diff --git a/.github/workflows/build-project-linux.yml b/.github/workflows/build-project-linux.yml new file mode 100644 index 00000000..d8c25f37 --- /dev/null +++ b/.github/workflows/build-project-linux.yml @@ -0,0 +1,128 @@ +name: Linux +on: + push: + tags: + - 'v*' + +jobs: + build_linux_release: + name: Build Linux release + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04] + include: + - os: ubuntu-20.04 + zip_name: ubuntu_tnc + generator: Unix Makefiles + + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ls-leave-prototype + + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + + + - name: Install Linux dependencies + if: matrix.os == 'ubuntu-20.04' + run: | + sudo apt install portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake python3-libhamlib2 + python -m pip install --upgrade pip + pip3 install pyaudio + pip3 install psutil + pip3 install crcengine + pip3 install pyinstaller + pip3 install ujson + pip3 install pyserial + pip3 install numpy + pip3 install structlog + + + #- name: Build Hamlib Python Binding + # if: matrix.os == 'ubuntu-latest' + # working-directory: tnc + # run: | + # sudo apt install wig libtool + # cd ~ + # git clone https://github.com/Hamlib/Hamlib.git + # cd Hamlib + # ./bootstrap + # ./configure --with-python-binding PYTHON_VERSION='3.9' --prefix=$HOME/local + # make + # make install + + + + + - name: Build codec2 Linux + if: matrix.os == 'ubuntu-20.04' + working-directory: tnc + run: | + git clone https://github.com/drowe67/codec2.git + cd codec2 && mkdir build_linux && cd build_linux + cmake ../ + make + + + - name: Build Linux Daemon + if: matrix.os == 'ubuntu-20.04' + working-directory: tnc + run: | + pyinstaller freedata.spec + + - name: LIST ALL FILES + shell: bash + run: | + ls -R + + + - name: Compress Linux + shell: bash + run: | + cd ./tnc/dist + mkdir compressed + zip -r ./compressed/${{ matrix.zip_name }}.zip * + + - name: Upload Ubuntu TNC artifacts + uses: actions/upload-artifact@v2 + with: + name: tnc-artifact + path: ./tnc/dist/compressed/* + + + + - name: Copy TNC to GUI Linux + if: matrix.os == 'ubuntu-20.04' + run: | + cp -R ./tnc/dist/tnc ./gui/tnc + ls -R + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v1 + with: + node-version: 16 + + - name: Release TNC + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/v') + with: + files: ./tnc/dist/compressed/${{ matrix.zip_name }}.zip + + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1 + with: + package_root: "./gui/" + github_token: ${{ secrets.github_token }} + # If the commit is tagged with a version (e.g. "v1.0.0"), + # release the app after building + release: ${{ startsWith(github.ref, 'refs/tags/v') }} + args: "-p always" + + + diff --git a/.github/workflows/build-project-mac.yml b/.github/workflows/build-project-mac.yml new file mode 100644 index 00000000..a9583696 --- /dev/null +++ b/.github/workflows/build-project-mac.yml @@ -0,0 +1,117 @@ +name: macOS +on: + push: + tags: + - 'v*' + +jobs: + build_linux_release: + name: Build macOS release + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-10.15] + include: + - os: macos-10.15 + zip_name: mac_tnc + generator: Unix Makefiles + + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ls-leave-prototype + + - name: Set up Python 3.9 + uses: actions/setup-python@v2 + with: + python-version: 3.9 + + + + - name: Install macOS dependencies + if: matrix.os == 'macos-10.15' + run: | + python -m pip install --upgrade pip + pip3 install psutil + pip3 install crcengine + pip3 install pyinstaller + pip3 install ujson + pip3 install pyserial + pip3 install numpy + pip3 install structlog + + - name: Install Portaudio + if: matrix.os == 'macos-10.15' + run: | + brew install portaudio + pip3 install pyaudio + + + - name: Build codec2 macOS + if: matrix.os == 'macos-10.15' + working-directory: tnc + run: | + git clone https://github.com/drowe67/codec2.git + cd codec2 && mkdir build_mac && cd build_mac + cmake ../ + make + + + - name: Build macOS pyinstaller + if: matrix.os == 'macos-10.15' + working-directory: tnc + run: | + pyinstaller freedata.spec + + - name: LIST ALL FILES + shell: bash + run: | + ls -R + + + - name: Compress + shell: bash + run: | + cd ./tnc/dist + mkdir compressed + zip -r ./compressed/${{ matrix.zip_name }}.zip * + + - name: Upload macOS TNC artifacts + uses: actions/upload-artifact@v2 + with: + name: tnc-artifact + path: ./tnc/dist/compressed/* + + + + + - name: Copy TNC to GUI + if: matrix.os == 'macos-10.15' + run: | + cp -R ./tnc/dist/tnc ./gui/tnc + ls -R + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v1 + with: + node-version: 16 + + - name: Release TNC + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/v') + with: + files: ./tnc/dist/compressed/${{ matrix.zip_name }}.zip + + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1 + with: + package_root: "./gui/" + github_token: ${{ secrets.github_token }} + # If the commit is tagged with a version (e.g. "v1.0.0"), + # release the app after building + release: ${{ startsWith(github.ref, 'refs/tags/v') }} + args: "-p always" + + + diff --git a/.github/workflows/build-project-win.yml b/.github/workflows/build-project-win.yml new file mode 100644 index 00000000..a816e461 --- /dev/null +++ b/.github/workflows/build-project-win.yml @@ -0,0 +1,115 @@ +name: Windows +on: + push: + tags: + - 'v*' + +jobs: + + build_windows_release: + name: Build Windows release + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest] + include: + - os: windows-latest + zip_name: windows_tnc + generator: Visual Studio 16 2019 + + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ls-leave-prototype + + - name: Set up Python 3.9 + uses: actions/setup-python@v2 + with: + python-version: 3.9 + + - name: Install Python dependencies + if: matrix.os == 'windows-latest' + run: | + python -m pip install --upgrade pip + pip install psutil + pip install crcengine + pip install pyinstaller + pip install ujson + pip install pyserial + pip install numpy + pip install structlog + pip install colorama + # curl.exe --output PyAudio-0.2.11-cp39-cp39-win_amd64.whl --url https://download.lfd.uci.edu/pythonlibs/y2rycu7g/PyAudio-0.2.11-cp39-cp39-win_amd64.whl + # pip install PyAudio-0.2.11-cp39-cp39-win_amd64.whl + + - name: Install Pyaudio + if: matrix.os == 'windows-latest' + working-directory: tnc/lib/pyaudio/windows + run: | + pip install PyAudio-0.2.11-cp39-cp39-win_amd64.whl + + + - name: Build Windows Daemon and TNC + if: matrix.os == 'windows-latest' + working-directory: tnc + run: | + pyinstaller freedata.spec + + - name: Copy TNC to GUI + shell: bash + run: | + cp -R ./tnc/dist/tnc ./gui/tnc + + - name: LIST ALL FILES + shell: bash + run: | + ls -R + + - name: Archive TNC + uses: thedoctor0/zip-release@master + with: + type: 'zip' + filename: '${{ matrix.zip_name }}.zip' + directory: ./tnc/dist/tnc + path: . + #exclusions: '*.git* /*node_modules/* .editorconfig' + + - name: LIST ALL FILES + shell: bash + working-directory: tnc + run: | + ls -R + + + + + #- name: Build codec2 + # shell: bash + # run: | + # choco install ninja cmake + # ninja --version + # cmake --version + + - name: Install Node.js, NPM and Yarn + uses: actions/setup-node@v1 + with: + node-version: 16 + + - name: Release TNC + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/v') + with: + files: ./tnc/dist/tnc/${{ matrix.zip_name }}.zip + + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1 + with: + package_root: "./gui/" + github_token: ${{ secrets.github_token }} + # If the commit is tagged with a version (e.g. "v1.0.0"), + # release the app after building + release: ${{ startsWith(github.ref, 'refs/tags/v') }} + args: "-p always" + + diff --git a/.github/workflows/build-project.yml b/.github/workflows/build-project.yml deleted file mode 100644 index d552da9e..00000000 --- a/.github/workflows/build-project.yml +++ /dev/null @@ -1,308 +0,0 @@ -name: Build/PROJECT -on: - push: - #tags: - #- '*' - -jobs: - - build_windows_release: - name: Build Windows release - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [windows-latest] - include: - - os: windows-latest - zip_name: windows_tnc - generator: Visual Studio 16 2019 - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - name: Install Python dependencies - if: matrix.os == 'windows-latest' - run: | - python -m pip install --upgrade pip - pip install psutil - pip install crcengine - pip install pyinstaller - pip install ujson - pip install pyserial - pip install numpy - pip install structlog - pip install colorama - # curl.exe --output PyAudio-0.2.11-cp39-cp39-win_amd64.whl --url https://download.lfd.uci.edu/pythonlibs/y2rycu7g/PyAudio-0.2.11-cp39-cp39-win_amd64.whl - # pip install PyAudio-0.2.11-cp39-cp39-win_amd64.whl - - - name: Install Pyaudio - if: matrix.os == 'windows-latest' - working-directory: tnc/lib/pyaudio/windows - run: | - pip install PyAudio-0.2.11-cp39-cp39-win_amd64.whl - - - - name: Build Windows Daemon - if: matrix.os == 'windows-latest' - working-directory: tnc - run: | - pyinstaller -F --add-binary="lib/codec2/windows/*;lib/codec2/windows/" --add-binary="lib/hamlib/win32/*;lib/hamlib/win32" --add-binary="lib/hamlib/win64/*;lib/hamlib/win64" daemon.py -n daemon - - - name: Build Windows TNC - if: matrix.os == 'windows-latest' - working-directory: tnc - run: | - pyinstaller -F --add-binary="lib/codec2/windows/*;lib/codec2/windows/" --add-binary="lib/hamlib/win32/*;lib/hamlib/win32" --add-binary="lib/hamlib/win64/*;lib/hamlib/win64" main.py -n tnc - - - - - - name: LIST ALL FILES - shell: bash - run: | - ls -R - - #- name: Build codec2 - # shell: bash - # run: | - # choco install ninja cmake - # ninja --version - # cmake --version - - - name: Install Node.js, NPM and Yarn - uses: actions/setup-node@v1 - with: - node-version: 14 - - - name: Copy TNC and DAEMOn to GUI Windows - if: matrix.os == 'windows-latest' - run: | - cp -R ./tnc/dist ./gui/ - ls -R - - - name: Build/release Electron app - uses: samuelmeuli/action-electron-builder@v1 - with: - package_root: "./gui/" - github_token: ${{ secrets.github_token }} - - - name: LIST ALL FILES - shell: bash - run: | - ls -R - - - name: chmod +x - shell: bash - run: | - chmod +x ./gui/dist/*.* - - - - name: Create app bundle - shell: bash - run: | - mkdir gui-bundle - cp ./gui/dist/*.* gui-bundle - cp ./tnc/dist/daemon.exe gui-bundle - cp ./tnc/dist/tnc.exe gui-bundle - chmod +x ./gui-bundle/tnc - chmod +x ./gui-bundle/daemon - cd ./gui-bundle - ls -R - - - name: Archive Release - uses: thedoctor0/zip-release@master - with: - type: 'zip' - filename: 'FreeDATA_windows.zip' - directory: ./gui-bundle/ - path: . - #exclusions: '*.git* /*node_modules/* .editorconfig' - - - name: Upload Windows GUI Bundle artifacts - uses: actions/upload-artifact@v2 - with: - name: gui-bundle-windows-artifact - path: ./gui-bundle/FreeDATA_windows.zip - - - build_linux_release: - name: Build Linux release - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-20.04] - include: - - os: ubuntu-20.04 - zip_name: ubuntu_tnc - generator: Unix Makefiles - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - - - name: Install Linux dependencies - if: matrix.os == 'ubuntu-20.04' - run: | - sudo apt install portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake python3-libhamlib2 - python -m pip install --upgrade pip - pip3 install pyaudio - pip3 install psutil - pip3 install crcengine - pip3 install pyinstaller - pip3 install ujson - pip3 install pyserial - pip3 install numpy - pip3 install structlog - - - #- name: Build Hamlib Python Binding - # if: matrix.os == 'ubuntu-latest' - # working-directory: tnc - # run: | - # sudo apt install wig libtool - # cd ~ - # git clone https://github.com/Hamlib/Hamlib.git - # cd Hamlib - # ./bootstrap - # ./configure --with-python-binding PYTHON_VERSION='3.9' --prefix=$HOME/local - # make - # make install - - - - - - name: Build codec2 Linux - if: matrix.os == 'ubuntu-20.04' - working-directory: tnc - run: | - git clone https://github.com/drowe67/codec2.git - cd codec2 && mkdir build_linux && cd build_linux - cmake ../ - make - - - - name: Build Linux Daemon - if: matrix.os == 'ubuntu-20.04' - working-directory: tnc - run: | - pyinstaller freedata.spec - - - name: LIST ALL FILES - shell: bash - run: | - ls -R - - - - name: Compress Linux - shell: bash - run: | - cd ./tnc/dist - mkdir compressed - zip -r ./compressed/${{ matrix.zip_name }}.zip * - - - name: Upload Ubuntu TNC artifacts - uses: actions/upload-artifact@v2 - with: - name: tnc-artifact - path: ./tnc/dist/compressed/* - - - name: Copy TNC to GUI Linux - if: matrix.os == 'ubuntu-20.04' - run: | - cp -R ./tnc/dist/tnc ./gui/tnc - ls -R - - - name: Install Node.js, NPM and Yarn - uses: actions/setup-node@v1 - with: - node-version: 14 - - - - name: Build/release Electron app - uses: samuelmeuli/action-electron-builder@v1 - with: - package_root: "./gui/" - github_token: ${{ secrets.github_token }} - - - name: LIST ALL FILES - shell: bash - run: | - ls -R - - - name: chmod +x - shell: bash - run: | - chmod +x ./gui/dist/*.AppImage - - - - name: Create app bundle - shell: bash - run: | - mkdir gui-bundle - cp ./gui/dist/*.AppImage gui-bundle - cp -R ./tnc/dist/tnc gui-bundle - chmod +x ./gui-bundle/tnc/tnc - chmod +x ./gui-bundle/tnc/daemon - cd ./gui-bundle - zip -r FreeDATA_linux.zip . - ls -R - - - - - - name: Upload Ubuntu GUI Bundle artifacts - uses: actions/upload-artifact@v2 - with: - name: gui-bundle-ubuntu-artifact - path: ./gui-bundle/FreeDATA_linux.zip - - - - - release: - name: Upload Release - needs: [build_linux_release, build_windows_release] - runs-on: ubuntu-20.04 - steps: - - - - name: Download artifact - uses: actions/download-artifact@v2 - - - - name: LIST ALL FILES - shell: bash - run: | - ls -R - - - - name: Release - uses: WebFreak001/deploy-nightly@v1.1.0 - #uses: softprops/action-gh-release@v1 - #if: startsWith(github.ref, 'refs/tags/') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: https://uploads.github.com/repos/DJ2LS/FreeDATA/releases/48616289/assets{?name,label} # find out this value by opening https://api.github.com/repos///releases in your browser and copy the full "upload_url" value including the {?name,label} part - release_id: 48616289 # same as above (id can just be taken out the upload_url, it's used to find old releases) - asset_path: ./gui-bundle-ubuntu-artifact/FreeDATA_linux.zip # path to archive to upload - asset_name: FreeDATA_linux-nightly-$$.zip # name to upload the release as, use $$ to insert date (YYYYMMDD) and 6 letter commit hash - asset_content_type: application/zip # required by GitHub API - max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted - #files: | - # ./gui-bundle-ubuntu-artifact/codec2-FreeDATA_ubuntu.zip - # ./tnc-artifact/ubuntu_tnc.zip - # LICENSE diff --git a/.stignore b/.stignore new file mode 100644 index 00000000..0378d016 --- /dev/null +++ b/.stignore @@ -0,0 +1,4 @@ +tnc/__pycache__ +tnc/daemon.log +tnc/tnc.log +gui/node_modules diff --git a/README.md b/README.md index b89c30ed..16a74adf 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,16 @@ My attempt to create a free and open-source TNC with a GUI for [codec2](https:// [mailing-list](https://groups.io/g/freedata) ## Under development + +![Build Windows](https://github.com/DJ2LS/FreeDATA/actions/workflows/build-project-win.yml/badge.svg) +![Build Linux](https://github.com/DJ2LS/FreeDATA/actions/workflows/build-project-linux.yml/badge.svg) +![Build macOS](https://github.com/DJ2LS/FreeDATA/actions/workflows/build-project-mac.yml/badge.svg) + Please keep in mind, that this project is still a prototype with many issues which need to be solved. Build steps for other OS than Ubuntu are provided, but not fully working, yet. +Please check the [Releases](https://github.com/DJ2LS/FreeDATA/releases) section for downloading nightly builds + ## Preview ![preview](https://github.com/DJ2LS/FreeDATA/blob/main/documentation/FreeDATA_preview.gif?raw=true "Preview") @@ -20,7 +27,7 @@ xssfox : https://github.com/xssfox/freedv-tnc ## Running the Ubuntu app bundle Download the latest developer release from the releases section, unpack it and just start the ".AppImage file". No more dependencies -## Manual installation -Please check the [wiki](https://github.com/DJ2LS/FreeDATA/wiki) for installation instructions +## Installation +Please check the [wiki](https://wiki.freedata.app) for installation instructions diff --git a/documentation/cube.xcf b/documentation/cube.xcf new file mode 100644 index 00000000..92d2e2d2 Binary files /dev/null and b/documentation/cube.xcf differ diff --git a/gui/config.json b/gui/config.json deleted file mode 100644 index 30f023e4..00000000 --- a/gui/config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tnc_host" : "127.0.0.1", - "tnc_port" : "3000", - "daemon_host" : "127.0.0.1", - "daemon_port" : "3001", - "mycall" : "AA0AA", - "mygrid" : "AA11ea" -} \ No newline at end of file diff --git a/gui/daemon.js b/gui/daemon.js index 6aff9a13..3b82d051 100644 --- a/gui/daemon.js +++ b/gui/daemon.js @@ -3,6 +3,10 @@ const path = require('path') const { ipcRenderer } = require('electron') +const log = require('electron-log'); +const daemonLog = log.scope('daemon'); + + // https://stackoverflow.com/a/26227660 var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") @@ -11,16 +15,17 @@ var configPath = path.join(configFolder, 'config.json') const config = require(configPath); var daemon = new net.Socket(); -var msg = ''; // Current message, per connection. +var socketchunk = ''; // Current message, per connection. setTimeout(connectDAEMON, 500) function connectDAEMON() { - console.log('connecting to DAEMON...') + + daemonLog.info('connecting to daemon'); //clear message buffer after reconnecting or inital connection - msg = ''; + socketchunk = ''; if (config.tnclocation == 'localhost') { daemon.connect(3001, '127.0.0.1') @@ -32,25 +37,48 @@ function connectDAEMON() { //client.setTimeout(5000); } -daemon.on('connect', function(data) { - console.log('DAEMON connection established') +daemon.on('connect', function(err) { + + daemonLog.info('daemon connection established'); + let Data = { + daemon_connection: daemon.readyState, + }; + ipcRenderer.send('request-update-daemon-connection', Data); + }) -daemon.on('error', function(data) { - console.log('DAEMON connection error'); - setTimeout(connectDAEMON, 2000) +daemon.on('error', function(err) { + daemonLog.error('daemon connection error'); + daemonLog.error(err) + daemon.destroy(); + setTimeout(connectDAEMON, 1000) + let Data = { + daemon_connection: daemon.readyState, + }; + ipcRenderer.send('request-update-daemon-connection', Data); + }); /* client.on('close', function(data) { console.log(' TNC connection closed'); setTimeout(connectTNC, 2000) + let Data = { + daemon_connection: daemon.readyState, + }; + ipcRenderer.send('request-update-daemon-connection', Data); }); */ daemon.on('end', function(data) { - console.log('DAEMON connection ended'); - setTimeout(connectDAEMON, 2000) + + daemonLog.warn('daemon connection ended'); + daemon.destroy(); + setTimeout(connectDAEMON, 500) + let Data = { + daemon_connection: daemon.readyState, + }; + ipcRenderer.send('request-update-daemon-connection', Data); }); //exports.writeCommand = function(command){ @@ -79,50 +107,91 @@ writeDaemonCommand = function(command) { // "https://stackoverflow.com/questions/9070700/nodejs-net-createserver-large-amount-of-data-coming-in" -daemon.on('data', function(data) { +daemon.on('data', function(socketdata) { - data = data.toString('utf8'); /* convert data to string */ - msg += data.toString('utf8'); /*append data to buffer so we can stick long data together */ + /* + inspired by: + stackoverflow.com questions 9070700 nodejs-net-createserver-large-amount-of-data-coming-in + */ - /* check if we reached an EOF, if true, clear buffer and parse JSON data */ - if (data.endsWith('}')) { - /*console.log(msg)*/ - try { - /*console.log(msg)*/ - data = JSON.parse(msg) - } catch (e) { - console.log(e); /* "SyntaxError */ - } - msg = ''; - /*console.log("EOF detected!")*/ - if (data['COMMAND'] == 'DAEMON_STATE') { - let Data = { - input_devices: data['INPUT_DEVICES'], - output_devices: data['OUTPUT_DEVICES'], - python_version: data['PYTHON_VERSION'], - hamlib_version: data['HAMLIB_VERSION'], - serial_devices: data['SERIAL_DEVICES'], - tnc_running_state: data['DAEMON_STATE'][0]['STATUS'], - ram_usage: data['RAM'], - cpu_usage: data['CPU'], - version: data['VERSION'], - }; - ipcRenderer.send('request-update-daemon-state', Data); - } + socketdata = socketdata.toString('utf8'); // convert data to string + socketchunk += socketdata// append data to buffer so we can stick long data together - if (data['COMMAND'] == 'TEST_HAMLIB') { - let Data = { - hamlib_result: data['RESULT'], - - }; - ipcRenderer.send('request-update-hamlib-test', Data); + + // check if we received begin and end of json data + if (socketchunk.startsWith('{"') && socketchunk.endsWith('"}\n')) { + + var data = '' + + // split data into chunks if we received multiple commands + socketchunk = socketchunk.split("\n"); + data = JSON.parse(socketchunk[0]) + + + // search for empty entries in socketchunk and remove them + for (i = 0; i < socketchunk.length; i++) { + if (socketchunk[i] === ''){ + socketchunk.splice(i, 1); + } } - ////// check if EOF ... + //iterate through socketchunks array to execute multiple commands in row + for (i = 0; i < socketchunk.length; i++) { + + //check if data is not empty + if(socketchunk[i].length > 0){ + + //try to parse JSON + try { + + data = JSON.parse(socketchunk[i]) + + } catch (e) { + console.log(e); // "SyntaxError + daemonLog.error(e); + daemonLog.debug(socketchunk[i]) + socketchunk = '' + + } + + } + + + + + if (data['command'] == 'daemon_state') { + let Data = { + input_devices: data['input_devices'], + output_devices: data['output_devices'], + python_version: data['python_version'], + hamlib_version: data['hamlib_version'], + serial_devices: data['serial_devices'], + tnc_running_state: data['daemon_state'][0]['status'], + ram_usage: data['ram'], + cpu_usage: data['cpu'], + version: data['version'], + }; + ipcRenderer.send('request-update-daemon-state', Data); + } + + if (data['command'] == 'test_hamlib') { + let Data = { + hamlib_result: data['result'], + + }; + ipcRenderer.send('request-update-hamlib-test', Data); + } + + + + } + + //finally delete message buffer + socketchunk = ''; + } - }); function hexToBytes(hex) { @@ -133,17 +202,17 @@ function hexToBytes(hex) { exports.getDaemonState = function() { //function getDaemonState(){ - command = '{"type" : "GET", "command" : "DAEMON_STATE"}' + command = '{"type" : "get", "command" : "daemon_state"}' writeDaemonCommand(command) } // START TNC // ` `== multi line string -exports.startTNC = function(mycall, mygrid, rx_audio, tx_audio, radiocontrol, devicename, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port) { +exports.startTNC = function(mycall, mygrid, rx_audio, tx_audio, radiocontrol, devicename, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port, enable_fft, enable_scatter, low_bandwith_mode) { var json_command = JSON.stringify({ - type: 'SET', - command: 'STARTTNC', + type: 'set', + command: 'start_tnc', parameter: [{ mycall: mycall, mygrid: mygrid, @@ -159,18 +228,21 @@ exports.startTNC = function(mycall, mygrid, rx_audio, tx_audio, radiocontrol, de stop_bits: stop_bits, handshake: handshake, rigctld_port: rigctld_port, - rigctld_ip: rigctld_ip + rigctld_ip: rigctld_ip, + enable_scatter: enable_scatter, + enable_fft: enable_fft, + low_bandwith_mode : low_bandwith_mode }] }) - //console.log(json_command) + daemonLog.debug(json_command); writeDaemonCommand(json_command) } // STOP TNC exports.stopTNC = function() { - command = '{"type" : "SET", "command": "STOPTNC" , "parameter": "---" }' + command = '{"type" : "set", "command": "stop_tnc" , "parameter": "---" }' writeDaemonCommand(command) } @@ -178,8 +250,8 @@ exports.stopTNC = function() { exports.testHamlib = function(radiocontrol, devicename, deviceport, serialspeed, pttprotocol, pttport, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port) { var json_command = JSON.stringify({ - type: 'GET', - command: 'TEST_HAMLIB', + type: 'get', + command: 'test_hamlib', parameter: [{ radiocontrol: radiocontrol, devicename: devicename, @@ -194,7 +266,7 @@ exports.testHamlib = function(radiocontrol, devicename, deviceport, serialspeed, rigctld_ip: rigctld_ip }] }) - console.log(json_command) + daemonLog.debug(json_command); writeDaemonCommand(json_command) } @@ -202,13 +274,13 @@ exports.testHamlib = function(radiocontrol, devicename, deviceport, serialspeed, //Save myCall exports.saveMyCall = function(callsign) { - command = '{"type" : "SET", "command": "MYCALLSIGN" , "parameter": "' + callsign + '", "timestamp" : "' + Date.now() + '"}' + command = '{"type" : "set", "command": "mycallsign" , "parameter": "' + callsign + '"}' writeDaemonCommand(command) } // Save myGrid exports.saveMyGrid = function(grid) { - command = '{"type" : "SET", "command": "MYGRID" , "parameter": "' + grid + '", "timestamp" : "' + Date.now() + '"}' + command = '{"type" : "set", "command": "mygrid" , "parameter": "' + grid + '"}' writeDaemonCommand(command) } diff --git a/gui/main.js b/gui/main.js index aa65653e..86a0b454 100644 --- a/gui/main.js +++ b/gui/main.js @@ -1,59 +1,112 @@ const { app, BrowserWindow, - ipcMain -} = require('electron') -const path = require('path') -const fs = require('fs') + ipcMain, + dialog, + shell +} = require('electron'); +const { autoUpdater } = require('electron-updater'); +const path = require('path'); +const fs = require('fs'); const os = require('os'); +const exec = require('child_process').spawn; +const log = require('electron-log'); +const mainLog = log.scope('main'); +const daemonProcessLog = log.scope('freedata-daemon'); + +const sysInfo = log.scope('system information'); +sysInfo.info("SYSTEM INFORMATION ----------------------------- "); +sysInfo.info("APP VERSION : " + app.getVersion()); +sysInfo.info("PLATFORM : " + os.platform()); +sysInfo.info("ARCHITECTURE: " + os.arch()); +sysInfo.info("FREE MEMORY: " + os.freemem()); +sysInfo.info("TOTAL MEMORY: " + os.totalmem()); +sysInfo.info("LOAD AVG : " + os.loadavg()); +sysInfo.info("RELEASE : " + os.release()); +sysInfo.info("TYPE : " + os.type()); +sysInfo.info("VERSION : " + os.version()); +sysInfo.info("UPTIME : " + os.uptime()); + + + app.setName("FreeDATA"); -var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") +var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config"); var configFolder = path.join(appDataFolder, "FreeDATA"); -var configPath = path.join(configFolder, 'config.json') +var configPath = path.join(configFolder, 'config.json'); // create config folder if not exists if (!fs.existsSync(configFolder)) { fs.mkdirSync(configFolder); } -// create config file if not exists -var configContent = ` -{ - "tnc_host": "127.0.0.1", - "tnc_port": "3000", - "daemon_host": "127.0.0.1", - "daemon_port": "3001", - "mycall": "AA0AA", - "mygrid": "JN40aa", - "deviceid": "RIG_MODEL_DUMMY_NOVFO", - "deviceport": "/dev/ttyACM1", - "serialspeed": "9600", - "ptt": "USB", - "spectrum": "waterfall", - "tnclocation": "localhost", - "stop_bits" : "1", - "data_bits" : "8", - "handshake" : "None", - "radiocontrol" : "direct", - "deviceport_rigctl" : "3", - "deviceid_rigctl" : "3", - "serialspeed_rigctl" : "9600", - "pttprotocol_rigctl" : "USB", - "rigctld_port" : "4532", - "rigctld_ip" : "127.0.0.1" +// create config file if not exists with defaults +const configDefaultSettings = '{\ + "tnc_host": "127.0.0.1",\ + "tnc_port": "3000",\ + "daemon_host": "127.0.0.1",\ + "daemon_port": "3001",\ + "mycall": "AA0AA-0",\ + "mygrid": "JN40aa",\ + "deviceid": "RIG_MODEL_DUMMY_NOVFO",\ + "deviceport": "/dev/ttyACM1",\ + "serialspeed_direct": "9600",\ + "spectrum": "waterfall",\ + "tnclocation": "localhost",\ + "stop_bits_direct" : "1",\ + "data_bits_direct" : "8",\ + "handshake_direct" : "None",\ + "radiocontrol" : "disabled",\ + "deviceport_rigctl" : "3",\ + "deviceid_rigctl" : "3",\ + "serialspeed_rigctl" : "9600",\ + "pttprotocol_direct" : "USB",\ + "pttprotocol_rigctl" : "USB",\ + "rigctld_port" : "4532",\ + "rigctld_ip" : "127.0.0.1",\ + "enable_scatter" : "False",\ + "enable_fft" : "False",\ + "low_bandwith_mode" : "False",\ + "theme" : "default",\ + "screen_height" : 430,\ + "screen_width" : 1050,\ + "update_channel" : "latest",\ + "beacon_interval" : 5,\ + "received_files_folder" : "None"\ + }'; -} -`; if (!fs.existsSync(configPath)) { - fs.writeFileSync(configPath, configContent) + fs.writeFileSync(configPath, configDefaultSettings) } +// load settings +var config = require(configPath); + +//config validation +// check running config against default config. +// if parameter not exists, add it to running config to prevent errors +sysInfo.info("CONFIG VALIDATION ----------------------------- "); + +var parsedConfig = JSON.parse(configDefaultSettings); +for (key in parsedConfig) { + if (config.hasOwnProperty(key)) { + sysInfo.info("FOUND SETTTING [" + key + "]: " + config[key]); + } else { + sysInfo.error("MISSING SETTTING [" + key + "] : " + parsedConfig[key]); + config[key] = parsedConfig[key]; + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + } +} +sysInfo.info("------------------------------------------ "); + + + +/* var chatDB = path.join(configFolder, 'chatDB.json') // create chat database file if not exists -var configContent = ` +const configContentChatDB = ` { "chatDB" : [{ "id" : "00000000", "timestamp" : 1234566, @@ -65,9 +118,9 @@ var configContent = ` } `; if (!fs.existsSync(chatDB)) { - fs.writeFileSync(chatDB, configContent) + fs.writeFileSync(chatDB, configContentChatDB); } - +*/ /* @@ -88,25 +141,29 @@ fs.mkdir(receivedFilesFolder, { -const config = require(configPath); -const exec = require('child_process').exec; + + let win = null; let data = null; +let logViewer = null; var daemonProcess = null; function createWindow() { win = new BrowserWindow({ - width: 1050, - height: 430, + width: config.screen_width, + height: config.screen_height, autoHideMenuBar: true, - icon: __dirname + '/src/icon_cube_border.png', + icon: 'src/img/icon.png', webPreferences: { //preload: path.join(__dirname, 'preload-main.js'), preload: require.resolve('./preload-main.js'), nodeIntegration: true, contextIsolation: false, - enableRemoteModule: false, //https://stackoverflow.com/questions/53390798/opening-new-window-electron/53393655 https://github.com/electron/remote + enableRemoteModule: false, + sandbox: false + //https://stackoverflow.com/questions/53390798/opening-new-window-electron/53393655 + //https://github.com/electron/remote } }) // hide menu bar @@ -132,90 +189,219 @@ function createWindow() { } }) - chat.loadFile('src/chat-module.html') - chat.setMenuBarVisibility(false) + chat.loadFile('src/chat-module.html'); + chat.setMenuBarVisibility(false); + + + logViewer = new BrowserWindow({ + height: 900, + width: 600, + show: false, + parent: win, + webPreferences: { + preload: require.resolve('./preload-log.js'), + nodeIntegration: true, + + } + }) + + logViewer.loadFile('src/log-module.html'); + logViewer.setMenuBarVisibility(false); + + // Emitted when the window is closed. + logViewer.on('close', function(evt) { + evt.preventDefault(); + logViewer.hide(); + }) + + + + + // Emitted when the window is closed. win.on('closed', function() { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. win = null; chat = null; + logViewer = null; }) + + + win.once('ready-to-show', () => { + + log.transports.file.level = "debug" + autoUpdater.logger = log.scope('updater'); + + autoUpdater.channel = config.update_channel + + autoUpdater.autoInstallOnAppQuit = false; + autoUpdater.autoDownload = true; + autoUpdater.checkForUpdatesAndNotify(); + //autoUpdater.quitAndInstall(); + }); chat.on('closed', function () { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. + }) // https://stackoverflow.com/questions/44258831/only-hide-the-window-when-closing-it-electron chat.on('close', function(evt) { evt.preventDefault(); - chat.hide() + chat.hide(); }); } app.whenReady().then(() => { - createWindow() + createWindow(); // start daemon by checking os - // https://stackoverflow.com/a/5775120 - console.log("Trying to start daemon binary") + mainLog.info('Starting freedata-daemon binary'); + + if(os.platform()=='darwin'){ + daemonProcess = exec(path.join(process.resourcesPath, 'tnc', 'freedata-daemon'), [], + { + cwd: path.join(process.resourcesPath, 'tnc'), + }); + } - if(os.platform()=='linux' || os.platform()=='darwin'){ - daemonProcess = exec('./tnc/daemon', function callback(err, stdout, stderr) { - if (err) { - console.log(os.platform()) - console.error(err) - console.error("Can't start daemon binary"); - console.error("--> this is only working with the app bundle and a precompiled binaries"); - return; - } - console.log(stdout); - }); + /* + process.resourcesPath --> + /tmp/.mount_FreeDAUQYfKb/resources + + __dirname --> + /tmp/.mount_FreeDAUQYfKb/resources/app.asar + */ + + if(os.platform()=='linux'){ + + /* + var folder = path.join(process.resourcesPath, 'tnc'); + //var folder = path.join(__dirname, 'extraResources', 'tnc'); + console.log(folder); + fs.readdir(folder, (err, files) => { + console.log(files); + }); + */ + + daemonProcess = exec(path.join(process.resourcesPath, 'tnc', 'freedata-daemon'), [], + { + cwd: path.join(process.resourcesPath, 'tnc'), + }); } + if(os.platform()=='win32' || os.platform()=='win64'){ - daemonProcess = exec('./tnc/daemon.exe', function callback(err, stdout, stderr) { - if (err) { - console.log(os.platform()) - console.error(err) - console.error("Can't start daemon binary"); - console.error("--> this is only working with the app bundle and a precompiled binaries"); - return; - } - console.log(stdout); - }); + // for windows the relative path via path.join(__dirname) is not needed for some reason + //daemonProcess = exec('\\tnc\\daemon.exe', []) + + daemonProcess = exec(path.join(process.resourcesPath, 'tnc', 'freedata-daemon.exe'), [], + { + cwd: path.join(process.resourcesPath, 'tnc'), + }); + } + // return process messages + + daemonProcess.on('error', (err) => { + daemonProcessLog.error(`error when starting daemon: ${err}`); + }); + + daemonProcess.on('message', (data) => { + daemonProcessLog.info(`${data}`); + }); + + daemonProcess.stdout.on('data', (data) => { + daemonProcessLog.info(`${data}`); + }); + + + + + + daemonProcess.stderr.on('data', (data) => { + daemonProcessLog.info(`${data}`); + + let arg = { + entry: `${data}` + }; + // send info to log only if log screen available + // it seems an error occurs when updating + if (logViewer !== null && logViewer !== ''){ + logViewer.webContents.send('action-update-log', arg); + } + + }); + + daemonProcess.on('close', (code) => { + daemonProcessLog.warn(`daemonProcess exited with code ${code}`); + }); + app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { - createWindow() + createWindow(); } }) }) app.on('window-all-closed', () => { - // kill daemon process - daemonProcess.kill('SIGINT'); - - if (process.platform !== 'darwin') { - app.quit() + + + // closing the tnc binary if not closed when closing application and also our daemon which has been started by the gui + try { + daemonProcess.kill(); + } catch (e) { + mainLog.error(e) } + + + mainLog.warn('closing tnc'); + + if(os.platform()=='win32' || os.platform()=='win64'){ + exec('Taskkill', ['/IM', 'freedata-tnc.exe', '/F']) + } + + if(os.platform()=='linux'){ + + exec('pkill', ['-9', 'freedata-tnc']) + + // on macOS we need to kill the daemon as well. If we are not doing this, + // the daemon wont startup again because the socket is already in use + //for some reason killing the daemon is killing our screen on Ubuntu..it seems theres another "daemon" out there... + exec('pkill', ['-9', 'freedata-daemon']) + } + + if(os.platform()=='darwin'){ + + exec('pkill', ['-9', 'freedata-tnc']) + + // on macOS we need to kill the daemon as well. If we are not doing this, + // the daemon wont startup again because the socket is already in use + //for some reason killing the daemon is killing our screen on Ubuntu..it seems theres another "daemon" out there... + exec('pkill', ['-9', 'freedata-daemon']) + + } + + /* + if (process.platform !== 'darwin') { + app.quit(); + } + */ + mainLog.warn('quitting app'); + app.quit(); + }) // IPC HANDLER ipcMain.on('request-show-chat-window', (event, arg) => { - chat.show() + chat.show(); }); @@ -244,6 +430,9 @@ ipcMain.on('request-update-hamlib-test', (event, arg) => { +ipcMain.on('request-update-tnc-connection', (event, arg) => { + win.webContents.send('action-update-tnc-connection', arg); +}); ipcMain.on('request-update-daemon-connection', (event, arg) => { win.webContents.send('action-update-daemon-connection', arg); @@ -257,6 +446,99 @@ ipcMain.on('request-update-rx-buffer', (event, arg) => { win.webContents.send('action-update-rx-buffer', arg); }); +/* ipcMain.on('request-update-rx-msg-buffer', (event, arg) => { chat.webContents.send('action-update-rx-msg-buffer', arg); }); +*/ +ipcMain.on('request-new-msg-received', (event, arg) => { + chat.webContents.send('action-new-msg-received', arg); +}); + +ipcMain.on('request-open-tnc-log', (event) => { + logViewer.show(); +}); + +//folder selector +ipcMain.on('get-folder-path',(event,data)=>{ + dialog.showOpenDialog({defaultPath: path.join(__dirname, '../assets/'), + buttonLabel: 'Select folder', properties: ['openDirectory']}).then(folderPaths => { + win.webContents.send('return-folder-paths', {path: folderPaths,}) + }); +}); + +//open folder +ipcMain.on('open-folder',(event,data)=>{ + shell.showItemInFolder(data.path) +}); + + + + +// LISTENER FOR UPDATER EVENTS +autoUpdater.on('update-available', (info) => { + mainLog.info('update available'); + + let arg = { + status: "update-available", + info: info + }; + win.webContents.send('action-updater', arg); + +}); + +autoUpdater.on('update-not-available', (info) => { + mainLog.info('update not available'); + let arg = { + status: "update-not-available", + info: info + }; + win.webContents.send('action-updater', arg); +}); + + +autoUpdater.on('update-downloaded', (info) => { + mainLog.info('update downloaded'); + let arg = { + status: "update-downloaded", + info: info + }; + win.webContents.send('action-updater', arg); + // we need to call this at this point. + // if an update is available and we are force closing the app + // the entire screen crashes... + mainLog.info('quit application and install update'); + autoUpdater.quitAndInstall(); + + +}); + +autoUpdater.on('checking-for-update', () => { +mainLog.info('checking for update'); + let arg = { + status: "checking-for-update", + version: app.getVersion() + }; + win.webContents.send('action-updater', arg); +}); + +autoUpdater.on('download-progress', (progress) => { + let arg = { + status: "download-progress", + progress: progress + }; + win.webContents.send('action-updater', arg); +}); + +autoUpdater.on('error', (error) => { + mainLog.info('update error'); + let arg = { + status: "error", + progress: error + }; + win.webContents.send('action-updater', arg); +}); + + + + diff --git a/gui/package-lock.json b/gui/package-lock.json deleted file mode 100644 index b1c66c99..00000000 --- a/gui/package-lock.json +++ /dev/null @@ -1,6170 +0,0 @@ -{ - "name": "FreeDATA", - "version": "0.0.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "FreeDATA", - "version": "0.0.1", - "license": "LGPL-2.1", - "dependencies": { - "bootstrap": "^5.1.0", - "chart.js": "^3.5.1", - "chartjs-plugin-annotation": "^1.0.2", - "qth-locator": "^2.1.0" - }, - "devDependencies": { - "electron": "^15.0.0", - "electron-builder": "^22.11.7" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/get": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz", - "integrity": "sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^9.6.0", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=8.6" - }, - "optionalDependencies": { - "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1" - } - }, - "node_modules/@electron/universal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.5.tgz", - "integrity": "sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.0.3", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@popperjs/core": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz", - "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", - "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==", - "dev": true - }, - "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/verror": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.5.tgz", - "integrity": "sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw==", - "dev": true, - "optional": true - }, - "node_modules/@types/yargs": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", - "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", - "dev": true - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz", - "integrity": "sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==", - "dev": true - }, - "node_modules/app-builder-lib": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.13.1.tgz", - "integrity": "sha512-TsUe7gCdH1cnSknUcqwVRAAxsFxsxcU/BJvnKR8ASzjaZtePW7MU+AEaDVDUURycgYxQ9XeymGjmuQGS32jcbw==", - "dev": true, - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.0.5", - "@malept/flatpak-bundler": "^0.4.0", - "7zip-bin": "~5.1.1", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.2", - "ejs": "^3.1.6", - "electron-osx-sign": "^0.5.0", - "electron-publish": "22.13.1", - "fs-extra": "^10.0.0", - "hosted-git-info": "^4.0.2", - "is-ci": "^3.0.0", - "isbinaryfile": "^4.0.8", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^3.0.4", - "read-config-file": "6.2.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.5", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/asar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.1.0.tgz", - "integrity": "sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ==", - "dev": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolean": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", - "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", - "dev": true, - "optional": true - }, - "node_modules/bootstrap": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", - "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, - "peerDependencies": { - "@popperjs/core": "^2.10.2" - } - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builder-util": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.13.1.tgz", - "integrity": "sha512-gMdoW9aQbWYxuQ4k4jT4An1BTo/hWzvsdv3pwNz18iNYnqn9j+xMllQOg9CHgfQYKSUd8VuMsZnbCvLO4NltYw==", - "dev": true, - "dependencies": { - "@types/debug": "^4.1.6", - "@types/fs-extra": "^9.0.11", - "7zip-bin": "~5.1.1", - "app-builder-bin": "3.7.1", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.8.1", - "chalk": "^4.1.1", - "cross-spawn": "^7.0.3", - "debug": "^4.3.2", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.8.1.tgz", - "integrity": "sha512-xHxAzdsJmMV8m/N+INzYUKfyJASeKyKHnA1uGkY8Y8JKLI/c4BG+If+L0If2YETv96CiRASkvd02tIt2pvrchQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.2", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", - "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==" - }, - "node_modules/chartjs-plugin-annotation": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-1.0.2.tgz", - "integrity": "sha512-asqP2/B+9tv105e3rwkzqoIgzhDBQRMzFRh/0ZTKqormxDXMP68uzxI5t3Fx8bxZSMNeEph0sY+0GIXXU0PeBQ==", - "peerDependencies": { - "chart.js": "^3.0.1" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "optional": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "optional": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "node_modules/dir-compare": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", - "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", - "dev": true, - "dependencies": { - "buffer-equal": "1.0.0", - "colors": "1.0.3", - "commander": "2.9.0", - "minimatch": "3.0.4" - }, - "bin": { - "dircompare": "src/cli/dircompare.js" - } - }, - "node_modules/dir-compare/node_modules/commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/dmg-builder": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.13.1.tgz", - "integrity": "sha512-qgfLN2fo4q2wIWNvbcKlZ71DLRDLvWIElOB7oxlSxUrMi6xhI+9v1Mh7E0FJ+r5UXhQzaQXaGuyMsQRbGgrSwg==", - "dev": true, - "dependencies": { - "app-builder-lib": "22.13.1", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "fs-extra": "^10.0.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.9" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.9.tgz", - "integrity": "sha512-Rq6qMDaDou2+aPN2SYy0x7LDznoJ/XaG6oDcH5wXUp+WRWQMUYE6eM+F+nex+/LSXOp1uw4HLFoed0YbfU8R/Q==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "cli-truncate": "^1.1.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.6", - "plist": "^3.0.1", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", - "dev": true, - "dependencies": { - "jake": "^10.6.1" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-15.3.0.tgz", - "integrity": "sha512-YLzaKCFmSniNlz9+NUTNs7ssPyDc+bYOCYZ0b/D6DjVkOeIFz4SR8EYKqlOc8TcqlDNu18BbWqz6zbJPyAAURg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^1.13.0", - "@types/node": "^14.6.2", - "extract-zip": "^1.0.3" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 8.6" - } - }, - "node_modules/electron-builder": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.13.1.tgz", - "integrity": "sha512-ajlI40L60qKBBxvpf770kcjxHAccMpEWpwsHAppytl3WmWgJfMut4Wz9VUFqyNtX/9a624QTatk6TqoxqewRug==", - "dev": true, - "dependencies": { - "@types/yargs": "^17.0.1", - "app-builder-lib": "22.13.1", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "chalk": "^4.1.1", - "dmg-builder": "22.13.1", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.2.0", - "update-notifier": "^5.1.0", - "yargs": "^17.0.1" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-osx-sign": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", - "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/electron-osx-sign/node_modules/isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "dependencies": { - "buffer-alloc": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/electron-osx-sign/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/electron-publish": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.13.1.tgz", - "integrity": "sha512-5nCXhnsqrRxP5NsZxUKjiMkcFmQglXp7i/YY4rp3h1s1psg3utOIkM29Z93YTSXicZJU1J+8811eo5HX1vpoKg==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "chalk": "^4.1.1", - "fs-extra": "^10.0.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "dependencies": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "optional": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz", - "integrity": "sha512-1NBe55C75bKGZaY9UHxvXG3G0gEp0ziht7quhuFrW3SPgZDw9HI6qvYXRSV5M/Eupyu8ljuJ6Cba+ec15PZ4Xw==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^1.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", - "dev": true, - "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/jake/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jake/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "dependencies": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", - "dev": true, - "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/plist/node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true, - "optional": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qth-locator": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/qth-locator/-/qth-locator-2.1.0.tgz", - "integrity": "sha512-QeF5nF/xkqeWQ363GgdK+qS40II/AYxpTCfrfg/yhOaXVOEdP9JZYBN72utWGyGD3GNr31hg5ivZDELCUUbs5w==" - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-config-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", - "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", - "dev": true, - "dependencies": { - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, - "node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - }, - "dependencies": { - "@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - }, - "@electron/get": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz", - "integrity": "sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1", - "got": "^9.6.0", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - } - }, - "@electron/universal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.5.tgz", - "integrity": "sha512-zX9O6+jr2NMyAdSkwEUlyltiI4/EBLu2Ls/VD3pUQdi3cAYeYfdQnT2AJJ38HE4QxLccbU13LSpccw1IWlkyag==", - "dev": true, - "requires": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.0.3", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@popperjs/core": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.2.tgz", - "integrity": "sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==", - "peer": true - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true, - "optional": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "14.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", - "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==", - "dev": true - }, - "@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "@types/verror": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.5.tgz", - "integrity": "sha512-9UjMCHK5GPgQRoNbqdLIAvAy0EInuiqbW0PBMtVP6B5B2HQJlvoJHM+KodPZMEjOa5VkSc+5LH7xy+cUzQdmHw==", - "dev": true, - "optional": true - }, - "@types/yargs": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", - "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "app-builder-bin": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz", - "integrity": "sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==", - "dev": true - }, - "app-builder-lib": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.13.1.tgz", - "integrity": "sha512-TsUe7gCdH1cnSknUcqwVRAAxsFxsxcU/BJvnKR8ASzjaZtePW7MU+AEaDVDUURycgYxQ9XeymGjmuQGS32jcbw==", - "dev": true, - "requires": { - "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.0.5", - "@malept/flatpak-bundler": "^0.4.0", - "7zip-bin": "~5.1.1", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.2", - "ejs": "^3.1.6", - "electron-osx-sign": "^0.5.0", - "electron-publish": "22.13.1", - "fs-extra": "^10.0.0", - "hosted-git-info": "^4.0.2", - "is-ci": "^3.0.0", - "isbinaryfile": "^4.0.8", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^3.0.4", - "read-config-file": "6.2.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.5", - "temp-file": "^3.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "asar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.1.0.tgz", - "integrity": "sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5" - } - }, - "boolean": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", - "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", - "dev": true, - "optional": true - }, - "bootstrap": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", - "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", - "requires": {} - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "optional": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builder-util": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.13.1.tgz", - "integrity": "sha512-gMdoW9aQbWYxuQ4k4jT4An1BTo/hWzvsdv3pwNz18iNYnqn9j+xMllQOg9CHgfQYKSUd8VuMsZnbCvLO4NltYw==", - "dev": true, - "requires": { - "@types/debug": "^4.1.6", - "@types/fs-extra": "^9.0.11", - "7zip-bin": "~5.1.1", - "app-builder-bin": "3.7.1", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.8.1", - "chalk": "^4.1.1", - "cross-spawn": "^7.0.3", - "debug": "^4.3.2", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "builder-util-runtime": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.8.1.tgz", - "integrity": "sha512-xHxAzdsJmMV8m/N+INzYUKfyJASeKyKHnA1uGkY8Y8JKLI/c4BG+If+L0If2YETv96CiRASkvd02tIt2pvrchQ==", - "dev": true, - "requires": { - "debug": "^4.3.2", - "sax": "^1.2.4" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chart.js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", - "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==" - }, - "chartjs-plugin-annotation": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-1.0.2.tgz", - "integrity": "sha512-asqP2/B+9tv105e3rwkzqoIgzhDBQRMzFRh/0ZTKqormxDXMP68uzxI5t3Fx8bxZSMNeEph0sY+0GIXXU0PeBQ==", - "requires": {} - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "optional": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.1.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "optional": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "dir-compare": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", - "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", - "dev": true, - "requires": { - "buffer-equal": "1.0.0", - "colors": "1.0.3", - "commander": "2.9.0", - "minimatch": "3.0.4" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, - "dmg-builder": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.13.1.tgz", - "integrity": "sha512-qgfLN2fo4q2wIWNvbcKlZ71DLRDLvWIElOB7oxlSxUrMi6xhI+9v1Mh7E0FJ+r5UXhQzaQXaGuyMsQRbGgrSwg==", - "dev": true, - "requires": { - "app-builder-lib": "22.13.1", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "dmg-license": "^1.0.9", - "fs-extra": "^10.0.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "dmg-license": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.9.tgz", - "integrity": "sha512-Rq6qMDaDou2+aPN2SYy0x7LDznoJ/XaG6oDcH5wXUp+WRWQMUYE6eM+F+nex+/LSXOp1uw4HLFoed0YbfU8R/Q==", - "dev": true, - "optional": true, - "requires": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "cli-truncate": "^1.1.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.6", - "plist": "^3.0.1", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", - "dev": true, - "requires": { - "jake": "^10.6.1" - } - }, - "electron": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-15.3.0.tgz", - "integrity": "sha512-YLzaKCFmSniNlz9+NUTNs7ssPyDc+bYOCYZ0b/D6DjVkOeIFz4SR8EYKqlOc8TcqlDNu18BbWqz6zbJPyAAURg==", - "dev": true, - "requires": { - "@electron/get": "^1.13.0", - "@types/node": "^14.6.2", - "extract-zip": "^1.0.3" - } - }, - "electron-builder": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.13.1.tgz", - "integrity": "sha512-ajlI40L60qKBBxvpf770kcjxHAccMpEWpwsHAppytl3WmWgJfMut4Wz9VUFqyNtX/9a624QTatk6TqoxqewRug==", - "dev": true, - "requires": { - "@types/yargs": "^17.0.1", - "app-builder-lib": "22.13.1", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "chalk": "^4.1.1", - "dmg-builder": "22.13.1", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.2.0", - "update-notifier": "^5.1.0", - "yargs": "^17.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "electron-osx-sign": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", - "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "electron-publish": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.13.1.tgz", - "integrity": "sha512-5nCXhnsqrRxP5NsZxUKjiMkcFmQglXp7i/YY4rp3h1s1psg3utOIkM29Z93YTSXicZJU1J+8811eo5HX1vpoKg==", - "dev": true, - "requires": { - "@types/fs-extra": "^9.0.11", - "builder-util": "22.13.1", - "builder-util-runtime": "8.8.1", - "chalk": "^4.1.1", - "fs-extra": "^10.0.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "optional": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "optional": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, - "global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "requires": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - } - }, - "globalthis": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", - "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", - "dev": true, - "optional": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "iconv-corefoundation": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz", - "integrity": "sha512-1NBe55C75bKGZaY9UHxvXG3G0gEp0ziht7quhuFrW3SPgZDw9HI6qvYXRSV5M/Eupyu8ljuJ6Cba+ec15PZ4Xw==", - "dev": true, - "optional": true, - "requires": { - "cli-truncate": "^1.1.0", - "node-addon-api": "^1.6.3" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "optional": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", - "dev": true, - "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^4.0.0" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true - }, - "plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", - "dev": true, - "requires": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7" - }, - "dependencies": { - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - } - } - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true, - "optional": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qth-locator": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/qth-locator/-/qth-locator-2.1.0.tgz", - "integrity": "sha512-QeF5nF/xkqeWQ363GgdK+qS40II/AYxpTCfrfg/yhOaXVOEdP9JZYBN72utWGyGD3GNr31hg5ivZDELCUUbs5w==" - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-config-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", - "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", - "dev": true, - "requires": { - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "requires": { - "type-fest": "^0.13.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true - }, - "stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "requires": { - "debug": "^4.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "requires": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "requires": { - "tmp": "^0.2.0" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "optional": true - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - } - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "optional": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/gui/package.json b/gui/package.json index 115dc934..df00b32e 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,6 +1,6 @@ { "name": "FreeDATA", - "version": "0.0.1", + "version": "0.1.2-alpha", "description": "FreeDATA ", "main": "main.js", "scripts": { @@ -8,12 +8,12 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "engines": { - "node": ">=12.0.0", + "node": ">=14.0.0", "npm": ">=6.0.0" }, "repository": { "type": "git", - "url": "git+https://github.com/DJ2LS/FreeDATA.git" + "url": "https://github.com/DJ2LS/FreeDATA.git" }, "keywords": [ "TNC", @@ -26,15 +26,64 @@ "bugs": { "url": "https://github.com/DJ2LS/FreeDATA/issues" }, - "homepage": "https://github.com/DJ2LS/FreeDATA#readme", + "homepage": "https://freedata.app", "dependencies": { "bootstrap": "^5.1.0", + "bootstrap-icons": "^1.8.1", + "bootswatch": "^5.1.3", "chart.js": "^3.5.1", "chartjs-plugin-annotation": "^1.0.2", - "qth-locator": "^2.1.0" + "electron-log": "^4.4.6", + "electron-updater": "^5.0.0", + "pouchdb": "^7.2.2", + "qth-locator": "^2.1.0", + "uuid": "^8.3.2" }, "devDependencies": { - "electron": "^15.0.0", - "electron-builder": "^22.11.7" + "electron": "^17.0.0", + "electron-builder": "^22.14.13" + }, + "build": { + "productName": "FreeDATA", + "appId": "app.freedata", + "directories": { + "buildResources": "src/img", + "output": "dist" + }, + "dmg": { + "icon": "src/img/icon.png", + "contents": [ + { + "x": 130, + "y": 220 + }, + { + "x": 410, + "y": 220, + "type": "link", + "path": "/Applications" + } + ] + }, + "win": { + "icon": "src/img/icon.png", + "target": [ + "nsis" + ] + }, + "linux": { + "icon": "src/img/icon.png", + "target": [ + "AppImage" + ], + "category": "Development" + }, + "publish": { + "provider": "github", + "releaseType": "release" + }, + "extraResources": [ + "./tnc/**" + ] } } diff --git a/gui/preload-chat.js b/gui/preload-chat.js index e0ab4cf7..851c43ec 100644 --- a/gui/preload-chat.js +++ b/gui/preload-chat.js @@ -3,87 +3,293 @@ const { ipcRenderer } = require('electron') +const { v4: uuidv4 } = require('uuid'); + // https://stackoverflow.com/a/26227660 var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") var configFolder = path.join(appDataFolder, "FreeDATA"); var configPath = path.join(configFolder, 'config.json') const config = require(configPath); -var chatDB = path.join(configFolder, 'chatDB.json') + +// set date format +const dateFormat = new Intl.DateTimeFormat('en-GB', { + timeStyle: 'long', + dateStyle: 'full' +}); + +// split character +const split_char = '\0;' + + +var chatDB = path.join(configFolder, 'chatDB') + +// ---- MessageDB +var PouchDB = require('pouchdb'); +var db = new PouchDB(chatDB); + + + +// get all messages from database +//var messages = db.get("messages").value() + +// get all dxcallsigns in database + + + +var dxcallsigns = new Set(); + +db.allDocs({ + include_docs: true, + attachments: true +}).then(function (result) { + // handle result + // get all dxcallsigns and append to list + result.rows.forEach(function(item) { + update_chat(item.doc) + }); + +}).catch(function (err) { + console.log(err); +}); + // WINDOW LISTENER window.addEventListener('DOMContentLoaded', () => { + // SEND MSG document.getElementById("sendMessage").addEventListener("click", () => { - dxcallsign = document.getElementById('chatModuleDxCall').value + + var dxcallsign = document.getElementById('chatModuleDxCall').value + dxcallsign = dxcallsign.toUpperCase() message = document.getElementById('chatModuleMessage').value - + console.log(dxcallsign) let Data = { - command: "sendMessage", - dxcallsign : dxcallsign.toUpperCase(), - mode : 10, + command: "send_message", + dxcallsign : dxcallsign, + mode : 255, frames : 1, data : message, checksum : '123' }; - ipcRenderer.send('run-tnc-command', Data); + ipcRenderer.send('run-tnc-command', Data); + + + var uuid = uuidv4(); + db.post({ + _id: uuid, + timestamp: Math.floor(Date.now() / 1000), + dxcallsign: dxcallsign, + dxgrid: 'NULL', + msg: message, + checksum: 'NULL', + type: "transmit" + }).then(function (response) { + // handle response + console.log("new database entry") + console.log(response) + + }).catch(function (err) { + console.log(err); + }); + + + + + db.get(uuid).then(function (doc) { + // handle doc + update_chat(doc) + }).catch(function (err) { + console.log(err); + }); + + // scroll to bottom + var element = document.getElementById("message-container"); + element.scrollTo(0,element.scrollHeight); + + // clear input + document.getElementById('chatModuleMessage').value = '' + + + }) -}) -ipcRenderer.on('action-update-rx-msg-buffer', (event, arg) => { - var data = arg.data + + +}); + +ipcRenderer.on('action-new-msg-received', (event, arg) => { console.log(arg.data) - var tbl = document.getElementById("rx-msg-data"); - document.getElementById("rx-msg-data").innerHTML = '' - + var new_msg = arg.data + new_msg.forEach(function(item) { + console.log(item) + //for (i = 0; i < arg.data.length; i++) { + + let obj = new Object(); + + var encoded_data = atob(item.data); + var splitted_data = encoded_data.split(split_char) + + //obj.uuid = item.uuid; + item.checksum = splitted_data[2] + item.msg = splitted_data[3] + //obj.dxcallsign = item.dxcallsign; + //obj.dxgrid = item.dxgrid; + //obj.timestamp = item.timestamp; + + + + + + + + // check if message not exists in database. + // this might cause big cpu load of file is getting too big + /* + if(!JSON.stringify(db.get("messages")).includes(item.uuid)){ + console.log("new message: " + item); + db.get("messages").push(item).save(); + } + */ + + + db.put({ + _id: item.uuid, + timestamp: item.timestamp, + dxcallsign: item.dxcallsign, + dxgrid: item.dxgrid, + msg: item.msg, + checksum: item.checksum, + type: "received" + }).then(function (response) { + // handle response + console.log("new database entry") + console.log(response) + + }).catch(function (err) { + console.log(err); + }); + + + + + db.get(item.uuid).then(function (doc) { + // handle doc + + // timestamp + update_chat(doc) + }).catch(function (err) { + console.log(err); + }); + +console.log("...................................") +return + + + + + + + + + + }); - for (i = 0; i < arg.data.length; i++) { + + + + + +}); + + + + + + + + +// Update chat list +update_chat = function(obj) { + + var dxcallsign = obj.dxcallsign; + + // CALLSIGN LIST + if(!(document.getElementById('chat-' + dxcallsign + '-list'))){ + var new_callsign = ` + +
+
${dxcallsign}
+ +
+ +
+ + `; + document.getElementById('list-tab').insertAdjacentHTML("beforeend", new_callsign); + + var message_area = ` +
+ `; + document.getElementById('nav-tabContent').insertAdjacentHTML("beforeend", message_area); + + // create eventlistener for listening on clicking on a callsign + document.getElementById('chat-' + dxcallsign + '-list').addEventListener('click', function() { + document.getElementById('chatModuleDxCall').value = dxcallsign; + + // scroll to bottom + var element = document.getElementById("message-container"); + element.scrollTo(0,element.scrollHeight); + + }); + + } + // APPEND MESSAGES TO CALLSIGN + + var timestamp = dateFormat.format(obj.timestamp * 1000); - // now we update the received files list + if(!(document.getElementById('msg-' + obj._id))){ + if (obj.type == 'received'){ + var new_message = ` +
+

${timestamp}

+
+
+

${obj.msg}

+
+
+
+ `; + } + + if (obj.type == 'transmit'){ - var row = document.createElement("tr"); - //https://stackoverflow.com/q/51421470 - //https://stackoverflow.com/a/847196 - timestampRaw = arg.data[i]['TIMESTAMP'] - var date = new Date(timestampRaw * 1000); - var hours = date.getHours(); - var minutes = "0" + date.getMinutes(); - var seconds = "0" + date.getSeconds(); - var datetime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2); - - var timestamp = document.createElement("td"); - var timestampText = document.createElement('span'); - timestampText.innerText = datetime - timestamp.appendChild(timestampText); - - var dxCall = document.createElement("td"); - var dxCallText = document.createElement('span'); - dxCallText.innerText = arg.data[i]['DXCALLSIGN'] - dxCall.appendChild(dxCallText); - - var message = document.createElement("td"); - var messageText = document.createElement('span'); - var messageString = arg.data[i]['RXDATA'][0]['d'] //data - console.log(messageString) - messageText.innerText = messageString - message.appendChild(messageText); - - row.appendChild(timestamp); - row.appendChild(dxCall); - row.appendChild(message); - - tbl.appendChild(row); + var new_message = ` +
+

${timestamp}

+
+
+

${obj.msg}

+
+
+
+ `; + } + + var id = "chat-" + obj.dxcallsign + document.getElementById(id).insertAdjacentHTML("beforeend", new_message); + var element = document.getElementById("message-container"); + element.scrollTo(0,element.scrollHeight); } - ipcRenderer.send('run-tnc-command', {"command" : "delRxMsgBuffer"}); -}) +} diff --git a/gui/preload-log.js b/gui/preload-log.js new file mode 100644 index 00000000..55366ea9 --- /dev/null +++ b/gui/preload-log.js @@ -0,0 +1,73 @@ +const path = require('path'); +const {ipcRenderer} = require('electron'); + +// https://stackoverflow.com/a/26227660 +var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") +var configFolder = path.join(appDataFolder, "FreeDATA"); +var configPath = path.join(configFolder, 'config.json') +const config = require(configPath); + + + +// WINDOW LISTENER +window.addEventListener('DOMContentLoaded', () => { + // here we could add filter buttons, somewhen later.. + +}) + + +ipcRenderer.on('action-update-log', (event, arg) => { + + var entry = arg.entry + + // remove ANSI characters from string, caused by color logging + // https://stackoverflow.com/a/29497680 + entry = entry.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,'') + + + var tbl = document.getElementById("log"); + var row = document.createElement("tr"); + + var timestamp = document.createElement("td"); + var timestampText = document.createElement('span'); + datetime = new Date(); + timestampText.innerText = datetime.toISOString(); + timestamp.appendChild(timestampText); + + var logEntry = document.createElement("td"); + var logEntryText = document.createElement('span'); + logEntryText.innerText = entry + logEntry.appendChild(logEntryText); + + row.appendChild(timestamp); + row.appendChild(logEntry); + tbl.appendChild(row); + + + + if (logEntryText.innerText.includes('ALSA lib pcm')) { + row.classList.add("table-secondary"); + } + + if (logEntryText.innerText.includes('[info ]')) { + row.classList.add("table-info"); + } + if (logEntryText.innerText.includes('[debug ]')) { + row.classList.add("table-secondary"); + } + + if (logEntryText.innerText.includes('[warning ]')) { + row.classList.add("table-warning"); + } + + if (logEntryText.innerText.includes('[error ]')) { + row.classList.add("table-danger"); + } + + + // scroll to bottom of page + // https://stackoverflow.com/a/11715670 + window.scrollTo(0,document.body.scrollHeight); + + +}) diff --git a/gui/preload-main.js b/gui/preload-main.js index eee95f3e..f45a5e33 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -1,7 +1,5 @@ -const path = require('path') -const { - ipcRenderer -} = require('electron') +const path = require('path'); +const {ipcRenderer} = require('electron'); const sock = require('./sock.js'); const daemon = require('./daemon.js'); const fs = require('fs'); @@ -13,21 +11,47 @@ const { } = require('qth-locator'); const os = require('os'); +// split character used for appending addiotional data to files +const split_char = '\0;'; + + // https://stackoverflow.com/a/26227660 -var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") +var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config"); var configFolder = path.join(appDataFolder, "FreeDATA"); -var configPath = path.join(configFolder, 'config.json') +var configPath = path.join(configFolder, 'config.json'); const config = require(configPath); // START INTERVALL COMMAND EXECUTION FOR STATES -setInterval(daemon.getDaemonState, 1000) -setInterval(sock.getTncState, 150) -setInterval(sock.getRxBuffer, 1000) -setInterval(sock.getMsgRxBuffer, 1000) +//setInterval(sock.getRxBuffer, 1000); + // WINDOW LISTENER window.addEventListener('DOMContentLoaded', () => { + +document.getElementById('received_files_folder').addEventListener('click', () => { + + ipcRenderer.send('get-folder-path',{ + title: 'Title', + }); + + ipcRenderer.on('return-folder-paths',(event,data)=>{ + document.getElementById("received_files_folder").value = data.path.filePaths[0] + config.received_files_folder = data.path.filePaths[0] + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + }); +}) + +document.getElementById('openReceivedFilesFolder').addEventListener('click', () => { + + ipcRenderer.send('open-folder',{ + path: config.received_files_folder, + }); +}) + + + + /* // ENABLE BOOTSTRAP POPOVERS EVERYWHERE // https://getbootstrap.com/docs/5.0/components/popovers/#example-enable-popovers-everywhere @@ -37,61 +61,139 @@ window.addEventListener('DOMContentLoaded', () => { }) */ + + // DISABLE HAMLIB DIRECT AND RIGCTL ON WINDOWS + if(os.platform()=='win32' || os.platform()=='win64'){ + + document.getElementById("radio-control-switch1").style.disabled = true; + //document.getElementById("radio-control-switch2").style.disabled = true; + } + // ENABLE TOOLTIPS EVERYWHERE // https://getbootstrap.com/docs/5.1/components/tooltips/ var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl) + return new bootstrap.Tooltip(tooltipTriggerEl); }) // LOAD SETTINGS - document.getElementById("tnc_adress").value = config.tnc_host - document.getElementById("tnc_port").value = config.tnc_port - document.getElementById("myCall").value = config.mycall - document.getElementById("myGrid").value = config.mygrid + document.getElementById("tnc_adress").value = config.tnc_host; + document.getElementById("tnc_port").value = config.tnc_port; - document.getElementById('hamlib_deviceid').value = config.deviceid - document.getElementById('hamlib_serialspeed').value = config.serialspeed - document.getElementById('hamlib_ptt_protocol').value = config.pttprotocol + callsign_and_ssid = config.mycall.split("-"); + callsign = callsign_and_ssid[0]; + ssid = callsign_and_ssid[1]; + + document.getElementById("myCall").value = callsign; + document.getElementById("myCallSSID").value = ssid; + document.getElementById("myGrid").value = config.mygrid; + + document.getElementById('hamlib_deviceid').value = config.deviceid; + document.getElementById('hamlib_serialspeed').value = config.serialspeed_direct; + document.getElementById('hamlib_ptt_protocol').value = config.pttprotocol_direct; - document.getElementById("hamlib_rigctld_ip").value = config.rigctld_ip - document.getElementById("hamlib_rigctld_port").value = config.rigctld_port + document.getElementById("hamlib_rigctld_ip").value = config.rigctld_ip; + document.getElementById("hamlib_rigctld_port").value = config.rigctld_port; - document.getElementById("hamlib_deviceid_rigctl").value = config.deviceid_rigctl - document.getElementById("hamlib_serialspeed_rigctl").value = config.serialspeed_rigctl - document.getElementById("hamlib_ptt_protocol_rigctl").value = config.pttprotocol_rigctl + //document.getElementById("hamlib_deviceid_rigctl").value = config.deviceid_rigctl; + //document.getElementById("hamlib_serialspeed_rigctl").value = config.serialspeed_rigctl; + //document.getElementById("hamlib_ptt_protocol_rigctl").value = config.pttprotocol_rigctl; - document.getElementById('hamlib_serialspeed_advanced').value = config.serialspeed - document.getElementById('hamlib_ptt_protocol_advanced').value = config.pttprotocol - document.getElementById('hamlib_databits_advanced').value = config.data_bits - document.getElementById('hamlib_stopbits_advanced').value = config.stop_bits - document.getElementById('hamlib_handshake_advanced').value = config.handshake + document.getElementById('hamlib_serialspeed_advanced').value = config.serialspeed_direct; + document.getElementById('hamlib_ptt_protocol_advanced').value = config.pttprotocol_direct; + document.getElementById('hamlib_databits_advanced').value = config.data_bits_direct; + document.getElementById('hamlib_stopbits_advanced').value = config.stop_bits_direct; + document.getElementById('hamlib_handshake_advanced').value = config.handshake_direct; + + document.getElementById("beaconInterval").value = config.beacon_interval; + + document.getElementById("scatterSwitch").value = config.enable_scatter; + document.getElementById("fftSwitch").value = config.enable_fft; + document.getElementById("500HzModeSwitch").value = config.low_bandwith_mode; + + document.getElementById("received_files_folder").value = config.received_files_folder; + + + + if(config.enable_scatter == 'True'){ + document.getElementById("scatterSwitch").checked = true; + } else { + document.getElementById("scatterSwitch").checked = false; + } + + if(config.enable_fft == 'True'){ + document.getElementById("fftSwitch").checked = true; + } else { + document.getElementById("fftSwitch").checked = false; + } + + if(config.low_bandwith_mode == 'True'){ + document.getElementById("500HzModeSwitch").checked = true; + } else { + document.getElementById("500HzModeSwitch").checked = false; + } + + // theme selector + + if(config.theme != 'default'){ + + var theme_path = "../node_modules/bootswatch/dist/"+ config.theme +"/bootstrap.min.css"; + document.getElementById("theme_selector").value = config.theme; + document.getElementById("bootstrap_theme").href = theme_path; + } else { + var theme_path = "../node_modules/bootstrap/dist/css/bootstrap.min.css"; + document.getElementById("theme_selector").value = 'default'; + document.getElementById("bootstrap_theme").href = theme_path; + } + + + // Update channel selector + document.getElementById("update_channel_selector").value = config.update_channel; + + - document.getElementById("beaconInterval").value = config.beacon_interval if (config.spectrum == 'waterfall') { - document.getElementById("waterfall-scatter-switch1").checked = true - document.getElementById("waterfall-scatter-switch2").checked = false + document.getElementById("waterfall-scatter-switch1").checked = true; + document.getElementById("waterfall-scatter-switch2").checked = false; document.getElementById("scatter").style.visibility = 'hidden'; document.getElementById("waterfall").style.visibility = 'visible'; document.getElementById("waterfall").style.height = '100%'; } else { - document.getElementById("waterfall-scatter-switch1").checked = false - document.getElementById("waterfall-scatter-switch2").checked = true + document.getElementById("waterfall-scatter-switch1").checked = false; + document.getElementById("waterfall-scatter-switch2").checked = true; document.getElementById("scatter").style.visibility = 'visible'; document.getElementById("waterfall").style.visibility = 'hidden'; document.getElementById("waterfall").style.height = '0px'; } // radio control element - if (config.radiocontrol == 'rigctl') { - - document.getElementById("radio-control-switch1").checked = false - document.getElementById("radio-control-switch2").checked = true - document.getElementById("radio-control-switch3").checked = false + if (config.radiocontrol == 'direct') { + + document.getElementById("radio-control-switch0").checked = false; + document.getElementById("radio-control-switch1").checked = true; + //document.getElementById("radio-control-switch2").checked = false; + document.getElementById("radio-control-switch3").checked = false; + + //document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; + document.getElementById("radio-control-rigctld").style.visibility = 'hidden'; + //document.getElementById("radio-control-rigctl").style.display = 'none'; + document.getElementById("radio-control-rigctld").style.display = 'none'; + + document.getElementById("radio-control-direct").style.display = 'block'; + document.getElementById("radio-control-direct").style.visibility = 'visible'; + document.getElementById("radio-control-direct").style.height = '100%'; + + /* + } else if (config.radiocontrol == 'rigctl') { + + document.getElementById("radio-control-switch0").checked = false; + document.getElementById("radio-control-switch1").checked = false; + //document.getElementById("radio-control-switch2").checked = true; + document.getElementById("radio-control-switch3").checked = false; document.getElementById("radio-control-direct").style.visibility = 'hidden'; document.getElementById("radio-control-rigctld").style.visibility = 'hidden'; @@ -101,31 +203,33 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("radio-control-rigctl").style.display = 'block'; document.getElementById("radio-control-rigctl").style.visibility = 'visible'; document.getElementById("radio-control-rigctl").style.height = '100%'; - +*/ } else if (config.radiocontrol == 'rigctld') { - document.getElementById("radio-control-switch1").checked = false - document.getElementById("radio-control-switch2").checked = false - document.getElementById("radio-control-switch3").checked = true + document.getElementById("radio-control-switch0").checked = false; + document.getElementById("radio-control-switch1").checked = false; + //document.getElementById("radio-control-switch2").checked = false; + document.getElementById("radio-control-switch3").checked = true; document.getElementById("radio-control-direct").style.visibility = 'hidden'; - document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; + //document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; document.getElementById("radio-control-direct").style.display = 'none'; - document.getElementById("radio-control-rigctl").style.display = 'none'; + //document.getElementById("radio-control-rigctl").style.display = 'none'; document.getElementById("radio-control-rigctld").style.display = 'block'; document.getElementById("radio-control-rigctld").style.visibility = 'visible'; document.getElementById("radio-control-rigctld").style.height = '100%'; } else { + + document.getElementById("radio-control-switch0").checked = true; + document.getElementById("radio-control-switch1").checked = false; + //document.getElementById("radio-control-switch2").checked = false; + document.getElementById("radio-control-switch3").checked = false; - document.getElementById("radio-control-switch1").checked = true - document.getElementById("radio-control-switch2").checked = false - document.getElementById("radio-control-switch3").checked = false - - document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; + //document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; document.getElementById("radio-control-rigctld").style.visibility = 'hidden'; - document.getElementById("radio-control-rigctl").style.display = 'none'; + //document.getElementById("radio-control-rigctl").style.display = 'none'; document.getElementById("radio-control-rigctld").style.display = 'none'; document.getElementById("radio-control-direct").style.display = 'block'; @@ -136,12 +240,12 @@ window.addEventListener('DOMContentLoaded', () => { // remote tnc if (config.tnclocation == 'remote') { - document.getElementById("local-remote-switch1").checked = false - document.getElementById("local-remote-switch2").checked = true + document.getElementById("local-remote-switch1").checked = false; + document.getElementById("local-remote-switch2").checked = true; document.getElementById("remote-tnc-field").style.visibility = 'visible'; } else { - document.getElementById("local-remote-switch1").checked = true - document.getElementById("local-remote-switch2").checked = false + document.getElementById("local-remote-switch1").checked = true; + document.getElementById("local-remote-switch2").checked = false; document.getElementById("remote-tnc-field").style.visibility = 'hidden'; } @@ -154,6 +258,21 @@ window.addEventListener('DOMContentLoaded', () => { // on click radio control toggle view + // disabled + document.getElementById("radio-control-switch0").addEventListener("click", () => { + //document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; + document.getElementById("radio-control-rigctld").style.visibility = 'hidden'; + //document.getElementById("radio-control-rigctl").style.display = 'none'; + document.getElementById("radio-control-rigctld").style.display = 'none'; + + document.getElementById("radio-control-direct").style.display = 'block'; + document.getElementById("radio-control-direct").style.visibility = 'visible'; + document.getElementById("radio-control-direct").style.height = '100%'; + config.radiocontrol = 'disabled' + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + }); + + // direct document.getElementById("radio-control-switch1").addEventListener("click", () => { document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; @@ -164,10 +283,11 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("radio-control-direct").style.display = 'block'; document.getElementById("radio-control-direct").style.visibility = 'visible'; document.getElementById("radio-control-direct").style.height = '100%'; - config.radiocontrol = 'direct' + config.radiocontrol = 'direct'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); + /* // rigctl document.getElementById("radio-control-switch2").addEventListener("click", () => { document.getElementById("radio-control-direct").style.visibility = 'hidden'; @@ -175,24 +295,24 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("radio-control-direct").style.display = 'none'; document.getElementById("radio-control-rigctld").style.display = 'none'; - document.getElementById("radio-control-rigctl").style.display = 'block'; - document.getElementById("radio-control-rigctl").style.visibility = 'visible'; - document.getElementById("radio-control-rigctl").style.height = '100%'; - config.radiocontrol = 'rigctl' + //document.getElementById("radio-control-rigctl").style.display = 'block'; + //document.getElementById("radio-control-rigctl").style.visibility = 'visible'; + //document.getElementById("radio-control-rigctl").style.height = '100%'; + config.radiocontrol = 'rigctl'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); - + */ // rigctld document.getElementById("radio-control-switch3").addEventListener("click", () => { document.getElementById("radio-control-direct").style.visibility = 'hidden'; - document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; + //document.getElementById("radio-control-rigctl").style.visibility = 'hidden'; document.getElementById("radio-control-direct").style.display = 'none'; - document.getElementById("radio-control-rigctl").style.display = 'none'; + //document.getElementById("radio-control-rigctl").style.display = 'none'; document.getElementById("radio-control-rigctld").style.display = 'block'; document.getElementById("radio-control-rigctld").style.visibility = 'visible'; document.getElementById("radio-control-rigctld").style.height = '100%'; - config.radiocontrol = 'rigctld' + config.radiocontrol = 'rigctld'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); @@ -203,7 +323,7 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("scatter").style.visibility = 'hidden'; document.getElementById("waterfall").style.visibility = 'visible'; document.getElementById("waterfall").style.height = '100%'; - config.spectrum = 'waterfall' + config.spectrum = 'waterfall'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); // scatter @@ -211,132 +331,245 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("scatter").style.visibility = 'visible'; document.getElementById("waterfall").style.visibility = 'hidden'; document.getElementById("waterfall").style.height = '0px'; - config.spectrum = 'scatter' + config.spectrum = 'scatter'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); + + // on click remote tnc toggle view document.getElementById("local-remote-switch1").addEventListener("click", () => { - document.getElementById("local-remote-switch1").checked = true - document.getElementById("local-remote-switch2").checked = false + document.getElementById("local-remote-switch1").checked = true; + document.getElementById("local-remote-switch2").checked = false; document.getElementById("remote-tnc-field").style.visibility = 'hidden'; - config.tnclocation = 'localhost' + config.tnclocation = 'localhost'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); document.getElementById("local-remote-switch2").addEventListener("click", () => { - document.getElementById("local-remote-switch1").checked = false - document.getElementById("local-remote-switch2").checked = true + document.getElementById("local-remote-switch1").checked = false; + document.getElementById("local-remote-switch2").checked = true; document.getElementById("remote-tnc-field").style.visibility = 'visible'; - config.tnclocation = 'remote' + config.tnclocation = 'remote'; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); // on change port and host document.getElementById("tnc_adress").addEventListener("change", () => { - console.log(document.getElementById("tnc_adress").value) - config.tnc_host = document.getElementById("tnc_adress").value - config.daemon_host = document.getElementById("tnc_adress").value + console.log(document.getElementById("tnc_adress").value); + config.tnc_host = document.getElementById("tnc_adress").value; + config.daemon_host = document.getElementById("tnc_adress").value; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); // on change ping callsign document.getElementById("dxCall").addEventListener("change", () => { - document.getElementById("dataModalDxCall").value = document.getElementById("dxCall").value + document.getElementById("dataModalDxCall").value = document.getElementById("dxCall").value; }); // on change ping callsign document.getElementById("dataModalDxCall").addEventListener("change", () => { - document.getElementById("dxCall").value = document.getElementById("dataModalDxCall").value + document.getElementById("dxCall").value = document.getElementById("dataModalDxCall").value; }); document.getElementById("tnc_port").addEventListener("change", () => { - config.tnc_port = document.getElementById("tnc_port").value - config.daemon_port = parseInt(document.getElementById("tnc_port").value) + 1 + config.tnc_port = document.getElementById("tnc_port").value; + config.daemon_port = parseInt(document.getElementById("tnc_port").value) + 1; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); }); // saveMyCall button clicked document.getElementById("saveMyCall").addEventListener("click", () => { - callsign = document.getElementById("myCall").value - config.mycall = callsign.toUpperCase() + callsign = document.getElementById("myCall").value; + ssid = document.getElementById("myCallSSID").value; + callsign_ssid = callsign.toUpperCase() + '-' + ssid; + config.mycall = callsign_ssid; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); - daemon.saveMyCall(callsign) + daemon.saveMyCall(callsign_ssid); }); // saveMyGrid button clicked document.getElementById("saveMyGrid").addEventListener("click", () => { - grid = document.getElementById("myGrid").value - config.mygrid = grid + grid = document.getElementById("myGrid").value; + config.mygrid = grid; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); - daemon.saveMyGrid(grid) + daemon.saveMyGrid(grid); }); // startPing button clicked document.getElementById("sendPing").addEventListener("click", () => { - var dxcallsign = document.getElementById("dxCall").value - dxcallsign = dxcallsign.toUpperCase() - sock.sendPing(dxcallsign) + var dxcallsign = document.getElementById("dxCall").value; + dxcallsign = dxcallsign.toUpperCase(); + sock.sendPing(dxcallsign); }); // dataModalstartPing button clicked document.getElementById("dataModalSendPing").addEventListener("click", () => { - var dxcallsign = document.getElementById("dataModalDxCall").value - dxcallsign = dxcallsign.toUpperCase() - sock.sendPing(dxcallsign) + var dxcallsign = document.getElementById("dataModalDxCall").value; + dxcallsign = dxcallsign.toUpperCase(); + sock.sendPing(dxcallsign); }); - + + + + + + // open arq session + document.getElementById("openARQSession").addEventListener("click", () => { + var dxcallsign = document.getElementById("dataModalDxCall").value; + dxcallsign = dxcallsign.toUpperCase(); + sock.connectARQ(dxcallsign); + }); + + // close arq session + document.getElementById("closeARQSession").addEventListener("click", () => { + sock.disconnectARQ(); + }); // sendCQ button clicked document.getElementById("sendCQ").addEventListener("click", () => { - sock.sendCQ() + sock.sendCQ(); }); // Start beacon button clicked document.getElementById("startBeacon").addEventListener("click", () => { - interval = document.getElementById("beaconInterval").value - config.beacon_interval = interval + interval = document.getElementById("beaconInterval").value; + config.beacon_interval = interval; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); - sock.startBeacon(interval) + sock.startBeacon(interval); }); + + // sendscatter Switch clicked + document.getElementById("scatterSwitch").addEventListener("click", () => { + console.log(document.getElementById("scatterSwitch").checked); + if(document.getElementById("scatterSwitch").checked == true){ + config.enable_scatter = "True"; + } else { + config.enable_scatter = "False"; + } + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + }); + + // sendfft Switch clicked + document.getElementById("fftSwitch").addEventListener("click", () => { + if(document.getElementById("fftSwitch").checked == true){ + config.enable_fft = "True"; + } else { + config.enable_fft = "False"; + } + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + }); + + // enable 500z Switch clicked + document.getElementById("500HzModeSwitch").addEventListener("click", () => { + if(document.getElementById("500HzModeSwitch").checked == true){ + config.low_bandwith_mode = "True"; + } else { + config.low_bandwith_mode = "False"; + } + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + }); + + + + + // Theme selector clicked + document.getElementById("theme_selector").addEventListener("click", () => { + + var theme = document.getElementById("theme_selector").value; + if(theme != 'default'){ + var theme_path = "../node_modules/bootswatch/dist/"+ theme +"/bootstrap.min.css"; + } else { + var theme_path = "../node_modules/bootstrap/dist/css/bootstrap.min.css"; + } + + //update path to css file + document.getElementById("bootstrap_theme").href = theme_path + + config.theme = theme; + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + + }); + + // Update channel selector clicked + document.getElementById("update_channel_selector").addEventListener("click", () => { + config.update_channel = document.getElementById("update_channel_selector").value; + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + + }); + + + + + //screen size + window.addEventListener('resize',() => { + + config.screen_height = window.innerHeight; + config.screen_width = window.innerWidth; + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + }); + // Stop beacon button clicked document.getElementById("stopBeacon").addEventListener("click", () => { - sock.stopBeacon() + sock.stopBeacon(); }); // startTNC button clicked document.getElementById("startTNC").addEventListener("click", () => { + /* + var deviceid_rigctl = document.getElementById("hamlib_deviceid_rigctl").value; + var deviceport_rigctl = document.getElementById("hamlib_deviceport_rigctl").value; + var serialspeed_rigctl = document.getElementById("hamlib_serialspeed_rigctl").value; + var pttprotocol_rigctl = document.getElementById("hamlib_ptt_protocol_rigctl").value; + */ + var rigctld_ip = document.getElementById("hamlib_rigctld_ip").value; + var rigctld_port = document.getElementById("hamlib_rigctld_port").value; - var deviceid_rigctl = document.getElementById("hamlib_deviceid_rigctl").value - var deviceport_rigctl = document.getElementById("hamlib_deviceport_rigctl").value - var serialspeed_rigctl = document.getElementById("hamlib_serialspeed_rigctl").value - var pttprotocol_rigctl = document.getElementById("hamlib_ptt_protocol_rigctl").value + var deviceid = document.getElementById("hamlib_deviceid").value; + var deviceport = document.getElementById("hamlib_deviceport").value; + var serialspeed = document.getElementById("hamlib_serialspeed").value; + var pttprotocol = document.getElementById("hamlib_ptt_protocol").value; + + var mycall = document.getElementById("myCall").value; + var ssid = document.getElementById("myCallSSID").value; + callsign_ssid = mycall.toUpperCase() + '-' + ssid; - var rigctld_ip = document.getElementById("hamlib_rigctld_ip").value - var rigctld_port = document.getElementById("hamlib_rigctld_port").value - - var deviceid = document.getElementById("hamlib_deviceid").value - var deviceport = document.getElementById("hamlib_deviceport").value - var serialspeed = document.getElementById("hamlib_serialspeed").value - var pttprotocol = document.getElementById("hamlib_ptt_protocol").value - - var mycall = document.getElementById("myCall").value - mycall = mycall.toUpperCase() - var mygrid = document.getElementById("myGrid").value - var rx_audio = document.getElementById("audio_input_selectbox").value - var tx_audio = document.getElementById("audio_output_selectbox").value + var mygrid = document.getElementById("myGrid").value; + + var rx_audio = document.getElementById("audio_input_selectbox").value; + var tx_audio = document.getElementById("audio_output_selectbox").value; + + var pttport = document.getElementById("hamlib_ptt_port_advanced").value; + var data_bits = document.getElementById('hamlib_databits_advanced').value; + var stop_bits = document.getElementById('hamlib_stopbits_advanced').value; + var handshake = document.getElementById('hamlib_handshake_advanced').value; + + if (document.getElementById("scatterSwitch").checked == true){ + var enable_scatter = "True"; + } else { + var enable_scatter = "False"; + } + + + if (document.getElementById("fftSwitch").checked == true){ + var enable_fft = "True"; + } else { + var enable_fft = "False"; + } + + if (document.getElementById("500HzModeSwitch").checked == true){ + var low_bandwith_mode = "True"; + } else { + var low_bandwith_mode = "False"; + } - var pttport = document.getElementById("hamlib_ptt_port_advanced").value - var data_bits = document.getElementById('hamlib_databits_advanced').value - var stop_bits = document.getElementById('hamlib_stopbits_advanced').value - var handshake = document.getElementById('hamlib_handshake_advanced').value // loop through audio device list and select @@ -345,7 +578,7 @@ window.addEventListener('DOMContentLoaded', () => { if (device.value == rx_audio) { console.log(device.text); - config.rx_audio = device.text + config.rx_audio = device.text; } } @@ -355,34 +588,62 @@ window.addEventListener('DOMContentLoaded', () => { if (device.value == tx_audio) { console.log(device.text); - config.tx_audio = device.text + config.tx_audio = device.text; } } + + /* + // overriding settings for rigctl / direct + if (document.getElementById("radio-control-switch2").checked){ + var radiocontrol = 'rigctl'; + var deviceid = document.getElementById("hamlib_deviceid_rigctl").value; + var deviceport = document.getElementById("hamlib_deviceport_rigctl").value; + var serialspeed = document.getElementById("hamlib_serialspeed_rigctl").value; + var pttprotocol = document.getElementById("hamlib_ptt_protocol_rigctl").value; - config.radiocontrol = radiocontrol - config.mycall = mycall - config.mygrid = mygrid - config.deviceid = deviceid - config.deviceport = deviceport - config.serialspeed = serialspeed - config.pttprotocol = pttprotocol - config.pttport = pttport - config.data_bits = data_bits - config.stop_bits = stop_bits - config.handshake = handshake - config.deviceid_rigctl = deviceid_rigctl - config.serialspeed_rigctl = serialspeed_rigctl - config.pttprotocol_rigctl = pttprotocol_rigctl - config.rigctld_port = rigctld_port - config.rigctld_ip = rigctld_ip - config.deviceport_rigctl = deviceport_rigctl - + } else + */ + if (document.getElementById("radio-control-switch3").checked) { + var radiocontrol = 'rigctld'; + + } else if (document.getElementById("radio-control-switch1").checked) { + var radiocontrol = 'direct'; + + } else { + var radiocontrol = 'disabled'; + } + + + + + config.radiocontrol = radiocontrol; + config.mycall = callsign_ssid; + config.mygrid = mygrid; + config.deviceid = deviceid; + config.deviceport = deviceport; + config.serialspeed_direct = serialspeed; + config.pttprotocol_direct = pttprotocol; + config.pttport = pttport; + config.data_bits_direct = data_bits; + config.stop_bits_direct = stop_bits; + config.handshake_direct = handshake; + //config.deviceid_rigctl = deviceid_rigctl; + //config.serialspeed_rigctl = serialspeed_rigctl; + //config.pttprotocol_rigctl = pttprotocol_rigctl; + config.rigctld_port = rigctld_port; + config.rigctld_ip = rigctld_ip; + //config.deviceport_rigctl = deviceport_rigctl; + config.enable_scatter = enable_scatter; + config.enable_fft = enable_fft; + config.low_bandwith_mode = low_bandwith_mode; fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); // collapse settings screen + // deactivated this part so start / stop is a little bit more smooth. We are getting problems because of network delay + /* var collapseFirstRow = new bootstrap.Collapse(document.getElementById('collapseFirstRow'), {toggle: false}) collapseFirstRow.hide() var collapseSecondRow = new bootstrap.Collapse(document.getElementById('collapseSecondRow'), {toggle: false}) @@ -391,45 +652,42 @@ window.addEventListener('DOMContentLoaded', () => { collapseThirdRow.show() var collapseFourthRow = new bootstrap.Collapse(document.getElementById('collapseFourthRow'), {toggle: false}) collapseFourthRow.show() - - // overriding settings for rigctl / direct - if (document.getElementById("radio-control-switch2").checked){ - var radiocontrol = 'rigctl' - var deviceid = document.getElementById("hamlib_deviceid_rigctl").value - var deviceport = document.getElementById("hamlib_deviceport_rigctl").value - var serialspeed = document.getElementById("hamlib_serialspeed_rigctl").value - var pttprotocol = document.getElementById("hamlib_ptt_protocol_rigctl").value - - } else if (document.getElementById("radio-control-switch3").checked) { - var radiocontrol = 'rigctld' + */ - } else { - var radiocontrol = 'direct' - } - daemon.startTNC(mycall, mygrid, rx_audio, tx_audio, radiocontrol, deviceid, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port) + daemon.startTNC(callsign_ssid, mygrid, rx_audio, tx_audio, radiocontrol, deviceid, deviceport, pttprotocol, pttport, serialspeed, data_bits, stop_bits, handshake, rigctld_ip, rigctld_port, enable_fft, enable_scatter, low_bandwith_mode); }) + document.getElementById("tncLog").addEventListener("click", () => { + + ipcRenderer.send('request-open-tnc-log'); + + + +}) + + // stopTNC button clicked document.getElementById("stopTNC").addEventListener("click", () => { - daemon.stopTNC() + daemon.stopTNC(); // collapse settings screen + // deactivated this part so start / stop is a little bit more smooth. We are getting problems because of network delay + /* var collapseFirstRow = new bootstrap.Collapse(document.getElementById('collapseFirstRow'), {toggle: false}) collapseFirstRow.show() var collapseSecondRow = new bootstrap.Collapse(document.getElementById('collapseSecondRow'), {toggle: false}) collapseSecondRow.show() - var collapseThirdRow = new bootstrap.Collapse(document.getElementById('collapseThirdRow'), {toggle: false}) collapseThirdRow.hide() var collapseFourthRow = new bootstrap.Collapse(document.getElementById('collapseFourthRow'), {toggle: false}) collapseFourthRow.hide() - + */ @@ -457,33 +715,37 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("testHamlib").addEventListener("click", () => { - var data_bits = document.getElementById("hamlib_databits_advanced").value - var stop_bits = document.getElementById("hamlib_stopbits_advanced").value - var handshake = document.getElementById("hamlib_handshake_advanced").value - var pttport = document.getElementById("hamlib_ptt_port_advanced").value + var data_bits = document.getElementById("hamlib_databits_advanced").value; + var stop_bits = document.getElementById("hamlib_stopbits_advanced").value; + var handshake = document.getElementById("hamlib_handshake_advanced").value; + var pttport = document.getElementById("hamlib_ptt_port_advanced").value; - var rigctld_ip = document.getElementById("hamlib_rigctld_ip").value - var rigctld_port = document.getElementById("hamlib_rigctld_port").value + var rigctld_ip = document.getElementById("hamlib_rigctld_ip").value; + var rigctld_port = document.getElementById("hamlib_rigctld_port").value; - var deviceid = document.getElementById("hamlib_deviceid").value - var deviceport = document.getElementById("hamlib_deviceport").value - var serialspeed = document.getElementById("hamlib_serialspeed").value - var pttprotocol = document.getElementById("hamlib_ptt_protocol").value + var deviceid = document.getElementById("hamlib_deviceid").value; + var deviceport = document.getElementById("hamlib_deviceport").value; + var serialspeed = document.getElementById("hamlib_serialspeed").value; + var pttprotocol = document.getElementById("hamlib_ptt_protocol").value; + /* // overriding settings for rigctl / direct if (document.getElementById("radio-control-switch2").checked){ - var radiocontrol = 'rigctl' - var deviceid = document.getElementById("hamlib_deviceid_rigctl").value - var deviceport = document.getElementById("hamlib_deviceport_rigctl").value - var serialspeed = document.getElementById("hamlib_serialspeed_rigctl").value - var pttprotocol = document.getElementById("hamlib_ptt_protocol_rigctl").value + var radiocontrol = 'rigctl'; + var deviceid = document.getElementById("hamlib_deviceid_rigctl").value; + var deviceport = document.getElementById("hamlib_deviceport_rigctl").value; + var serialspeed = document.getElementById("hamlib_serialspeed_rigctl").value; + var pttprotocol = document.getElementById("hamlib_ptt_protocol_rigctl").value; - } else if (document.getElementById("radio-control-switch3").checked) { - var radiocontrol = 'rigctld' + } else */ + if (document.getElementById("radio-control-switch3").checked) { + var radiocontrol = 'rigctld'; + } else if (document.getElementById("radio-control-switch1").checked) { + var radiocontrol = 'direct'; } else { - var radiocontrol = 'direct' + var radiocontrol = 'disabled'; } @@ -504,17 +766,18 @@ window.addEventListener('DOMContentLoaded', () => { var fileList = document.getElementById("dataModalFile").files; var reader = new FileReader(); - //reader.readAsBinaryString(fileList[0]); - reader.readAsDataURL(fileList[0]); + reader.readAsBinaryString(fileList[0]); + //reader.readAsDataURL(fileList[0]); reader.onload = function(e) { // binary data - var data = e.target.result - console.log(data) + var data = e.target.result; + console.log(data); + let Data = { - command: "sendFile", + command: "send_file", dxcallsign: document.getElementById("dataModalDxCall").value.toUpperCase(), mode: document.getElementById("datamode").value, frames: document.getElementById("framesperburst").value, @@ -534,7 +797,7 @@ window.addEventListener('DOMContentLoaded', () => { // START TRANSMISSION document.getElementById("stopTransmission").addEventListener("click", () => { let Data = { - command: "stopTransmission" + command: "stop_transmission" }; ipcRenderer.send('run-tnc-command', Data); }) @@ -652,18 +915,19 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => { }; if (typeof(arg.scatter) == 'undefined') { - var scatterSize = 0 + var scatterSize = 0; } else { - var scatterSize = arg.scatter.length + var scatterSize = arg.scatter.length; } if (global.data != newdata && scatterSize > 0) { try { global.myChart.destroy(); } catch (e) { // myChart not yet created + console.log(e); } - global.data = newdata + global.data = newdata; var ctx = document.getElementById('scatter').getContext('2d'); @@ -676,127 +940,176 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => { // PTT STATE if (arg.ptt_state == 'True') { - document.getElementById("ptt_state").className = "btn btn-danger"; + document.getElementById("ptt_state").className = "btn btn-sm btn-danger"; } else if (arg.ptt_state == 'False') { - document.getElementById("ptt_state").className = "btn btn-success"; + document.getElementById("ptt_state").className = "btn btn-sm btn-success"; } else { - document.getElementById("ptt_state").className = "btn btn-secondary" + document.getElementById("ptt_state").className = "btn btn-sm btn-secondary"; + } + + // CHANNEL BUSY STATE + if (arg.channel_busy == 'True') { + document.getElementById("channel_busy").className = "btn btn-sm btn-danger"; + + } else if (arg.channel_busy == 'False') { + document.getElementById("channel_busy").className = "btn btn-sm btn-success"; + + } else { + document.getElementById("channel_busy").className = "btn btn-sm btn-secondary"; + } // BUSY STATE if (arg.busy_state == 'BUSY') { - document.getElementById("busy_state").className = "btn btn-danger"; - document.getElementById("startTransmission").disabled = true - document.getElementById("stopTransmission").disabled = false + document.getElementById("busy_state").className = "btn btn-sm btn-danger"; + + document.getElementById("startTransmission").disabled = true; + //document.getElementById("stopTransmission").disabled = false; } else if (arg.busy_state == 'IDLE') { - document.getElementById("busy_state").className = "btn btn-success"; + document.getElementById("busy_state").className = "btn btn-sm btn-success"; } else { - document.getElementById("busy_state").className = "btn btn-secondary" - document.getElementById("startTransmission").disabled = true - document.getElementById("stopTransmission").disabled = false + document.getElementById("busy_state").className = "btn btn-sm btn-secondary"; + document.getElementById("startTransmission").disabled = true; + //document.getElementById("stopTransmission").disabled = false; } // ARQ STATE if (arg.arq_state == 'True') { - document.getElementById("arq_state").className = "btn btn-warning"; - document.getElementById("startTransmission").disabled = true - document.getElementById("stopTransmission").disabled = false + document.getElementById("arq_state").className = "btn btn-sm btn-warning"; + //document.getElementById("startTransmission").disabled = true; + document.getElementById("startTransmission").disabled = false; + //document.getElementById("stopTransmission").disabled = false; } else if (arg.arq_state == 'False') { - document.getElementById("arq_state").className = "btn btn-secondary"; - document.getElementById("startTransmission").disabled = false - document.getElementById("stopTransmission").disabled = true + document.getElementById("arq_state").className = "btn btn-sm btn-secondary"; + document.getElementById("startTransmission").disabled = false; + //document.getElementById("stopTransmission").disabled = true; } else { - document.getElementById("arq_state").className = "btn btn-secondary" - document.getElementById("startTransmission").disabled = true - document.getElementById("stopTransmission").disabled = false + document.getElementById("arq_state").className = "btn btn-sm btn-secondary"; + //document.getElementById("startTransmission").disabled = true; + document.getElementById("startTransmission").disabled = false; + //document.getElementById("stopTransmission").disabled = false; } + // ARQ SESSION + if (arg.arq_session == 'True') { + document.getElementById("arq_session").className = "btn btn-sm btn-warning"; + + } else if (arg.arq_session == 'False') { + document.getElementById("arq_session").className = "btn btn-sm btn-secondary"; + + } else { + document.getElementById("arq_session").className = "btn btn-sm btn-secondary"; + + } + + + // BEACON STATE if (arg.beacon_state == 'True') { - document.getElementById("startBeacon").className = "btn btn-success spinner-grow" - document.getElementById("startBeacon").disabled = true - document.getElementById("beaconInterval").disabled = true - document.getElementById("stopBeacon").disabled = false + document.getElementById("startBeacon").className = "btn btn-sm btn-success spinner-grow"; + document.getElementById("startBeacon").disabled = true; + document.getElementById("beaconInterval").disabled = true; + document.getElementById("stopBeacon").disabled = false; } else if (arg.beacon_state == 'False') { - document.getElementById("startBeacon").className = "btn btn-success" - document.getElementById("startBeacon").disabled = false - document.getElementById("beaconInterval").disabled = false - document.getElementById("stopBeacon").disabled = true + document.getElementById("startBeacon").className = "btn btn-sm btn-success"; + document.getElementById("startBeacon").disabled = false; + document.getElementById("beaconInterval").disabled = false; + document.getElementById("stopBeacon").disabled = true; } else { - document.getElementById("startBeacon").className = "btn btn-success" - document.getElementById("startBeacon").disabled = false - document.getElementById("stopBeacon").disabled = true - document.getElementById("beaconInterval").disabled = false + document.getElementById("startBeacon").className = "btn btn-sm btn-success"; + document.getElementById("startBeacon").disabled = false; + document.getElementById("stopBeacon").disabled = true; + document.getElementById("beaconInterval").disabled = false; } // RMS - document.getElementById("rms_level").setAttribute("aria-valuenow", arg.rms_level) - document.getElementById("rms_level").setAttribute("style", "width:" + arg.rms_level + "%;") + document.getElementById("rms_level").setAttribute("aria-valuenow", arg.rms_level); + document.getElementById("rms_level").setAttribute("style", "width:" + arg.rms_level + "%;"); // SET FREQUENCY - document.getElementById("frequency").innerHTML = arg.frequency + document.getElementById("frequency").innerHTML = arg.frequency; // SET MODE - document.getElementById("mode").innerHTML = arg.mode + document.getElementById("mode").innerHTML = arg.mode; // SET BANDWITH - document.getElementById("bandwith").innerHTML = arg.bandwith + document.getElementById("bandwith").innerHTML = arg.bandwith; // SET BYTES PER MINUTE if (typeof(arg.arq_bytes_per_minute) == 'undefined') { - var arq_bytes_per_minute = 0 + var arq_bytes_per_minute = 0; } else { - var arq_bytes_per_minute = arg.arq_bytes_per_minute + var arq_bytes_per_minute = arg.arq_bytes_per_minute; } - document.getElementById("bytes_per_min").innerHTML = arq_bytes_per_minute + document.getElementById("bytes_per_min").innerHTML = arq_bytes_per_minute; // SET BYTES PER MINUTE COMPRESSED if (typeof(arg.arq_bytes_per_minute) == 'undefined') { - var arq_bytes_per_minute_compressed = 0 + var arq_bytes_per_minute_compressed = 0; } else { - var arq_bytes_per_minute_compressed = Math.round(arg.arq_bytes_per_minute * arg.arq_compression_factor) + var arq_bytes_per_minute_compressed = Math.round(arg.arq_bytes_per_minute * arg.arq_compression_factor); } - document.getElementById("bytes_per_min_compressed").innerHTML = arq_bytes_per_minute_compressed + document.getElementById("bytes_per_min_compressed").innerHTML = arq_bytes_per_minute_compressed; + + + // SET SPEED LEVEL + + if(arg.speed_level >= 0) { + document.getElementById("speed_level").className = "bi bi-reception-1"; + } + if(arg.speed_level >= 1) { + document.getElementById("speed_level").className = "bi bi-reception-2"; + } + if(arg.speed_level >= 2) { + document.getElementById("speed_level").className = "bi bi-reception-3"; + } + if(arg.speed_level >= 3) { + document.getElementById("speed_level").className = "bi bi-reception-4"; + } + if(arg.speed_level >= 4) { + document.getElementById("speed_level").className = "bi bi-reception-4"; + } + // SET TOTAL BYTES if (typeof(arg.total_bytes) == 'undefined') { - var total_bytes = 0 + var total_bytes = 0; } else { - var total_bytes = arg.total_bytes + var total_bytes = arg.total_bytes; } - document.getElementById("total_bytes").innerHTML = total_bytes - document.getElementById("transmission_progress").setAttribute("aria-valuenow", arg.arq_transmission_percent) - document.getElementById("transmission_progress").setAttribute("style", "width:" + arg.arq_transmission_percent + "%;") + document.getElementById("total_bytes").innerHTML = total_bytes; + document.getElementById("transmission_progress").setAttribute("aria-valuenow", arg.arq_transmission_percent); + document.getElementById("transmission_progress").setAttribute("style", "width:" + arg.arq_transmission_percent + "%;"); // UPDATE HEARD STATIONS var tbl = document.getElementById("heardstations"); - document.getElementById("heardstations").innerHTML = '' + document.getElementById("heardstations").innerHTML = ''; if (typeof(arg.stations) == 'undefined') { - var heardStationsLength = 0 + var heardStationsLength = 0; } else { - var heardStationsLength = arg.stations.length + var heardStationsLength = arg.stations.length; } for (i = 0; i < heardStationsLength; i++) { // first we update the PING window - if (arg.stations[i]['DXCALLSIGN'] == document.getElementById("dxCall").value) { - var dxGrid = arg.stations[i]['DXGRID'] - var myGrid = document.getElementById("myGrid").value + if (arg.stations[i]['dxcallsign'] == document.getElementById("dxCall").value) { + var dxGrid = arg.stations[i]['dxgrid']; + var myGrid = document.getElementById("myGrid").value; try { var dist = parseInt(distance(myGrid, dxGrid)) + ' km'; - document.getElementById("pingDistance").innerHTML = dist - document.getElementById("dataModalPingDistance").innerHTML = dist + document.getElementById("pingDistance").innerHTML = dist; + document.getElementById("dataModalPingDistance").innerHTML = dist; } catch { - document.getElementById("pingDistance").innerHTML = '---' - document.getElementById("dataModalPingDistance").innerHTML = '---' + document.getElementById("pingDistance").innerHTML = '---'; + document.getElementById("dataModalPingDistance").innerHTML = '---'; } - document.getElementById("pingDB").innerHTML = arg.stations[i]['SNR'] - document.getElementById("dataModalPingDB").innerHTML = arg.stations[i]['SNR'] + document.getElementById("pingDB").innerHTML = arg.stations[i]['snr']; + document.getElementById("dataModalPingDB").innerHTML = arg.stations[i]['snr']; } // now we update the heard stations list @@ -804,7 +1117,7 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => { //https://stackoverflow.com/q/51421470 //https://stackoverflow.com/a/847196 - timestampRaw = arg.stations[i]['TIMESTAMP'] + timestampRaw = arg.stations[i]['timestamp']; var date = new Date(timestampRaw * 1000); var hours = date.getHours(); var minutes = "0" + date.getMinutes(); @@ -813,48 +1126,58 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => { var timestamp = document.createElement("td"); var timestampText = document.createElement('span'); - timestampText.innerText = datetime + timestampText.innerText = datetime; timestamp.appendChild(timestampText); var frequency = document.createElement("td"); var frequencyText = document.createElement('span'); - frequencyText.innerText = arg.stations[i]['FREQUENCY'] + frequencyText.innerText = arg.stations[i]['frequency']; frequency.appendChild(frequencyText); var dxCall = document.createElement("td"); var dxCallText = document.createElement('span'); - dxCallText.innerText = arg.stations[i]['DXCALLSIGN'] + dxCallText.innerText = arg.stations[i]['dxcallsign']; dxCall.appendChild(dxCallText); var dxGrid = document.createElement("td"); var dxGridText = document.createElement('span'); - dxGridText.innerText = arg.stations[i]['DXGRID'] + dxGridText.innerText = arg.stations[i]['dxgrid']; dxGrid.appendChild(dxGridText); var gridDistance = document.createElement("td"); var gridDistanceText = document.createElement('span'); try { - gridDistanceText.innerText = parseInt(distance(document.getElementById("myGrid").value, arg.stations[i]['DXGRID'])) + ' km'; + gridDistanceText.innerText = parseInt(distance(document.getElementById("myGrid").value, arg.stations[i]['dxgrid'])) + ' km'; } catch { - gridDistanceText.innerText = '---' + gridDistanceText.innerText = '---'; } gridDistance.appendChild(gridDistanceText); var dataType = document.createElement("td"); var dataTypeText = document.createElement('span'); - if(arg.stations[i]['DATATYPE'] == 'DATA-CHANNEL'){ - dataTypeText.innerText = 'DATA-C' + dataTypeText.innerText = arg.stations[i]['datatype']; + dataType.appendChild(dataTypeText); + + if(arg.stations[i]['datatype'] == 'DATA-CHANNEL'){ + dataTypeText.innerText = 'DATA-C'; dataType.appendChild(dataTypeText); } + if(arg.stations[i]['datatype'] == 'SESSION-HB'){ + dataTypeText.innerHTML = ''; + dataType.appendChild(dataTypeText); + } + if (dataTypeText.innerText == 'CQ CQ CQ') { row.classList.add("table-success"); + } if (dataTypeText.innerText == 'DATA-C') { + dataTypeText.innerHTML = ''; row.classList.add("table-warning"); } @@ -872,12 +1195,12 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => { var snr = document.createElement("td"); var snrText = document.createElement('span'); - snrText.innerText = arg.stations[i]['SNR'] + snrText.innerText = arg.stations[i]['snr']; snr.appendChild(snrText); var offset = document.createElement("td"); var offsetText = document.createElement('span'); - offsetText.innerText = arg.stations[i]['OFFSET'] + offsetText.innerText = arg.stations[i]['offset']; offset.appendChild(offsetText); row.appendChild(timestamp); @@ -895,148 +1218,139 @@ ipcRenderer.on('action-update-tnc-state', (event, arg) => { // DISPLAY INFO TOASTS if (typeof(arg.info) == 'undefined') { - var infoLength = 0 + var infoLength = 0; } else { - var infoLength = arg.info.length + var infoLength = arg.info.length; } for (i = 0; i < infoLength; i++) { // SENDING CQ TOAST if (arg.info[i] == "CQ;SENDING"){ - var toastCQsending = document.getElementById('toastCQsending') - var toast = bootstrap.Toast.getOrCreateInstance(toastCQsending) // Returns a Bootstrap toast instance - toast.show() + var toastCQsending = document.getElementById('toastCQsending'); + var toast = bootstrap.Toast.getOrCreateInstance(toastCQsending); // Returns a Bootstrap toast instance + toast.show(); } // RECEIVING CQ TOAST if (arg.info[i] == "CQ;RECEIVING"){ - var toastCQreceiving = document.getElementById('toastCQreceiving') - var toast = bootstrap.Toast.getOrCreateInstance(toastCQreceiving) // Returns a Bootstrap toast instance - toast.show() + var toastCQreceiving = document.getElementById('toastCQreceiving'); + var toast = bootstrap.Toast.getOrCreateInstance(toastCQreceiving); // Returns a Bootstrap toast instance + toast.show(); } // RECEIVING BEACON TOAST if (arg.info[i] == "BEACON;RECEIVING"){ - var toastBEACONreceiving = document.getElementById('toastBEACONreceiving') - var toast = bootstrap.Toast.getOrCreateInstance(toastBEACONreceiving) // Returns a Bootstrap toast instance - toast.show() + var toastBEACONreceiving = document.getElementById('toastBEACONreceiving'); + var toast = bootstrap.Toast.getOrCreateInstance(toastBEACONreceiving); // Returns a Bootstrap toast instance + toast.show(); } // SENDING PING TOAST if (arg.info[i] == "PING;SENDING"){ - var toastPINGsending = document.getElementById('toastPINGsending') - var toast = bootstrap.Toast.getOrCreateInstance(toastPINGsending) // Returns a Bootstrap toast instance - toast.show() + var toastPINGsending = document.getElementById('toastPINGsending'); + var toast = bootstrap.Toast.getOrCreateInstance(toastPINGsending); // Returns a Bootstrap toast instance + toast.show(); } // RECEIVING PING TOAST if (arg.info[i] == "PING;RECEIVING"){ - var toastPINGreceiving = document.getElementById('toastPINGreceiving') - var toast = bootstrap.Toast.getOrCreateInstance(toastPINGreceiving) // Returns a Bootstrap toast instance - toast.show() + var toastPINGreceiving = document.getElementById('toastPINGreceiving'); + var toast = bootstrap.Toast.getOrCreateInstance(toastPINGreceiving); // Returns a Bootstrap toast instance + toast.show(); } // RECEIVING PING ACK TOAST if (arg.info[i] == "PING;RECEIVEDACK"){ - var toastPINGreceivedACK = document.getElementById('toastPINGreceivedACK') - var toast = bootstrap.Toast.getOrCreateInstance(toastPINGreceivedACK) // Returns a Bootstrap toast instance - toast.show() + var toastPINGreceivedACK = document.getElementById('toastPINGreceivedACK'); + var toast = bootstrap.Toast.getOrCreateInstance(toastPINGreceivedACK); // Returns a Bootstrap toast instance + toast.show(); } // DATACHANNEL OPENING TOAST if (arg.info[i] == "DATACHANNEL;OPENING"){ - var toastDATACHANNELopening = document.getElementById('toastDATACHANNELopening') - var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELopening) // Returns a Bootstrap toast instance - toast.show() + var toastDATACHANNELopening = document.getElementById('toastDATACHANNELopening'); + var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELopening); // Returns a Bootstrap toast instance + toast.show(); } // DATACHANNEL OPEN TOAST if (arg.info[i] == "DATACHANNEL;OPEN"){ - var toastDATACHANNELopen = document.getElementById('toastDATACHANNELopen') - var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELopen) // Returns a Bootstrap toast instance - toast.show() + var toastDATACHANNELopen = document.getElementById('toastDATACHANNELopen'); + var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELopen); // Returns a Bootstrap toast instance + toast.show(); } // DATACHANNEL RECEIVEDOPENER TOAST if (arg.info[i] == "DATACHANNEL;RECEIVEDOPENER"){ - var toastDATACHANNELreceivedopener = document.getElementById('toastDATACHANNELreceivedopener') - var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELreceivedopener) // Returns a Bootstrap toast instance - toast.show() + var toastDATACHANNELreceivedopener = document.getElementById('toastDATACHANNELreceivedopener'); + var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELreceivedopener); // Returns a Bootstrap toast instance + toast.show(); } // TRANSMISSION STOPPED if (arg.info[i] == "TRANSMISSION;STOPPED"){ - var toastDATACHANNELreceivedopener = document.getElementById('toastTRANSMISSIONstopped') - var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELreceivedopener) // Returns a Bootstrap toast instance - toast.show() + var toastDATACHANNELreceivedopener = document.getElementById('toastTRANSMISSIONstopped'); + var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELreceivedopener); // Returns a Bootstrap toast instance + toast.show(); } - - + // DATACHANNEL FAILED TOAST if (arg.info[i] == "DATACHANNEL;FAILED"){ - var toastDATACHANNELfailed = document.getElementById('toastDATACHANNELfailed') - var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELfailed) // Returns a Bootstrap toast instance - toast.show() + var toastDATACHANNELfailed = document.getElementById('toastDATACHANNELfailed'); + var toast = bootstrap.Toast.getOrCreateInstance(toastDATACHANNELfailed); // Returns a Bootstrap toast instance + toast.show(); } // ARQ RECEIVING TOAST if (arg.info[i] == "ARQ;RECEIVING"){ document.getElementById("transmission_progress").className = "progress-bar progress-bar-striped progress-bar-animated bg-primary"; - var toastARQreceiving = document.getElementById('toastARQreceiving') - var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceiving) // Returns a Bootstrap toast instance - toast.show() + var toastARQreceiving = document.getElementById('toastARQreceiving'); + var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceiving); // Returns a Bootstrap toast instance + toast.show(); } // ARQ RECEIVING SUCCESS TOAST + console.log(arg.info[i]) if (arg.info[i] == "ARQ;RECEIVING;SUCCESS"){ document.getElementById("transmission_progress").className = "progress-bar progress-bar-striped bg-success"; - var toastARQreceivingsuccess = document.getElementById('toastARQreceivingsuccess') - var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceivingsuccess) // Returns a Bootstrap toast instance - toast.show() + var toastARQreceivingsuccess = document.getElementById('toastARQreceivingsuccess'); + var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceivingsuccess); // Returns a Bootstrap toast instance + toast.show(); } // ARQ RECEIVING FAILED TOAST if (arg.info[i] == "ARQ;RECEIVING;FAILED"){ document.getElementById("transmission_progress").className = "progress-bar progress-bar-striped bg-danger"; - var toastARQreceivingfailed = document.getElementById('toastARQreceivingfailed') - var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceivingfailed) // Returns a Bootstrap toast instance - toast.show() + var toastARQreceivingfailed = document.getElementById('toastARQreceivingfailed'); + var toast = bootstrap.Toast.getOrCreateInstance(toastARQreceivingfailed); // Returns a Bootstrap toast instance + toast.show(); } // ARQ TRANSMITTING TOAST if (arg.info[i] == "ARQ;TRANSMITTING"){ document.getElementById("transmission_progress").className = "progress-bar progress-bar-striped progress-bar-animated bg-primary"; - var toastARQtransmitting = document.getElementById('toastARQtransmitting') - var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmitting) // Returns a Bootstrap toast instance - toast.show() + var toastARQtransmitting = document.getElementById('toastARQtransmitting'); + var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmitting); // Returns a Bootstrap toast instance + toast.show(); } // ARQ TRANSMITTING SUCCESS TOAST if (arg.info[i] == "ARQ;TRANSMITTING;SUCCESS"){ document.getElementById("transmission_progress").className = "progress-bar progress-bar-striped bg-success"; - var toastARQtransmittingsuccess = document.getElementById('toastARQtransmittingsuccess') - var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmittingsuccess) // Returns a Bootstrap toast instance - toast.show() + var toastARQtransmittingsuccess = document.getElementById('toastARQtransmittingsuccess'); + var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmittingsuccess); // Returns a Bootstrap toast instance + toast.show(); } // ARQ TRANSMITTING FAILED TOAST if (arg.info[i] == "ARQ;TRANSMITTING;FAILED"){ document.getElementById("transmission_progress").className = "progress-bar progress-bar-striped bg-danger"; - var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmittingfailed) // Returns a Bootstrap toast instance - toast.show() - } - - - - - - - - - + var toast = bootstrap.Toast.getOrCreateInstance(toastARQtransmittingfailed); // Returns a Bootstrap toast instance + toast.show(); + } } }); @@ -1053,34 +1367,37 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { document.getElementById("progressbar_cpu").setAttribute("style", "width:" + arg.cpu_usage + "%;") document.getElementById("progressbar_cpu_value").innerHTML = arg.cpu_usage + "%" */ + /* document.getElementById("ram_load").innerHTML = arg.ram_usage + "%" document.getElementById("cpu_load").innerHTML = arg.cpu_usage + "%" - + */ // OPERATING SYSTEM //document.getElementById("operating_system").innerHTML = "OS " + os.type() - + /* // PYTHON VERSION document.getElementById("python_version").innerHTML = "Python " + arg.python_version document.getElementById("python_version").className = "btn btn-sm btn-success"; - + */ + /* // HAMLIB VERSION document.getElementById("hamlib_version").innerHTML = "Hamlib " + arg.hamlib_version document.getElementById("hamlib_version").className = "btn btn-sm btn-success"; - + */ + /* // NODE VERSION document.getElementById("node_version").innerHTML = "Node " + process.version document.getElementById("node_version").className = "btn btn-sm btn-success"; - + */ // UPDATE AUDIO INPUT if (arg.tnc_running_state == "stopped") { if (document.getElementById("audio_input_selectbox").length != arg.input_devices.length) { - document.getElementById("audio_input_selectbox").innerHTML = "" + document.getElementById("audio_input_selectbox").innerHTML = ""; for (i = 0; i < arg.input_devices.length; i++) { var option = document.createElement("option"); - option.text = arg.input_devices[i]['NAME']; - option.value = arg.input_devices[i]['ID']; + option.text = arg.input_devices[i]['name']; + option.value = arg.input_devices[i]['id']; // set device from config if available if(config.rx_audio == option.text){ @@ -1093,11 +1410,11 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { // UPDATE AUDIO OUTPUT if (arg.tnc_running_state == "stopped") { if (document.getElementById("audio_output_selectbox").length != arg.output_devices.length) { - document.getElementById("audio_output_selectbox").innerHTML = "" + document.getElementById("audio_output_selectbox").innerHTML = ""; for (i = 0; i < arg.output_devices.length; i++) { var option = document.createElement("option"); - option.text = arg.output_devices[i]['NAME']; - option.value = arg.output_devices[i]['ID']; + option.text = arg.output_devices[i]['name']; + option.value = arg.output_devices[i]['id']; // set device from config if available if(config.tx_audio == option.text){ option.setAttribute('selected', true); @@ -1110,11 +1427,11 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { // UPDATE SERIAL DEVICES if (arg.tnc_running_state == "stopped") { if (document.getElementById("hamlib_deviceport").length != arg.serial_devices.length) { - document.getElementById("hamlib_deviceport").innerHTML = "" + document.getElementById("hamlib_deviceport").innerHTML = ""; for (i = 0; i < arg.serial_devices.length; i++) { var option = document.createElement("option"); - option.text = arg.serial_devices[i]['DESCRIPTION']; - option.value = arg.serial_devices[i]['PORT']; + option.text = arg.serial_devices[i]['description']; + option.value = arg.serial_devices[i]['port']; // set device from config if available if(config.deviceport == option.value){ option.setAttribute('selected', true); @@ -1126,11 +1443,11 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { // advanced settings if (document.getElementById("hamlib_deviceport_advanced").length != arg.serial_devices.length) { - document.getElementById("hamlib_deviceport_advanced").innerHTML = "" + document.getElementById("hamlib_deviceport_advanced").innerHTML = ""; for (i = 0; i < arg.serial_devices.length; i++) { var option = document.createElement("option"); - option.text = arg.serial_devices[i]['DESCRIPTION']; - option.value = arg.serial_devices[i]['PORT']; + option.text = arg.serial_devices[i]['description']; + option.value = arg.serial_devices[i]['port']; // set device from config if available if(config.deviceport == option.value){ option.setAttribute('selected', true); @@ -1139,13 +1456,14 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { } } + /* // rigctl settings if (document.getElementById("hamlib_deviceport_rigctl").length != arg.serial_devices.length) { - document.getElementById("hamlib_deviceport_rigctl").innerHTML = "" + document.getElementById("hamlib_deviceport_rigctl").innerHTML = ""; for (i = 0; i < arg.serial_devices.length; i++) { var option = document.createElement("option"); - option.text = arg.serial_devices[i]['DESCRIPTION']; - option.value = arg.serial_devices[i]['PORT']; + option.text = arg.serial_devices[i]['description']; + option.value = arg.serial_devices[i]['port']; // set device from config if available if(config.deviceport == option.value){ option.setAttribute('selected', true); @@ -1153,17 +1471,18 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { document.getElementById("hamlib_deviceport_rigctl").add(option); } } + */ } if (arg.tnc_running_state == "stopped") { if (document.getElementById("hamlib_ptt_port_advanced").length != arg.serial_devices.length) { - document.getElementById("hamlib_ptt_port_advanced").innerHTML = "" + document.getElementById("hamlib_ptt_port_advanced").innerHTML = ""; for (i = 0; i < arg.serial_devices.length; i++) { var option = document.createElement("option"); - option.text = arg.serial_devices[i]['DESCRIPTION']; - option.value = arg.serial_devices[i]['PORT']; + option.text = arg.serial_devices[i]['description']; + option.value = arg.serial_devices[i]['port']; // set device from config if available if(config.pttport == option.value){ option.setAttribute('selected', true); @@ -1174,72 +1493,12 @@ ipcRenderer.on('action-update-daemon-state', (event, arg) => { } - // TNC RUNNING STATE - //document.getElementById("tnc_running_state").innerHTML = arg.tnc_running_state; - if (arg.tnc_running_state == "running") { - document.getElementById('hamlib_deviceid').disabled = true - document.getElementById('hamlib_deviceport').disabled = true - document.getElementById('advancedHamlibSettingsButton').disabled = true - document.getElementById('testHamlib').disabled = true - document.getElementById('hamlib_ptt_protocol').disabled = true - document.getElementById('audio_input_selectbox').disabled = true - document.getElementById('audio_output_selectbox').disabled = true - document.getElementById('stopTNC').disabled = false - document.getElementById('startTNC').disabled = true - //document.getElementById('myCall').disabled = false - document.getElementById('dxCall').disabled = false - //document.getElementById('saveMyCall').disabled = false - //document.getElementById('myGrid').disabled = false - //document.getElementById('saveMyGrid').disabled = false - document.getElementById("hamlib_serialspeed").disabled = true - //document.getElementById("startTransmission").disabled = false - document.getElementById("openDataModule").disabled = false - - // collapse settings screen - var collapseFirstRow = new bootstrap.Collapse(document.getElementById('collapseFirstRow'), {toggle: false}) - collapseFirstRow.hide() - var collapseSecondRow = new bootstrap.Collapse(document.getElementById('collapseSecondRow'), {toggle: false}) - collapseSecondRow.hide() - var collapseThirdRow = new bootstrap.Collapse(document.getElementById('collapseThirdRow'), {toggle: false}) - collapseThirdRow.show() - var collapseFourthRow = new bootstrap.Collapse(document.getElementById('collapseFourthRow'), {toggle: false}) - collapseFourthRow.show() - } else { - document.getElementById('hamlib_deviceid').disabled = false - document.getElementById('hamlib_deviceport').disabled = false - document.getElementById('advancedHamlibSettingsButton').disabled = false - document.getElementById('testHamlib').disabled = false - document.getElementById('hamlib_ptt_protocol').disabled = false - document.getElementById('audio_input_selectbox').disabled = false - document.getElementById('audio_output_selectbox').disabled = false - document.getElementById('stopTNC').disabled = true - document.getElementById('startTNC').disabled = false - //document.getElementById('myCall').disabled = true - document.getElementById('dxCall').disabled = true - //document.getElementById('saveMyCall').disabled = true - //document.getElementById('myGrid').disabled = true - //document.getElementById('saveMyGrid').disabled = true - document.getElementById("hamlib_serialspeed").disabled = false - //document.getElementById("startTransmission").disabled = true - document.getElementById("openDataModule").disabled = true - - // collapse settings screen - var collapseFirstRow = new bootstrap.Collapse(document.getElementById('collapseFirstRow'), {toggle: false}) - collapseFirstRow.show() - var collapseSecondRow = new bootstrap.Collapse(document.getElementById('collapseSecondRow'), {toggle: false}) - collapseSecondRow.show() - var collapseThirdRow = new bootstrap.Collapse(document.getElementById('collapseThirdRow'), {toggle: false}) - collapseThirdRow.hide() - var collapseFourthRow = new bootstrap.Collapse(document.getElementById('collapseFourthRow'), {toggle: false}) - collapseFourthRow.hide() - } - }); // ACTION UPDATE HAMLIB TEST ipcRenderer.on('action-update-hamlib-test', (event, arg) => { - console.log(arg.hamlib_result) + console.log(arg.hamlib_result); if (arg.hamlib_result == 'SUCCESS') { document.getElementById("testHamlib").className = "btn btn-sm btn-success"; // BUTTON HAS BEEN REMOVED @@ -1263,55 +1522,114 @@ ipcRenderer.on('action-update-hamlib-test', (event, arg) => { - - ipcRenderer.on('action-update-daemon-connection', (event, arg) => { if (arg.daemon_connection == 'open') { document.getElementById("daemon_connection_state").className = "btn btn-success"; - document.getElementById("blurdiv").style.webkitFilter = "blur(0px)"; + //document.getElementById("blurdiv").style.webkitFilter = "blur(0px)"; } if (arg.daemon_connection == 'opening') { document.getElementById("daemon_connection_state").className = "btn btn-warning"; - document.getElementById("blurdiv").style.webkitFilter = "blur(10px)"; + //document.getElementById("blurdiv").style.webkitFilter = "blur(10px)"; } if (arg.daemon_connection == 'closed') { document.getElementById("daemon_connection_state").className = "btn btn-danger"; - document.getElementById("blurdiv").style.webkitFilter = "blur(10px)"; + //document.getElementById("blurdiv").style.webkitFilter = "blur(10px)"; } }); -ipcRenderer.on('action-update-rx-buffer', (event, arg) => { +ipcRenderer.on('action-update-tnc-connection', (event, arg) => { - var data = arg.data["DATA"] + if (arg.tnc_connection == "open") { + document.getElementById('hamlib_deviceid').disabled = true; + document.getElementById('hamlib_deviceport').disabled = true; + document.getElementById('advancedHamlibSettingsButton').disabled = true; + document.getElementById('testHamlib').disabled = true; + document.getElementById('hamlib_ptt_protocol').disabled = true; + document.getElementById('audio_input_selectbox').disabled = true; + document.getElementById('audio_output_selectbox').disabled = true; + //document.getElementById('stopTNC').disabled = false; + document.getElementById('startTNC').disabled = true; + document.getElementById('dxCall').disabled = false; + document.getElementById("hamlib_serialspeed").disabled = true; + document.getElementById("openDataModule").disabled = false; + + // collapse settings screen + var collapseFirstRow = new bootstrap.Collapse(document.getElementById('collapseFirstRow'), {toggle: false}) + collapseFirstRow.hide(); + var collapseSecondRow = new bootstrap.Collapse(document.getElementById('collapseSecondRow'), {toggle: false}) + collapseSecondRow.hide(); + var collapseThirdRow = new bootstrap.Collapse(document.getElementById('collapseThirdRow'), {toggle: false}) + collapseThirdRow.show(); + var collapseFourthRow = new bootstrap.Collapse(document.getElementById('collapseFourthRow'), {toggle: false}) + collapseFourthRow.show(); + } else { + document.getElementById('hamlib_deviceid').disabled = false; + document.getElementById('hamlib_deviceport').disabled = false; + document.getElementById('advancedHamlibSettingsButton').disabled = false; + document.getElementById('testHamlib').disabled = false; + document.getElementById('hamlib_ptt_protocol').disabled = false; + document.getElementById('audio_input_selectbox').disabled = false; + document.getElementById('audio_output_selectbox').disabled = false; + //document.getElementById('stopTNC').disabled = true; + document.getElementById('startTNC').disabled = false; + document.getElementById('dxCall').disabled = true; + document.getElementById("hamlib_serialspeed").disabled = false; + document.getElementById("openDataModule").disabled = true; + + // collapse settings screen + var collapseFirstRow = new bootstrap.Collapse(document.getElementById('collapseFirstRow'), {toggle: false}) + collapseFirstRow.show(); + var collapseSecondRow = new bootstrap.Collapse(document.getElementById('collapseSecondRow'), {toggle: false}) + collapseSecondRow.show(); + var collapseThirdRow = new bootstrap.Collapse(document.getElementById('collapseThirdRow'), {toggle: false}) + collapseThirdRow.hide(); + var collapseFourthRow = new bootstrap.Collapse(document.getElementById('collapseFourthRow'), {toggle: false}) + collapseFourthRow.hide(); + } + + + + + + +}); + + +ipcRenderer.on('action-update-rx-buffer', (event, arg) => { + + var data = arg.data["data"]; var tbl = document.getElementById("rx-data"); - document.getElementById("rx-data").innerHTML = '' + document.getElementById("rx-data").innerHTML = ''; + for (i = 0; i < arg.data.length; i++) { // first we update the PING window - if (arg.data[i]['DXCALLSIGN'] == document.getElementById("dxCall").value) { + if (arg.data[i]['dxcallsign'] == document.getElementById("dxCall").value) { /* // if we are sending data without doing a ping before, we don't have a grid locator available. This could be a future feature for the TNC! if(arg.data[i]['DXGRID'] != ''){ document.getElementById("pingDistance").innerHTML = arg.stations[i]['DXGRID'] } */ - document.getElementById("pingDB").innerHTML = arg.stations[i]['SNR'] + document.getElementById("pingDB").innerHTML = arg.stations[i]['snr']; } + + // now we update the received files list var row = document.createElement("tr"); //https://stackoverflow.com/q/51421470 //https://stackoverflow.com/a/847196 - timestampRaw = arg.data[i]['TIMESTAMP'] + timestampRaw = arg.data[i]['timestamp'] var date = new Date(timestampRaw * 1000); var hours = date.getHours(); var minutes = "0" + date.getMinutes(); @@ -1320,12 +1638,12 @@ ipcRenderer.on('action-update-rx-buffer', (event, arg) => { var timestamp = document.createElement("td"); var timestampText = document.createElement('span'); - timestampText.innerText = datetime + timestampText.innerText = datetime; timestamp.appendChild(timestampText); var dxCall = document.createElement("td"); var dxCallText = document.createElement('span'); - dxCallText.innerText = arg.data[i]['DXCALLSIGN'] + dxCallText.innerText = arg.data[i]['dxcallsign']; dxCall.appendChild(dxCallText); /* @@ -1335,26 +1653,38 @@ ipcRenderer.on('action-update-rx-buffer', (event, arg) => { dxGrid.appendChild(dxGridText); */ + console.log(arg.data); + + var encoded_data = atob(arg.data[i]['data']); + var splitted_data = encoded_data.split(split_char); + console.log(splitted_data); + var fileName = document.createElement("td"); var fileNameText = document.createElement('span'); - var fileNameString = arg.data[i]['RXDATA'][0]['fn'] - fileNameText.innerText = fileNameString + //var fileNameString = arg.data[i]['data'][0]['fn']; + var fileNameString = splitted_data[1]; + + + fileNameText.innerText = fileNameString; fileName.appendChild(fileNameText); row.appendChild(timestamp); row.appendChild(dxCall); // row.appendChild(dxGrid); row.appendChild(fileName); - tbl.appendChild(row); // https://stackoverflow.com/a/26227660 - var appDataFolder = process.env.HOME - console.log("appDataFolder:" + appDataFolder) + var appDataFolder = process.env.HOME; + console.log("appDataFolder:" + appDataFolder); var applicationFolder = path.join(appDataFolder, "FreeDATA"); - console.log(applicationFolder) - var receivedFilesFolder = path.join(applicationFolder, "receivedFiles"); - console.log("receivedFilesFolder: " + receivedFilesFolder) + console.log(applicationFolder); + //var receivedFilesFolder = path.join(applicationFolder, "receivedFiles"); + var receivedFilesFolder = path.join(config.received_files_folder); + + + + console.log("receivedFilesFolder: " + receivedFilesFolder); // Creates receivedFiles folder if not exists // https://stackoverflow.com/a/13544465 fs.mkdir(receivedFilesFolder, { @@ -1364,16 +1694,18 @@ ipcRenderer.on('action-update-rx-buffer', (event, arg) => { }); - // write file to rxdata folder - var base64String = arg.data[i]['RXDATA'][0]['d'] + // write file to data folder + ////var base64String = arg.data[i]['data'][0]['d'] // remove header from base64 String // https://www.codeblocq.com/2016/04/Convert-a-base64-string-to-a-file-in-Node/ - var base64Data = base64String.split(';base64,').pop() + ////var base64Data = base64String.split(';base64,').pop() //write data to file + var base64Data = splitted_data[4]; var receivedFile = path.join(receivedFilesFolder, fileNameString); - console.log(receivedFile) + console.log(receivedFile); - require("fs").writeFile(receivedFile, base64Data, 'base64', function(err) { + require("fs").writeFile(receivedFile, base64Data, 'binary', function(err) { + //require("fs").writeFile(receivedFile, base64Data, 'base64', function(err) { console.log(err); }); } @@ -1381,26 +1713,93 @@ ipcRenderer.on('action-update-rx-buffer', (event, arg) => { }); ipcRenderer.on('run-tnc-command', (event, arg) => { - if (arg.command == 'saveMyCall') { - sock.saveMyCall(arg.callsign) + + if (arg.command == 'save_my_call') { + sock.saveMyCall(arg.callsign); } - if (arg.command == 'saveMyGrid') { - sock.saveMyGrid(arg.grid) + if (arg.command == 'save_my_grid') { + sock.saveMyGrid(arg.grid); } if (arg.command == 'ping') { - sock.sendPing(arg.dxcallsign) + sock.sendPing(arg.dxcallsign); } - if (arg.command == 'sendFile') { - sock.sendFile(arg.dxcallsign, arg.mode, arg.frames, arg.filename, arg.filetype, arg.data, arg.checksum) + if (arg.command == 'send_file') { + sock.sendFile(arg.dxcallsign, arg.mode, arg.frames, arg.filename, arg.filetype, arg.data, arg.checksum); } - if (arg.command == 'sendMessage') { - sock.sendMessage(arg.dxcallsign, arg.mode, arg.frames, arg.data, arg.checksum) + if (arg.command == 'send_message') { + sock.sendMessage(arg.dxcallsign, arg.mode, arg.frames, arg.data, arg.checksum); } - if (arg.command == 'stopTransmission') { - sock.stopTransmission() - } - if (arg.command == 'delRxMsgBuffer') { - sock.delRxMsgBuffer() + if (arg.command == 'stop_transmission') { + sock.stopTransmission(); } + +}); + +// IPC ACTION FOR AUTO UPDATER +ipcRenderer.on('action-updater', (event, arg) => { + + if (arg.status == "download-progress"){ + + bootstrap.Toast.getOrCreateInstance(document.getElementById('toastUpdateAvailable')).hide(); // close our update available notification + + + var progressinfo = '(' + Math.round(arg.progress.transferred/1024) + 'kB /' + Math.round(arg.progress.total/1024) + 'kB)'; + document.getElementById("toastUpdateProgressInfo").innerHTML = progressinfo; + document.getElementById("toastUpdateProgressSpeed").innerHTML = Math.round(arg.progress.bytesPerSecond/1024) + "kByte/s"; + + document.getElementById("toastUpdateProgressBar").setAttribute("aria-valuenow", arg.progress.percent) + document.getElementById("toastUpdateProgressBar").setAttribute("style", "width:" + arg.progress.percent + "%;") + + var toast = bootstrap.Toast.getOrCreateInstance( + document.getElementById('toastUpdateProgress') + ); // Returns a Bootstrap toast instance + + + let showing = document.getElementById("toastUpdateProgress").getAttribute("class").includes("showing"); + if(!showing){ + toast.show(); + } + } + + if (arg.status == "checking-for-update"){ + var toast = bootstrap.Toast.getOrCreateInstance( + document.getElementById('toastUpdateChecking') + ); // Returns a Bootstrap toast instance + toast.show(); + document.title = "FreeDATA by DJ2LS" + ' - v' + arg.version; + } + if (arg.status == "update-downloaded"){ + var toast = bootstrap.Toast.getOrCreateInstance( + document.getElementById('toastUpdateDownloaded') + ); // Returns a Bootstrap toast instance + toast.show(); + } + if (arg.status == "update-not-available"){ + bootstrap.Toast.getOrCreateInstance(document.getElementById('toastUpdateChecking')).hide(); + var toast = bootstrap.Toast.getOrCreateInstance( + document.getElementById('toastUpdateNotAvailable') + ); // Returns a Bootstrap toast instance + toast.show(); + } + if (arg.status == "update-available"){ + + bootstrap.Toast.getOrCreateInstance(document.getElementById('toastUpdateChecking')).hide(); + var toast = bootstrap.Toast.getOrCreateInstance( + document.getElementById('toastUpdateAvailable') + ); // Returns a Bootstrap toast instance + toast.show(); + } + + if (arg.status == "error"){ + var toast = bootstrap.Toast.getOrCreateInstance( + document.getElementById('toastUpdateNotChecking') + ); // Returns a Bootstrap toast instance + toast.show(); + + + } + + + }); diff --git a/gui/sock.js b/gui/sock.js index 4cb1e212..534f324d 100644 --- a/gui/sock.js +++ b/gui/sock.js @@ -4,6 +4,9 @@ const { ipcRenderer } = require('electron') +const log = require('electron-log'); +const socketLog = log.scope('tnc'); + // https://stackoverflow.com/a/26227660 var appDataFolder = process.env.APPDATA || (process.platform == 'darwin' ? process.env.HOME + '/Library/Application Support' : process.env.HOME + "/.config") var configFolder = path.join(appDataFolder, "FreeDATA"); @@ -11,7 +14,10 @@ var configPath = path.join(configFolder, 'config.json') const config = require(configPath); var client = new net.Socket(); -var msg = ''; // Current message, per connection. +var socketchunk = ''; // Current message, per connection. + +// split character +const split_char = '\0;' // globals for getting new data only if available so we are saving bandwith var rxBufferLengthTnc = 0 @@ -20,14 +26,14 @@ var rxMsgBufferLengthTnc = 0 var rxMsgBufferLengthGui = 0 // network connection Timeout -setTimeout(connectTNC, 3000) +setTimeout(connectTNC, 2000) function connectTNC() { //exports.connectTNC = function(){ - //console.log('connecting to TNC...') + //socketLog.info('connecting to TNC...') //clear message buffer after reconnecting or inital connection - msg = ''; + socketchunk = ''; if (config.tnclocation == 'localhost') { client.connect(3000, '127.0.0.1') @@ -37,13 +43,29 @@ function connectTNC() { } client.on('connect', function(data) { - console.log('TNC connection established') + socketLog.info('TNC connection established') + let Data = { + busy_state: "-", + arq_state: "-", + //channel_state: "-", + frequency: "-", + mode: "-", + bandwith: "-", + rms_level: 0 + }; + ipcRenderer.send('request-update-tnc-state', Data); + + // also update tnc connection state + ipcRenderer.send('request-update-tnc-connection', {tnc_connection : client.readyState}); + + }) client.on('error', function(data) { - console.log('TNC connection error'); - + socketLog.error('TNC connection error'); + socketLog.error(data); let Data = { + tnc_connection: client.readyState, busy_state: "-", arq_state: "-", //channel_state: "-", @@ -54,136 +76,236 @@ client.on('error', function(data) { }; ipcRenderer.send('request-update-tnc-state', Data); - - setTimeout(connectTNC, 2000) + ipcRenderer.send('request-update-tnc-connection', {tnc_connection : client.readyState}); + client.destroy(); + setTimeout(connectTNC, 500) // setTimeout( function() { exports.connectTNC(tnc_host, tnc_port); }, 2000 ); }); /* client.on('close', function(data) { - console.log(' TNC connection closed'); + socketLog.info(' TNC connection closed'); setTimeout(connectTNC, 2000) }); */ client.on('end', function(data) { - console.log('TNC connection ended'); - //setTimeout(connectTNC, 2000) - setTimeout(connectTNC, 0) - - // setTimeout( function() { exports.connectTNC(tnc_host, tnc_port); }, 2000 ); + socketLog.info('TNC connection ended'); + ipcRenderer.send('request-update-tnc-connection', {tnc_connection : client.readyState}); + client.destroy(); + + setTimeout(connectTNC, 500) }); -//exports.writeTncCommand = function(command){ writeTncCommand = function(command) { - - //console.log(command) + + //socketLog.info(command) // we use the writingCommand function to update our TCPIP state because we are calling this function a lot // if socket openend, we are able to run commands + + + if (client.readyState == 'open') { - //uiMain.setTNCconnection('open') client.write(command + '\n'); + } if (client.readyState == 'closed') { - //uiMain.setTNCconnection('closed') - //console.log("CLOSED!!!!!") + socketLog.info("CLOSED!") + } if (client.readyState == 'opening') { - //uiMain.setTNCconnection('opening') - //console.log("OPENING!!!!!") - console.log('connecting to TNC...') + socketLog.info('connecting to TNC...') + } } -client.on('data', function(data) { +client.on('data', function(socketdata) { + + ipcRenderer.send('request-update-tnc-connection', {tnc_connection : client.readyState}); /* + inspired by: stackoverflow.com questions 9070700 nodejs-net-createserver-large-amount-of-data-coming-in */ - data = data.toString('utf8'); // convert data to string - msg += data.toString('utf8'); // append data to buffer so we can stick long data together - //console.log(data) - // check if we reached an EOF, if true, clear buffer and parse JSON data - if (data.endsWith('"EOF":"EOF"}')) { - //console.log(msg) - try { - //console.log(msg) - data = JSON.parse(msg) - } catch (e) { - console.log(e); /* "SyntaxError*/ + + socketdata = socketdata.toString('utf8'); // convert data to string + socketchunk += socketdata// append data to buffer so we can stick long data together + + + // check if we received begin and end of json data + if (socketchunk.startsWith('{"') && socketchunk.endsWith('"}\n')) { + + var data = '' + + // split data into chunks if we received multiple commands + socketchunk = socketchunk.split("\n"); + data = JSON.parse(socketchunk[0]) + + + // search for empty entries in socketchunk and remove them + for (i = 0; i < socketchunk.length; i++) { + if (socketchunk[i] === ''){ + socketchunk.splice(i, 1); + } } - msg = ''; - /* console.log("EOF detected!") */ + + + //iterate through socketchunks array to execute multiple commands in row + for (i = 0; i < socketchunk.length; i++) { - //console.log(data) + //check if data is not empty + if(socketchunk[i].length > 0){ + + //try to parse JSON + try { - if (data['COMMAND'] == 'TNC_STATE') { - //console.log(data) - // set length of RX Buffer to global variable - rxBufferLengthTnc = data['RX_BUFFER_LENGTH'] - rxMsgBufferLengthTnc = data['RX_MSG_BUFFER_LENGTH'] + data = JSON.parse(socketchunk[i]) + + } catch (e) { + socketLog.info(e); // "SyntaxError + socketLog.info(socketchunk[i]) + socketchunk = '' + + } + + } + + + if (data['command'] == 'tnc_state') { + //socketLog.info(data) + // set length of RX Buffer to global variable + rxBufferLengthTnc = data['rx_buffer_length'] + rxMsgBufferLengthTnc = data['rx_msg_buffer_length'] + + let Data = { + ptt_state: data['ptt_state'], + busy_state: data['tnc_state'], + arq_state: data['arq_state'], + arq_session: data['arq_session'], + //channel_state: data['CHANNEL_STATE'], + frequency: data['frequency'], + speed_level: data['speed_level'], + mode: data['mode'], + bandwith: data['bandwith'], + rms_level: (data['audio_rms'] / 1000) * 100, + fft: data['fft'], + channel_busy: data['channel_busy'], + scatter: data['scatter'], + info: data['info'], + rx_buffer_length: data['rx_buffer_length'], + rx_msg_buffer_length: data['rx_msg_buffer_length'], + tx_n_max_retries: data['tx_n_max_retries'], + arq_tx_n_frames_per_burst: data['arq_tx_n_frames_per_burst'], + arq_tx_n_bursts: data['arq_tx_n_bursts'], + arq_tx_n_current_arq_frame: data['arq_tx_n_current_arq_frame'], + arq_tx_n_total_arq_frames: data['arq_tx_n_total_arq_frames'], + arq_rx_frame_n_bursts: data['arq_rx_frame_n_bursts'], + arq_rx_n_current_arq_frame: data['arq_rx_n_current_arq_frame'], + arq_n_arq_frames_per_data_frame: data['arq_n_arq_frames_per_data_frame'], + arq_bytes_per_minute: data['arq_bytes_per_minute'], + arq_compression_factor: data['arq_compression_factor'], + total_bytes: data['total_bytes'], + arq_transmission_percent: data['arq_transmission_percent'], + stations: data['stations'], + beacon_state: data['beacon_state'], + }; + + ipcRenderer.send('request-update-tnc-state', Data); + } + + /* A TEST WITH STREAMING DATA .... */ + // if we received data through network stream, we get a single data item + if (data['arq'] == 'received') { + dataArray = [] + messageArray = [] + + socketLog.info(data) + // we need to encode here to do a deep check for checking if file or message + var encoded_data = atob(data['data']) + var splitted_data = encoded_data.split(split_char) + + + if(splitted_data[0] == 'f'){ + dataArray.push(data) + } + + if(splitted_data[0] == 'm'){ + messageArray.push(data) + } + + rxBufferLengthGui = dataArray.length + let Files = { + data: dataArray, + }; + ipcRenderer.send('request-update-rx-buffer', Files); + + rxMsgBufferLengthGui = messageArray.length + let Messages = { + data: messageArray, + }; + + //ipcRenderer.send('request-update-rx-msg-buffer', Messages); + ipcRenderer.send('request-new-msg-received', Messages); + } + + // if we manually checking for the rx buffer we are getting an array of multiple data + if (data['command'] == 'rx_buffer') { + socketLog.info(data) + // iterate through buffer list and sort it to file or message array + dataArray = [] + messageArray = [] + + for (i = 0; i < data['data-array'].length; i++) { + try{ + // we need to encode here to do a deep check for checking if file or message + var encoded_data = atob(data['data-array'][i]['data']) + var splitted_data = encoded_data.split(split_char) + + + if(splitted_data[0] == 'f'){ + dataArray.push(data['data-array'][i]) + + } + + if(splitted_data[0] == 'm'){ + messageArray.push(data['data-array'][i]) + + } + + } catch (e) { + socketLog.info(e) + } + } + + + + rxBufferLengthGui = dataArray.length + let Files = { + data: dataArray, + }; + ipcRenderer.send('request-update-rx-buffer', Files); + + rxMsgBufferLengthGui = messageArray.length + let Messages = { + data: messageArray, + }; + //ipcRenderer.send('request-update-rx-msg-buffer', Messages); + ipcRenderer.send('request-new-msg-received', Messages); + + + } - let Data = { - toe: Date.now() - data['TIMESTAMP'], // time of execution - ptt_state: data['PTT_STATE'], - busy_state: data['TNC_STATE'], - arq_state: data['ARQ_STATE'], - //channel_state: data['CHANNEL_STATE'], - frequency: data['FREQUENCY'], - mode: data['MODE'], - bandwith: data['BANDWITH'], - rms_level: (data['AUDIO_RMS'] / 1000) * 100, - fft: data['FFT'], - scatter: data['SCATTER'], - info: data['INFO'], - rx_buffer_length: data['RX_BUFFER_LENGTH'], - rx_msg_buffer_length: data['RX_MSG_BUFFER_LENGTH'], - tx_n_max_retries: data['TX_N_MAX_RETRIES'], - arq_tx_n_frames_per_burst: data['ARQ_TX_N_FRAMES_PER_BURST'], - arq_tx_n_bursts: data['ARQ_TX_N_BURSTS'], - arq_tx_n_current_arq_frame: data['ARQ_TX_N_CURRENT_ARQ_FRAME'], - arq_tx_n_total_arq_frames: data['ARQ_TX_N_TOTAL_ARQ_FRAMES'], - arq_rx_frame_n_bursts: data['ARQ_RX_FRAME_N_BURSTS'], - arq_rx_n_current_arq_frame: data['ARQ_RX_N_CURRENT_ARQ_FRAME'], - arq_n_arq_frames_per_data_frame: data['ARQ_N_ARQ_FRAMES_PER_DATA_FRAME'], - arq_bytes_per_minute: data['ARQ_BYTES_PER_MINUTE'], - arq_compression_factor: data['ARQ_COMPRESSION_FACTOR'], - total_bytes: data['TOTAL_BYTES'], - arq_transmission_percent: data['ARQ_TRANSMISSION_PERCENT'], - stations: data['STATIONS'], - beacon_state: data['BEACON_STATE'], - }; - //console.log(Data) - ipcRenderer.send('request-update-tnc-state', Data); } - - if (data['COMMAND'] == 'RX_BUFFER') { - - rxBufferLengthGui = data['DATA-ARRAY'].length - let Data = { - data: data['DATA-ARRAY'], - }; - - ipcRenderer.send('request-update-rx-buffer', Data); - } - - if (data['COMMAND'] == 'RX_MSG_BUFFER') { - - rxMsgBufferLengthGui = data['DATA-ARRAY'].length - let Data = { - data: data['DATA-ARRAY'], - }; - - ipcRenderer.send('request-update-rx-msg-buffer', Data); - } - // check if EOF ... + + //finally delete message buffer + socketchunk = ''; + } - }); function hexToBytes(hex) { @@ -195,57 +317,74 @@ function hexToBytes(hex) { //Get TNC State exports.getTncState = function() { - command = '{"type" : "GET", "command" : "TNC_STATE", "timestamp" : ' + Date.now() + '}'; + command = '{"type" : "get", "command" : "tnc_state"}'; writeTncCommand(command) } //Get DATA State exports.getDataState = function() { - command = '{"type" : "GET", "command" : "DATA_STATE", "timestamp" : ' + Date.now() + '}'; + command = '{"type" : "get", "command" : "data_state"}'; //writeTncCommand(command) } -//Get Heard Stations -//exports.getHeardStations = function() { -// command = '{"type" : "GET", "command" : "HEARD_STATIONS", "timestamp" : ' + Date.now() + '}'; -// writeTncCommand(command) -//} // Send Ping exports.sendPing = function(dxcallsign) { - command = '{"type" : "PING", "command" : "PING", "dxcallsign" : "' + dxcallsign + '", "timestamp" : ' + Date.now() + '}' + command = '{"type" : "ping", "command" : "ping", "dxcallsign" : "' + dxcallsign + '"}' writeTncCommand(command) } // Send CQ exports.sendCQ = function() { - command = '{"type" : "BROADCAST", "command" : "CQCQCQ", "timestamp" : ' + Date.now() + '}' + command = '{"type" : "broadcast", "command" : "cqcqcq"}' writeTncCommand(command) } // Send File exports.sendFile = function(dxcallsign, mode, frames, filename, filetype, data, checksum) { - command = '{"type" : "ARQ", "command" : "sendFile", "dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "filename" : "' + filename + '", "filetype" : "' + filetype + '", "data" : "' + data + '", "checksum" : "' + checksum + '", "timestamp" : ' + Date.now() + '}' + + socketLog.info(data) + socketLog.info(filetype) + socketLog.info(filename) + + var datatype = "f" + + data = datatype + split_char + filename + split_char + filetype + split_char + checksum + split_char + data + socketLog.info(data) + socketLog.info(btoa(data)) + data = btoa(data) + + command = '{"type" : "arq", "command" : "send_raw", "parameter" : [{"dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '"}]}' writeTncCommand(command) } // Send Message exports.sendMessage = function(dxcallsign, mode, frames, data, checksum) { - command = '{"type" : "ARQ", "command" : "sendMessage", "dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '" , "checksum" : "' + checksum + '", "timestamp" : ' + Date.now() + '}' - console.log(command) + socketLog.info(data) + + var datatype = "m" + data = datatype + split_char + split_char + checksum + split_char + data + socketLog.info(data) + socketLog.info(btoa(data)) + data = btoa(data) + + //command = '{"type" : "arq", "command" : "send_message", "parameter" : [{ "dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '" , "checksum" : "' + checksum + '"}]}' + command = '{"type" : "arq", "command" : "send_raw", "parameter" : [{"dxcallsign" : "' + dxcallsign + '", "mode" : "' + mode + '", "n_frames" : "' + frames + '", "data" : "' + data + '"}]}' + socketLog.info(command) + socketLog.info("-------------------------------------") writeTncCommand(command) } //STOP TRANSMISSION exports.stopTransmission = function() { - command = '{"type" : "ARQ", "command": "stopTransmission", "timestamp" : ' + Date.now() + '}' + command = '{"type" : "arq", "command": "stop_transmission"}' writeTncCommand(command) } // Get RX BUffer exports.getRxBuffer = function() { - command = '{"type" : "GET", "command" : "RX_BUFFER", "timestamp" : ' + Date.now() + '}' + command = '{"type" : "get", "command" : "rx_buffer"}' // call command only if new data arrived if (rxBufferLengthGui != rxBufferLengthTnc) { @@ -253,35 +392,27 @@ exports.getRxBuffer = function() { } } -// Get RX MSG BUffer -exports.getMsgRxBuffer = function() { - command = '{"type" : "GET", "command" : "RX_MSG_BUFFER", "timestamp" : ' + Date.now() + '}' - - // call command only if new data arrived - if (rxMsgBufferLengthGui != rxMsgBufferLengthTnc) { - writeTncCommand(command) - } -} - -// DELETE RX MSG BUffer -exports.delRxMsgBuffer = function() { - command = '{"type" : "SET", "command" : "DEL_RX_MSG_BUFFER", "timestamp" : ' + Date.now() + '}' - - // call command only if new data arrived - if (rxMsgBufferLengthGui != rxMsgBufferLengthTnc) { - writeTncCommand(command) - } -} // START BEACON exports.startBeacon = function(interval) { - command = '{"type" : "BROADCAST", "command" : "START_BEACON", "parameter": "' + interval + '","timestamp" : ' + Date.now() + '}' + command = '{"type" : "broadcast", "command" : "start_beacon", "parameter": "' + interval + '"}' writeTncCommand(command) } // STOP BEACON exports.stopBeacon = function() { - command = '{"type" : "BROADCAST", "command" : "STOP_BEACON", "timestamp" : ' + Date.now() + '}' + command = '{"type" : "broadcast", "command" : "stop_beacon"}' writeTncCommand(command) } +// OPEN ARQ SESSION +exports.connectARQ = function(dxcallsign) { + command = '{"type" : "arq", "command" : "connect", "dxcallsign": "'+ dxcallsign + '"}' + writeTncCommand(command) +} + +// CLOSE ARQ SESSION +exports.disconnectARQ = function() { + command = '{"type" : "arq", "command" : "disconnect"}' + writeTncCommand(command) +} diff --git a/gui/src/app-icon.png b/gui/src/app-icon.png deleted file mode 100644 index 2eaa4683..00000000 Binary files a/gui/src/app-icon.png and /dev/null differ diff --git a/gui/src/chat-module.html b/gui/src/chat-module.html index 33d988e5..9572bbcb 100644 --- a/gui/src/chat-module.html +++ b/gui/src/chat-module.html @@ -7,7 +7,9 @@ - + + + FreeDATA - CHAT @@ -18,36 +20,61 @@ -
- - - + + + +
+
+
+ + +
+
+ + +
+
+ +
+ + + + + + +
+ + + + +
+
+ + + + + + + + +
- - - - - - - - - - - - - -
TimeDXCallMessage
- + + + diff --git a/gui/src/cube_round.png b/gui/src/img/favicon.png similarity index 100% rename from gui/src/cube_round.png rename to gui/src/img/favicon.png diff --git a/gui/src/img/icon.png b/gui/src/img/icon.png new file mode 100644 index 00000000..692fee40 Binary files /dev/null and b/gui/src/img/icon.png differ diff --git a/gui/src/icon_cube_border.png b/gui/src/img/icon_cube_border.png similarity index 100% rename from gui/src/icon_cube_border.png rename to gui/src/img/icon_cube_border.png diff --git a/gui/src/index.html b/gui/src/index.html index 20302d92..9e8fdfa8 100644 --- a/gui/src/index.html +++ b/gui/src/index.html @@ -8,89 +8,151 @@ - + + + + - FreeDATA + FreeDATA by DJ2LS -