├── README.md ├── companion ├── images │ ├── solo.png │ ├── solo-opaque.png │ ├── X32-Air-faders.png │ └── solo.b64 ├── manifest.json └── HELP.md ├── .gitignore ├── .github └── workflows │ └── companion-module-checks.yaml ├── package.json ├── defOuts.js ├── LICENSE ├── config.js ├── icons.js ├── defSolo.js ├── defStrip.js ├── helpers.js ├── upgrades.js ├── actions.js ├── constants.js ├── index.js └── yarn.lock /README.md: -------------------------------------------------------------------------------- 1 | # companion-module-behringer-xair 2 | 3 | See [HELP.md](./companion/HELP.md) and [LICENSE](./LICENSE) 4 | -------------------------------------------------------------------------------- /companion/images/solo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitfocus/companion-module-behringer-xair/HEAD/companion/images/solo.png -------------------------------------------------------------------------------- /companion/images/solo-opaque.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitfocus/companion-module-behringer-xair/HEAD/companion/images/solo-opaque.png -------------------------------------------------------------------------------- /companion/images/X32-Air-faders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitfocus/companion-module-behringer-xair/HEAD/companion/images/X32-Air-faders.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .eslintrc 3 | /pkg 4 | /pkg.tgz 5 | DEBUG-INSPECT 6 | DEBUG-INSPECTx 7 | DEBUG-PACKAGE 8 | DEBUG-PACKAGED 9 | .yarn/ 10 | -------------------------------------------------------------------------------- /.github/workflows/companion-module-checks.yaml: -------------------------------------------------------------------------------- 1 | name: Companion Module Checks 2 | 3 | on: 4 | push: 5 | 6 | jobs: 7 | check: 8 | name: Check module 9 | 10 | if: ${{ !contains(github.repository, 'companion-module-template-') }} 11 | 12 | permissions: 13 | packages: read 14 | 15 | uses: bitfocus/actions/.github/workflows/module-checks.yaml@main 16 | # with: 17 | # upload-artifact: true # uncomment this to upload the built package as an artifact to this workflow that you can download and share with others 18 | 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "behringer-xair", 3 | "version": "2.6.6", 4 | "type": "module", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "license": "MIT", 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/bitfocus/companion-module-behringer-xair.git" 13 | }, 14 | "dependencies": { 15 | "@companion-module/base": "^1.11.2", 16 | "companion-module-utils": "^0.5.0", 17 | "osc": "^2.4.3" 18 | }, 19 | "devDependencies": { 20 | "@companion-module/tools": "^2.1.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /defOuts.js: -------------------------------------------------------------------------------- 1 | export const defOuts = [ 2 | { 3 | 'id': 'main', 4 | 'digits': 1, 5 | 'min': 1, 6 | 'max': 2, 7 | 'srcAmt': 10, 8 | 'description': 'Main/Phones Outs', 9 | 'hasPos': false, 10 | 'srcs': ['LR', 'Mon', 'UOut'], 11 | }, 12 | { 13 | 'id': 'aux', 14 | 'digits': 1, 15 | 'min': 1, 16 | 'max': 6, 17 | 'srcAmt': 55, 18 | 'description': 'Aux Outs', 19 | 'hasPos': true, 20 | 'srcs': ['Ch', 'Aux', 'FxRtn', 'Bus', 'FxSnd', 'L', 'R', 'UOut'], 21 | }, 22 | { 23 | 'id': 'p16', 24 | 'digits': 2, 25 | 'min': 1, 26 | 'max': 16, 27 | 'srcAmt': 55, 28 | 'description': 'P16 Outs', 29 | 'hasPos': true, 30 | 'srcs': ['Ch', 'Aux', 'FxRtn', 'Bus', 'FxSnd', 'L', 'R', 'UOut'], 31 | }, 32 | { 33 | 'id': 'usb', 34 | 'digits': 2, 35 | 'min': 1, 36 | 'max': 16, 37 | 'srcAmt': 37, 38 | 'description': 'USB sends Outs', 39 | 'hasPos': true, 40 | 'srcs': ['Ch', 'Aux', 'FxRtn', 'Bus', 'FxSnd', 'L', 'R'], 41 | }, 42 | ] 43 | -------------------------------------------------------------------------------- /companion/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "behringer-xair", 3 | "name": "behringer-xair", 4 | "shortname": "xair", 5 | "description": "Module to control Midas MR and Behringer XR series mixers", 6 | "version": "0.0.0", 7 | "license": "MIT", 8 | "repository": "git+https://github.com/bitfocus/companion-module-behringer-xair.git", 9 | "bugs": "https://github.com/bitfocus/companion-module-behringer-xair/issues", 10 | "maintainers": [ 11 | { 12 | "name": "John Knight, Jr", 13 | "email": "istnv@ayesti.com" 14 | }, 15 | { 16 | "name": "Per Roine", 17 | "email": "per.roine@gmail.com" 18 | }, 19 | { 20 | "name": "Janos Münker" 21 | } 22 | ], 23 | "legacyIds": [ 24 | "xair" 25 | ], 26 | "runtime": { 27 | "type": "node18", 28 | "api": "nodejs-ipc", 29 | "apiVersion": "0.0.0", 30 | "entrypoint": "../index.js" 31 | }, 32 | "manufacturer": "Behringer/Midas", 33 | "products": [ 34 | "XR/MR", 35 | "XAir", 36 | "XR12", 37 | "XR16", 38 | "X18", 39 | "XR18" 40 | ], 41 | "keywords": [ 42 | "Audio", 43 | "Mixer", 44 | "Console" 45 | ] 46 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Bitfocus AS 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | import { Regex } from '@companion-module/base' 2 | 3 | // Return config fields for web config 4 | export function getConfigFields() { 5 | let cf = [ 6 | { 7 | type: 'textinput', 8 | id: 'host', 9 | label: 'Target IP', 10 | tooltip: 'The IP of the MR / XR console', 11 | width: 6, 12 | default: '0.0.0.0', 13 | regex: Regex.IP, 14 | }, 15 | { 16 | type: 'checkbox', 17 | id: 'scan', 18 | label: 'Scan network for XAir mixers?', 19 | default: true, 20 | width: 12, 21 | }, 22 | { 23 | type: 'dropdown', 24 | id: 'model', 25 | label: 'Select Model', 26 | tooltip: 'This model is assumed when mixer is offline', 27 | width: 6, 28 | default: 'X18', 29 | choices: this.MIXER_CHOICES, 30 | }, 31 | ] 32 | 33 | let ch = [] 34 | if (Object.keys(this.unitsFound || {}).length == 0) { 35 | ch = [{ id: 'none', label: 'No XAir units located' }] 36 | } else { 37 | let unit = this.unitsFound 38 | for (let u in unit) { 39 | ch.push({ id: unit[u].m_name, label: `${unit[u].m_name} (${unit[u].m_ip})` }) 40 | } 41 | } 42 | 43 | cf.push({ 44 | type: 'dropdown', 45 | id: 'mixer', 46 | label: 'Select Mixer by Name', 47 | tooltip: 'Name and IP of mixers on the network', 48 | width: 12, 49 | default: ch[0].id, 50 | choices: ch, 51 | }) 52 | return cf 53 | } 54 | -------------------------------------------------------------------------------- /companion/images/solo.b64: -------------------------------------------------------------------------------- 1 | iVBORw0KGgoAAAANSUhEUgAAAEgAAAA6CAYAAAATBx+NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAUcSURBVHic7ZpLaFxVGIC//96ZTNKkqSnGN+JzUS3oyqi1ogstqKAIuhIVFEUUtOBGhC5UxI2FgigYKLqpFRdV8FFsN1rFbtoGWwyl1lStsa+0NjNJzsy5M7+LuXdyZzKT00zSJpTzwYU573O/+c859w4jeQ0UTytMsNgzWOp4QQ4y6YQijyrl4cWazFIgIHgHeDJJ1wkKKf/dLRy64LNaQuSV8XTaLzEHXpADL8iBF+TAC3LgBTnwghx4QQ68IAdekAMvyIEX5MALcuAFOfCCHHhBDrwgB16QAy/IgRfkwAty4AU58IIceEEOvCAHXpADL8iBF+TAC3LgBTnwghx4QQ68IAcNf8GjfzEmoUpfucgalJUIY2VhpKODYRHa+gduZPhY4XpVjnd08dS8JpfXQJNrXIORgnL5vDqcIyXDC9ZQsAZtuE5Ehofa6dMafrUGLRlG5to2r8FgyslUbYmJgsB1SrBzXLm0nYnNldIkAwIfAd1NivsryhUXYh6zURPUYStINaBXC8GOs8rK8z54wLOpOWxEuVfgEYQ3YYn8mTQJpzgkdaJcC699/yl953Nsa9gRL6eTjWWqBKqsaMjrskXesIY91jBqDfut4T1tmGerJaZKr53i7bh81BqGbJENqtMR3LjE6gTNlBT+clJZvtBiUjeyLR43iqZ4WpVsq7qqdFjDj032KrWG31S5JNXvDEGqLLeGoabti+xWpbOZoBnHvABZWyGoKKB3dhJuP6H0LKya2mB74k+hCp9GJf61hi+iIk+okktXjYq8CqyN5/g7yrvAUFy8qlzkrdmGiopsAG6Lkwfi9gcBUAaiEq83bZjXQAupCEpfE2VJImnXMW26kc4LVfoiw+EWUbHfGG5I6iZRYQ1lY7gxbr/CGsbj/NOq1f2sWQRZw7G43pSOVw8hneQaa7Bx/sHYx+wRlKbDKmE1ku7pRrYlYbhQiHAmLHEHsAk401C8OqzmEy+9W+P84c5ODsftzwI/xfl9xnBts3F0giuh9viyW3o5BSDLOIrWovBmbRIEVUGzPI5la5LkgQLyZWPozxfpZSzbyWuZHJeh3CfC5lTxOlVCoIfp024s3V6lerMAYVi/qScUQ3pTyVN1hVLrT5isqwec46tG1iphWQFZV0C2zraZtosIUbaLHzI5ngN2JUMzQT8wwfTXWHdiSeoEq1TIN+s7V6GQStafzOkTcNnM9uf8LpaNapIeiyVlnI0cWMPGkuFlVTpq863KTx5UK3QzLkKJZEOFW3SSq+O6XcCaOH88l+PPpgN1MZqKlAGNT2bN049wO4DAiEidSGCOL6spSY8XCLbMV5IqVwl8EBX5xxq+iopsjooMAaviKvtEmKR6B1vivDAK+LpkWB8V+Y44IgQ+F6HcbBwRVJTP4mRPVGJ7ybA+yvAtVL8c1Vr/9eQ10EKl+SnW6pqMJHl3+yQ5OdqhNMXWWcYpR4aHUzKXWcPeZnVLhiNamH6HbPEctDIyHGox1oEkquZ0irUiiSSBZyYIBtuVlLW8ovAS8L3AH0CJ6mm2A+XBTCffJHVFmMzkuB94X+EIYIFRgcFsmbukh+O1urAb2Inyc6r96dByt8CHwFHAKvwFbMrkWCvSfP+SvAYqCrlSZc43GGWEKBSAwR4qL7b788RSIq/BIPB8nDTzEgQQhUKUEUCHQfYu1EQXkQHgpvjztKDqq0V7VAJBZUEmt9QwGQAVKIcX5x3Ol4xUH8LaRqt9CNVN86JCYep/T6xGm2u0hEsAAAAASUVORK5CYII= -------------------------------------------------------------------------------- /icons.js: -------------------------------------------------------------------------------- 1 | export const ICON_SOLO = 2 | 'iVBORw0KGgoAAAANSUhEUgAAAEgAAAA6CAYAAAATBx+NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAUcSURBVHic7ZpLaFxVGIC//96ZTNKkqSnGN+JzUS3oyqi1ogstqKAIuhIVFEUUtOBGhC5UxI2FgigYKLqpFRdV8FFsN1rFbtoGWwyl1lStsa+0NjNJzsy5M7+LuXdyZzKT00zSJpTzwYU573O/+c859w4jeQ0UTytMsNgzWOp4QQ4y6YQijyrl4cWazFIgIHgHeDJJ1wkKKf/dLRy64LNaQuSV8XTaLzEHXpADL8iBF+TAC3LgBTnwghx4QQ68IAdekAMvyIEX5MALcuAFOfCCHHhBDrwgB16QAy/IgRfkwAty4AU58IIceEEOvCAHXpADL8iBF+TAC3LgBTnwghx4QQ68IAcNf8GjfzEmoUpfucgalJUIY2VhpKODYRHa+gduZPhY4XpVjnd08dS8JpfXQJNrXIORgnL5vDqcIyXDC9ZQsAZtuE5Ehofa6dMafrUGLRlG5to2r8FgyslUbYmJgsB1SrBzXLm0nYnNldIkAwIfAd1NivsryhUXYh6zURPUYStINaBXC8GOs8rK8z54wLOpOWxEuVfgEYQ3YYn8mTQJpzgkdaJcC699/yl953Nsa9gRL6eTjWWqBKqsaMjrskXesIY91jBqDfut4T1tmGerJaZKr53i7bh81BqGbJENqtMR3LjE6gTNlBT+clJZvtBiUjeyLR43iqZ4WpVsq7qqdFjDj032KrWG31S5JNXvDEGqLLeGoabti+xWpbOZoBnHvABZWyGoKKB3dhJuP6H0LKya2mB74k+hCp9GJf61hi+iIk+okktXjYq8CqyN5/g7yrvAUFy8qlzkrdmGiopsAG6Lkwfi9gcBUAaiEq83bZjXQAupCEpfE2VJImnXMW26kc4LVfoiw+EWUbHfGG5I6iZRYQ1lY7gxbr/CGsbj/NOq1f2sWQRZw7G43pSOVw8hneQaa7Bx/sHYx+wRlKbDKmE1ku7pRrYlYbhQiHAmLHEHsAk401C8OqzmEy+9W+P84c5ODsftzwI/xfl9xnBts3F0giuh9viyW3o5BSDLOIrWovBmbRIEVUGzPI5la5LkgQLyZWPozxfpZSzbyWuZHJeh3CfC5lTxOlVCoIfp024s3V6lerMAYVi/qScUQ3pTyVN1hVLrT5isqwec46tG1iphWQFZV0C2zraZtosIUbaLHzI5ngN2JUMzQT8wwfTXWHdiSeoEq1TIN+s7V6GQStafzOkTcNnM9uf8LpaNapIeiyVlnI0cWMPGkuFlVTpq863KTx5UK3QzLkKJZEOFW3SSq+O6XcCaOH88l+PPpgN1MZqKlAGNT2bN049wO4DAiEidSGCOL6spSY8XCLbMV5IqVwl8EBX5xxq+iopsjooMAaviKvtEmKR6B1vivDAK+LpkWB8V+Y44IgQ+F6HcbBwRVJTP4mRPVGJ7ybA+yvAtVL8c1Vr/9eQ10EKl+SnW6pqMJHl3+yQ5OdqhNMXWWcYpR4aHUzKXWcPeZnVLhiNamH6HbPEctDIyHGox1oEkquZ0irUiiSSBZyYIBtuVlLW8ovAS8L3AH0CJ6mm2A+XBTCffJHVFmMzkuB94X+EIYIFRgcFsmbukh+O1urAb2Inyc6r96dByt8CHwFHAKvwFbMrkWCvSfP+SvAYqCrlSZc43GGWEKBSAwR4qL7b788RSIq/BIPB8nDTzEgQQhUKUEUCHQfYu1EQXkQHgpvjztKDqq0V7VAJBZUEmt9QwGQAVKIcX5x3Ol4xUH8LaRqt9CNVN86JCYep/T6xGm2u0hEsAAAAASUVORK5CYII='; 3 | 4 | -------------------------------------------------------------------------------- /defSolo.js: -------------------------------------------------------------------------------- 1 | export const defSolo = [ 2 | { 3 | id: 'solosw', 4 | prefix: '/-stat/solosw/', 5 | cmdMap: [ 6 | { 7 | description: 'Channel', 8 | actID: 'ch', 9 | min: 1, 10 | max: 16, 11 | offset: 0, 12 | }, 13 | { 14 | description: 'Aux/USB', 15 | actID: 'aux', 16 | min: 1, 17 | max: 1, 18 | offset: 16, 19 | }, 20 | { 21 | description: 'FX Return', 22 | actID: 'fxr', 23 | min: 1, 24 | max: 4, 25 | offset: 17, 26 | }, 27 | { 28 | description: 'Bus Master', 29 | actID: 'bus', 30 | min: 1, 31 | max: 6, 32 | offset: 39, 33 | }, 34 | { 35 | description: 'FX Master', 36 | actID: 'fxs', 37 | min: 1, 38 | max: 4, 39 | offset: 45, 40 | }, 41 | { 42 | description: 'Master LR', 43 | actID: 'lr', 44 | min: 1, 45 | max: 1, 46 | offset: 49, 47 | }, 48 | { 49 | description: 'DCA', 50 | actID: 'dca', 51 | min: 1, 52 | max: 4, 53 | offset: 50, 54 | }, 55 | ], 56 | }, 57 | { 58 | id: 'config', 59 | prefix: '/config/solo/', 60 | comment: "the following actID will be prefixed with 'solo_'", 61 | cmdMap: [ 62 | { 63 | actID: 'level', 64 | description: 'Level', 65 | isFader: true, 66 | fadeType: 161, 67 | }, 68 | { 69 | actID: 'source', 70 | description: 'Solo Bus Source', 71 | isFader: false, 72 | bg: [100, 75, 50], 73 | }, 74 | { 75 | actID: 'sourcetrim', 76 | description: 'Source Trim', 77 | isFader: true, 78 | fadeType: 73, 79 | }, 80 | { 81 | actID: 'chmode', 82 | description: 'Channel Solo', 83 | isFader: false, 84 | }, 85 | { 86 | actID: 'busmode', 87 | description: 'Bus Solo', 88 | isFader: false, 89 | }, 90 | { 91 | actID: 'dimpfl', 92 | description: 'PFL Attenuation', 93 | isFader: false, 94 | bg: [0, 150, 200], 95 | }, 96 | { 97 | actID: 'dimatt', 98 | description: 'Dim Gain/Att', 99 | isFader: true, 100 | fadeType: 40, 101 | }, 102 | { 103 | actID: 'mute', 104 | description: 'Mute', 105 | isFader: false, 106 | bg: [128, 0, 0], 107 | }, 108 | { 109 | actID: 'mono', 110 | description: 'Mono', 111 | isFader: false, 112 | bg: [0, 150, 200], 113 | }, 114 | { 115 | actID: 'dim', 116 | description: 'Dim', 117 | isFader: false, 118 | bg: [0, 150, 200], 119 | }, 120 | ], 121 | }, 122 | { 123 | id: 'action', 124 | prefix: '/-action/', 125 | cmdMap: [ 126 | { 127 | actID: 'clearsolo', 128 | description: 'Solo Clear', 129 | statID: '/-stat/solo', 130 | statDesc: 'Any Solo Active', 131 | bg: [168, 0, 0], 132 | isFader: false, 133 | }, 134 | ], 135 | }, 136 | ] 137 | -------------------------------------------------------------------------------- /defStrip.js: -------------------------------------------------------------------------------- 1 | export const defStrip = [ 2 | { 3 | 'id': 'ch', 4 | 'digits': 2, 5 | 'min': 1, 6 | 'max': 16, 7 | 'description': 'Channel', 8 | 'label': '', 9 | 'muteID': 'mute', 10 | 'fadeID': 'fad', 11 | 'panID': 'pan', 12 | 'hasLevel': true, 13 | 'hasMix': true, 14 | 'proc': ['gate', 'insert', 'eq', 'dyn', 'lr'], 15 | 'procPfx': '', 16 | 'hasOn': true, 17 | 'hasPan': true, 18 | 'hasPre': true, 19 | }, 20 | { 21 | 'id': 'rtn', 22 | 'digits': 1, 23 | 'min': 1, 24 | 'max': 4, 25 | 'description': 'FX Return', 26 | 'label': 'FX', 27 | 'muteID': 'mute', 28 | 'fadeID': 'fad', 29 | 'panID': 'pan', 30 | 'hasLevel': true, 31 | 'hasMix': true, 32 | 'proc': ['eq', 'lr'], 33 | 'procPfx': '', 34 | 'hasOn': true, 35 | 'hasPan': true, 36 | 'hasPre': true, 37 | }, 38 | { 39 | 'id': 'fxsend', 40 | 'digits': 1, 41 | 'min': 1, 42 | 'max': 4, 43 | 'muteID': 'mute', 44 | 'fadeID': 'fad', 45 | 'description': 'FX Send', 46 | 'label': 'FX', 47 | 'hasLevel': false, 48 | 'hasMix': true, 49 | 'proc': [], 50 | 'procPfx': '', 51 | 'hasOn': true, 52 | 'hasPan': false, 53 | 'hasPre': false, 54 | }, 55 | { 56 | 'id': 'bus', 57 | 'digits': 1, 58 | 'min': 1, 59 | 'max': 6, 60 | 'description': 'Bus Master', 61 | 'label': 'Bus', 62 | 'muteID': 'mute', 63 | 'fadeID': 'fad', 64 | 'panID': 'pan', 65 | 'hasLevel': false, 66 | 'hasMix': true, 67 | 'proc': ['insert', 'eq', 'dyn', 'lr'], 68 | 'procPfx': '', 69 | 'hasOn': true, 70 | 'hasPan': true, 71 | 'hasPre': false, 72 | }, 73 | { 74 | 'id': 'dca', 75 | 'digits': 1, 76 | 'min': 1, 77 | 'max': 4, 78 | 'description': 'DCA', 79 | 'label': 'DCA', 80 | 'muteID': 'mute', 81 | 'fadeID': 'fad', 82 | 'hasLevel': false, 83 | 'hasMix': false, 84 | 'proc': [], 85 | 'hasOn': true, 86 | 'hasPan': false, 87 | 'hasPre': false, 88 | }, 89 | { 90 | 'id': 'lr', 91 | 'digits': 0, 92 | 'min': 0, 93 | 'max': 0, 94 | 'muteID': 'mMute', 95 | 'fadeID': 'mFad', 96 | 'panID': 'mPan', 97 | 'description': 'Main LR', 98 | 'label': 'LR', 99 | 'hasLevel': false, 100 | 'hasMix': true, 101 | 'procPfx': 'm_', 102 | 'proc': ['insert', 'eq', 'dyn'], 103 | 'hasOn': true, 104 | 'hasPan': true, 105 | 'hasPre': false, 106 | }, 107 | { 108 | 'id': 'rtn/aux', 109 | 'digits': 0, 110 | 'min': 0, 111 | 'max': 0, 112 | 'description': 'USB(x12/x16) or Aux In(x18)', 113 | 'label': 'Aux', 114 | 'muteID': 'usbMute', 115 | 'fadeID': 'usbFad', 116 | 'panID': 'usbPan', 117 | 'hasLevel': true, 118 | 'hasMix': true, 119 | 'proc': ['eq'], 120 | 'procPfx': 'u_', 121 | 'hasOn': true, 122 | 'hasPan': true, 123 | 'hasPre': true, 124 | }, 125 | { 126 | 'id': 'config/mute', 127 | 'digits': 1, 128 | 'min': 1, 129 | 'max': 4, 130 | 'description': 'Mute Group', 131 | 'muteID': 'mute_grp', 132 | 'hasLevel': false, 133 | 'hasMix': false, 134 | 'proc': [], 135 | 'hasOn': false, 136 | 'hasPan': false, 137 | 'hasPre': false, 138 | }, 139 | ] 140 | -------------------------------------------------------------------------------- /helpers.js: -------------------------------------------------------------------------------- 1 | import { Regex } from '@companion-module/base' 2 | // helper functions 3 | 4 | const REGEX_PERCENT = new RegExp(Regex.PERCENT) 5 | /** 6 | * Returns the passed integer left-padded with '0's 7 | * Will truncate result length is greater than 'len' 8 | * @param {number} num - number to pad 9 | * @param {number} [len=2] - optional length of result, defaults to 2 10 | * @returns {string} 11 | * @since 2.3.0 12 | */ 13 | export function pad0(num, len = 2) { 14 | return num.toString().padStart(len,'0') 15 | } 16 | 17 | /** 18 | * Replace (clean) slashes '/' with another character 19 | * 20 | * @param {string} s - string to clean 21 | * @param {string} [r="_"] - replace with, defaults to '_' 22 | * @returns {string} 23 | */ 24 | export function unSlash(s, r = '_') { 25 | return s.split('/').join(r) 26 | } 27 | 28 | /** 29 | * Return appropriate option (1 or 0) 30 | * based on old value for toggle or direct 0 or 1 31 | * @param {boolean} isOn - current value (for toggle) 32 | * @param {number} opt - 0 forces off, 1 forces on, 2 inverts 'isOn' 33 | * @returns {number} 34 | */ 35 | export function setToggle(isOn, opt) { 36 | return 2 == parseInt(opt) ? 1 - isOn : parseInt(opt) 37 | } 38 | 39 | // calculate new fader/level float 40 | // returns a 'new' float value 41 | // or undefined for a store 42 | /** 43 | * Calculates the new position for a fader/level set, adjust, or restore. 44 | * If cross fade requested, adds to the crossfade queue and returns the 1st step. 45 | * For fader store, saves the current value and returns null 46 | * 47 | * @param {*} cmd - actionId 48 | * @param {string} strip - OSC node for channel / trim / send level 49 | * @param {object} opt - option for action 50 | * @param {object} self - context 51 | * @returns {float} new fader position 52 | */ 53 | export async function fadeTo(cmd, strip, opt, self) { 54 | const stat = self.xStat[strip] 55 | const node = strip.split('/').pop() 56 | const subAct = cmd.slice(-2) 57 | let opTicks = 1 58 | 59 | if (subAct == '_a') { 60 | opTicks = String(await self.parseVariablesInString(`${opt.ticks}`)).trim() 61 | if (opTicks && REGEX_PERCENT.test(opTicks)) { 62 | throw new Error('Invalid Adjust Percentage') 63 | } 64 | opTicks = parseInt(opTicks) 65 | } 66 | const faderLim = !!opt.faderLim 67 | const steps = stat.fSteps 68 | const span = parseFloat(opt.duration) 69 | const oldVal = stat[node] 70 | const oldIdx = stat.idx 71 | const byVal = (opTicks * steps) / 100 72 | const newIdx = Math.min(steps - 1, Math.max(0, oldIdx + Math.round(byVal))) 73 | const slot = opt.store == 'me' ? strip : opt.store 74 | let r = -1 75 | 76 | switch (subAct) { 77 | case '_a': // adjust +/- (pseudo %) 78 | r = self.fLevels[steps][newIdx] 79 | break 80 | case '_r': // restore 81 | r = slot && self.tempStore[slot] ? self.tempStore[slot] : -1 82 | break 83 | case '_s': // store 84 | if (slot) { 85 | // sanity check 86 | self.tempStore[slot] = stat[node] 87 | } 88 | r = null 89 | // the 'store' actions are internal to this module only 90 | // intentionally returns 'null' vs an accidental 'undefined' 91 | break 92 | default: // set new value 93 | r = parseFloat(opt[node] || opt.fad) 94 | } 95 | // if max fader limit check requested 96 | // anything over -0.3db resets to 0db 97 | faderLim && r >= 0.74 ? (r = 0.75) : r 98 | 99 | // set up cross fade? 100 | if (span > 0 && r >= 0) { 101 | const xSteps = span / (1000 / self.fadeResolution) 102 | const xDelta = Math.floor(((r - oldVal) / xSteps) * 10000) / 10000 103 | if (xDelta !== 0) { 104 | self.crossFades[strip] = { 105 | steps: xSteps, 106 | delta: xDelta, 107 | startVal: oldVal, 108 | finalVal: r, 109 | atStep: 1, 110 | } 111 | // return start of the xfade 112 | r = oldVal + xDelta 113 | } 114 | } 115 | // self.log('debug',`---------- ${oldIdx}:${oldVal} by ${byVal}(${opTicks}) fadeTo ${newIdx}:${r} ----------`); 116 | return r 117 | } 118 | -------------------------------------------------------------------------------- /upgrades.js: -------------------------------------------------------------------------------- 1 | import { CreateConvertToBooleanFeedbackUpgradeScript } from '@companion-module/base' 2 | import { combineRgb } from '@companion-module/base' 3 | import { ICON_SOLO } from './icons.js' 4 | 5 | export const UpgradeScripts = [ 6 | // grab these values for later 7 | 8 | // [0] 9 | function (context, props) { 10 | const result = { 11 | updatedConfig: null, 12 | updatedActions: [], 13 | updatedFeedbacks: [], 14 | } 15 | 16 | for (let action of props.actions) { 17 | if (['mute', 'mMute', 'usbMute'].includes(action.actionId)) { 18 | if (action.options.mute === null) { 19 | action.options.mute = '0' 20 | result.updatedActions.push(action) 21 | } 22 | } 23 | if ('mute_grp' == action.actionId) { 24 | if (action.options.mute === null) { 25 | action.options.mute = '1' 26 | result.updatedActions.push(action) 27 | } 28 | } 29 | } 30 | 31 | return result 32 | }, 33 | 34 | CreateConvertToBooleanFeedbackUpgradeScript({ 35 | solo_mute: true, 36 | solo_mono: true, 37 | solo_dim: true, 38 | rtn: true, 39 | lr: true, 40 | fxsend: true, 41 | dca: true, 42 | bus: true, 43 | ch: true, 44 | solosw_aux: true, 45 | solosw_bus: true, 46 | solosw_ch: true, 47 | solosw_dca: true, 48 | solosw_fxr: true, 49 | solosw_fxs: true, 50 | solosw_lr: true, 51 | 'rtn/aux': true, 52 | 'config/mute': true, 53 | }), 54 | 55 | // [1] 56 | function (context, props) { 57 | const result = { 58 | updatedConfig: null, 59 | updatedActions: [], 60 | updatedFeedbacks: [], 61 | } 62 | 63 | for (let fb of props.feedbacks) { 64 | if (fb.feedbackId?.match(/^solosw_/) && Object.keys(fb?.style || {}).length == 0) { 65 | fb.style = { 66 | color: combineRgb(255, 255, 255), 67 | bgcolor: 0, 68 | png64: ICON_SOLO, 69 | } 70 | result.updatedFeedbacks.push(fb) 71 | } 72 | } 73 | return result 74 | }, 75 | 76 | function (context, props) { 77 | const result = { 78 | updatedConfig: null, 79 | updatedActions: [], 80 | updatedFeedbacks: [], 81 | } 82 | for (let action of props.actions) { 83 | let changed = false 84 | let aId = action.actionId 85 | if (aId.match(/^send/)) { 86 | // chNum changed to num to match other actions 87 | if (action.options.chNum != undefined) { 88 | action.options.num = action.options.chNum 89 | delete action.options.chNum 90 | changed = true 91 | } 92 | } 93 | if (aId.match(/^fad|send|mFad|usbFad/)) { 94 | action.options.faderLim = false 95 | changed = true 96 | } 97 | if (changed) { 98 | result.updatedActions.push(action) 99 | } 100 | } 101 | return result 102 | }, 103 | CreateConvertToBooleanFeedbackUpgradeScript({ 104 | snap_color: true, 105 | }), 106 | 107 | function (context, props) { 108 | const result = { 109 | updatedConfig: null, 110 | updatedActions: [], 111 | updatedFeedbacks: [], 112 | } 113 | 114 | for (let fb of props.feedbacks) { 115 | let changed = false 116 | if (fb.feedbackId == 'rtn/aux') { 117 | fb.feedbackId = 'rtn_aux' 118 | changed = true 119 | } 120 | if (fb.feedbackId == 'rtn_aux') { 121 | if (fb.options.state == undefined) { 122 | fb.options.state = '1' 123 | changed = true 124 | } 125 | } 126 | if (changed) { 127 | result.updatedFeedbacks.push(fb) 128 | } 129 | } 130 | return result 131 | }, 132 | 133 | function (context, props) { 134 | const result = { 135 | updatedConfig: null, 136 | updatedActions: [], 137 | updatedFeedbacks: [], 138 | } 139 | 140 | for (let fb of props.feedbacks) { 141 | let changed = false 142 | if (fb.feedbackId == 'config/mute') { 143 | fb.feedbackId = 'config_mute' 144 | changed = true 145 | } 146 | if (fb.feedbackId == 'config_mute') { 147 | if (fb.options.state == undefined) { 148 | fb.options.state = '1' 149 | changed = true 150 | } 151 | } 152 | if (changed) { 153 | result.updatedFeedbacks.push(fb) 154 | } 155 | } 156 | return result 157 | }, 158 | ] 159 | -------------------------------------------------------------------------------- /actions.js: -------------------------------------------------------------------------------- 1 | import { Regex, InstanceStatus } from '@companion-module/base' 2 | import { pad0 } from './helpers.js' 3 | 4 | export function buildStaticActions(self) { 5 | const sendOSCCmd = async (cmd, arg) => await self.sendOSC(cmd, arg) 6 | 7 | let actions = { 8 | label: { 9 | name: 'Set label', 10 | options: [ 11 | { 12 | type: 'dropdown', 13 | label: 'Type', 14 | id: 'type', 15 | choices: [ 16 | { id: '/ch/', label: 'Channel 1-16' }, 17 | { id: '/rtn/', label: 'Fx Return 1-4' }, 18 | { id: '/fxsend/', label: 'Fx Send 1-4' }, 19 | { id: '/bus/', label: 'Bus 1-6' }, 20 | ], 21 | default: '/ch/', 22 | }, 23 | { 24 | type: 'textinput', 25 | label: 'Channel, Fx Return, Fx Send or Bus Number', 26 | id: 'num', 27 | default: '1', 28 | regex: Regex.NUMBER, 29 | }, 30 | { 31 | type: 'textinput', 32 | label: 'Label', 33 | id: 'lab', 34 | default: '', 35 | }, 36 | ], 37 | callback: async (action, context) => { 38 | const opt = action.options 39 | const arg = { 40 | type: 's', 41 | value: '' + opt.lab, 42 | } 43 | nVal = opt.type == '/ch/' ? pad0(opt.num) : opt.num 44 | await sendOSCCmd(opt.type + nVal + '/config/name', arg) 45 | }, 46 | }, 47 | 48 | mLabel: { 49 | name: 'Set Main label', 50 | options: [ 51 | { 52 | type: 'textinput', 53 | label: 'Label', 54 | id: 'lab', 55 | default: '', 56 | }, 57 | ], 58 | callback: async (action, context) => { 59 | const opt = action.options 60 | await sendOSCCmd('/lr/config/name', { type: 's', value: '' + opt.lab }) 61 | }, 62 | }, 63 | 64 | usbLabel: { 65 | name: 'Set USB/Aux label', 66 | options: [ 67 | { 68 | type: 'textinput', 69 | label: 'Label', 70 | id: 'lab', 71 | default: 'USB', 72 | }, 73 | ], 74 | callback: async (action, context) => { 75 | const opt = action.options 76 | await sendOSCCmd('/rtn/aux/config/name', { type: 's', value: '' + opt.lab }) 77 | }, 78 | }, 79 | 80 | color: { 81 | name: 'Set color', 82 | options: [ 83 | { 84 | type: 'dropdown', 85 | label: 'Type', 86 | id: 'type', 87 | choices: [ 88 | { id: '/ch/', label: 'Channel 1-16' }, 89 | { id: '/rtn/', label: 'Fx Return 1-4' }, 90 | { id: '/fxsend/', label: 'Fx Send 1-4' }, 91 | { id: '/bus/', label: 'Bus 1-6' }, 92 | ], 93 | default: '/ch/', 94 | }, 95 | { 96 | type: 'textinput', 97 | label: 'Channel, Fx Return, Fx Send or Bus Number', 98 | id: 'num', 99 | default: '1', 100 | regex: Regex.NUMBER, 101 | }, 102 | { 103 | type: 'dropdown', 104 | label: 'color', 105 | id: 'col', 106 | choices: self.COLOR_VALUES, 107 | }, 108 | ], 109 | callback: async (action, context) => { 110 | const opt = action.options 111 | const arg = { 112 | type: 'i', 113 | value: parseInt(opt.col), 114 | } 115 | nVal = opt.type == '/ch/' ? pad0(opt.num) : opt.num 116 | await sendOSCCmd(opt.type + nval + '/config/color', arg) 117 | }, 118 | }, 119 | 120 | mColor: { 121 | name: 'Set Main color', 122 | options: [ 123 | { 124 | type: 'dropdown', 125 | label: 'color', 126 | id: 'col', 127 | choices: self.COLOR_VALUES, 128 | }, 129 | ], 130 | callback: async (action, context) => { 131 | const opt = action.options 132 | await sendOSCCmd('/lr/config/color', { type: 'i', value: parseInt(opt.col) }) 133 | }, 134 | }, 135 | 136 | usbColor: { 137 | name: 'Set USB color', 138 | options: [ 139 | { 140 | type: 'dropdown', 141 | label: 'color', 142 | id: 'col', 143 | choices: self.COLOR_VALUES, 144 | }, 145 | ], 146 | callback: async (action, context) => { 147 | const opt = action.options 148 | await sendOSCCmd('/rtn/aux/config/color', { type: 'i', value: parseInt(opt.col) }) 149 | }, 150 | }, 151 | 152 | load_snap: { 153 | name: 'Snapshot: Load', 154 | options: [ 155 | { 156 | type: 'textinput', 157 | label: 'Snapshot Number 1-64', 158 | id: 'snap', 159 | default: '1', 160 | useVariables: true, 161 | }, 162 | ], 163 | callback: async (action, context) => { 164 | const snap = parseInt(await context.parseVariablesInString(action.options.snap)) 165 | if (snap < 1 || snap > 64) { 166 | const err = [action.controlId, action.actionId, 'Invalid Snapshot #'].join(' → ') 167 | self.updateStatus(InstanceStatus.BadConfig, err) 168 | self.paramError = true 169 | } else { 170 | self.updateStatus(InstanceStatus.Ok) 171 | self.paramError = false 172 | await sendOSCCmd('/-snap/load', { type: 'i', value: snap }) 173 | } 174 | }, 175 | }, 176 | 177 | save_snap_num: { 178 | name: 'Snapshot: Save', 179 | options: [ 180 | { 181 | type: 'textinput', 182 | label: 'Snapshot Number 1-64', 183 | id: 'snap', 184 | default: '1', 185 | useVariables: true, 186 | }, 187 | ], 188 | callback: async (action, context) => { 189 | const snap = parseInt(await context.parseVariablesInString(action.options.snap)) 190 | if (snap < 1 || snap > 64) { 191 | const err = [action.controlId, action.actionId, 'Invalid Snapshot #'].join(' → ') 192 | self.updateStatus(InstanceStatus.BadConfig, err) 193 | self.paramError = true 194 | } else { 195 | self.updateStatus(InstanceStatus.Ok) 196 | self.paramError = false 197 | await sendOSCCmd('/-snap/load', { type: 'i', value: snap }) 198 | } 199 | }, 200 | }, 201 | 202 | next_snap: { 203 | name: 'Snapshot: Load Next', 204 | options: [], 205 | callback: async (action, context) => { 206 | const snap = Math.min(++self.currentSnapshot, 64) 207 | await sendOSCCmd('/-snap/load', { type: 'i', value: snap }) 208 | }, 209 | }, 210 | 211 | prev_snap: { 212 | name: 'Snapshot: Load Prior', 213 | options: [], 214 | callback: async (action, context) => { 215 | const snap = Math.max(--self.currentSnapshot, 1) 216 | await sendOSCCmd('/-snap/load', { type: 'i', value: snap }) 217 | }, 218 | }, 219 | 220 | save_snap: { 221 | name: 'Snapshot: Save Current', 222 | options: [], 223 | callback: async (action, context) => { 224 | const snap = self.currentSnapshot 225 | await sendOSCCmd('/-snap/save', { type: 'i', value: snap }) 226 | }, 227 | }, 228 | 229 | tape: { 230 | name: 'Tape Operation', 231 | options: [ 232 | { 233 | type: 'dropdown', 234 | label: 'Function', 235 | id: 'tFunc', 236 | choices: self.TAPE_FUNCTIONS, 237 | }, 238 | ], 239 | callback: async (action, context) => { 240 | const opt = action.options 241 | await sendOSCCmd('/-stat/tape/state', { type: 'i', value: parseInt(opt.tFunc) }) 242 | }, 243 | }, 244 | } 245 | Object.assign(self.actionDefs, actions) 246 | } 247 | -------------------------------------------------------------------------------- /constants.js: -------------------------------------------------------------------------------- 1 | import { combineRgb } from '@companion-module/base' 2 | import { pad0 } from './helpers.js' 3 | 4 | export function buildConstants(self) { 5 | // discreet float values for faders (1024) 6 | self.fLevels[1024] = [] 7 | for (let i = 0; i < 1024; i++) { 8 | self.fLevels[1024][i] = Math.min( 9 | 1.0, 10 | Math.floor((Math.round(self.stepsToFader(i, 1024) * 1023.5) / 1023) * 10000) / 10000 11 | ) 12 | } 13 | 14 | self.levelOpts = [ 15 | { op: '', act: 'Set' }, 16 | { op: '_a', act: 'Adjust' }, 17 | { op: '_s', act: 'Store' }, 18 | { op: '_r', act: 'Recall' }, 19 | ] 20 | 21 | // pre-set linear values for various other 'levels' 22 | // todo: continue from here 23 | self.LIMITS = { 24 | 1024: { fmin: -100, fmax: 10 }, // main faders 25 | 161: { fmin: -100, fmax: 10 }, // sends, solo level 26 | 101: { fmin: -100, fmax: 100 }, // pan 27 | 145: { fmin: -12, fmax: 60 }, // headamp gain 28 | 73: { fmin: -18, fmax: 18 }, // solo source trim 29 | 65: { fmin: -12, fmax: 20 }, // aux gain 30 | 40: { fmin: -40, fmax: 0 }, // solo dim att/gain 31 | } 32 | 33 | const lvls = [ 34 | 161, // sends, solo level 35 | 101, // pan 36 | 145, // headamp gain 37 | 73, // solo source trim 38 | 65, // aux gain 39 | 40, // solo dim att/gain 40 | ] 41 | 42 | for (let lvl of lvls) { 43 | self.fLevels[lvl] = [] 44 | for (let i = 0; i < lvl; i++) { 45 | self.fLevels[lvl][i] = self.stepsToFader(i, lvl) 46 | } 47 | } 48 | 49 | self.STORE_LOCATION = [] 50 | 51 | for (let i = 1; i <= 10; i++) { 52 | var i2 = pad0(i) 53 | 54 | self.STORE_LOCATION.push({ 55 | label: `Global ${i}`, 56 | id: `gs_${i2}`, 57 | }) 58 | } 59 | 60 | self.FADER_VALUES = [ 61 | { label: '- ∞', id: '0.0' }, 62 | { label: '-50 dB: ', id: '0.1251' }, 63 | { label: '-30 dB', id: '0.251' }, 64 | { label: '-20 dB', id: '0.375' }, 65 | { label: '-18 dB', id: '0.4' }, 66 | { label: '-15 dB', id: '0.437' }, 67 | { label: '-12 dB', id: '0.475' }, 68 | { label: '-9 dB', id: '0.525' }, 69 | { label: '-6 dB', id: '0.6' }, 70 | { label: '-3 dB', id: '0.675' }, 71 | { label: '-2 dB', id: '0.7' }, 72 | { label: '-1 dB', id: '0.725' }, 73 | { label: '0 dB', id: '0.75' }, 74 | { label: '+1 dB', id: '0.775' }, 75 | { label: '+2 dB', id: '0.8' }, 76 | { label: '+3 dB', id: '0.825' }, 77 | { label: '+4 dB', id: '0.85' }, 78 | { label: '+5 dB', id: '0.875' }, 79 | { label: '+6 dB', id: '0.9' }, 80 | { label: '+9 dB', id: '0.975' }, 81 | { label: '+10 dB', id: '1.0' }, 82 | ] 83 | 84 | self.COLOR_VALUES = [ 85 | { label: 'Off', id: '0', bg: 0, fg: combineRgb(64, 64, 64) }, 86 | { label: 'Red: ', id: '1', bg: combineRgb(224, 0, 0), fg: 0 }, 87 | { label: 'Green', id: '2', bg: combineRgb(0, 224, 0), fg: 0 }, 88 | { label: 'Yellow', id: '3', bg: combineRgb(224, 224, 0), fg: 0 }, 89 | { label: 'Blue', id: '4', bg: combineRgb(0, 0, 224), fg: 0 }, 90 | { label: 'Magenta', id: '5', bg: combineRgb(224, 0, 224), fg: 0 }, 91 | { label: 'Cyan', id: '6', bg: combineRgb(0, 192, 224), fg: 0 }, 92 | { label: 'White', id: '7', bg: combineRgb(224, 224, 224), fg: 0 }, 93 | { label: 'Off Inverted', id: '8', bg: combineRgb(64, 64, 64), fg: 0 }, 94 | { label: 'Red Inverted', id: '9', bg: 0, fg: combineRgb(224, 0, 0) }, 95 | { label: 'Green Inverted', id: '10', bg: 0, fg: combineRgb(0, 224, 0) }, 96 | { label: 'Yellow Inverted', id: '11', bg: 0, fg: combineRgb(224, 224, 0) }, 97 | { label: 'Blue Inverted', id: '12', bg: 0, fg: combineRgb(0, 0, 224) }, 98 | { label: 'Magenta Inverted', id: '13', bg: 0, fg: combineRgb(224, 0, 224) }, 99 | { label: 'Cyan Inverted', id: '14', bg: 0, fg: combineRgb(0, 192, 224) }, 100 | { label: 'White Inverted', id: '15', bg: 0, fg: combineRgb(224, 224, 224) }, 101 | ] 102 | 103 | self.MONITOR_SOURCES = [ 104 | { id: 0, label: 'Off' }, 105 | { id: 1, label: 'LR' }, 106 | { id: 2, label: 'LR (PFL)' }, 107 | { id: 3, label: 'LR (AFL)' }, 108 | { id: 4, label: 'AUX' }, 109 | { id: 5, label: 'USB 17/18' }, 110 | { id: 6, label: 'Bus 1' }, 111 | { id: 7, label: 'Bus 2' }, 112 | { id: 8, label: 'Bus 3' }, 113 | { id: 9, label: 'Bus 4' }, 114 | { id: 10, label: 'Bus 5' }, 115 | { id: 11, label: 'Bus 6' }, 116 | { id: 12, label: 'Bus 1/2' }, 117 | { id: 13, label: 'Bus 3/4' }, 118 | { id: 14, label: 'Bus 5/6' }, 119 | ] 120 | 121 | self.TAPE_FUNCTIONS = [ 122 | { label: 'STOP', id: '0' }, 123 | { label: 'PLAY PAUSE', id: '1' }, 124 | { label: 'PLAY', id: '2' }, 125 | { label: 'RECORD PAUSE', id: '3' }, 126 | { label: 'RECORD', id: '4' }, 127 | { label: 'FAST FORWARD', id: '5' }, 128 | { label: 'REWIND', id: '6' }, 129 | ] 130 | 131 | self.BAR_LOCATION = [ 132 | { id: 't', label: 'Top' }, 133 | { id: 'b', label: 'Bottom' }, 134 | { id: 'l', label: 'Left' }, 135 | { id: 'r', label: 'Right' }, 136 | ] 137 | 138 | self.MIXER_MODEL = { 139 | XR12: { desc: 'XAir 12 Rack', channels: 12 }, 140 | XR16: { desc: 'XAir 16 Rack', channels: 16 }, 141 | XR18: { desc: 'XAir 18 Rack', channels: 18 }, 142 | X18: { desc: 'XAir 18 Desk', channels: 18 }, 143 | } 144 | 145 | self.MIXER_CHOICES = [] 146 | Object.entries(self.MIXER_MODEL).forEach(([key, val]) => { 147 | self.MIXER_CHOICES.push({ 148 | id: key, 149 | label: val.desc, 150 | }) 151 | }) 152 | 153 | self.HA_CONFIG = [ 154 | { 155 | 12: { name: '', has: false }, 156 | 16: { name: '', has: false }, 157 | 18: { name: '', has: false }, 158 | }, 159 | ] 160 | 161 | for (let c = 1; c < 25; c++) { 162 | switch (c) { 163 | case 1: 164 | case 2: 165 | case 3: 166 | case 4: 167 | self.HA_CONFIG[c] = { 168 | 12: { name: `XLR ${c}`, has: true }, 169 | 16: { name: `XLR ${c}`, has: true }, 170 | 18: { name: `XLR ${c}`, has: true }, 171 | trim: 145, 172 | ph: true, 173 | } 174 | break 175 | case 5: 176 | case 6: 177 | case 7: 178 | case 8: 179 | self.HA_CONFIG[c] = { 180 | 12: { name: '', has: false }, 181 | 16: { name: `XLR ${c}`, has: true }, 182 | 18: { name: `XLR ${c}`, has: true }, 183 | trim: 145, 184 | ph: true, 185 | } 186 | break 187 | case 9: 188 | case 10: 189 | case 11: 190 | case 12: 191 | case 13: 192 | case 14: 193 | case 15: 194 | case 16: 195 | self.HA_CONFIG[c] = { 196 | 12: { name: '', has: false }, 197 | 16: { name: '', has: false }, 198 | 18: { name: `XLR ${c}`, has: true }, 199 | trim: 145, 200 | ph: true, 201 | } 202 | break 203 | case 17: 204 | self.HA_CONFIG[c] = { 205 | 12: { name: `TRS ${c - 16}`, has: true }, 206 | 16: { name: `TRS ${c - 16}`, has: true }, 207 | 18: { name: 'RCA', has: true }, 208 | trim: 65, 209 | ph: false, 210 | } 211 | break 212 | case 18: 213 | case 19: 214 | case 20: 215 | case 21: 216 | case 22: 217 | case 23: 218 | case 24: 219 | self.HA_CONFIG[c] = { 220 | 12: { name: `TRS ${c - 16}`, has: true }, 221 | 16: { name: `TRS ${c - 16}`, has: true }, 222 | 18: { name: '', has: false }, 223 | trim: 65, 224 | ph: false, 225 | } 226 | break 227 | } 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /companion/HELP.md: -------------------------------------------------------------------------------- 1 | # Midas MR18 / Behringer XR 12/16/18 2 | 3 | This Module controls the Midas MR series and Behringer XR series of consoles 4 | go over to [Midas](https://www.midasconsoles.com/catalog.html?brandName=midas&catalog=Application&category=C-MIDAS-MIXERS-DIGITALSTAGEBOXMIXERS) or [Behringer](https://www.behringer.com/catalog.html?brandName=behringer&catalog=Application&category=C-BEHRINGER-MIXERS-DIGITALSTAGEBOXMIXERS) 5 | to get additional information about the consoles and their capabilities. 6 | 7 | -------- 8 | Contributions for development and maintenance of this open source module are always welcome 9 | 10 | 11 | -------- 12 | 13 | ## Configuration 14 | 15 | **Target IP:** Enter the IP address of the Mixer 16 | 17 | **Scan for XAir Mixers?** Module will scan for XAir mixers on the network 18 | 19 | **Select mixer by Name** Choose a mixer from those located on the network 20 | 21 | **Note* Once a mixer (name) is chosen, the module will attempt to re-locate it if the IP changes. This feature can be disabled by un-checking the *Scan for Mixers* option 22 | 23 | ## Supported Actions 24 | 25 | | Console Function | What it does | 26 | | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | 27 | | Channel, USB, FX Send, Fx Return, Bus and Main mute | Mutes or Unmutes the selected Channel, USB, FX Send, Fx Return, Bus and Main | 28 | | Channel, USB, FX Send, Fx Return, Bus and Main fader set | Sets the level of the selected Channel, Channel, USB, FX Send, Fx Return, Bus and Main fader | 29 | | Channel, USB, FX Send, Fx Return, Bus and Main fader adjust | Adjust the selected Channel, Channel, USB, FX Send, Fx Return, Bus and Main fader up or down by steps **see notes* | 30 | | Store Fader Channel, USB, FX Send, Fx Return, Bus and Main | Stores the selected fader value for later recall **see notes* | 31 | | Recall Fader Channel, USB, FX Send, Fx Return, Bus and Main | Sets the selected fader to the stored value | 32 | | Channel, USB, FX Return, Bus, Main Pan Balance set | Set Pan Balance | 33 | | Channel, USB, FX Return, Bus, Main Pan Balance adjust | Adjust Pan Balance | 34 | | Channel, USB, FX Return, Bus, Main Pan Balance store | Store Pan Balance | 35 | | Channel, USB, FX Return, Bus, Main Pan Balance recall | Recall Pan Balance | 36 | | Set State of Insert, Gate, EQ, Compressor, LR send | Turn the selected processing element On or Off | 37 | | Channel, USB, FX Send, Fx Return, Bus and Main label | Sets the text label in the scribble strip of the selected Channel, USB, FX Send, Fx Return, Bus and Main | 38 | | Channel, USB, FX Send, Fx Return, Bus and Main color | Sets the color of the scribble strip of the selected Channel, USB, FX Send, Fx Return, Bus and Main | 39 | | Mute Group | Turns the selected mute group on or off | 40 | | Bus send | Adjust Bus send for channels | 41 | | Store Bus send | Stores the selected Bus send level for later recall **see notes* | 42 | | Recall Bus send | Recalls the selected Bus send level | 43 | | Channel, USB, FX Send, Fx Return, Bus and Main Solo | Solos the selected Channel, USB, FX Send, Fx Return, Bus and Main | 44 | | Clear Solo | Clears all active solos | 45 | | Solo Level Set | Sets the level of the Solo (monitor) output | 46 | | Set Monitor Source | Sets the Source of the Monitor output | 47 | | Channel Solo Mode | Set solo mode for Channels (AFL/PFL) | 48 | | Channel Solo Mode | Set solo mode for Channels (AFL/PFL) | 49 | | PFL Dim | Enable/Disable PFL Dim/Attenuation | 50 | | Solo Level Adjust | Adjust the Solo level up or down by steps **see notes* | 51 | | Solo Dim | Dims the Solo output level to the value configured in the console. | 52 | | Solo Mute | Mutes the Solo output | 53 | | Solo Mono | Controls the Mono mix-down of the Solo output | 54 | | Snapshot: Load | Loads the given Snapshot from the console internal Snapshot list 1-64 | 55 | | Snapshot: Save | Save the given Snapshot to the console internal Snapshot list 1-64 | 56 | | Snapshot: Load Previous | Loads the previous (numerical) snapshot **see notes* | 57 | | Snapshot: Load Next | Loads the next (numerical) snapshot **see notes* | 58 | | Snapshot: Save Current | Saves/overwrites/updates the current snapshot (NO CONFIRMATION) **see notes* | 59 | | Tape Operation | Stop,Play,PlayPause,Record,RecordPause,Fast Forward,Rewind of the tape Deck | 60 | 61 | **Note *mute, solo, processing*:** All mute, solo, and processing actions also have a Toggle option that inverts the current state of the board setting. 62 | 63 | **Note *fader/level adjustment*:** This module stores fader position as a range from 0 (-oo dB) to 100 (+10dB). The conversion from position to dB is explained below. Fader changes also have an optional duration of 0 to 60000 mSec (0 to 60 seconds) to create cross fades. There is an option to limit levels to 0db. The adjustment amount entry will accept a dynamic variable/expression. 64 | 65 | **Note *Storage and Recall*:** Each channel or bus send has one save value. Recall will only restore the last value saved. There are also 10 Global slots available to store a value that may be recalled to any channel. Recalling an empty slot will have no effect. 66 | 67 | **Note *Snapshots*:** If the Previous/Next numbered Snapshot is empty, the mixer will not change snapshots. The Save snapshot function does NOT ask for confirmation before saving/overwriting. The Snapshot to load item can be a dynamic variable/expression. 68 | 69 | **Note *Presets*:** There are some preset buttons included to some common button configurations with pre-built actions and feedback indicators. They use channel 1 as a demonstration. There is also a 'Rude Solo' button available. 70 | 71 | ## Dynamic Variables 72 | 73 | | Variable | Description | 74 | | -------------------------------- | ----------------------------------------------- | 75 | | **$(INSTANCENAME:m_name)** | Mixer Name | 76 | | **$(INSTANCENAME:m_model)** | Mixer Model | 77 | | **$(INSTANCENAME:m_fw)** | Mixer Firmware | 78 | | **$(INSTANCENAME:s_name)** | Current Snapshot Name | 79 | | **$(INSTANCENAME:s_index)** | Current Snapshot Number | 80 | | **$(INSTANCENAME:s_name_n)** | Next Snapshot Name | 81 | | **$(INSTANCENAME:s_name_p)** | Prior Snapshot Name | 82 | | **$(INSTANCENAME:s_name_{num})** | Name of Snapshot {num} **see notes* | 83 | | **$(INSTANCENAME:l_lr)** | Label on LR/Main | 84 | | **$(INSTANCENAME:l_rtn_aux)** | Label on USB/Aux return | 85 | | **$(INSTANCENAME:l_ch#)** | Label on Channel # | 86 | | **$(INSTANCENAME:l_bus#)** | Label on Bus Master # | 87 | | **$(INSTANCENAME:l_dca#)** | Label on DCA # | 88 | | **$(INSTANCENAME:l_rtn#)** | Label on Return # | 89 | | **$(INSTANCENAME:p_lr)** | Pan Balance on LR/Main | 90 | | **$(INSTANCENAME:p_rtn_aux)** | Pan Balance on USB/Aux return | 91 | | **$(INSTANCENAME:p_rtn_aux_b#)** | Pan Balance on USB/Aux return to Bus # (1,3,5) | 92 | | **$(INSTANCENAME:p_ch#)** | Pan Balance on Channel # | 93 | | **$(INSTANCENAME:p_ch#_b#)** | Pan Balance on Channel # to Bus # (1,3,5) | 94 | | **$(INSTANCENAME:p_bus#)** | Pan Balance on Bus Master # | 95 | | **$(INSTANCENAME:p_rtn#)** | Pan Balance on Return # | 96 | | **$(INSTANCENAME:p_rtn#_b#)** | Pan Balance on Return # to Bus # (1,3,5) | 97 | | **$(INSTANCENAME:f_lr_d)** | LR/Main Fader dB | 98 | | **$(INSTANCENAME:f_lr_p)** | LR/Main Fader Percent | 99 | | **$(INSTANCENAME:f_lr_rp)** | LR/Main Relative Loudness Percent **see notes* | 100 | | **$(INSTANCENAME:f_rtn_aux_d)** | USB/Aux return Fader dB | 101 | | **$(INSTANCENAME:f_rtn_aux_p)** | USB/Aux return Fader Percent | 102 | | **$(INSTANCENAME:f_rtn_aux_rp)** | USB/Aux return Fader Relative Loudness Percent | 103 | | **$(INSTANCENAME:f_ch#_d)** | Channel # Fader dB | 104 | | **$(INSTANCENAME:f_ch#_p)** | Channel # Fader Percent | 105 | | **$(INSTANCENAME:f_ch#_rp)** | Channel # Fader Relative Loudness Percent | 106 | | **$(INSTANCENAME:f_bus#_d)** | Bus Master # Fader dB | 107 | | **$(INSTANCENAME:f_bus#_p)** | Bus Master # Fader Percent | 108 | | **$(INSTANCENAME:f_bus#_rp)** | Bus Master # Fader Relative Loudness Percent | 109 | | **$(INSTANCENAME:f_dca#_d)** | DCA # Fader dB | 110 | | **$(INSTANCENAME:f_dca#_p)** | DCA # Fader Percent | 111 | | **$(INSTANCENAME:f_dca#_rp)** | DCA # Fader Relative Loudness Percent | 112 | | **$(INSTANCENAME:f_rtn#_d)** | Return # Fader dB | 113 | | **$(INSTANCENAME:f_rtn#_p)** | Return # Fader Percent | 114 | | **$(INSTANCENAME:f_rtn#_rp)** | Return # Fader Relative Loudness Percent | 115 | | **$(INSTANCENAME:f_fxsend#_d)** | FX Bus Master # Fader dB | 116 | | **$(INSTANCENAME:f_fxsend#_p)** | FX Bus Master # Fader Percent | 117 | | **$(INSTANCENAME:f_fxsend#_rp)** | FX Bus Master # Fader Relative Loudness Percent | 118 | | **$(INSTANCENAME:m_source)** | Current Monitor Output Source | 119 | | **$(INSTANCENAME:m_chmode)** | Channel Solo Mode (AFL/PFL) | 120 | | **$(INSTANCENAME:m_busmode)** | Bus Solo Mode (AFL/PFL) | 121 | | **$(INSTANCENAME:m_dimpfl)** | Solo PFL Attenuation Enabled (true/false) | 122 | | **$(INSTANCENAME:m_dim)** | Solo Dim Enabled (true/false) | 123 | | **$(INSTANCENAME:f_solo_d)** | Solo (monitor) output level dB | 124 | | **$(INSTANCENAME:f_solo_p)** | Solo (monitor) output level Percent | 125 | | **$(INSTANCENAME:f_fxsend#_rp)** | FX Bus Master # Fader Relative Loudness Percent | 126 | | **$(INSTANCENAME:m_ch#)** | Meter level on Channel # | 127 | | **$(INSTANCENAME:m_bus#)** | Meter level on Bus # | 128 | | **$(INSTANCENAME:m_fxsend#)** | Meter level FX Send # | 129 | | **$(INSTANCENAME:m_lr_?)** | Meter level on Main out (l/r) | 130 | | **$(INSTANCENAME:m_mon_?)** | Meter level on Monitor out (l/r) | 131 | | **$(INSTANCENAME:m_rtn_aux_?)** | Meter level on Aux Return (l/r) | 132 | | **$(INSTANCENAME:m_rtn#_?)** | Meter level on Return # (l/r) | 133 | 134 | **Note *Snapshot numbers*:** Replace {num} with the desired 2-digit snapshot number: $(xair:s_name_04). A snapshot with no name will have a default name of '#{num}': #04 (it is probably empty). 135 | 136 | **Note *Relative Loudness*:** This variable shows the percieved loudness with 0dB fader gain as a reference (100%). +/- 10dB changes become x2/x0.5 respectively as per the Loudness Equation (10 x log2). This allows for a more non-savy user friendly readout. *See table below.* 137 | 138 | **Example values:** 139 | 140 | | d (dB) | % (_p) | % (_rp) | 141 | | ------ | ------ | ------- | 142 | | +10 | 100 | 200 | 143 | | 0 | 75 | 100 | 144 | | -10 | 50 | 50 | 145 | | -20 | 38 | 25 | 146 | | -30 | 25 | 13 | 147 | | -40 | 19 | 6 | 148 | 149 | ## Feedback 150 | 151 | | Feedback | Description | 152 | | --------------------------------- | -------------------------------------------------------------------------------------------- | 153 | | **Color when Current Snapshot** * | Sets the button color if the Selected snapshot is loaded | 154 | | **Color when Channel muted** * | Sets the button color if the selected channel is muted (Channel/Bus/DCA/FX send/FX return) | 155 | | **Color when Main LR muted** * | Sets the button color if the Main LR is muted | 156 | | **Color when USB/Aux in muted** * | Sets the button color if the USB/Aux in is muted | 157 | | **Color when Mute Group on** * | Sets the button color if the selected Mute Group is on | 158 | | **Color of Channel label** | Sets the button color to match the seleted channel (Channel/Bus/DCA/FX send/FX return) label | 159 | | **Color of Main LR label** | Sets the button color to match the Main LR label | 160 | | **Color of USB/Aux label** | Sets the button color to match the USB/Aux label | 161 | | **Channel Solo** * | Changes the button when (Channel/Bus/DCA/FX send/FX return) Solo on | 162 | | **Main LR Solo** * | Changes the button when Main LR Solo on | 163 | | **USB/Aux Solo** * | Changes the button when USB/Aux Solo on | 164 | | **Processing status** * | Changes the button according to the selected channel/process status | 165 | | **Monitor Source** * | Changes the button when Monitor Source is set to selected option | 166 | | **Color when Solo Mute** * | Sets the button color when the Solo output is muted | 167 | | **Color when Solo Mono** * | Sets the button color when the Solo output is mono | 168 | | **Color when Solo Dim PFL** * | Sets the button color when the Solo PFL is dimmed | 169 | | **Color when Solo Dim** * | Sets the button color when the Solo output is dimmed | 170 | | **Color when Any Solo Active** | Sets the button color when 'Clr Solo' is active | 171 | | **Meter Bar** | Adds a graphic meter bar for the selected channel/bus to the button | 172 | 173 | ## Notes 174 | 175 | \* Starred feedbacks are implemented as boolean (on/off) style and can be used in triggers. In order to provide an **off** trigger, these have a **State** option to select which particular state (on/off) to use for the feedback. The default style (button colors) is for the **on** state and may not be applicable to the **off** state. 176 | 177 | Channel ranges are maximums (compatible with the X18). If you have an X12 or X16 invalid channels are ignored. 178 | 179 | Solo Feedback indicator changes the button color to white on black with an overlay:
180 | ![Solo](images/solo-opaque.png "Solo") 181 | 182 | For additional actions please raise a feature request at [github](https://github.com/bitfocus/companion) 183 | 184 | ## Fader steps to dB information 185 | 186 | Similar to the X32, XAir faders implement a 4 linear functions approach with cross points at ‐10, ‐30, ‐60 dB to emulate the log function one can expect to manipulate volume data. Fader controls typically follow a log 10 function to match the human perception of loudness. The volume ratio generic formula: dB value = 20 * log (v2/v1) produces a response curve in blue, as below. On the other hand, XAir faders are using 4 different linear functions with increasing slopes to approximate the dB log transfer shape; the figure below shows the 4 different XAir segments in red (labeled X32). 187 | 188 | In both representations, 0db maps to 0.75 and 10dB maps to 1.0 189 | 190 | ![Fader](images/X32-Air-faders.png?raw=true "Fader") 191 | 192 | Since the mixer uses 1024 steps per fader, there may be some rounding differences between the mixer display and companion. 193 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-useless-escape */ 2 | import OSC from 'osc' 3 | import { combineRgb, Regex, TCPHelper } from '@companion-module/base' 4 | import { runEntrypoint, InstanceBase, InstanceStatus } from '@companion-module/base' 5 | import { UpgradeScripts } from './upgrades.js' 6 | import { buildConstants } from './constants.js' 7 | import { buildStripDefs } from './buildStripDefs.js' 8 | import { buildSoloDefs } from './buildSoloDefs.js' 9 | import { buildStaticActions } from './actions.js' 10 | import { buildSnapshotDefs } from './buildSnapshotDefs.js' 11 | import { buildMeterDefs } from './buildMeterDefs.js' 12 | import { buildHADefs } from './buildHADefs.js' 13 | import { getConfigFields } from './config.js' 14 | import { ICON_SOLO } from './icons.js' 15 | import { pad0 } from './helpers.js' 16 | import os from 'os' 17 | import { runInThisContext } from 'vm' 18 | 19 | class BAirInstance extends InstanceBase { 20 | constructor(internal) { 21 | super(internal) 22 | 23 | // stat id from mixer address 24 | this.fbToStat = {} 25 | this.fbToMeter = {} 26 | 27 | this.soloOffset = {} 28 | this.actionDefs = {} 29 | this.haActionDefs = {} 30 | this.muteFeedbacks = {} 31 | this.meterFeedbacks = {} 32 | this.colorFeedbacks = {} 33 | this.variableDefs = [] 34 | this.fLevels = {} 35 | this.blinkingFB = {} 36 | this.crossFades = {} 37 | this.unitsFound = {} 38 | 39 | this.debugLevel = process.env.DEVELOPER ? 2 : 0 40 | this.PollCount = 10 41 | this.PollTimeout = 40 42 | this.getConfigFields = getConfigFields 43 | 44 | buildConstants(this) 45 | } 46 | 47 | async init(config) { 48 | this.config = config 49 | 50 | if (!this.config.model) { 51 | this.config.model = 'X18' 52 | } 53 | 54 | if (!this.config.channels) { 55 | this.config.channels = parseInt(this.config.model.replace(/\D/g, '')) 56 | this.saveConfig(this.config) 57 | } 58 | this.snapshot = [] 59 | 60 | this.currentSnapshot = 0 61 | this.prevSnapshot = 0 62 | this.nextSnapshot = 0 63 | 64 | this.myMixer = { 65 | name: '', 66 | model: '', 67 | channels: 0, 68 | ip: '', 69 | fwVersion: '', 70 | } 71 | 72 | // mixer state 73 | this.xStat = {} 74 | // meters 75 | this.mStat = {} 76 | 77 | // level/fader value store 78 | this.tempStore = {} 79 | 80 | // cross-fade steps per second 81 | this.fadeResolution = 20 82 | this.needStats = true 83 | this.hostResponse = false 84 | this.blinkOn = false 85 | 86 | this.unitsFound = {} 87 | if (config.scan) { 88 | // quick moment to pre-scan 89 | this.scanForMixers() 90 | } 91 | buildStripDefs(this) 92 | buildSoloDefs(this) 93 | buildStaticActions(this) 94 | buildSnapshotDefs(this) 95 | buildMeterDefs(this) 96 | buildHADefs(this) 97 | 98 | //buildHeadampDefs(this) 99 | this.setActionDefinitions(this.actionDefs) 100 | this.buildStaticFeedbacks(this) 101 | this.buildStaticVariables() 102 | this.buildPresets() 103 | this.init_osc() 104 | this.totalVars = Object.keys(this.xStat).length 105 | this.log('debug', `${this.totalVars} status addresses`) 106 | } 107 | 108 | async configUpdated(config) { 109 | // a bit more processing than available in 110 | // an upgrade script :) 111 | if ('' == config.host) { 112 | let u = this.unitsFound[config.mixer] 113 | if (u) { 114 | config.host = u 115 | this.saveConfig(config) 116 | } 117 | } 118 | // do we have a name for this host? 119 | if (config.scan) { 120 | if (!('' == config.mixer || 'none' == config.mixer) && Object.keys(this.unitsFound).length > 0) { 121 | for (let m in this.unitsFound) { 122 | if (this.unitsFound[m].m_ip == config.host) { 123 | config.mixer = m 124 | config.model = this.unitsFound[m].m_model 125 | config.channels = this.unitsFound[m].m_channels 126 | } 127 | } 128 | this.saveConfig(config) 129 | } 130 | if (config.mixer in this.unitsFound) { 131 | if (config.host != this.unitsFound[config.mixer].m_ip) { 132 | config.host = this.unitsFound[config.mixer].m_ip 133 | this.saveConfig(config) 134 | } 135 | } 136 | } 137 | await this.destroy() // re-start all connections in case host changed. 138 | await this.init(config) 139 | } 140 | 141 | // When module gets deleted 142 | async destroy() { 143 | if (this.heartbeat) { 144 | clearInterval(this.heartbeat) 145 | delete this.heartbeat 146 | } 147 | if (this.blinker) { 148 | clearInterval(this.blinker) 149 | delete this.blinker 150 | } 151 | if (this.fader) { 152 | clearInterval(this.fader) 153 | delete this.fader 154 | } 155 | if (this.oscPort) { 156 | this.oscPort.close() 157 | delete this.oscPort 158 | } 159 | if (this.scanner) { 160 | clearInterval(this.scanner) 161 | delete this.scanner 162 | } 163 | if (this.scanPort) { 164 | this.scanPort.close() 165 | delete this.scanport 166 | } 167 | } 168 | 169 | /** 170 | * heartbeat to request updates, subscription expires every 10 seconds 171 | */ 172 | pulse() { 173 | this.sendOSC('/xremote', []) 174 | // subscribe for meter data 175 | this.sendOSC('/-local/updrate', [{ type: 'i', value: 1 }]) 176 | this.sendOSC('/meters', [ 177 | { type: 's', value: '/meters/1' }, 178 | { type: 'i', value: 0 }, 179 | ]) 180 | // any leftover status needed? 181 | if (this.needStats) { 182 | this.pollStats() 183 | } 184 | } 185 | 186 | /** 187 | * feedback blinker (1 sec interval) 188 | */ 189 | blink() { 190 | // toggle 'blinker' 191 | this.blinkOn = !this.blinkOn 192 | this.checkFeedbacks(...Object.keys(this.blinkingFB)) 193 | } 194 | 195 | /** 196 | * Get broadcast addresses for all local IPv4 interfaces. 197 | * @returns {string[]} An array of broadcast addresses (e.g., ["192.168.1.255", ...]). 198 | */ 199 | getBroadcastAddresses() { 200 | const interfaces = os.networkInterfaces() 201 | const broadcastAddresses = [] 202 | 203 | for (const name of Object.keys(interfaces)) { 204 | for (const iface of interfaces[name]) { 205 | if (iface.family === 'IPv4' && !iface.internal) { 206 | // Calculate broadcast address by replacing the last octet with 255 207 | const parts = iface.address.split('.') 208 | parts[3] = '255' 209 | broadcastAddresses.push(parts.join('.')) 210 | } 211 | } 212 | } 213 | 214 | return broadcastAddresses 215 | } 216 | 217 | /** 218 | * 219 | * network scanner interval 220 | */ 221 | probe() { 222 | const broadcastAddresses = this.getBroadcastAddresses() 223 | 224 | if (!(this.probeCount % 6)) { 225 | // Scan every 30 seconds 226 | for (const broadcast of broadcastAddresses) { 227 | this.scanPort.send( 228 | { 229 | address: '/xinfo', 230 | args: [], 231 | }, 232 | broadcast, 233 | 10024 234 | ) 235 | } 236 | } 237 | this.probeCount++ 238 | } 239 | 240 | /** 241 | * Gather list of local mixer IP numbers and names 242 | */ 243 | async scanForMixers() { 244 | let uPort = this.scanPort 245 | 246 | if (!this.scanPort) { 247 | uPort = this.scanPort = new OSC.UDPPort({ 248 | localAddress: '0.0.0.0', 249 | localPort: 0, 250 | broadcast: true, 251 | metadata: true, 252 | }) 253 | } 254 | 255 | this.scanPort.on('error', (err) => { 256 | this.log('error', 'XAir scan: ' + err.message) 257 | this.probeCount = 0 // reset to check every 5 secs 258 | this.updateStatus(InstanceStatus.UnknownError, err.message) 259 | }) 260 | 261 | uPort.open() 262 | 263 | // When the port is read, send an OSC message to, say, SuperCollider 264 | uPort.on('ready', () => { 265 | this.probeCount = 0 266 | this.probe() 267 | if (this.scanner != undefined) { 268 | clearInterval(this.scanner) 269 | delete this.scanner 270 | } 271 | this.scanner = setInterval(() => { 272 | this.probe() 273 | }, 5000) 274 | }) 275 | 276 | uPort.on('message', (oscMsg, timeTag, info) => { 277 | if ('/xinfo' == oscMsg.address) { 278 | let args = oscMsg.args 279 | let newUnit = { 280 | m_ip: args[0].value, 281 | m_name: args[1].value, 282 | m_model: args[2].value, 283 | m_fwver: args[3].value, 284 | m_channels: parseInt(args[2].value.match(/\d+/)[0]), 285 | m_last: Date.now(), 286 | } 287 | this.unitsFound[newUnit.m_name] = newUnit 288 | if (!this.config.mixer || this.config.mixer == '') { 289 | if (newUnit.m_ip == this.config.host) { 290 | this.config.mixer = newUnit.m_name 291 | this.config.model = newUnit.m_model 292 | this.config.channels = newUnit.m_channels 293 | this.saveConfig(this.config) 294 | } 295 | } 296 | for (let u in this.unitsFound) { 297 | // remove from list if not seen in last 10 minutes 298 | if (Date.now() - this.unitsFound[u].m_last > 600000) { 299 | delete this.unitsFound[u] 300 | } 301 | } 302 | } 303 | }) 304 | } 305 | 306 | /** 307 | * timed fades 308 | */ 309 | doFades() { 310 | let arg = { type: 'f' } 311 | let fadeDone = [] 312 | 313 | for (let f in this.crossFades) { 314 | let c = this.crossFades[f] 315 | c.atStep++ 316 | let atStep = c.atStep 317 | let newVal = c.startVal + c.delta * atStep 318 | 319 | arg.value = Math.sign(c.delta) > 0 ? Math.min(c.finalVal, newVal) : Math.max(c.finalVal, newVal) 320 | 321 | this.sendOSC(f, arg) 322 | 323 | if (atStep > c.steps) { 324 | fadeDone.push(f) 325 | } 326 | } 327 | 328 | // delete completed fades 329 | for (let f of fadeDone) { 330 | delete this.crossFades[f] 331 | } 332 | } 333 | 334 | buildPresets() { 335 | const presets = {} 336 | 337 | presets['chan_fb'] = { 338 | type: 'button', 339 | category: 'Channel', 340 | name: 'Channel 1 Label\nIncludes Label, Color, Mute toggle, Mute feedback, Solo feedback', 341 | style: { 342 | text: '$(xair:l_ch1)', 343 | size: '18', 344 | color: combineRgb(255, 255, 255), 345 | bgcolor: 0, 346 | }, 347 | steps: [ 348 | { 349 | down: [ 350 | { 351 | actionId: 'mute', 352 | options: { 353 | type: '/ch/', 354 | num: 1, 355 | mute: 2, 356 | }, 357 | }, 358 | ], 359 | up: [], 360 | }, 361 | ], 362 | feedbacks: [ 363 | { 364 | feedbackId: 'c_ch', 365 | options: { 366 | theChannel: 1, 367 | }, 368 | }, 369 | { 370 | feedbackId: 'ch', 371 | options: { 372 | theChannel: 1, 373 | state: 1, 374 | }, 375 | style: { 376 | color: 16777215, 377 | bgcolor: combineRgb(128, 0, 0), 378 | }, 379 | }, 380 | { 381 | feedbackId: 'solosw_ch', 382 | options: { 383 | theChannel: 1, 384 | state: '1', 385 | }, 386 | style: { 387 | color: combineRgb(255, 255, 255), 388 | bgcolor: combineRgb(0, 0, 0), 389 | png64: ICON_SOLO, 390 | }, 391 | }, 392 | ], 393 | } 394 | 395 | presets['chan_lvl'] = { 396 | type: 'button', 397 | category: 'Channel', 398 | name: 'Channel 1 Level\nIncludes Fader dB, Color, Solo toggle, Solo feedback', 399 | style: { 400 | text: '$(xair:f_ch1_d)', 401 | size: '18', 402 | color: combineRgb(255, 255, 255), 403 | bgcolor: 0, 404 | }, 405 | steps: [ 406 | { 407 | down: [ 408 | { 409 | actionId: 'solosw_ch', 410 | options: { 411 | num: 1, 412 | solo: 2, 413 | }, 414 | }, 415 | ], 416 | up: [], 417 | }, 418 | ], 419 | feedbacks: [ 420 | { 421 | feedbackId: 'c_ch', 422 | options: { 423 | theChannel: 1, 424 | }, 425 | }, 426 | { 427 | feedbackId: 'solosw_ch', 428 | options: { 429 | theChannel: 1, 430 | state: 1, 431 | }, 432 | style: { 433 | color: combineRgb(255, 255, 255), 434 | bgcolor: combineRgb(0, 0, 0), 435 | png64: ICON_SOLO, 436 | }, 437 | }, 438 | ], 439 | } 440 | presets['rude'] = { 441 | type: 'button', 442 | category: 'Status', 443 | name: 'Rude Solo Button\nBlinks if any solo is on\nPush to clear all solos', 444 | style: { 445 | text: 'All Solo Clear', 446 | size: '18', 447 | color: combineRgb(255, 255, 255), 448 | bgcolor: 0, 449 | }, 450 | steps: [ 451 | { 452 | down: [ 453 | { 454 | actionId: 'clearsolo', 455 | options: {}, 456 | }, 457 | ], 458 | up: [], 459 | }, 460 | ], 461 | feedbacks: [ 462 | { 463 | feedbackId: 'clearsolo', 464 | options: { 465 | blink: 1, 466 | fg: combineRgb(255, 255, 255), 467 | bg: combineRgb(255, 0, 0), 468 | }, 469 | }, 470 | ], 471 | } 472 | 473 | this.setPresetDefinitions(presets) 474 | } 475 | 476 | pollStats() { 477 | let stillNeed = 0 478 | let counter = 0 479 | let timeNow = Date.now() 480 | let timeOut = timeNow - this.PollTimeout 481 | 482 | for (const id in this.xStat) { 483 | if (!this.xStat[id].valid) { 484 | stillNeed++ 485 | if (this.xStat[id].polled < timeOut) { 486 | this.sendOSC(id) 487 | this.xStat[id].polled = timeNow 488 | counter++ 489 | // only allow 'PollCount' queries during one cycle 490 | if (counter > this.PollCount) { 491 | break 492 | } 493 | } 494 | } 495 | } 496 | 497 | if (!this.hostResponse && stillNeed && timeNow - this.timeStart > 10000) { 498 | this.log('error', `${this.config.host} not responding`) 499 | this.updateStatus(InstanceStatus.ConnectionFailure, `${this.config.host} not responding`) 500 | if (this.config.scan && this.unitsFound[this.config.mixer] !== undefined) { 501 | if (this.config.host != this.unitsFound[this.config.mixer]) { 502 | this.log('warn', `Resetting IP for ${this.config.mixer}`) 503 | this.config.host = this.unitsFound[this.config.mixer].m_ip 504 | this.saveConfig(this.config) 505 | this.destroy() 506 | this.init(this.config) 507 | } 508 | } 509 | return 510 | } 511 | 512 | if (0 == stillNeed) { 513 | this.updateStatus(InstanceStatus.Ok, 'Console status loaded') 514 | const c = Object.keys(this.xStat).length 515 | const d = (c / ((timeNow - this.timeStart) / 1000)).toFixed(1) 516 | this.log('info', `Status Sync complete (${c}@${d})`) 517 | } 518 | this.needStats = stillNeed 519 | } 520 | 521 | firstPoll() { 522 | this.sendOSC('/xinfo', []) 523 | this.sendOSC('/-snap/index', []) 524 | this.sendOSC('/-snap/name', []) 525 | this.timeStart = Date.now() 526 | this.pollStats() 527 | this.pulse() 528 | } 529 | 530 | /** 531 | * Calculate linear fader value (0..1) for a given 'step' 532 | * depending on total 'steps' 533 | * @param {integer} i - which step 534 | * @param {integer} steps - number of steps for this fader parameter 535 | * @returns {float} 536 | */ 537 | stepsToFader(i, steps) { 538 | let res = i / (steps - 1) 539 | 540 | return Math.floor(res * 10000) / 10000 541 | } 542 | 543 | /** 544 | * Calculate linear fader dB value for a given 'step' 545 | * depending on total 'steps' 546 | * @param {integer} i - which step 547 | * @param {integer} steps - number of steps for this fader parameter 548 | * @returns {float} 549 | */ 550 | linFaderToDB(f, lim = { fmin: -12, fmax: 20 }) { 551 | return (lim.fmin + (lim.fmax - lim.fmin) * f).toFixed(1) 552 | } 553 | 554 | /** 555 | * Calculate logarithmic fader dB value for a given 'step' 556 | * depending on total 'steps' 557 | * @param {integer} i - which step 558 | * @param {integer} steps - number of steps for this fader parameter 559 | * @returns {float} 560 | */ 561 | logFaderToDB(f, steps) { 562 | let res = i / (steps - 1) 563 | return Math.floor((fmin * exp(log(fmax / fmin) * f)) / 10000) 564 | } 565 | 566 | faderToDB(f, steps, rp) { 567 | // “f” represents OSC float data. f: [0.0, 1.0] 568 | // “d” represents the dB float data. d:[-oo, +10] 569 | // if "rp" (Relative percent) is true, return a loudness perceptual (base 10/33.22) change in % compared to unity (0dB) 570 | let d = 0 571 | 572 | if (f >= 0.5) { 573 | d = f * 40.0 - 30.0 // max dB value: +10. 574 | } else if (f >= 0.25) { 575 | d = f * 80.0 - 50.0 576 | } else if (f >= 0.0625) { 577 | d = f * 160.0 - 70.0 578 | } else if (f >= 0.0) { 579 | d = f * 480.0 - 90.0 // min dB value: -90 or -oo 580 | } 581 | return f == 0 582 | ? rp 583 | ? '0' 584 | : '-oo' 585 | : (rp ? '' : d > 0 ? '+' : '') + (rp ? 100 * 10 ** (d / 33.22) : Math.round(d * 1023.5) / 1024).toFixed(1) 586 | } 587 | 588 | init_osc() { 589 | let self = this 590 | 591 | if (this.oscPort) { 592 | this.oscPort.close() 593 | } 594 | // no host or still default '0.0.0.0' 595 | if (!this.config.host || this.config.host.split('.').reduce((acc, b) => acc + b, 0) == 0) { 596 | this.updateStatus(InstanceStatus.ConnectionFailure, 'No host IP') 597 | } else { 598 | // if (this.config.host) { 599 | this.oscPort = new OSC.UDPPort({ 600 | localAddress: '0.0.0.0', 601 | localPort: 0, // random local port 602 | remoteAddress: this.config.host, 603 | remotePort: 10024, 604 | metadata: true, 605 | }) 606 | 607 | // listen for incoming messages 608 | this.oscPort.on('message', (message, timeTag, info) => { 609 | const args = message.args 610 | const node = message.address 611 | const leaf = node.split('/').pop() 612 | const top = node.split('/')[1] 613 | this.hostResponse = true 614 | 615 | if ('meters' != top && this.debugLevel > 0) { 616 | this.log('debug', `received ${node}:` + JSON.stringify(args) + ` from ${info.address}`) 617 | } 618 | if (this.xStat[node] !== undefined) { 619 | let v = args[0].value 620 | switch (leaf) { 621 | case 'on': 622 | case 'lr': 623 | case '1': 624 | case '2': 625 | case '3': 626 | case '4': // '/config/mute/#' 627 | this.xStat[node].isOn = !!v 628 | const fbSubs = this.xStat[node].fbSubs 629 | if (fbSubs?.size > 0) { 630 | this.checkFeedbacksById(...fbSubs) 631 | } else { 632 | this.checkFeedbacks(this.xStat[node].fbID) 633 | } 634 | break 635 | 636 | // this.xStat[node].isOn = !!v 637 | // this.checkFeedbacks(this.xStat[node].fbID) 638 | // break 639 | case 'fader': 640 | case 'level': 641 | v = Math.floor(v * 10000) / 10000 642 | this.xStat[node][leaf] = v 643 | this.setVariableValues({ 644 | [this.xStat[node].varID + '_p']: Math.round(v * 100), 645 | [this.xStat[node].varID + '_d']: this.faderToDB(v, 1024, false), 646 | [this.xStat[node].varID + '_rp']: Math.round(this.faderToDB(v, 1024, true)), 647 | }) 648 | this.xStat[node].idx = this.fLevels[this.xStat[node].fSteps].findIndex((i) => i >= v) 649 | break 650 | case 'pan': 651 | v = Math.floor(v * 10000) / 10000 652 | this.xStat[node].pan = v 653 | this.setVariableValues({ 654 | [this.xStat[node].varID]: Math.round(v * 200 - 100), 655 | }) 656 | this.xStat[node].idx = this.fLevels[this.xStat[node].fSteps].findIndex((i) => i >= v) 657 | if (this.xStat[node].fbSubs.size > 0) { 658 | this.checkFeedbacksById(...this.xStat[node].fbSubs) 659 | } 660 | break 661 | case 'gain': // headamp 662 | let ha = parseInt(node.split('/')[2]) 663 | this.xStat[node].gain = v 664 | this.setVariableValues({ 665 | [this.xStat[node].varID + '_p']: Math.round(v * 100), 666 | [this.xStat[node].varID + '_d']: this.linFaderToDB( 667 | v, 668 | this.LIMITS[this.xStat[node].trim] 669 | //{ fmin: this.LIMITS[this.xStat[node].trim].fmin, fmax: this.LIMITS[this.xStat[node].trim].fmax}, 670 | ), 671 | }) 672 | break 673 | case 'phantom': 674 | this.xStat[node].pp = !!v 675 | this.setVariableValues({ 676 | [this.xStat[node].varID]: !!v, 677 | }) 678 | if (this.xStat[node].fbSubs?.size > 0) { 679 | this.checkFeedbacksById(...this.xStat[node].fbSubs) 680 | } 681 | break 682 | case 'source': 683 | this.xStat[node].m_source = v 684 | this.setVariableValues({ 685 | [this.xStat[node].varID]: this.MONITOR_SOURCES[v].label, 686 | }) 687 | this.checkFeedbacks(this.xStat[node].fbID) 688 | break 689 | case 'chmode': 690 | case 'busmode': 691 | this.xStat[node].value = !!v ? 'AFL' : 'PFL' 692 | this.setVariableValues({ 693 | [this.xStat[node].varID]: this.xStat[node].value, 694 | }) 695 | break 696 | case 'name': 697 | // no name, use behringer default 698 | v = v == '' ? this.xStat[node].defaultName : v 699 | this.xStat[node].name = v 700 | this.setVariableValues({ [this.xStat[node].fbID]: v }) 701 | if ('-snap' == top) { 702 | let num = parseInt(node.split('/')[2]) 703 | if (num == this.currentSnapshot) { 704 | this.setVariableValues({ s_name: v }) 705 | } else if (num == this.prevSnapshot) { 706 | this.setVariableValues({ s_name_p: v }) 707 | } else if (num == this.nextSnapshot) { 708 | this.setVariableValues({ s_name_n: v }) 709 | } 710 | } 711 | break 712 | case 'color': 713 | this.xStat[node].color = v 714 | this.checkFeedbacks(this.xStat[node].fbID) 715 | break 716 | case 'dimpfl': 717 | case 'mono': 718 | case 'dim': 719 | case 'mute': // '/config/solo/' 720 | this.xStat[node].isOn = !!v 721 | this.checkFeedbacks(this.xStat[node].fbID) 722 | this.setVariableValues({ [this.xStat[node].varID]: v ? true : false }) 723 | break 724 | 725 | default: 726 | if (node.match(/\/solo/)) { 727 | this.xStat[node].isOn = v 728 | this.checkFeedbacks(this.xStat[node].fbID) 729 | } 730 | } 731 | this.xStat[node].valid = true 732 | if (this.needStats) { 733 | this.pollStats() 734 | } 735 | // this.log('debug',`${node}: ${JSON.stringify(args)}`); 736 | } else if ('xinfo' == top) { 737 | this.myMixer.name = args[1].value 738 | this.myMixer.model = args[2].value 739 | this.myMixer.channels = parseInt(args[2].value.match(/\d+/)[0]) 740 | this.myMixer.fw = args[3].value 741 | this.myMixer.ip = args[0].value 742 | this.setVariableValues({ 743 | m_name: this.myMixer.name, 744 | m_model: this.myMixer.model, 745 | m_channels: this.myMixer.channels, 746 | m_fw: this.myMixer.fw, 747 | m_ip: this.myMixer.ip, 748 | }) 749 | } else if ('/-snap/index' == node) { 750 | const s = parseInt(args[0].value) 751 | const n = this.xStat[this.snapshot[s]].name 752 | this.currentSnapshot = s 753 | this.setVariableValues({ 754 | s_index: s, 755 | s_name: n, 756 | ['s_name_' + pad0(s)]: n, 757 | }) 758 | this.prevSnapshot = 1 >= s ? 0 : s - 1 759 | this.nextSnapshot = 64 <= s ? 0 : s + 1 760 | this.setVariableValues({ 761 | s_name_p: this.xStat[this.snapshot[this.prevSnapshot]]?.name ?? '-----', 762 | s_name_n: this.xStat[this.snapshot[this.nextSnapshot]]?.name ?? '-----', 763 | }) 764 | this.checkFeedbacks('snap_color') 765 | this.sendOSC('/-snap/' + pad0(s) + '/name', []) 766 | } else if ('meters' == top) { 767 | // meters here 768 | switch (leaf) { 769 | case '1': 770 | this.parseMeters1(args[0].value) 771 | break 772 | } 773 | if ('meters' != top && this.debugLevel > 0) { 774 | this.log('debug', message.address, args) 775 | } 776 | } 777 | }) 778 | 779 | this.oscPort.on('ready', () => { 780 | this.updateStatus(InstanceStatus.Connecting, 'Loading console status') 781 | this.Connected = true 782 | this.log('info', 'Sync started') 783 | this.firstPoll() 784 | this.heartbeat = setInterval(() => { 785 | this.pulse() 786 | }, 9500) // just before 10 sec expiration 787 | this.blinker = setInterval(() => { 788 | this.blink() 789 | }, 1000) 790 | this.fader = setInterval(() => { 791 | this.doFades() 792 | }, 1000 / this.fadeResolution) 793 | }) 794 | 795 | this.oscPort.on('close', () => { 796 | this.connected = false 797 | if (this.heartbeat) { 798 | clearInterval(this.heartbeat) 799 | delete this.heartbeat 800 | } 801 | if (this.blinker) { 802 | clearInterval(this.blinker) 803 | delete this.blinker 804 | } 805 | if (this.fader) { 806 | clearInterval(this.fader) 807 | delete this.fader 808 | } 809 | }) 810 | 811 | this.oscPort.on('error', (err) => { 812 | this.log('error', 'Error: ' + err.message) 813 | this.updateStatus(InstanceStatus.UnknownError, err.message) 814 | this.connected = false 815 | if (this.heartbeat) { 816 | clearInterval(this.heartbeat) 817 | delete this.heartbeat 818 | } 819 | if (this.blinker) { 820 | clearInterval(this.blinker) 821 | delete this.blinker 822 | } 823 | if (this.fader) { 824 | clearInterval(this.fader) 825 | delete this.fader 826 | } 827 | }) 828 | 829 | this.oscPort.open() 830 | } 831 | } 832 | 833 | parseMeters1(buf) { 834 | if (buf[0] != 40) return 835 | 836 | // if (this.lastMeter && Date.now() - this.lastMeter < 50) { 837 | // return 838 | // } 839 | let data = new DataView(buf.slice(4).buffer) 840 | 841 | let variables = {} 842 | let feedbacks = [] 843 | 844 | for (let i = 0; i < 40; i++) { 845 | const m = this.meter1[i] 846 | let newVal = data.getInt16(i * 2, true) / 256 847 | const mv = this.mStat[m] 848 | let total = mv.total 849 | const oldVal = mv.dbVal 850 | mv.valid = true 851 | mv.dbVal = newVal 852 | 853 | mv.count = ++mv.count % 10 854 | total -= mv.samples[mv.count] 855 | mv.samples[mv.count] = newVal 856 | total += newVal 857 | mv.total = total 858 | if (this.lastMeter && Date.now() - this.lastMeter > 50) { 859 | if (mv.fbSubs.size > 0 && newVal != oldVal) { 860 | this.checkFeedbacksById(...mv.fbSubs) 861 | } 862 | variables[mv.vName] = Math.max(Math.round(total) / 10, -60.0) 863 | } 864 | } 865 | this.setVariableValues(variables) 866 | this.lastMeter = Date.now() 867 | } 868 | 869 | // define static instance variables 870 | buildStaticVariables() { 871 | const variables = [ 872 | { 873 | name: 'XAir Mixer Name', 874 | variableId: 'm_name', 875 | }, 876 | { 877 | name: 'XAir Mixer Model', 878 | variableId: 'm_model', 879 | }, 880 | { 881 | name: 'XAir Mixer Firmware', 882 | variableId: 'm_fw', 883 | }, 884 | { 885 | name: 'XAir Mixer IP Address', 886 | variableId: 'm_ip', 887 | }, 888 | { 889 | name: 'XAir Mixer Channels', 890 | variableId: 'm_channels', 891 | }, 892 | { 893 | name: 'Current Snapshot Name', 894 | variableId: 's_name', 895 | }, 896 | { 897 | name: 'Current Snapshot Index', 898 | variableId: 's_index', 899 | }, 900 | { 901 | name: 'Previous Snapshot Name', 902 | variableId: 's_name_p', 903 | }, 904 | { 905 | name: 'Next Snapshot Name', 906 | variableId: 's_name_n', 907 | }, 908 | ] 909 | variables.push.apply(variables, this.variableDefs) 910 | 911 | this.setVariableDefinitions(variables) 912 | } 913 | 914 | // define instance feedbacks 915 | buildStaticFeedbacks(self) { 916 | const feedbacks = { 917 | snap_color: { 918 | type: 'boolean', 919 | name: 'Is Current Snapshot', 920 | description: 'Indicate on button when snapshot is loaded', 921 | options: [ 922 | { 923 | type: 'textinput', 924 | label: 'Snapshot to match', 925 | id: 'theSnap', 926 | default: '1', 927 | required: true, 928 | useVariables: true, 929 | }, 930 | ], 931 | defaultStyle: { 932 | color: combineRgb(255, 255, 255), 933 | bgcolor: combineRgb(0, 128, 0), 934 | }, 935 | 936 | callback: async (feedback, context) => { 937 | try { 938 | const snap = parseInt(await context.parseVariablesInString(feedback.options.theSnap)) 939 | 940 | if (snap < 1 || snap > 64) { 941 | const err = [feedback.controlId, feedback.feedbackId, 'Invalid Snapshot #'].join(' → ') 942 | this.updateStatus(InstanceStatus.BadConfig, err) 943 | this.paramError = true 944 | } else { 945 | return snap == this.currentSnapshot 946 | } 947 | } finally { 948 | } 949 | }, 950 | }, 951 | } 952 | Object.assign(feedbacks, this.muteFeedbacks) 953 | Object.assign(feedbacks, this.colorFeedbacks) 954 | Object.assign(feedbacks, this.meterFeedbacks) 955 | this.setFeedbackDefinitions(feedbacks) 956 | } 957 | 958 | async sendOSC(node, arg) { 959 | arg = arg ?? [] 960 | 961 | if (this.oscPort) { 962 | if (this.debugLevel > 0) { 963 | this.log('debug', `OSC > ${node}:` + JSON.stringify(arg)) 964 | } 965 | this.oscPort.send({ 966 | address: node, 967 | args: arg, 968 | }) 969 | } 970 | } 971 | } 972 | 973 | runEntrypoint(BAirInstance, UpgradeScripts) 974 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 6 6 | cacheKey: 10c0 7 | 8 | "@companion-module/base@npm:^1.11.2": 9 | version: 1.11.2 10 | resolution: "@companion-module/base@npm:1.11.2" 11 | dependencies: 12 | ajv: "npm:^8.17.1" 13 | colord: "npm:^2.9.3" 14 | ejson: "npm:^2.2.3" 15 | eventemitter3: "npm:^5.0.1" 16 | mimic-fn: "npm:^3.1.0" 17 | nanoid: "npm:^3.3.7" 18 | p-queue: "npm:^6.6.2" 19 | p-timeout: "npm:^4.1.0" 20 | tslib: "npm:^2.7.0" 21 | checksum: c0e3a6994d7be47e6247b7dd3a0a243b276f07c03b21a9f406046fd8af9a1b85d5740f898e255c0f2d2270298fe69bc8b8046718911feea3106a3807b8b46076 22 | languageName: node 23 | linkType: hard 24 | 25 | "@companion-module/tools@npm:^2.1.0": 26 | version: 2.1.0 27 | resolution: "@companion-module/tools@npm:2.1.0" 28 | dependencies: 29 | "@eslint/js": "npm:^9.10.0" 30 | eslint-config-prettier: "npm:^9.1.0" 31 | eslint-plugin-n: "npm:^17.10.2" 32 | eslint-plugin-prettier: "npm:^5.2.1" 33 | find-up: "npm:^7.0.0" 34 | parse-author: "npm:^2.0.0" 35 | tar: "npm:^7.4.3" 36 | webpack: "npm:^5.94.0" 37 | webpack-cli: "npm:^5.1.4" 38 | zx: "npm:^8.1.6" 39 | peerDependencies: 40 | "@companion-module/base": ^1.11.0 41 | eslint: ^9.0.0 42 | prettier: ^3.0.0 43 | typescript-eslint: ^8.2.0 44 | peerDependenciesMeta: 45 | eslint: 46 | optional: true 47 | prettier: 48 | optional: true 49 | typescript-eslint: 50 | optional: true 51 | bin: 52 | companion-generate-manifest: scripts/generate-manifest.js 53 | companion-module-build: scripts/build.js 54 | companion-module-check: scripts/check.js 55 | checksum: a0ea5e762a4ce66088446c8feba10ddd92c3c5cb810c9709c70a60ec67ecf254b7814c3ca4bacc228fba7181018dd84c5d3343203cea7eaa0b475d94dd67e180 56 | languageName: node 57 | linkType: hard 58 | 59 | "@discoveryjs/json-ext@npm:^0.5.0": 60 | version: 0.5.7 61 | resolution: "@discoveryjs/json-ext@npm:0.5.7" 62 | checksum: e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c 63 | languageName: node 64 | linkType: hard 65 | 66 | "@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.4.0": 67 | version: 4.4.0 68 | resolution: "@eslint-community/eslint-utils@npm:4.4.0" 69 | dependencies: 70 | eslint-visitor-keys: "npm:^3.3.0" 71 | peerDependencies: 72 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 73 | checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e 74 | languageName: node 75 | linkType: hard 76 | 77 | "@eslint-community/regexpp@npm:^4.6.0": 78 | version: 4.10.0 79 | resolution: "@eslint-community/regexpp@npm:4.10.0" 80 | checksum: c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 81 | languageName: node 82 | linkType: hard 83 | 84 | "@eslint/js@npm:^9.10.0": 85 | version: 9.16.0 86 | resolution: "@eslint/js@npm:9.16.0" 87 | checksum: a55846a4ddade720662d36682f3eaaf38eac06eeee12c83bb837bba2b7d550dadcb3445b104219f0bc1da2e09b4fe5fb5ba123b8338c8c787bcfbd540878df75 88 | languageName: node 89 | linkType: hard 90 | 91 | "@isaacs/cliui@npm:^8.0.2": 92 | version: 8.0.2 93 | resolution: "@isaacs/cliui@npm:8.0.2" 94 | dependencies: 95 | string-width: "npm:^5.1.2" 96 | string-width-cjs: "npm:string-width@^4.2.0" 97 | strip-ansi: "npm:^7.0.1" 98 | strip-ansi-cjs: "npm:strip-ansi@^6.0.1" 99 | wrap-ansi: "npm:^8.1.0" 100 | wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" 101 | checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e 102 | languageName: node 103 | linkType: hard 104 | 105 | "@isaacs/fs-minipass@npm:^4.0.0": 106 | version: 4.0.1 107 | resolution: "@isaacs/fs-minipass@npm:4.0.1" 108 | dependencies: 109 | minipass: "npm:^7.0.4" 110 | checksum: c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 111 | languageName: node 112 | linkType: hard 113 | 114 | "@jridgewell/gen-mapping@npm:^0.3.0": 115 | version: 0.3.3 116 | resolution: "@jridgewell/gen-mapping@npm:0.3.3" 117 | dependencies: 118 | "@jridgewell/set-array": "npm:^1.0.1" 119 | "@jridgewell/sourcemap-codec": "npm:^1.4.10" 120 | "@jridgewell/trace-mapping": "npm:^0.3.9" 121 | checksum: 376fc11cf5a967318ba3ddd9d8e91be528eab6af66810a713c49b0c3f8dc67e9949452c51c38ab1b19aa618fb5e8594da5a249977e26b1e7fea1ee5a1fcacc74 122 | languageName: node 123 | linkType: hard 124 | 125 | "@jridgewell/resolve-uri@npm:^3.1.0": 126 | version: 3.1.1 127 | resolution: "@jridgewell/resolve-uri@npm:3.1.1" 128 | checksum: 0dbc9e29bc640bbbdc5b9876d2859c69042bfcf1423c1e6421bcca53e826660bff4e41c7d4bcb8dbea696404231a6f902f76ba41835d049e20f2dd6cffb713bf 129 | languageName: node 130 | linkType: hard 131 | 132 | "@jridgewell/set-array@npm:^1.0.1": 133 | version: 1.1.2 134 | resolution: "@jridgewell/set-array@npm:1.1.2" 135 | checksum: bc7ab4c4c00470de4e7562ecac3c0c84f53e7ee8a711e546d67c47da7febe7c45cd67d4d84ee3c9b2c05ae8e872656cdded8a707a283d30bd54fbc65aef821ab 136 | languageName: node 137 | linkType: hard 138 | 139 | "@jridgewell/source-map@npm:^0.3.3": 140 | version: 0.3.5 141 | resolution: "@jridgewell/source-map@npm:0.3.5" 142 | dependencies: 143 | "@jridgewell/gen-mapping": "npm:^0.3.0" 144 | "@jridgewell/trace-mapping": "npm:^0.3.9" 145 | checksum: b985d9ebd833a21a6e9ace820c8a76f60345a34d9e28d98497c16b6e93ce1f131bff0abd45f8585f14aa382cce678ed680d628c631b40a9616a19cfbc2049b68 146 | languageName: node 147 | linkType: hard 148 | 149 | "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": 150 | version: 1.4.15 151 | resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" 152 | checksum: 0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 153 | languageName: node 154 | linkType: hard 155 | 156 | "@jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.9": 157 | version: 0.3.20 158 | resolution: "@jridgewell/trace-mapping@npm:0.3.20" 159 | dependencies: 160 | "@jridgewell/resolve-uri": "npm:^3.1.0" 161 | "@jridgewell/sourcemap-codec": "npm:^1.4.14" 162 | checksum: 0ea0b2675cf513ec44dc25605616a3c9b808b9832e74b5b63c44260d66b58558bba65764f81928fc1033ead911f8718dca1134049c3e7a93937faf436671df31 163 | languageName: node 164 | linkType: hard 165 | 166 | "@npmcli/agent@npm:^2.0.0": 167 | version: 2.2.2 168 | resolution: "@npmcli/agent@npm:2.2.2" 169 | dependencies: 170 | agent-base: "npm:^7.1.0" 171 | http-proxy-agent: "npm:^7.0.0" 172 | https-proxy-agent: "npm:^7.0.1" 173 | lru-cache: "npm:^10.0.1" 174 | socks-proxy-agent: "npm:^8.0.3" 175 | checksum: 325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae 176 | languageName: node 177 | linkType: hard 178 | 179 | "@npmcli/fs@npm:^3.1.0": 180 | version: 3.1.0 181 | resolution: "@npmcli/fs@npm:3.1.0" 182 | dependencies: 183 | semver: "npm:^7.3.5" 184 | checksum: 162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e 185 | languageName: node 186 | linkType: hard 187 | 188 | "@pkgjs/parseargs@npm:^0.11.0": 189 | version: 0.11.0 190 | resolution: "@pkgjs/parseargs@npm:0.11.0" 191 | checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd 192 | languageName: node 193 | linkType: hard 194 | 195 | "@pkgr/core@npm:^0.1.0": 196 | version: 0.1.1 197 | resolution: "@pkgr/core@npm:0.1.1" 198 | checksum: 3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 199 | languageName: node 200 | linkType: hard 201 | 202 | "@serialport/binding-mock@npm:10.2.2": 203 | version: 10.2.2 204 | resolution: "@serialport/binding-mock@npm:10.2.2" 205 | dependencies: 206 | "@serialport/bindings-interface": "npm:^1.2.1" 207 | debug: "npm:^4.3.3" 208 | checksum: ba0b26f0e449b32b77315cf57d377318d4ffdaa84d6aaa1efdc48f35b99ade513d2a37f672443163446f1feeb664d5d518f05ea5c5c90d935b87a92fee36b2ba 209 | languageName: node 210 | linkType: hard 211 | 212 | "@serialport/bindings-cpp@npm:10.8.0": 213 | version: 10.8.0 214 | resolution: "@serialport/bindings-cpp@npm:10.8.0" 215 | dependencies: 216 | "@serialport/bindings-interface": "npm:1.2.2" 217 | "@serialport/parser-readline": "npm:^10.2.1" 218 | debug: "npm:^4.3.2" 219 | node-addon-api: "npm:^5.0.0" 220 | node-gyp: "npm:latest" 221 | node-gyp-build: "npm:^4.3.0" 222 | checksum: e6ee85391a2ca05f2b7aca7ff9037dc08a97faa1c793ebce620245dc645994371df3c56b00accff74b96641761ca37422da95690a09bf89f306bfab87a6360bd 223 | languageName: node 224 | linkType: hard 225 | 226 | "@serialport/bindings-interface@npm:1.2.2, @serialport/bindings-interface@npm:^1.2.1": 227 | version: 1.2.2 228 | resolution: "@serialport/bindings-interface@npm:1.2.2" 229 | checksum: e0fb8deaee585573c4151dcb13cc2dc471fc9906a16d8b595fd9aed27e263b8b2e1ba94b0eda814f2ddab7d4143ad7d504b5d2034e5607d8c1d77b4b3dcfc369 230 | languageName: node 231 | linkType: hard 232 | 233 | "@serialport/parser-byte-length@npm:10.5.0": 234 | version: 10.5.0 235 | resolution: "@serialport/parser-byte-length@npm:10.5.0" 236 | checksum: adeb871734e410f53f9b1ce8798e749a3ea65a586f987befc8c5a0be541d34f7517c561d88608d4c1096f6e380e7c5c7f7919dd47012cf7839f6fb7364d0e4df 237 | languageName: node 238 | linkType: hard 239 | 240 | "@serialport/parser-cctalk@npm:10.5.0": 241 | version: 10.5.0 242 | resolution: "@serialport/parser-cctalk@npm:10.5.0" 243 | checksum: f6277a77a48c1402f2c290818e685a4fccd7312d3a1bb20c0d98b2bfe3d832633c0769a5088c6ae9bdd6b7c256e6ffa61f9f2cab7d52a69c3b90dd86993f3c58 244 | languageName: node 245 | linkType: hard 246 | 247 | "@serialport/parser-delimiter@npm:10.5.0": 248 | version: 10.5.0 249 | resolution: "@serialport/parser-delimiter@npm:10.5.0" 250 | checksum: 290f6bb2007d812bdb6581fe21091d0de7d3e51699d0780884ffe067a663da3cf7284382402e77afa7c04cad1d6b69ec3fe1a701fc5956f972cf31396d9e2ecd 251 | languageName: node 252 | linkType: hard 253 | 254 | "@serialport/parser-inter-byte-timeout@npm:10.5.0": 255 | version: 10.5.0 256 | resolution: "@serialport/parser-inter-byte-timeout@npm:10.5.0" 257 | checksum: 35a8c9d2efc225cd2e7158ab0b8290d441207ea5cbb9d8d9ca0a55736282732a329ac8baf8d0ea7869baae63e0e9825ecbe54901ffab7dd9113db696546e9d26 258 | languageName: node 259 | linkType: hard 260 | 261 | "@serialport/parser-packet-length@npm:10.5.0": 262 | version: 10.5.0 263 | resolution: "@serialport/parser-packet-length@npm:10.5.0" 264 | checksum: 8a2d80578a91c7752d71e508ea83e2cca2c77f4e40bf3bd5a4d18a8a0c750c975f7e60a7af00c91100a3f2a7cd61ce91026091694a03526b2017921ebd817abe 265 | languageName: node 266 | linkType: hard 267 | 268 | "@serialport/parser-readline@npm:10.5.0, @serialport/parser-readline@npm:^10.2.1": 269 | version: 10.5.0 270 | resolution: "@serialport/parser-readline@npm:10.5.0" 271 | dependencies: 272 | "@serialport/parser-delimiter": "npm:10.5.0" 273 | checksum: 0ca8d62e15b70f0dcd3b819fd07759a66eb98e4f523eca220a4dca97981cdf383235ec1c972c630aaaa8a6f8938e36ff319d32de2163d49427483529797d5b79 274 | languageName: node 275 | linkType: hard 276 | 277 | "@serialport/parser-ready@npm:10.5.0": 278 | version: 10.5.0 279 | resolution: "@serialport/parser-ready@npm:10.5.0" 280 | checksum: 1862a4a248f26d2f12c1218183c13348f062fbadd13f8fbaeb8aad80e9ecdaaee609d2efe5f273314c9e1305ac85bd0157d7cc7c3578754cfae724dc7322a4ce 281 | languageName: node 282 | linkType: hard 283 | 284 | "@serialport/parser-regex@npm:10.5.0": 285 | version: 10.5.0 286 | resolution: "@serialport/parser-regex@npm:10.5.0" 287 | checksum: 796e844ce797eeb48720f8595a6b1e654d266a1f748404554f434e71d1557b31c117a27026642652322b60586b1ab156c16728b422f809e1413abdb1003ad8fc 288 | languageName: node 289 | linkType: hard 290 | 291 | "@serialport/parser-slip-encoder@npm:10.5.0": 292 | version: 10.5.0 293 | resolution: "@serialport/parser-slip-encoder@npm:10.5.0" 294 | checksum: 7a4d1caf73398547e3cc5598c39787a8918c2e7f37ef97f7d3958c86e00d2f49d092f6dd2dd65e14a4da94dfc161600d8bbc24e274ba33505f55eb4c9974ed6b 295 | languageName: node 296 | linkType: hard 297 | 298 | "@serialport/parser-spacepacket@npm:10.5.0": 299 | version: 10.5.0 300 | resolution: "@serialport/parser-spacepacket@npm:10.5.0" 301 | checksum: 0c549789efaeb087c3ad93e65137a82f1ceae18a0b8366922f157aed6157c5f5e2f9fd4cccf2c61002da44c4b39cacedf3f2f6db4e6aaa161edd612e44b06ca2 302 | languageName: node 303 | linkType: hard 304 | 305 | "@serialport/stream@npm:10.5.0": 306 | version: 10.5.0 307 | resolution: "@serialport/stream@npm:10.5.0" 308 | dependencies: 309 | "@serialport/bindings-interface": "npm:1.2.2" 310 | debug: "npm:^4.3.2" 311 | checksum: 8ee7eed452ad31c66adb66ba68873b3ce05f2366999ecfd941393363b5dd41638bcad8c433b58478d51d03f25b909d3f65f2b51df715bce3f293cac2242ce7ce 312 | languageName: node 313 | linkType: hard 314 | 315 | "@types/estree@npm:^1.0.5": 316 | version: 1.0.5 317 | resolution: "@types/estree@npm:1.0.5" 318 | checksum: b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d 319 | languageName: node 320 | linkType: hard 321 | 322 | "@types/json-schema@npm:^7.0.8": 323 | version: 7.0.15 324 | resolution: "@types/json-schema@npm:7.0.15" 325 | checksum: a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db 326 | languageName: node 327 | linkType: hard 328 | 329 | "@types/node@npm:*": 330 | version: 20.10.7 331 | resolution: "@types/node@npm:20.10.7" 332 | dependencies: 333 | undici-types: "npm:~5.26.4" 334 | checksum: d626cea1b7da4784ee7b335dcc54e64adba9725dab7ca51a690167de502ef89fec07b05ad8e25845d188d7ad7f72c192ec92964d456321ed5b9452113bf9351f 335 | languageName: node 336 | linkType: hard 337 | 338 | "@types/pngjs@npm:^6.0.1": 339 | version: 6.0.4 340 | resolution: "@types/pngjs@npm:6.0.4" 341 | dependencies: 342 | "@types/node": "npm:*" 343 | checksum: 7217bc69907cc588b29fd875a3f351296744361c12f3a2f4a66c259bcaae7ba75dd3c58586ff53eea6db4512d203ef433435672a47ca8803af84c89c34b2b5b9 344 | languageName: node 345 | linkType: hard 346 | 347 | "@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": 348 | version: 1.12.1 349 | resolution: "@webassemblyjs/ast@npm:1.12.1" 350 | dependencies: 351 | "@webassemblyjs/helper-numbers": "npm:1.11.6" 352 | "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" 353 | checksum: ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c 354 | languageName: node 355 | linkType: hard 356 | 357 | "@webassemblyjs/floating-point-hex-parser@npm:1.11.6": 358 | version: 1.11.6 359 | resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" 360 | checksum: 37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a 361 | languageName: node 362 | linkType: hard 363 | 364 | "@webassemblyjs/helper-api-error@npm:1.11.6": 365 | version: 1.11.6 366 | resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" 367 | checksum: a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a 368 | languageName: node 369 | linkType: hard 370 | 371 | "@webassemblyjs/helper-buffer@npm:1.12.1": 372 | version: 1.12.1 373 | resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" 374 | checksum: 0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a 375 | languageName: node 376 | linkType: hard 377 | 378 | "@webassemblyjs/helper-numbers@npm:1.11.6": 379 | version: 1.11.6 380 | resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" 381 | dependencies: 382 | "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" 383 | "@webassemblyjs/helper-api-error": "npm:1.11.6" 384 | "@xtuc/long": "npm:4.2.2" 385 | checksum: c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 386 | languageName: node 387 | linkType: hard 388 | 389 | "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": 390 | version: 1.11.6 391 | resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" 392 | checksum: 79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 393 | languageName: node 394 | linkType: hard 395 | 396 | "@webassemblyjs/helper-wasm-section@npm:1.12.1": 397 | version: 1.12.1 398 | resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" 399 | dependencies: 400 | "@webassemblyjs/ast": "npm:1.12.1" 401 | "@webassemblyjs/helper-buffer": "npm:1.12.1" 402 | "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" 403 | "@webassemblyjs/wasm-gen": "npm:1.12.1" 404 | checksum: 0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 405 | languageName: node 406 | linkType: hard 407 | 408 | "@webassemblyjs/ieee754@npm:1.11.6": 409 | version: 1.11.6 410 | resolution: "@webassemblyjs/ieee754@npm:1.11.6" 411 | dependencies: 412 | "@xtuc/ieee754": "npm:^1.2.0" 413 | checksum: 59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f 414 | languageName: node 415 | linkType: hard 416 | 417 | "@webassemblyjs/leb128@npm:1.11.6": 418 | version: 1.11.6 419 | resolution: "@webassemblyjs/leb128@npm:1.11.6" 420 | dependencies: 421 | "@xtuc/long": "npm:4.2.2" 422 | checksum: cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e 423 | languageName: node 424 | linkType: hard 425 | 426 | "@webassemblyjs/utf8@npm:1.11.6": 427 | version: 1.11.6 428 | resolution: "@webassemblyjs/utf8@npm:1.11.6" 429 | checksum: 14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee 430 | languageName: node 431 | linkType: hard 432 | 433 | "@webassemblyjs/wasm-edit@npm:^1.12.1": 434 | version: 1.12.1 435 | resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" 436 | dependencies: 437 | "@webassemblyjs/ast": "npm:1.12.1" 438 | "@webassemblyjs/helper-buffer": "npm:1.12.1" 439 | "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" 440 | "@webassemblyjs/helper-wasm-section": "npm:1.12.1" 441 | "@webassemblyjs/wasm-gen": "npm:1.12.1" 442 | "@webassemblyjs/wasm-opt": "npm:1.12.1" 443 | "@webassemblyjs/wasm-parser": "npm:1.12.1" 444 | "@webassemblyjs/wast-printer": "npm:1.12.1" 445 | checksum: 972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b 446 | languageName: node 447 | linkType: hard 448 | 449 | "@webassemblyjs/wasm-gen@npm:1.12.1": 450 | version: 1.12.1 451 | resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" 452 | dependencies: 453 | "@webassemblyjs/ast": "npm:1.12.1" 454 | "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" 455 | "@webassemblyjs/ieee754": "npm:1.11.6" 456 | "@webassemblyjs/leb128": "npm:1.11.6" 457 | "@webassemblyjs/utf8": "npm:1.11.6" 458 | checksum: 1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 459 | languageName: node 460 | linkType: hard 461 | 462 | "@webassemblyjs/wasm-opt@npm:1.12.1": 463 | version: 1.12.1 464 | resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" 465 | dependencies: 466 | "@webassemblyjs/ast": "npm:1.12.1" 467 | "@webassemblyjs/helper-buffer": "npm:1.12.1" 468 | "@webassemblyjs/wasm-gen": "npm:1.12.1" 469 | "@webassemblyjs/wasm-parser": "npm:1.12.1" 470 | checksum: 992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb 471 | languageName: node 472 | linkType: hard 473 | 474 | "@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": 475 | version: 1.12.1 476 | resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" 477 | dependencies: 478 | "@webassemblyjs/ast": "npm:1.12.1" 479 | "@webassemblyjs/helper-api-error": "npm:1.11.6" 480 | "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" 481 | "@webassemblyjs/ieee754": "npm:1.11.6" 482 | "@webassemblyjs/leb128": "npm:1.11.6" 483 | "@webassemblyjs/utf8": "npm:1.11.6" 484 | checksum: e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e 485 | languageName: node 486 | linkType: hard 487 | 488 | "@webassemblyjs/wast-printer@npm:1.12.1": 489 | version: 1.12.1 490 | resolution: "@webassemblyjs/wast-printer@npm:1.12.1" 491 | dependencies: 492 | "@webassemblyjs/ast": "npm:1.12.1" 493 | "@xtuc/long": "npm:4.2.2" 494 | checksum: 39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a 495 | languageName: node 496 | linkType: hard 497 | 498 | "@webpack-cli/configtest@npm:^2.1.1": 499 | version: 2.1.1 500 | resolution: "@webpack-cli/configtest@npm:2.1.1" 501 | peerDependencies: 502 | webpack: 5.x.x 503 | webpack-cli: 5.x.x 504 | checksum: a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d 505 | languageName: node 506 | linkType: hard 507 | 508 | "@webpack-cli/info@npm:^2.0.2": 509 | version: 2.0.2 510 | resolution: "@webpack-cli/info@npm:2.0.2" 511 | peerDependencies: 512 | webpack: 5.x.x 513 | webpack-cli: 5.x.x 514 | checksum: ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d 515 | languageName: node 516 | linkType: hard 517 | 518 | "@webpack-cli/serve@npm:^2.0.5": 519 | version: 2.0.5 520 | resolution: "@webpack-cli/serve@npm:2.0.5" 521 | peerDependencies: 522 | webpack: 5.x.x 523 | webpack-cli: 5.x.x 524 | peerDependenciesMeta: 525 | webpack-dev-server: 526 | optional: true 527 | checksum: 36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc 528 | languageName: node 529 | linkType: hard 530 | 531 | "@xtuc/ieee754@npm:^1.2.0": 532 | version: 1.2.0 533 | resolution: "@xtuc/ieee754@npm:1.2.0" 534 | checksum: a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f 535 | languageName: node 536 | linkType: hard 537 | 538 | "@xtuc/long@npm:4.2.2": 539 | version: 4.2.2 540 | resolution: "@xtuc/long@npm:4.2.2" 541 | checksum: 8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 542 | languageName: node 543 | linkType: hard 544 | 545 | "abbrev@npm:^2.0.0": 546 | version: 2.0.0 547 | resolution: "abbrev@npm:2.0.0" 548 | checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 549 | languageName: node 550 | linkType: hard 551 | 552 | "acorn-import-attributes@npm:^1.9.5": 553 | version: 1.9.5 554 | resolution: "acorn-import-attributes@npm:1.9.5" 555 | peerDependencies: 556 | acorn: ^8 557 | checksum: 5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d 558 | languageName: node 559 | linkType: hard 560 | 561 | "acorn@npm:^8.7.1, acorn@npm:^8.8.2": 562 | version: 8.11.3 563 | resolution: "acorn@npm:8.11.3" 564 | bin: 565 | acorn: bin/acorn 566 | checksum: 3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 567 | languageName: node 568 | linkType: hard 569 | 570 | "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": 571 | version: 7.1.1 572 | resolution: "agent-base@npm:7.1.1" 573 | dependencies: 574 | debug: "npm:^4.3.4" 575 | checksum: e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 576 | languageName: node 577 | linkType: hard 578 | 579 | "aggregate-error@npm:^3.0.0": 580 | version: 3.1.0 581 | resolution: "aggregate-error@npm:3.1.0" 582 | dependencies: 583 | clean-stack: "npm:^2.0.0" 584 | indent-string: "npm:^4.0.0" 585 | checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 586 | languageName: node 587 | linkType: hard 588 | 589 | "ajv-keywords@npm:^3.5.2": 590 | version: 3.5.2 591 | resolution: "ajv-keywords@npm:3.5.2" 592 | peerDependencies: 593 | ajv: ^6.9.1 594 | checksum: 0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 595 | languageName: node 596 | linkType: hard 597 | 598 | "ajv@npm:^6.12.5": 599 | version: 6.12.6 600 | resolution: "ajv@npm:6.12.6" 601 | dependencies: 602 | fast-deep-equal: "npm:^3.1.1" 603 | fast-json-stable-stringify: "npm:^2.0.0" 604 | json-schema-traverse: "npm:^0.4.1" 605 | uri-js: "npm:^4.2.2" 606 | checksum: 41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 607 | languageName: node 608 | linkType: hard 609 | 610 | "ajv@npm:^8.17.1": 611 | version: 8.17.1 612 | resolution: "ajv@npm:8.17.1" 613 | dependencies: 614 | fast-deep-equal: "npm:^3.1.3" 615 | fast-uri: "npm:^3.0.1" 616 | json-schema-traverse: "npm:^1.0.0" 617 | require-from-string: "npm:^2.0.2" 618 | checksum: ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 619 | languageName: node 620 | linkType: hard 621 | 622 | "ansi-regex@npm:^5.0.1": 623 | version: 5.0.1 624 | resolution: "ansi-regex@npm:5.0.1" 625 | checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 626 | languageName: node 627 | linkType: hard 628 | 629 | "ansi-regex@npm:^6.0.1": 630 | version: 6.0.1 631 | resolution: "ansi-regex@npm:6.0.1" 632 | checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 633 | languageName: node 634 | linkType: hard 635 | 636 | "ansi-styles@npm:^4.0.0": 637 | version: 4.3.0 638 | resolution: "ansi-styles@npm:4.3.0" 639 | dependencies: 640 | color-convert: "npm:^2.0.1" 641 | checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 642 | languageName: node 643 | linkType: hard 644 | 645 | "ansi-styles@npm:^6.1.0": 646 | version: 6.2.1 647 | resolution: "ansi-styles@npm:6.2.1" 648 | checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c 649 | languageName: node 650 | linkType: hard 651 | 652 | "author-regex@npm:^1.0.0": 653 | version: 1.0.0 654 | resolution: "author-regex@npm:1.0.0" 655 | checksum: 3f3a5ad6660be010bd5b979fac180f435bd9615e81db2b1cdac081eb3f639461f6c3927ced956e377a5c91cc789e3de3a3e900e296c1423971043c8fd8be0b73 656 | languageName: node 657 | linkType: hard 658 | 659 | "balanced-match@npm:^1.0.0": 660 | version: 1.0.2 661 | resolution: "balanced-match@npm:1.0.2" 662 | checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee 663 | languageName: node 664 | linkType: hard 665 | 666 | "behringer-xair@workspace:.": 667 | version: 0.0.0-use.local 668 | resolution: "behringer-xair@workspace:." 669 | dependencies: 670 | "@companion-module/base": ^1.11.2 671 | "@companion-module/tools": ^2.1.0 672 | companion-module-utils: ^0.5.0 673 | osc: ^2.4.3 674 | languageName: unknown 675 | linkType: soft 676 | 677 | "brace-expansion@npm:^2.0.1": 678 | version: 2.0.1 679 | resolution: "brace-expansion@npm:2.0.1" 680 | dependencies: 681 | balanced-match: "npm:^1.0.0" 682 | checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f 683 | languageName: node 684 | linkType: hard 685 | 686 | "browserslist@npm:^4.21.10": 687 | version: 4.23.1 688 | resolution: "browserslist@npm:4.23.1" 689 | dependencies: 690 | caniuse-lite: "npm:^1.0.30001629" 691 | electron-to-chromium: "npm:^1.4.796" 692 | node-releases: "npm:^2.0.14" 693 | update-browserslist-db: "npm:^1.0.16" 694 | bin: 695 | browserslist: cli.js 696 | checksum: eb47c7ab9d60db25ce2faca70efeb278faa7282a2f62b7f2fa2f92e5f5251cf65144244566c86559419ff4f6d78f59ea50e39911321ad91f3b27788901f1f5e9 697 | languageName: node 698 | linkType: hard 699 | 700 | "buffer-from@npm:^1.0.0": 701 | version: 1.1.2 702 | resolution: "buffer-from@npm:1.1.2" 703 | checksum: 124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 704 | languageName: node 705 | linkType: hard 706 | 707 | "cacache@npm:^18.0.0": 708 | version: 18.0.2 709 | resolution: "cacache@npm:18.0.2" 710 | dependencies: 711 | "@npmcli/fs": "npm:^3.1.0" 712 | fs-minipass: "npm:^3.0.0" 713 | glob: "npm:^10.2.2" 714 | lru-cache: "npm:^10.0.1" 715 | minipass: "npm:^7.0.3" 716 | minipass-collect: "npm:^2.0.1" 717 | minipass-flush: "npm:^1.0.5" 718 | minipass-pipeline: "npm:^1.2.4" 719 | p-map: "npm:^4.0.0" 720 | ssri: "npm:^10.0.0" 721 | tar: "npm:^6.1.11" 722 | unique-filename: "npm:^3.0.0" 723 | checksum: 7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc 724 | languageName: node 725 | linkType: hard 726 | 727 | "caniuse-lite@npm:^1.0.30001629": 728 | version: 1.0.30001629 729 | resolution: "caniuse-lite@npm:1.0.30001629" 730 | checksum: e95136a423c0c5e7f9d026ef3f9be8d06cadc4c83ad65eedfaeaba6b5eb814489ea186e90bae1085f3be7348577e25f8fe436b384c2f983324ad8dea4a7dfe1d 731 | languageName: node 732 | linkType: hard 733 | 734 | "chownr@npm:^2.0.0": 735 | version: 2.0.0 736 | resolution: "chownr@npm:2.0.0" 737 | checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 738 | languageName: node 739 | linkType: hard 740 | 741 | "chownr@npm:^3.0.0": 742 | version: 3.0.0 743 | resolution: "chownr@npm:3.0.0" 744 | checksum: 43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 745 | languageName: node 746 | linkType: hard 747 | 748 | "chrome-trace-event@npm:^1.0.2": 749 | version: 1.0.3 750 | resolution: "chrome-trace-event@npm:1.0.3" 751 | checksum: 080ce2d20c2b9e0f8461a380e9585686caa768b1c834a464470c9dc74cda07f27611c7b727a2cd768a9cecd033297fdec4ce01f1e58b62227882c1059dec321c 752 | languageName: node 753 | linkType: hard 754 | 755 | "clean-stack@npm:^2.0.0": 756 | version: 2.2.0 757 | resolution: "clean-stack@npm:2.2.0" 758 | checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 759 | languageName: node 760 | linkType: hard 761 | 762 | "clone-deep@npm:^4.0.1": 763 | version: 4.0.1 764 | resolution: "clone-deep@npm:4.0.1" 765 | dependencies: 766 | is-plain-object: "npm:^2.0.4" 767 | kind-of: "npm:^6.0.2" 768 | shallow-clone: "npm:^3.0.0" 769 | checksum: 637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 770 | languageName: node 771 | linkType: hard 772 | 773 | "color-convert@npm:^2.0.1": 774 | version: 2.0.1 775 | resolution: "color-convert@npm:2.0.1" 776 | dependencies: 777 | color-name: "npm:~1.1.4" 778 | checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 779 | languageName: node 780 | linkType: hard 781 | 782 | "color-name@npm:~1.1.4": 783 | version: 1.1.4 784 | resolution: "color-name@npm:1.1.4" 785 | checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 786 | languageName: node 787 | linkType: hard 788 | 789 | "colord@npm:^2.9.3": 790 | version: 2.9.3 791 | resolution: "colord@npm:2.9.3" 792 | checksum: 9699e956894d8996b28c686afe8988720785f476f59335c80ce852ded76ab3ebe252703aec53d9bef54f6219aea6b960fb3d9a8300058a1d0c0d4026460cd110 793 | languageName: node 794 | linkType: hard 795 | 796 | "colorette@npm:^2.0.14": 797 | version: 2.0.20 798 | resolution: "colorette@npm:2.0.20" 799 | checksum: e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 800 | languageName: node 801 | linkType: hard 802 | 803 | "commander@npm:^10.0.1": 804 | version: 10.0.1 805 | resolution: "commander@npm:10.0.1" 806 | checksum: 53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 807 | languageName: node 808 | linkType: hard 809 | 810 | "commander@npm:^2.20.0": 811 | version: 2.20.3 812 | resolution: "commander@npm:2.20.3" 813 | checksum: 74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 814 | languageName: node 815 | linkType: hard 816 | 817 | "companion-module-utils@npm:^0.5.0": 818 | version: 0.5.0 819 | resolution: "companion-module-utils@npm:0.5.0" 820 | dependencies: 821 | "@types/pngjs": "npm:^6.0.1" 822 | pngjs: "npm:^7.0.0" 823 | checksum: ad8ec64ba33823fc5cbb4fba0a815f1a3897c1e337dd4897c1c6bfef6c33fa0c193aeda09ac451afe369c1ce85ca5d7b2250c554d7ab516118790d153a2c57af 824 | languageName: node 825 | linkType: hard 826 | 827 | "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": 828 | version: 7.0.6 829 | resolution: "cross-spawn@npm:7.0.6" 830 | dependencies: 831 | path-key: "npm:^3.1.0" 832 | shebang-command: "npm:^2.0.0" 833 | which: "npm:^2.0.1" 834 | checksum: 053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 835 | languageName: node 836 | linkType: hard 837 | 838 | "debug@npm:4, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": 839 | version: 4.3.4 840 | resolution: "debug@npm:4.3.4" 841 | dependencies: 842 | ms: "npm:2.1.2" 843 | peerDependenciesMeta: 844 | supports-color: 845 | optional: true 846 | checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 847 | languageName: node 848 | linkType: hard 849 | 850 | "eastasianwidth@npm:^0.2.0": 851 | version: 0.2.0 852 | resolution: "eastasianwidth@npm:0.2.0" 853 | checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 854 | languageName: node 855 | linkType: hard 856 | 857 | "ejson@npm:^2.2.3": 858 | version: 2.2.3 859 | resolution: "ejson@npm:2.2.3" 860 | checksum: 648ea347f5e57441b7b9341adc6de244445b6da1d0e7747ea7a083f906299b92e4c44fc29e6de0b240d8fa4a73159e85f9367780d7af2ecbc50aae8a4e4961ae 861 | languageName: node 862 | linkType: hard 863 | 864 | "electron-to-chromium@npm:^1.4.796": 865 | version: 1.4.796 866 | resolution: "electron-to-chromium@npm:1.4.796" 867 | checksum: 4f80f06f8e86a56889c1f687db4fec2d5cba6daf23e1f5f621e98254501579d83eaeff9aa1f7aa4144407b519507ea1e55397bfa8f82f1491b17cc4c238bdf6e 868 | languageName: node 869 | linkType: hard 870 | 871 | "emoji-regex@npm:^8.0.0": 872 | version: 8.0.0 873 | resolution: "emoji-regex@npm:8.0.0" 874 | checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 875 | languageName: node 876 | linkType: hard 877 | 878 | "emoji-regex@npm:^9.2.2": 879 | version: 9.2.2 880 | resolution: "emoji-regex@npm:9.2.2" 881 | checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 882 | languageName: node 883 | linkType: hard 884 | 885 | "encoding@npm:^0.1.13": 886 | version: 0.1.13 887 | resolution: "encoding@npm:0.1.13" 888 | dependencies: 889 | iconv-lite: "npm:^0.6.2" 890 | checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 891 | languageName: node 892 | linkType: hard 893 | 894 | "enhanced-resolve@npm:^5.17.0, enhanced-resolve@npm:^5.17.1": 895 | version: 5.17.1 896 | resolution: "enhanced-resolve@npm:5.17.1" 897 | dependencies: 898 | graceful-fs: "npm:^4.2.4" 899 | tapable: "npm:^2.2.0" 900 | checksum: 81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 901 | languageName: node 902 | linkType: hard 903 | 904 | "env-paths@npm:^2.2.0": 905 | version: 2.2.1 906 | resolution: "env-paths@npm:2.2.1" 907 | checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 908 | languageName: node 909 | linkType: hard 910 | 911 | "envinfo@npm:^7.7.3": 912 | version: 7.11.0 913 | resolution: "envinfo@npm:7.11.0" 914 | bin: 915 | envinfo: dist/cli.js 916 | checksum: 4415b9c1ca32cdf92ce126136b9965eeac2efd6ab7e5278c06e8f86d048edad87ef4084710313a6d938ef9bc084ab17e1caee16339d731d230f3e2650f3aaf4d 917 | languageName: node 918 | linkType: hard 919 | 920 | "err-code@npm:^2.0.2": 921 | version: 2.0.3 922 | resolution: "err-code@npm:2.0.3" 923 | checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 924 | languageName: node 925 | linkType: hard 926 | 927 | "es-module-lexer@npm:^1.2.1": 928 | version: 1.4.1 929 | resolution: "es-module-lexer@npm:1.4.1" 930 | checksum: b7260a138668554d3f0ddcc728cb4b60c2fa463f15545cf155ecbdd5450a1348952d58298a7f48642e900ee579f21d7f5304b6b3c61b3d9fc2d4b2109b5a9dff 931 | languageName: node 932 | linkType: hard 933 | 934 | "escalade@npm:^3.1.2": 935 | version: 3.1.2 936 | resolution: "escalade@npm:3.1.2" 937 | checksum: 6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 938 | languageName: node 939 | linkType: hard 940 | 941 | "eslint-compat-utils@npm:^0.1.2": 942 | version: 0.1.2 943 | resolution: "eslint-compat-utils@npm:0.1.2" 944 | peerDependencies: 945 | eslint: ">=6.0.0" 946 | checksum: 023fe1422eb5dfebe71e118fe144836f28c06b1f4d55ef4c1c42ec2dbfa3e09f19287b0092881aad307429cf247fec9ade603e050392033106d26bc981d82ee5 947 | languageName: node 948 | linkType: hard 949 | 950 | "eslint-config-prettier@npm:^9.1.0": 951 | version: 9.1.0 952 | resolution: "eslint-config-prettier@npm:9.1.0" 953 | peerDependencies: 954 | eslint: ">=7.0.0" 955 | bin: 956 | eslint-config-prettier: bin/cli.js 957 | checksum: 6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d 958 | languageName: node 959 | linkType: hard 960 | 961 | "eslint-plugin-es-x@npm:^7.5.0": 962 | version: 7.5.0 963 | resolution: "eslint-plugin-es-x@npm:7.5.0" 964 | dependencies: 965 | "@eslint-community/eslint-utils": "npm:^4.1.2" 966 | "@eslint-community/regexpp": "npm:^4.6.0" 967 | eslint-compat-utils: "npm:^0.1.2" 968 | peerDependencies: 969 | eslint: ">=8" 970 | checksum: e2fa9295f1b05a73f540007139c01b57f58e5f51cb841b80dc7ff7782219d8bff7aff7a54250bb4dd636a483052828492060d4aa1dac566b5289bde89616e1f5 971 | languageName: node 972 | linkType: hard 973 | 974 | "eslint-plugin-n@npm:^17.10.2": 975 | version: 17.10.2 976 | resolution: "eslint-plugin-n@npm:17.10.2" 977 | dependencies: 978 | "@eslint-community/eslint-utils": "npm:^4.4.0" 979 | enhanced-resolve: "npm:^5.17.0" 980 | eslint-plugin-es-x: "npm:^7.5.0" 981 | get-tsconfig: "npm:^4.7.0" 982 | globals: "npm:^15.8.0" 983 | ignore: "npm:^5.2.4" 984 | minimatch: "npm:^9.0.5" 985 | semver: "npm:^7.5.3" 986 | peerDependencies: 987 | eslint: ">=8.23.0" 988 | checksum: cd1e089a5243e923a0f79f688b69d27c8a6513deb7c4b2e687e8c476893e512f6a97ecf5ed595e489b583675002126065e3864c0102a606b857ec93c69f6da6a 989 | languageName: node 990 | linkType: hard 991 | 992 | "eslint-plugin-prettier@npm:^5.2.1": 993 | version: 5.2.1 994 | resolution: "eslint-plugin-prettier@npm:5.2.1" 995 | dependencies: 996 | prettier-linter-helpers: "npm:^1.0.0" 997 | synckit: "npm:^0.9.1" 998 | peerDependencies: 999 | "@types/eslint": ">=8.0.0" 1000 | eslint: ">=8.0.0" 1001 | eslint-config-prettier: "*" 1002 | prettier: ">=3.0.0" 1003 | peerDependenciesMeta: 1004 | "@types/eslint": 1005 | optional: true 1006 | eslint-config-prettier: 1007 | optional: true 1008 | checksum: 4bc8bbaf5bb556c9c501dcdff369137763c49ccaf544f9fa91400360ed5e3a3f1234ab59690e06beca5b1b7e6f6356978cdd3b02af6aba3edea2ffe69ca6e8b2 1009 | languageName: node 1010 | linkType: hard 1011 | 1012 | "eslint-scope@npm:5.1.1": 1013 | version: 5.1.1 1014 | resolution: "eslint-scope@npm:5.1.1" 1015 | dependencies: 1016 | esrecurse: "npm:^4.3.0" 1017 | estraverse: "npm:^4.1.1" 1018 | checksum: d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a 1019 | languageName: node 1020 | linkType: hard 1021 | 1022 | "eslint-visitor-keys@npm:^3.3.0": 1023 | version: 3.4.3 1024 | resolution: "eslint-visitor-keys@npm:3.4.3" 1025 | checksum: 92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 1026 | languageName: node 1027 | linkType: hard 1028 | 1029 | "esrecurse@npm:^4.3.0": 1030 | version: 4.3.0 1031 | resolution: "esrecurse@npm:4.3.0" 1032 | dependencies: 1033 | estraverse: "npm:^5.2.0" 1034 | checksum: 81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 1035 | languageName: node 1036 | linkType: hard 1037 | 1038 | "estraverse@npm:^4.1.1": 1039 | version: 4.3.0 1040 | resolution: "estraverse@npm:4.3.0" 1041 | checksum: 9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d 1042 | languageName: node 1043 | linkType: hard 1044 | 1045 | "estraverse@npm:^5.2.0": 1046 | version: 5.3.0 1047 | resolution: "estraverse@npm:5.3.0" 1048 | checksum: 1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 1049 | languageName: node 1050 | linkType: hard 1051 | 1052 | "eventemitter3@npm:^4.0.4": 1053 | version: 4.0.7 1054 | resolution: "eventemitter3@npm:4.0.7" 1055 | checksum: 5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b 1056 | languageName: node 1057 | linkType: hard 1058 | 1059 | "eventemitter3@npm:^5.0.1": 1060 | version: 5.0.1 1061 | resolution: "eventemitter3@npm:5.0.1" 1062 | checksum: 4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 1063 | languageName: node 1064 | linkType: hard 1065 | 1066 | "events@npm:^3.2.0": 1067 | version: 3.3.0 1068 | resolution: "events@npm:3.3.0" 1069 | checksum: d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 1070 | languageName: node 1071 | linkType: hard 1072 | 1073 | "exponential-backoff@npm:^3.1.1": 1074 | version: 3.1.1 1075 | resolution: "exponential-backoff@npm:3.1.1" 1076 | checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 1077 | languageName: node 1078 | linkType: hard 1079 | 1080 | "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": 1081 | version: 3.1.3 1082 | resolution: "fast-deep-equal@npm:3.1.3" 1083 | checksum: 40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 1084 | languageName: node 1085 | linkType: hard 1086 | 1087 | "fast-diff@npm:^1.1.2": 1088 | version: 1.3.0 1089 | resolution: "fast-diff@npm:1.3.0" 1090 | checksum: 5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 1091 | languageName: node 1092 | linkType: hard 1093 | 1094 | "fast-json-stable-stringify@npm:^2.0.0": 1095 | version: 2.1.0 1096 | resolution: "fast-json-stable-stringify@npm:2.1.0" 1097 | checksum: 7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b 1098 | languageName: node 1099 | linkType: hard 1100 | 1101 | "fast-uri@npm:^3.0.1": 1102 | version: 3.0.1 1103 | resolution: "fast-uri@npm:3.0.1" 1104 | checksum: 3cd46d6006083b14ca61ffe9a05b8eef75ef87e9574b6f68f2e17ecf4daa7aaadeff44e3f0f7a0ef4e0f7e7c20fc07beec49ff14dc72d0b500f00386592f2d10 1105 | languageName: node 1106 | linkType: hard 1107 | 1108 | "fastest-levenshtein@npm:^1.0.12": 1109 | version: 1.0.16 1110 | resolution: "fastest-levenshtein@npm:1.0.16" 1111 | checksum: 7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b 1112 | languageName: node 1113 | linkType: hard 1114 | 1115 | "find-up@npm:^4.0.0": 1116 | version: 4.1.0 1117 | resolution: "find-up@npm:4.1.0" 1118 | dependencies: 1119 | locate-path: "npm:^5.0.0" 1120 | path-exists: "npm:^4.0.0" 1121 | checksum: 0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 1122 | languageName: node 1123 | linkType: hard 1124 | 1125 | "find-up@npm:^7.0.0": 1126 | version: 7.0.0 1127 | resolution: "find-up@npm:7.0.0" 1128 | dependencies: 1129 | locate-path: "npm:^7.2.0" 1130 | path-exists: "npm:^5.0.0" 1131 | unicorn-magic: "npm:^0.1.0" 1132 | checksum: e6ee3e6154560bc0ab3bc3b7d1348b31513f9bdf49a5dd2e952495427d559fa48cdf33953e85a309a323898b43fa1bfbc8b80c880dfc16068384783034030008 1133 | languageName: node 1134 | linkType: hard 1135 | 1136 | "flat@npm:^5.0.2": 1137 | version: 5.0.2 1138 | resolution: "flat@npm:5.0.2" 1139 | bin: 1140 | flat: cli.js 1141 | checksum: f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe 1142 | languageName: node 1143 | linkType: hard 1144 | 1145 | "foreground-child@npm:^3.1.0": 1146 | version: 3.1.1 1147 | resolution: "foreground-child@npm:3.1.1" 1148 | dependencies: 1149 | cross-spawn: "npm:^7.0.0" 1150 | signal-exit: "npm:^4.0.1" 1151 | checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 1152 | languageName: node 1153 | linkType: hard 1154 | 1155 | "fs-minipass@npm:^2.0.0": 1156 | version: 2.1.0 1157 | resolution: "fs-minipass@npm:2.1.0" 1158 | dependencies: 1159 | minipass: "npm:^3.0.0" 1160 | checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 1161 | languageName: node 1162 | linkType: hard 1163 | 1164 | "fs-minipass@npm:^3.0.0": 1165 | version: 3.0.3 1166 | resolution: "fs-minipass@npm:3.0.3" 1167 | dependencies: 1168 | minipass: "npm:^7.0.3" 1169 | checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 1170 | languageName: node 1171 | linkType: hard 1172 | 1173 | "function-bind@npm:^1.1.2": 1174 | version: 1.1.2 1175 | resolution: "function-bind@npm:1.1.2" 1176 | checksum: d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 1177 | languageName: node 1178 | linkType: hard 1179 | 1180 | "get-tsconfig@npm:^4.7.0": 1181 | version: 4.7.2 1182 | resolution: "get-tsconfig@npm:4.7.2" 1183 | dependencies: 1184 | resolve-pkg-maps: "npm:^1.0.0" 1185 | checksum: 169b2beababfbb16e8a0ae813ee59d3e14d4960231c816615161ab5be68ec07a394dce59695742ac84295e2efab8d9e89bcf3abaf5e253dfbec3496e01bb9a65 1186 | languageName: node 1187 | linkType: hard 1188 | 1189 | "glob-to-regexp@npm:^0.4.1": 1190 | version: 0.4.1 1191 | resolution: "glob-to-regexp@npm:0.4.1" 1192 | checksum: 0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 1193 | languageName: node 1194 | linkType: hard 1195 | 1196 | "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": 1197 | version: 10.5.0 1198 | resolution: "glob@npm:10.5.0" 1199 | dependencies: 1200 | foreground-child: ^3.1.0 1201 | jackspeak: ^3.1.2 1202 | minimatch: ^9.0.4 1203 | minipass: ^7.1.2 1204 | package-json-from-dist: ^1.0.0 1205 | path-scurry: ^1.11.1 1206 | bin: 1207 | glob: dist/esm/bin.mjs 1208 | checksum: 8/cda96c074878abca9657bd984d2396945cf0d64283f6feeb40d738fe2da642be0010ad5210a1646244a5fc3511b0cab5a374569b3de5a12b8a63d392f18c6043 1209 | languageName: node 1210 | linkType: hard 1211 | 1212 | "globals@npm:^15.8.0": 1213 | version: 15.9.0 1214 | resolution: "globals@npm:15.9.0" 1215 | checksum: de4b553e412e7e830998578d51b605c492256fb2a9273eaeec6ec9ee519f1c5aa50de57e3979911607fd7593a4066420e01d8c3d551e7a6a236e96c521aee36c 1216 | languageName: node 1217 | linkType: hard 1218 | 1219 | "graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": 1220 | version: 4.2.11 1221 | resolution: "graceful-fs@npm:4.2.11" 1222 | checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 1223 | languageName: node 1224 | linkType: hard 1225 | 1226 | "has-flag@npm:^4.0.0": 1227 | version: 4.0.0 1228 | resolution: "has-flag@npm:4.0.0" 1229 | checksum: 2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 1230 | languageName: node 1231 | linkType: hard 1232 | 1233 | "hasown@npm:^2.0.0": 1234 | version: 2.0.0 1235 | resolution: "hasown@npm:2.0.0" 1236 | dependencies: 1237 | function-bind: "npm:^1.1.2" 1238 | checksum: 5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc 1239 | languageName: node 1240 | linkType: hard 1241 | 1242 | "http-cache-semantics@npm:^4.1.1": 1243 | version: 4.1.1 1244 | resolution: "http-cache-semantics@npm:4.1.1" 1245 | checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc 1246 | languageName: node 1247 | linkType: hard 1248 | 1249 | "http-proxy-agent@npm:^7.0.0": 1250 | version: 7.0.2 1251 | resolution: "http-proxy-agent@npm:7.0.2" 1252 | dependencies: 1253 | agent-base: "npm:^7.1.0" 1254 | debug: "npm:^4.3.4" 1255 | checksum: 4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 1256 | languageName: node 1257 | linkType: hard 1258 | 1259 | "https-proxy-agent@npm:^7.0.1": 1260 | version: 7.0.4 1261 | resolution: "https-proxy-agent@npm:7.0.4" 1262 | dependencies: 1263 | agent-base: "npm:^7.0.2" 1264 | debug: "npm:4" 1265 | checksum: bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b 1266 | languageName: node 1267 | linkType: hard 1268 | 1269 | "iconv-lite@npm:^0.6.2": 1270 | version: 0.6.3 1271 | resolution: "iconv-lite@npm:0.6.3" 1272 | dependencies: 1273 | safer-buffer: "npm:>= 2.1.2 < 3.0.0" 1274 | checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 1275 | languageName: node 1276 | linkType: hard 1277 | 1278 | "ignore@npm:^5.2.4": 1279 | version: 5.3.0 1280 | resolution: "ignore@npm:5.3.0" 1281 | checksum: dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 1282 | languageName: node 1283 | linkType: hard 1284 | 1285 | "import-local@npm:^3.0.2": 1286 | version: 3.1.0 1287 | resolution: "import-local@npm:3.1.0" 1288 | dependencies: 1289 | pkg-dir: "npm:^4.2.0" 1290 | resolve-cwd: "npm:^3.0.0" 1291 | bin: 1292 | import-local-fixture: fixtures/cli.js 1293 | checksum: c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 1294 | languageName: node 1295 | linkType: hard 1296 | 1297 | "imurmurhash@npm:^0.1.4": 1298 | version: 0.1.4 1299 | resolution: "imurmurhash@npm:0.1.4" 1300 | checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 1301 | languageName: node 1302 | linkType: hard 1303 | 1304 | "indent-string@npm:^4.0.0": 1305 | version: 4.0.0 1306 | resolution: "indent-string@npm:4.0.0" 1307 | checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f 1308 | languageName: node 1309 | linkType: hard 1310 | 1311 | "interpret@npm:^3.1.1": 1312 | version: 3.1.1 1313 | resolution: "interpret@npm:3.1.1" 1314 | checksum: 6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 1315 | languageName: node 1316 | linkType: hard 1317 | 1318 | "ip-address@npm:^9.0.5": 1319 | version: 9.0.5 1320 | resolution: "ip-address@npm:9.0.5" 1321 | dependencies: 1322 | jsbn: "npm:1.1.0" 1323 | sprintf-js: "npm:^1.1.3" 1324 | checksum: 331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc 1325 | languageName: node 1326 | linkType: hard 1327 | 1328 | "is-core-module@npm:^2.13.0": 1329 | version: 2.13.1 1330 | resolution: "is-core-module@npm:2.13.1" 1331 | dependencies: 1332 | hasown: "npm:^2.0.0" 1333 | checksum: 2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 1334 | languageName: node 1335 | linkType: hard 1336 | 1337 | "is-fullwidth-code-point@npm:^3.0.0": 1338 | version: 3.0.0 1339 | resolution: "is-fullwidth-code-point@npm:3.0.0" 1340 | checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc 1341 | languageName: node 1342 | linkType: hard 1343 | 1344 | "is-lambda@npm:^1.0.1": 1345 | version: 1.0.1 1346 | resolution: "is-lambda@npm:1.0.1" 1347 | checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d 1348 | languageName: node 1349 | linkType: hard 1350 | 1351 | "is-plain-object@npm:^2.0.4": 1352 | version: 2.0.4 1353 | resolution: "is-plain-object@npm:2.0.4" 1354 | dependencies: 1355 | isobject: "npm:^3.0.1" 1356 | checksum: f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 1357 | languageName: node 1358 | linkType: hard 1359 | 1360 | "isexe@npm:^2.0.0": 1361 | version: 2.0.0 1362 | resolution: "isexe@npm:2.0.0" 1363 | checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d 1364 | languageName: node 1365 | linkType: hard 1366 | 1367 | "isexe@npm:^3.1.1": 1368 | version: 3.1.1 1369 | resolution: "isexe@npm:3.1.1" 1370 | checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 1371 | languageName: node 1372 | linkType: hard 1373 | 1374 | "isobject@npm:^3.0.1": 1375 | version: 3.0.1 1376 | resolution: "isobject@npm:3.0.1" 1377 | checksum: 03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db 1378 | languageName: node 1379 | linkType: hard 1380 | 1381 | "jackspeak@npm:^3.1.2": 1382 | version: 3.4.3 1383 | resolution: "jackspeak@npm:3.4.3" 1384 | dependencies: 1385 | "@isaacs/cliui": "npm:^8.0.2" 1386 | "@pkgjs/parseargs": "npm:^0.11.0" 1387 | dependenciesMeta: 1388 | "@pkgjs/parseargs": 1389 | optional: true 1390 | checksum: 6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 1391 | languageName: node 1392 | linkType: hard 1393 | 1394 | "jest-worker@npm:^27.4.5": 1395 | version: 27.5.1 1396 | resolution: "jest-worker@npm:27.5.1" 1397 | dependencies: 1398 | "@types/node": "npm:*" 1399 | merge-stream: "npm:^2.0.0" 1400 | supports-color: "npm:^8.0.0" 1401 | checksum: 8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b 1402 | languageName: node 1403 | linkType: hard 1404 | 1405 | "jsbn@npm:1.1.0": 1406 | version: 1.1.0 1407 | resolution: "jsbn@npm:1.1.0" 1408 | checksum: 4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 1409 | languageName: node 1410 | linkType: hard 1411 | 1412 | "json-parse-even-better-errors@npm:^2.3.1": 1413 | version: 2.3.1 1414 | resolution: "json-parse-even-better-errors@npm:2.3.1" 1415 | checksum: 140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 1416 | languageName: node 1417 | linkType: hard 1418 | 1419 | "json-schema-traverse@npm:^0.4.1": 1420 | version: 0.4.1 1421 | resolution: "json-schema-traverse@npm:0.4.1" 1422 | checksum: 108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce 1423 | languageName: node 1424 | linkType: hard 1425 | 1426 | "json-schema-traverse@npm:^1.0.0": 1427 | version: 1.0.0 1428 | resolution: "json-schema-traverse@npm:1.0.0" 1429 | checksum: 71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 1430 | languageName: node 1431 | linkType: hard 1432 | 1433 | "kind-of@npm:^6.0.2": 1434 | version: 6.0.3 1435 | resolution: "kind-of@npm:6.0.3" 1436 | checksum: 61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 1437 | languageName: node 1438 | linkType: hard 1439 | 1440 | "loader-runner@npm:^4.2.0": 1441 | version: 4.3.0 1442 | resolution: "loader-runner@npm:4.3.0" 1443 | checksum: a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 1444 | languageName: node 1445 | linkType: hard 1446 | 1447 | "locate-path@npm:^5.0.0": 1448 | version: 5.0.0 1449 | resolution: "locate-path@npm:5.0.0" 1450 | dependencies: 1451 | p-locate: "npm:^4.1.0" 1452 | checksum: 33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 1453 | languageName: node 1454 | linkType: hard 1455 | 1456 | "locate-path@npm:^7.2.0": 1457 | version: 7.2.0 1458 | resolution: "locate-path@npm:7.2.0" 1459 | dependencies: 1460 | p-locate: "npm:^6.0.0" 1461 | checksum: 139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 1462 | languageName: node 1463 | linkType: hard 1464 | 1465 | "long@npm:4.0.0": 1466 | version: 4.0.0 1467 | resolution: "long@npm:4.0.0" 1468 | checksum: 50a6417d15b06104dbe4e3d4a667c39b137f130a9108ea8752b352a4cfae047531a3ac351c181792f3f8768fe17cca6b0f406674a541a86fb638aaac560d83ed 1469 | languageName: node 1470 | linkType: hard 1471 | 1472 | "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": 1473 | version: 10.2.0 1474 | resolution: "lru-cache@npm:10.2.0" 1475 | checksum: c9847612aa2daaef102d30542a8d6d9b2c2bb36581c1bf0dc3ebf5e5f3352c772a749e604afae2e46873b930a9e9523743faac4e5b937c576ab29196774712ee 1476 | languageName: node 1477 | linkType: hard 1478 | 1479 | "lru-cache@npm:^6.0.0": 1480 | version: 6.0.0 1481 | resolution: "lru-cache@npm:6.0.0" 1482 | dependencies: 1483 | yallist: "npm:^4.0.0" 1484 | checksum: cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 1485 | languageName: node 1486 | linkType: hard 1487 | 1488 | "make-fetch-happen@npm:^13.0.0": 1489 | version: 13.0.0 1490 | resolution: "make-fetch-happen@npm:13.0.0" 1491 | dependencies: 1492 | "@npmcli/agent": "npm:^2.0.0" 1493 | cacache: "npm:^18.0.0" 1494 | http-cache-semantics: "npm:^4.1.1" 1495 | is-lambda: "npm:^1.0.1" 1496 | minipass: "npm:^7.0.2" 1497 | minipass-fetch: "npm:^3.0.0" 1498 | minipass-flush: "npm:^1.0.5" 1499 | minipass-pipeline: "npm:^1.2.4" 1500 | negotiator: "npm:^0.6.3" 1501 | promise-retry: "npm:^2.0.1" 1502 | ssri: "npm:^10.0.0" 1503 | checksum: 43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 1504 | languageName: node 1505 | linkType: hard 1506 | 1507 | "merge-stream@npm:^2.0.0": 1508 | version: 2.0.0 1509 | resolution: "merge-stream@npm:2.0.0" 1510 | checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 1511 | languageName: node 1512 | linkType: hard 1513 | 1514 | "mime-db@npm:1.52.0": 1515 | version: 1.52.0 1516 | resolution: "mime-db@npm:1.52.0" 1517 | checksum: 0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa 1518 | languageName: node 1519 | linkType: hard 1520 | 1521 | "mime-types@npm:^2.1.27": 1522 | version: 2.1.35 1523 | resolution: "mime-types@npm:2.1.35" 1524 | dependencies: 1525 | mime-db: "npm:1.52.0" 1526 | checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 1527 | languageName: node 1528 | linkType: hard 1529 | 1530 | "mimic-fn@npm:^3.1.0": 1531 | version: 3.1.0 1532 | resolution: "mimic-fn@npm:3.1.0" 1533 | checksum: a07cdd8ed6490c2dff5b11f889b245d9556b80f5a653a552a651d17cff5a2d156e632d235106c2369f00cccef4071704589574cf3601bc1b1400a1f620dff067 1534 | languageName: node 1535 | linkType: hard 1536 | 1537 | "minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": 1538 | version: 9.0.5 1539 | resolution: "minimatch@npm:9.0.5" 1540 | dependencies: 1541 | brace-expansion: "npm:^2.0.1" 1542 | checksum: de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed 1543 | languageName: node 1544 | linkType: hard 1545 | 1546 | "minipass-collect@npm:^2.0.1": 1547 | version: 2.0.1 1548 | resolution: "minipass-collect@npm:2.0.1" 1549 | dependencies: 1550 | minipass: "npm:^7.0.3" 1551 | checksum: 5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e 1552 | languageName: node 1553 | linkType: hard 1554 | 1555 | "minipass-fetch@npm:^3.0.0": 1556 | version: 3.0.4 1557 | resolution: "minipass-fetch@npm:3.0.4" 1558 | dependencies: 1559 | encoding: "npm:^0.1.13" 1560 | minipass: "npm:^7.0.3" 1561 | minipass-sized: "npm:^1.0.3" 1562 | minizlib: "npm:^2.1.2" 1563 | dependenciesMeta: 1564 | encoding: 1565 | optional: true 1566 | checksum: 1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 1567 | languageName: node 1568 | linkType: hard 1569 | 1570 | "minipass-flush@npm:^1.0.5": 1571 | version: 1.0.5 1572 | resolution: "minipass-flush@npm:1.0.5" 1573 | dependencies: 1574 | minipass: "npm:^3.0.0" 1575 | checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd 1576 | languageName: node 1577 | linkType: hard 1578 | 1579 | "minipass-pipeline@npm:^1.2.4": 1580 | version: 1.2.4 1581 | resolution: "minipass-pipeline@npm:1.2.4" 1582 | dependencies: 1583 | minipass: "npm:^3.0.0" 1584 | checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 1585 | languageName: node 1586 | linkType: hard 1587 | 1588 | "minipass-sized@npm:^1.0.3": 1589 | version: 1.0.3 1590 | resolution: "minipass-sized@npm:1.0.3" 1591 | dependencies: 1592 | minipass: "npm:^3.0.0" 1593 | checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb 1594 | languageName: node 1595 | linkType: hard 1596 | 1597 | "minipass@npm:^3.0.0": 1598 | version: 3.3.6 1599 | resolution: "minipass@npm:3.3.6" 1600 | dependencies: 1601 | yallist: "npm:^4.0.0" 1602 | checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c 1603 | languageName: node 1604 | linkType: hard 1605 | 1606 | "minipass@npm:^5.0.0": 1607 | version: 5.0.0 1608 | resolution: "minipass@npm:5.0.0" 1609 | checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 1610 | languageName: node 1611 | linkType: hard 1612 | 1613 | "minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4": 1614 | version: 7.0.4 1615 | resolution: "minipass@npm:7.0.4" 1616 | checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 1617 | languageName: node 1618 | linkType: hard 1619 | 1620 | "minipass@npm:^7.1.2": 1621 | version: 7.1.2 1622 | resolution: "minipass@npm:7.1.2" 1623 | checksum: b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 1624 | languageName: node 1625 | linkType: hard 1626 | 1627 | "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": 1628 | version: 2.1.2 1629 | resolution: "minizlib@npm:2.1.2" 1630 | dependencies: 1631 | minipass: "npm:^3.0.0" 1632 | yallist: "npm:^4.0.0" 1633 | checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 1634 | languageName: node 1635 | linkType: hard 1636 | 1637 | "minizlib@npm:^3.0.1": 1638 | version: 3.0.1 1639 | resolution: "minizlib@npm:3.0.1" 1640 | dependencies: 1641 | minipass: "npm:^7.0.4" 1642 | rimraf: "npm:^5.0.5" 1643 | checksum: 82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 1644 | languageName: node 1645 | linkType: hard 1646 | 1647 | "mkdirp@npm:^1.0.3": 1648 | version: 1.0.4 1649 | resolution: "mkdirp@npm:1.0.4" 1650 | bin: 1651 | mkdirp: bin/cmd.js 1652 | checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf 1653 | languageName: node 1654 | linkType: hard 1655 | 1656 | "mkdirp@npm:^3.0.1": 1657 | version: 3.0.1 1658 | resolution: "mkdirp@npm:3.0.1" 1659 | bin: 1660 | mkdirp: dist/cjs/src/bin.js 1661 | checksum: 9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d 1662 | languageName: node 1663 | linkType: hard 1664 | 1665 | "ms@npm:2.1.2": 1666 | version: 2.1.2 1667 | resolution: "ms@npm:2.1.2" 1668 | checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc 1669 | languageName: node 1670 | linkType: hard 1671 | 1672 | "nanoid@npm:^3.3.7": 1673 | version: 3.3.8 1674 | resolution: "nanoid@npm:3.3.8" 1675 | bin: 1676 | nanoid: bin/nanoid.cjs 1677 | checksum: 4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 1678 | languageName: node 1679 | linkType: hard 1680 | 1681 | "negotiator@npm:^0.6.3": 1682 | version: 0.6.3 1683 | resolution: "negotiator@npm:0.6.3" 1684 | checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 1685 | languageName: node 1686 | linkType: hard 1687 | 1688 | "neo-async@npm:^2.6.2": 1689 | version: 2.6.2 1690 | resolution: "neo-async@npm:2.6.2" 1691 | checksum: c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d 1692 | languageName: node 1693 | linkType: hard 1694 | 1695 | "node-addon-api@npm:^5.0.0": 1696 | version: 5.1.0 1697 | resolution: "node-addon-api@npm:5.1.0" 1698 | dependencies: 1699 | node-gyp: "npm:latest" 1700 | checksum: 0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d 1701 | languageName: node 1702 | linkType: hard 1703 | 1704 | "node-gyp-build@npm:^4.3.0": 1705 | version: 4.8.0 1706 | resolution: "node-gyp-build@npm:4.8.0" 1707 | bin: 1708 | node-gyp-build: bin.js 1709 | node-gyp-build-optional: optional.js 1710 | node-gyp-build-test: build-test.js 1711 | checksum: 85324be16f81f0235cbbc42e3eceaeb1b5ab94c8d8f5236755e1435b4908338c65a4e75f66ee343cbcb44ddf9b52a428755bec16dcd983295be4458d95c8e1ad 1712 | languageName: node 1713 | linkType: hard 1714 | 1715 | "node-gyp@npm:latest": 1716 | version: 10.1.0 1717 | resolution: "node-gyp@npm:10.1.0" 1718 | dependencies: 1719 | env-paths: "npm:^2.2.0" 1720 | exponential-backoff: "npm:^3.1.1" 1721 | glob: "npm:^10.3.10" 1722 | graceful-fs: "npm:^4.2.6" 1723 | make-fetch-happen: "npm:^13.0.0" 1724 | nopt: "npm:^7.0.0" 1725 | proc-log: "npm:^3.0.0" 1726 | semver: "npm:^7.3.5" 1727 | tar: "npm:^6.1.2" 1728 | which: "npm:^4.0.0" 1729 | bin: 1730 | node-gyp: bin/node-gyp.js 1731 | checksum: 9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c 1732 | languageName: node 1733 | linkType: hard 1734 | 1735 | "node-releases@npm:^2.0.14": 1736 | version: 2.0.14 1737 | resolution: "node-releases@npm:2.0.14" 1738 | checksum: 199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 1739 | languageName: node 1740 | linkType: hard 1741 | 1742 | "nopt@npm:^7.0.0": 1743 | version: 7.2.0 1744 | resolution: "nopt@npm:7.2.0" 1745 | dependencies: 1746 | abbrev: "npm:^2.0.0" 1747 | bin: 1748 | nopt: bin/nopt.js 1749 | checksum: 9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff 1750 | languageName: node 1751 | linkType: hard 1752 | 1753 | "osc@npm:^2.4.3": 1754 | version: 2.4.4 1755 | resolution: "osc@npm:2.4.4" 1756 | dependencies: 1757 | long: "npm:4.0.0" 1758 | serialport: "npm:10.5.0" 1759 | slip: "npm:1.0.2" 1760 | wolfy87-eventemitter: "npm:5.2.9" 1761 | ws: "npm:8.13.0" 1762 | dependenciesMeta: 1763 | serialport: 1764 | optional: true 1765 | checksum: 489b2c51dffb7003d44fd4c09dc42a796cd9c0982e7e66cba350031d52084341d8fae779b8e338f627e242e9e6ce7f74631059c29fe74b2a62a72f67464eb08d 1766 | languageName: node 1767 | linkType: hard 1768 | 1769 | "p-finally@npm:^1.0.0": 1770 | version: 1.0.0 1771 | resolution: "p-finally@npm:1.0.0" 1772 | checksum: 6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 1773 | languageName: node 1774 | linkType: hard 1775 | 1776 | "p-limit@npm:^2.2.0": 1777 | version: 2.3.0 1778 | resolution: "p-limit@npm:2.3.0" 1779 | dependencies: 1780 | p-try: "npm:^2.0.0" 1781 | checksum: 8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 1782 | languageName: node 1783 | linkType: hard 1784 | 1785 | "p-limit@npm:^4.0.0": 1786 | version: 4.0.0 1787 | resolution: "p-limit@npm:4.0.0" 1788 | dependencies: 1789 | yocto-queue: "npm:^1.0.0" 1790 | checksum: a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad 1791 | languageName: node 1792 | linkType: hard 1793 | 1794 | "p-locate@npm:^4.1.0": 1795 | version: 4.1.0 1796 | resolution: "p-locate@npm:4.1.0" 1797 | dependencies: 1798 | p-limit: "npm:^2.2.0" 1799 | checksum: 1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 1800 | languageName: node 1801 | linkType: hard 1802 | 1803 | "p-locate@npm:^6.0.0": 1804 | version: 6.0.0 1805 | resolution: "p-locate@npm:6.0.0" 1806 | dependencies: 1807 | p-limit: "npm:^4.0.0" 1808 | checksum: d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 1809 | languageName: node 1810 | linkType: hard 1811 | 1812 | "p-map@npm:^4.0.0": 1813 | version: 4.0.0 1814 | resolution: "p-map@npm:4.0.0" 1815 | dependencies: 1816 | aggregate-error: "npm:^3.0.0" 1817 | checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 1818 | languageName: node 1819 | linkType: hard 1820 | 1821 | "p-queue@npm:^6.6.2": 1822 | version: 6.6.2 1823 | resolution: "p-queue@npm:6.6.2" 1824 | dependencies: 1825 | eventemitter3: "npm:^4.0.4" 1826 | p-timeout: "npm:^3.2.0" 1827 | checksum: 5739ecf5806bbeadf8e463793d5e3004d08bb3f6177bd1a44a005da8fd81bb90f80e4633e1fb6f1dfd35ee663a5c0229abe26aebb36f547ad5a858347c7b0d3e 1828 | languageName: node 1829 | linkType: hard 1830 | 1831 | "p-timeout@npm:^3.2.0": 1832 | version: 3.2.0 1833 | resolution: "p-timeout@npm:3.2.0" 1834 | dependencies: 1835 | p-finally: "npm:^1.0.0" 1836 | checksum: 524b393711a6ba8e1d48137c5924749f29c93d70b671e6db761afa784726572ca06149c715632da8f70c090073afb2af1c05730303f915604fd38ee207b70a61 1837 | languageName: node 1838 | linkType: hard 1839 | 1840 | "p-timeout@npm:^4.1.0": 1841 | version: 4.1.0 1842 | resolution: "p-timeout@npm:4.1.0" 1843 | checksum: 25aaf13ae9ebfff4ab45591f6647f3bee1ecede073c367175fb0157c27efb170cfb51259a4d2e9118d2ca595453bc885f086ad0ca7476d1c26cee3d13a7c9f6d 1844 | languageName: node 1845 | linkType: hard 1846 | 1847 | "p-try@npm:^2.0.0": 1848 | version: 2.2.0 1849 | resolution: "p-try@npm:2.2.0" 1850 | checksum: c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f 1851 | languageName: node 1852 | linkType: hard 1853 | 1854 | "package-json-from-dist@npm:^1.0.0": 1855 | version: 1.0.0 1856 | resolution: "package-json-from-dist@npm:1.0.0" 1857 | checksum: e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 1858 | languageName: node 1859 | linkType: hard 1860 | 1861 | "parse-author@npm:^2.0.0": 1862 | version: 2.0.0 1863 | resolution: "parse-author@npm:2.0.0" 1864 | dependencies: 1865 | author-regex: "npm:^1.0.0" 1866 | checksum: 8b4c19523588a4271c89f64e8167be7c80b4765059c865d38a996c37d080c7e5123e3e2d07d47290891628ad27f4dfb692e3b61156c52fcc0af6cdce3ed57afd 1867 | languageName: node 1868 | linkType: hard 1869 | 1870 | "path-exists@npm:^4.0.0": 1871 | version: 4.0.0 1872 | resolution: "path-exists@npm:4.0.0" 1873 | checksum: 8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b 1874 | languageName: node 1875 | linkType: hard 1876 | 1877 | "path-exists@npm:^5.0.0": 1878 | version: 5.0.0 1879 | resolution: "path-exists@npm:5.0.0" 1880 | checksum: b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a 1881 | languageName: node 1882 | linkType: hard 1883 | 1884 | "path-key@npm:^3.1.0": 1885 | version: 3.1.1 1886 | resolution: "path-key@npm:3.1.1" 1887 | checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c 1888 | languageName: node 1889 | linkType: hard 1890 | 1891 | "path-parse@npm:^1.0.7": 1892 | version: 1.0.7 1893 | resolution: "path-parse@npm:1.0.7" 1894 | checksum: 11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 1895 | languageName: node 1896 | linkType: hard 1897 | 1898 | "path-scurry@npm:^1.11.1": 1899 | version: 1.11.1 1900 | resolution: "path-scurry@npm:1.11.1" 1901 | dependencies: 1902 | lru-cache: "npm:^10.2.0" 1903 | minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" 1904 | checksum: 32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d 1905 | languageName: node 1906 | linkType: hard 1907 | 1908 | "picocolors@npm:^1.0.1": 1909 | version: 1.0.1 1910 | resolution: "picocolors@npm:1.0.1" 1911 | checksum: c63cdad2bf812ef0d66c8db29583802355d4ca67b9285d846f390cc15c2f6ccb94e8cb7eb6a6e97fc5990a6d3ad4ae42d86c84d3146e667c739a4234ed50d400 1912 | languageName: node 1913 | linkType: hard 1914 | 1915 | "pkg-dir@npm:^4.2.0": 1916 | version: 4.2.0 1917 | resolution: "pkg-dir@npm:4.2.0" 1918 | dependencies: 1919 | find-up: "npm:^4.0.0" 1920 | checksum: c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 1921 | languageName: node 1922 | linkType: hard 1923 | 1924 | "pngjs@npm:^7.0.0": 1925 | version: 7.0.0 1926 | resolution: "pngjs@npm:7.0.0" 1927 | checksum: 0d4c7a0fd476a9c33df7d0a2a73e1d56537628a668841f6995c2bca070cf30819f9254a64363266bc14ef2fee47659dd3b4f2b18eec7ab65143015139f497b38 1928 | languageName: node 1929 | linkType: hard 1930 | 1931 | "prettier-linter-helpers@npm:^1.0.0": 1932 | version: 1.0.0 1933 | resolution: "prettier-linter-helpers@npm:1.0.0" 1934 | dependencies: 1935 | fast-diff: "npm:^1.1.2" 1936 | checksum: 81e0027d731b7b3697ccd2129470ed9913ecb111e4ec175a12f0fcfab0096516373bf0af2fef132af50cafb0a905b74ff57996d615f59512bb9ac7378fcc64ab 1937 | languageName: node 1938 | linkType: hard 1939 | 1940 | "proc-log@npm:^3.0.0": 1941 | version: 3.0.0 1942 | resolution: "proc-log@npm:3.0.0" 1943 | checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc 1944 | languageName: node 1945 | linkType: hard 1946 | 1947 | "promise-retry@npm:^2.0.1": 1948 | version: 2.0.1 1949 | resolution: "promise-retry@npm:2.0.1" 1950 | dependencies: 1951 | err-code: "npm:^2.0.2" 1952 | retry: "npm:^0.12.0" 1953 | checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 1954 | languageName: node 1955 | linkType: hard 1956 | 1957 | "punycode@npm:^2.1.0": 1958 | version: 2.3.1 1959 | resolution: "punycode@npm:2.3.1" 1960 | checksum: 14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 1961 | languageName: node 1962 | linkType: hard 1963 | 1964 | "randombytes@npm:^2.1.0": 1965 | version: 2.1.0 1966 | resolution: "randombytes@npm:2.1.0" 1967 | dependencies: 1968 | safe-buffer: "npm:^5.1.0" 1969 | checksum: 50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 1970 | languageName: node 1971 | linkType: hard 1972 | 1973 | "rechoir@npm:^0.8.0": 1974 | version: 0.8.0 1975 | resolution: "rechoir@npm:0.8.0" 1976 | dependencies: 1977 | resolve: "npm:^1.20.0" 1978 | checksum: 1a30074124a22abbd5d44d802dac26407fa72a0a95f162aa5504ba8246bc5452f8b1a027b154d9bdbabcd8764920ff9333d934c46a8f17479c8912e92332f3ff 1979 | languageName: node 1980 | linkType: hard 1981 | 1982 | "require-from-string@npm:^2.0.2": 1983 | version: 2.0.2 1984 | resolution: "require-from-string@npm:2.0.2" 1985 | checksum: aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 1986 | languageName: node 1987 | linkType: hard 1988 | 1989 | "resolve-cwd@npm:^3.0.0": 1990 | version: 3.0.0 1991 | resolution: "resolve-cwd@npm:3.0.0" 1992 | dependencies: 1993 | resolve-from: "npm:^5.0.0" 1994 | checksum: e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 1995 | languageName: node 1996 | linkType: hard 1997 | 1998 | "resolve-from@npm:^5.0.0": 1999 | version: 5.0.0 2000 | resolution: "resolve-from@npm:5.0.0" 2001 | checksum: b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 2002 | languageName: node 2003 | linkType: hard 2004 | 2005 | "resolve-pkg-maps@npm:^1.0.0": 2006 | version: 1.0.0 2007 | resolution: "resolve-pkg-maps@npm:1.0.0" 2008 | checksum: fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab 2009 | languageName: node 2010 | linkType: hard 2011 | 2012 | "resolve@npm:^1.20.0": 2013 | version: 1.22.8 2014 | resolution: "resolve@npm:1.22.8" 2015 | dependencies: 2016 | is-core-module: "npm:^2.13.0" 2017 | path-parse: "npm:^1.0.7" 2018 | supports-preserve-symlinks-flag: "npm:^1.0.0" 2019 | bin: 2020 | resolve: bin/resolve 2021 | checksum: 07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a 2022 | languageName: node 2023 | linkType: hard 2024 | 2025 | "resolve@patch:resolve@npm%3A^1.20.0#~builtin": 2026 | version: 1.22.8 2027 | resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" 2028 | dependencies: 2029 | is-core-module: "npm:^2.13.0" 2030 | path-parse: "npm:^1.0.7" 2031 | supports-preserve-symlinks-flag: "npm:^1.0.0" 2032 | bin: 2033 | resolve: bin/resolve 2034 | checksum: 8/5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 2035 | languageName: node 2036 | linkType: hard 2037 | 2038 | "retry@npm:^0.12.0": 2039 | version: 0.12.0 2040 | resolution: "retry@npm:0.12.0" 2041 | checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe 2042 | languageName: node 2043 | linkType: hard 2044 | 2045 | "rimraf@npm:^5.0.5": 2046 | version: 5.0.10 2047 | resolution: "rimraf@npm:5.0.10" 2048 | dependencies: 2049 | glob: "npm:^10.3.7" 2050 | bin: 2051 | rimraf: dist/esm/bin.mjs 2052 | checksum: 7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc 2053 | languageName: node 2054 | linkType: hard 2055 | 2056 | "safe-buffer@npm:^5.1.0": 2057 | version: 5.2.1 2058 | resolution: "safe-buffer@npm:5.2.1" 2059 | checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 2060 | languageName: node 2061 | linkType: hard 2062 | 2063 | "safer-buffer@npm:>= 2.1.2 < 3.0.0": 2064 | version: 2.1.2 2065 | resolution: "safer-buffer@npm:2.1.2" 2066 | checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 2067 | languageName: node 2068 | linkType: hard 2069 | 2070 | "schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": 2071 | version: 3.3.0 2072 | resolution: "schema-utils@npm:3.3.0" 2073 | dependencies: 2074 | "@types/json-schema": "npm:^7.0.8" 2075 | ajv: "npm:^6.12.5" 2076 | ajv-keywords: "npm:^3.5.2" 2077 | checksum: fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 2078 | languageName: node 2079 | linkType: hard 2080 | 2081 | "semver@npm:^7.3.5": 2082 | version: 7.6.0 2083 | resolution: "semver@npm:7.6.0" 2084 | dependencies: 2085 | lru-cache: "npm:^6.0.0" 2086 | bin: 2087 | semver: bin/semver.js 2088 | checksum: fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 2089 | languageName: node 2090 | linkType: hard 2091 | 2092 | "semver@npm:^7.5.3": 2093 | version: 7.5.4 2094 | resolution: "semver@npm:7.5.4" 2095 | dependencies: 2096 | lru-cache: "npm:^6.0.0" 2097 | bin: 2098 | semver: bin/semver.js 2099 | checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e 2100 | languageName: node 2101 | linkType: hard 2102 | 2103 | "serialize-javascript@npm:^6.0.1": 2104 | version: 6.0.2 2105 | resolution: "serialize-javascript@npm:6.0.2" 2106 | dependencies: 2107 | randombytes: "npm:^2.1.0" 2108 | checksum: 2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 2109 | languageName: node 2110 | linkType: hard 2111 | 2112 | "serialport@npm:10.5.0": 2113 | version: 10.5.0 2114 | resolution: "serialport@npm:10.5.0" 2115 | dependencies: 2116 | "@serialport/binding-mock": "npm:10.2.2" 2117 | "@serialport/bindings-cpp": "npm:10.8.0" 2118 | "@serialport/parser-byte-length": "npm:10.5.0" 2119 | "@serialport/parser-cctalk": "npm:10.5.0" 2120 | "@serialport/parser-delimiter": "npm:10.5.0" 2121 | "@serialport/parser-inter-byte-timeout": "npm:10.5.0" 2122 | "@serialport/parser-packet-length": "npm:10.5.0" 2123 | "@serialport/parser-readline": "npm:10.5.0" 2124 | "@serialport/parser-ready": "npm:10.5.0" 2125 | "@serialport/parser-regex": "npm:10.5.0" 2126 | "@serialport/parser-slip-encoder": "npm:10.5.0" 2127 | "@serialport/parser-spacepacket": "npm:10.5.0" 2128 | "@serialport/stream": "npm:10.5.0" 2129 | debug: "npm:^4.3.3" 2130 | checksum: 2d3e02b95fc22606336d0dd94c783aff782f532ba060d13545d72610e25d0dc1b900fd9b2ec3e3747de52cce05e272bdb2e52eeac23f08d9475f77be569d60b0 2131 | languageName: node 2132 | linkType: hard 2133 | 2134 | "shallow-clone@npm:^3.0.0": 2135 | version: 3.0.1 2136 | resolution: "shallow-clone@npm:3.0.1" 2137 | dependencies: 2138 | kind-of: "npm:^6.0.2" 2139 | checksum: 7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e 2140 | languageName: node 2141 | linkType: hard 2142 | 2143 | "shebang-command@npm:^2.0.0": 2144 | version: 2.0.0 2145 | resolution: "shebang-command@npm:2.0.0" 2146 | dependencies: 2147 | shebang-regex: "npm:^3.0.0" 2148 | checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e 2149 | languageName: node 2150 | linkType: hard 2151 | 2152 | "shebang-regex@npm:^3.0.0": 2153 | version: 3.0.0 2154 | resolution: "shebang-regex@npm:3.0.0" 2155 | checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 2156 | languageName: node 2157 | linkType: hard 2158 | 2159 | "signal-exit@npm:^4.0.1": 2160 | version: 4.1.0 2161 | resolution: "signal-exit@npm:4.1.0" 2162 | checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 2163 | languageName: node 2164 | linkType: hard 2165 | 2166 | "slip@npm:1.0.2": 2167 | version: 1.0.2 2168 | resolution: "slip@npm:1.0.2" 2169 | checksum: f1a235ec2960c9c769c149dd6f0c21b74c7abf7f1f8b249cbe1370bae75e20f60faee25b4a951407cedd355ebab17038323f5fc800f6bab188877472566fe81a 2170 | languageName: node 2171 | linkType: hard 2172 | 2173 | "smart-buffer@npm:^4.2.0": 2174 | version: 4.2.0 2175 | resolution: "smart-buffer@npm:4.2.0" 2176 | checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 2177 | languageName: node 2178 | linkType: hard 2179 | 2180 | "socks-proxy-agent@npm:^8.0.3": 2181 | version: 8.0.3 2182 | resolution: "socks-proxy-agent@npm:8.0.3" 2183 | dependencies: 2184 | agent-base: "npm:^7.1.1" 2185 | debug: "npm:^4.3.4" 2186 | socks: "npm:^2.7.1" 2187 | checksum: 4950529affd8ccd6951575e21c1b7be8531b24d924aa4df3ee32df506af34b618c4e50d261f4cc603f1bfd8d426915b7d629966c8ce45b05fb5ad8c8b9a6459d 2188 | languageName: node 2189 | linkType: hard 2190 | 2191 | "socks@npm:^2.7.1": 2192 | version: 2.8.3 2193 | resolution: "socks@npm:2.8.3" 2194 | dependencies: 2195 | ip-address: "npm:^9.0.5" 2196 | smart-buffer: "npm:^4.2.0" 2197 | checksum: d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 2198 | languageName: node 2199 | linkType: hard 2200 | 2201 | "source-map-support@npm:~0.5.20": 2202 | version: 0.5.21 2203 | resolution: "source-map-support@npm:0.5.21" 2204 | dependencies: 2205 | buffer-from: "npm:^1.0.0" 2206 | source-map: "npm:^0.6.0" 2207 | checksum: 9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d 2208 | languageName: node 2209 | linkType: hard 2210 | 2211 | "source-map@npm:^0.6.0": 2212 | version: 0.6.1 2213 | resolution: "source-map@npm:0.6.1" 2214 | checksum: ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 2215 | languageName: node 2216 | linkType: hard 2217 | 2218 | "sprintf-js@npm:^1.1.3": 2219 | version: 1.1.3 2220 | resolution: "sprintf-js@npm:1.1.3" 2221 | checksum: 09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec 2222 | languageName: node 2223 | linkType: hard 2224 | 2225 | "ssri@npm:^10.0.0": 2226 | version: 10.0.5 2227 | resolution: "ssri@npm:10.0.5" 2228 | dependencies: 2229 | minipass: "npm:^7.0.3" 2230 | checksum: b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 2231 | languageName: node 2232 | linkType: hard 2233 | 2234 | "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": 2235 | version: 4.2.3 2236 | resolution: "string-width@npm:4.2.3" 2237 | dependencies: 2238 | emoji-regex: "npm:^8.0.0" 2239 | is-fullwidth-code-point: "npm:^3.0.0" 2240 | strip-ansi: "npm:^6.0.1" 2241 | checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b 2242 | languageName: node 2243 | linkType: hard 2244 | 2245 | "string-width@npm:^5.0.1, string-width@npm:^5.1.2": 2246 | version: 5.1.2 2247 | resolution: "string-width@npm:5.1.2" 2248 | dependencies: 2249 | eastasianwidth: "npm:^0.2.0" 2250 | emoji-regex: "npm:^9.2.2" 2251 | strip-ansi: "npm:^7.0.1" 2252 | checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca 2253 | languageName: node 2254 | linkType: hard 2255 | 2256 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 2257 | version: 6.0.1 2258 | resolution: "strip-ansi@npm:6.0.1" 2259 | dependencies: 2260 | ansi-regex: "npm:^5.0.1" 2261 | checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 2262 | languageName: node 2263 | linkType: hard 2264 | 2265 | "strip-ansi@npm:^7.0.1": 2266 | version: 7.1.0 2267 | resolution: "strip-ansi@npm:7.1.0" 2268 | dependencies: 2269 | ansi-regex: "npm:^6.0.1" 2270 | checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 2271 | languageName: node 2272 | linkType: hard 2273 | 2274 | "supports-color@npm:^8.0.0": 2275 | version: 8.1.1 2276 | resolution: "supports-color@npm:8.1.1" 2277 | dependencies: 2278 | has-flag: "npm:^4.0.0" 2279 | checksum: ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 2280 | languageName: node 2281 | linkType: hard 2282 | 2283 | "supports-preserve-symlinks-flag@npm:^1.0.0": 2284 | version: 1.0.0 2285 | resolution: "supports-preserve-symlinks-flag@npm:1.0.0" 2286 | checksum: 6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 2287 | languageName: node 2288 | linkType: hard 2289 | 2290 | "synckit@npm:^0.9.1": 2291 | version: 0.9.1 2292 | resolution: "synckit@npm:0.9.1" 2293 | dependencies: 2294 | "@pkgr/core": "npm:^0.1.0" 2295 | tslib: "npm:^2.6.2" 2296 | checksum: d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e 2297 | languageName: node 2298 | linkType: hard 2299 | 2300 | "tapable@npm:^2.1.1, tapable@npm:^2.2.0": 2301 | version: 2.2.1 2302 | resolution: "tapable@npm:2.2.1" 2303 | checksum: bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 2304 | languageName: node 2305 | linkType: hard 2306 | 2307 | "tar@npm:^6.1.11, tar@npm:^6.1.2": 2308 | version: 6.2.1 2309 | resolution: "tar@npm:6.2.1" 2310 | dependencies: 2311 | chownr: "npm:^2.0.0" 2312 | fs-minipass: "npm:^2.0.0" 2313 | minipass: "npm:^5.0.0" 2314 | minizlib: "npm:^2.1.1" 2315 | mkdirp: "npm:^1.0.3" 2316 | yallist: "npm:^4.0.0" 2317 | checksum: a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 2318 | languageName: node 2319 | linkType: hard 2320 | 2321 | "tar@npm:^7.4.3": 2322 | version: 7.4.3 2323 | resolution: "tar@npm:7.4.3" 2324 | dependencies: 2325 | "@isaacs/fs-minipass": "npm:^4.0.0" 2326 | chownr: "npm:^3.0.0" 2327 | minipass: "npm:^7.1.2" 2328 | minizlib: "npm:^3.0.1" 2329 | mkdirp: "npm:^3.0.1" 2330 | yallist: "npm:^5.0.0" 2331 | checksum: d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d 2332 | languageName: node 2333 | linkType: hard 2334 | 2335 | "terser-webpack-plugin@npm:^5.3.10": 2336 | version: 5.3.10 2337 | resolution: "terser-webpack-plugin@npm:5.3.10" 2338 | dependencies: 2339 | "@jridgewell/trace-mapping": "npm:^0.3.20" 2340 | jest-worker: "npm:^27.4.5" 2341 | schema-utils: "npm:^3.1.1" 2342 | serialize-javascript: "npm:^6.0.1" 2343 | terser: "npm:^5.26.0" 2344 | peerDependencies: 2345 | webpack: ^5.1.0 2346 | peerDependenciesMeta: 2347 | "@swc/core": 2348 | optional: true 2349 | esbuild: 2350 | optional: true 2351 | uglify-js: 2352 | optional: true 2353 | checksum: 66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 2354 | languageName: node 2355 | linkType: hard 2356 | 2357 | "terser@npm:^5.26.0": 2358 | version: 5.26.0 2359 | resolution: "terser@npm:5.26.0" 2360 | dependencies: 2361 | "@jridgewell/source-map": "npm:^0.3.3" 2362 | acorn: "npm:^8.8.2" 2363 | commander: "npm:^2.20.0" 2364 | source-map-support: "npm:~0.5.20" 2365 | bin: 2366 | terser: bin/terser 2367 | checksum: 3906289c6bacd75804a47a583cdafefbd76c5edb39435369755c7b1592e57586fb2f4bddf6eb37a807d6e782171dbf0aa7bbdc80fd5b77b2f2b62196cac49b62 2368 | languageName: node 2369 | linkType: hard 2370 | 2371 | "tslib@npm:^2.6.2, tslib@npm:^2.7.0": 2372 | version: 2.7.0 2373 | resolution: "tslib@npm:2.7.0" 2374 | checksum: 469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 2375 | languageName: node 2376 | linkType: hard 2377 | 2378 | "undici-types@npm:~5.26.4": 2379 | version: 5.26.5 2380 | resolution: "undici-types@npm:5.26.5" 2381 | checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 2382 | languageName: node 2383 | linkType: hard 2384 | 2385 | "unicorn-magic@npm:^0.1.0": 2386 | version: 0.1.0 2387 | resolution: "unicorn-magic@npm:0.1.0" 2388 | checksum: e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92 2389 | languageName: node 2390 | linkType: hard 2391 | 2392 | "unique-filename@npm:^3.0.0": 2393 | version: 3.0.0 2394 | resolution: "unique-filename@npm:3.0.0" 2395 | dependencies: 2396 | unique-slug: "npm:^4.0.0" 2397 | checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f 2398 | languageName: node 2399 | linkType: hard 2400 | 2401 | "unique-slug@npm:^4.0.0": 2402 | version: 4.0.0 2403 | resolution: "unique-slug@npm:4.0.0" 2404 | dependencies: 2405 | imurmurhash: "npm:^0.1.4" 2406 | checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 2407 | languageName: node 2408 | linkType: hard 2409 | 2410 | "update-browserslist-db@npm:^1.0.16": 2411 | version: 1.0.16 2412 | resolution: "update-browserslist-db@npm:1.0.16" 2413 | dependencies: 2414 | escalade: "npm:^3.1.2" 2415 | picocolors: "npm:^1.0.1" 2416 | peerDependencies: 2417 | browserslist: ">= 4.21.0" 2418 | bin: 2419 | update-browserslist-db: cli.js 2420 | checksum: 5995399fc202adbb51567e4810e146cdf7af630a92cc969365a099150cb00597e425cc14987ca7080b09a4d0cfd2a3de53fbe72eebff171aed7f9bb81f9bf405 2421 | languageName: node 2422 | linkType: hard 2423 | 2424 | "uri-js@npm:^4.2.2": 2425 | version: 4.4.1 2426 | resolution: "uri-js@npm:4.4.1" 2427 | dependencies: 2428 | punycode: "npm:^2.1.0" 2429 | checksum: 4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c 2430 | languageName: node 2431 | linkType: hard 2432 | 2433 | "watchpack@npm:^2.4.1": 2434 | version: 2.4.1 2435 | resolution: "watchpack@npm:2.4.1" 2436 | dependencies: 2437 | glob-to-regexp: "npm:^0.4.1" 2438 | graceful-fs: "npm:^4.1.2" 2439 | checksum: c694de0a61004e587a8a0fdc9cfec20ee692c52032d9ab2c2e99969a37fdab9e6e1bd3164ed506f9a13f7c83e65563d563e0d6b87358470cdb7309b83db78683 2440 | languageName: node 2441 | linkType: hard 2442 | 2443 | "webpack-cli@npm:^5.1.4": 2444 | version: 5.1.4 2445 | resolution: "webpack-cli@npm:5.1.4" 2446 | dependencies: 2447 | "@discoveryjs/json-ext": "npm:^0.5.0" 2448 | "@webpack-cli/configtest": "npm:^2.1.1" 2449 | "@webpack-cli/info": "npm:^2.0.2" 2450 | "@webpack-cli/serve": "npm:^2.0.5" 2451 | colorette: "npm:^2.0.14" 2452 | commander: "npm:^10.0.1" 2453 | cross-spawn: "npm:^7.0.3" 2454 | envinfo: "npm:^7.7.3" 2455 | fastest-levenshtein: "npm:^1.0.12" 2456 | import-local: "npm:^3.0.2" 2457 | interpret: "npm:^3.1.1" 2458 | rechoir: "npm:^0.8.0" 2459 | webpack-merge: "npm:^5.7.3" 2460 | peerDependencies: 2461 | webpack: 5.x.x 2462 | peerDependenciesMeta: 2463 | "@webpack-cli/generators": 2464 | optional: true 2465 | webpack-bundle-analyzer: 2466 | optional: true 2467 | webpack-dev-server: 2468 | optional: true 2469 | bin: 2470 | webpack-cli: bin/cli.js 2471 | checksum: 4266909ae5e2e662c8790ac286e965b2c7fd5a4a2f07f48e28576234c9a5f631847ccddc18e1b3281c7b4be04a7ff4717d2636033a322dde13ac995fd0d9de10 2472 | languageName: node 2473 | linkType: hard 2474 | 2475 | "webpack-merge@npm:^5.7.3": 2476 | version: 5.10.0 2477 | resolution: "webpack-merge@npm:5.10.0" 2478 | dependencies: 2479 | clone-deep: "npm:^4.0.1" 2480 | flat: "npm:^5.0.2" 2481 | wildcard: "npm:^2.0.0" 2482 | checksum: b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b 2483 | languageName: node 2484 | linkType: hard 2485 | 2486 | "webpack-sources@npm:^3.2.3": 2487 | version: 3.2.3 2488 | resolution: "webpack-sources@npm:3.2.3" 2489 | checksum: 2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e 2490 | languageName: node 2491 | linkType: hard 2492 | 2493 | "webpack@npm:^5.94.0": 2494 | version: 5.94.0 2495 | resolution: "webpack@npm:5.94.0" 2496 | dependencies: 2497 | "@types/estree": "npm:^1.0.5" 2498 | "@webassemblyjs/ast": "npm:^1.12.1" 2499 | "@webassemblyjs/wasm-edit": "npm:^1.12.1" 2500 | "@webassemblyjs/wasm-parser": "npm:^1.12.1" 2501 | acorn: "npm:^8.7.1" 2502 | acorn-import-attributes: "npm:^1.9.5" 2503 | browserslist: "npm:^4.21.10" 2504 | chrome-trace-event: "npm:^1.0.2" 2505 | enhanced-resolve: "npm:^5.17.1" 2506 | es-module-lexer: "npm:^1.2.1" 2507 | eslint-scope: "npm:5.1.1" 2508 | events: "npm:^3.2.0" 2509 | glob-to-regexp: "npm:^0.4.1" 2510 | graceful-fs: "npm:^4.2.11" 2511 | json-parse-even-better-errors: "npm:^2.3.1" 2512 | loader-runner: "npm:^4.2.0" 2513 | mime-types: "npm:^2.1.27" 2514 | neo-async: "npm:^2.6.2" 2515 | schema-utils: "npm:^3.2.0" 2516 | tapable: "npm:^2.1.1" 2517 | terser-webpack-plugin: "npm:^5.3.10" 2518 | watchpack: "npm:^2.4.1" 2519 | webpack-sources: "npm:^3.2.3" 2520 | peerDependenciesMeta: 2521 | webpack-cli: 2522 | optional: true 2523 | bin: 2524 | webpack: bin/webpack.js 2525 | checksum: b4d1b751f634079bd177a89eef84d80fa5bb8d6fc15d72ab40fc2b9ca5167a79b56585e1a849e9e27e259803ee5c4365cb719e54af70a43c06358ec268ff4ebf 2526 | languageName: node 2527 | linkType: hard 2528 | 2529 | "which@npm:^2.0.1": 2530 | version: 2.0.2 2531 | resolution: "which@npm:2.0.2" 2532 | dependencies: 2533 | isexe: "npm:^2.0.0" 2534 | bin: 2535 | node-which: ./bin/node-which 2536 | checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f 2537 | languageName: node 2538 | linkType: hard 2539 | 2540 | "which@npm:^4.0.0": 2541 | version: 4.0.0 2542 | resolution: "which@npm:4.0.0" 2543 | dependencies: 2544 | isexe: "npm:^3.1.1" 2545 | bin: 2546 | node-which: bin/which.js 2547 | checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a 2548 | languageName: node 2549 | linkType: hard 2550 | 2551 | "wildcard@npm:^2.0.0": 2552 | version: 2.0.1 2553 | resolution: "wildcard@npm:2.0.1" 2554 | checksum: 08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 2555 | languageName: node 2556 | linkType: hard 2557 | 2558 | "wolfy87-eventemitter@npm:5.2.9": 2559 | version: 5.2.9 2560 | resolution: "wolfy87-eventemitter@npm:5.2.9" 2561 | checksum: dd218e3eb5fe2bbb7894d19b857ee7df1b711cadb6dfa177392d42b71522979d1883489057d13cf7af6785835b9807ab1f821d3dbf79ee9691ba27e72ad91c4d 2562 | languageName: node 2563 | linkType: hard 2564 | 2565 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2566 | version: 7.0.0 2567 | resolution: "wrap-ansi@npm:7.0.0" 2568 | dependencies: 2569 | ansi-styles: "npm:^4.0.0" 2570 | string-width: "npm:^4.1.0" 2571 | strip-ansi: "npm:^6.0.0" 2572 | checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da 2573 | languageName: node 2574 | linkType: hard 2575 | 2576 | "wrap-ansi@npm:^8.1.0": 2577 | version: 8.1.0 2578 | resolution: "wrap-ansi@npm:8.1.0" 2579 | dependencies: 2580 | ansi-styles: "npm:^6.1.0" 2581 | string-width: "npm:^5.0.1" 2582 | strip-ansi: "npm:^7.0.1" 2583 | checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 2584 | languageName: node 2585 | linkType: hard 2586 | 2587 | "ws@npm:8.13.0": 2588 | version: 8.13.0 2589 | resolution: "ws@npm:8.13.0" 2590 | peerDependencies: 2591 | bufferutil: ^4.0.1 2592 | utf-8-validate: ">=5.0.2" 2593 | peerDependenciesMeta: 2594 | bufferutil: 2595 | optional: true 2596 | utf-8-validate: 2597 | optional: true 2598 | checksum: 579817dbbab3ee46669129c220cfd81ba6cdb9ab5c3e9a105702dd045743c4ab72e33bb384573827c0c481213417cc880e41bc097e0fc541a0b79fa3eb38207d 2599 | languageName: node 2600 | linkType: hard 2601 | 2602 | "yallist@npm:^4.0.0": 2603 | version: 4.0.0 2604 | resolution: "yallist@npm:4.0.0" 2605 | checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a 2606 | languageName: node 2607 | linkType: hard 2608 | 2609 | "yallist@npm:^5.0.0": 2610 | version: 5.0.0 2611 | resolution: "yallist@npm:5.0.0" 2612 | checksum: a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 2613 | languageName: node 2614 | linkType: hard 2615 | 2616 | "yocto-queue@npm:^1.0.0": 2617 | version: 1.0.0 2618 | resolution: "yocto-queue@npm:1.0.0" 2619 | checksum: 856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 2620 | languageName: node 2621 | linkType: hard 2622 | 2623 | "zx@npm:^8.1.6": 2624 | version: 8.8.5 2625 | resolution: "zx@npm:8.8.5" 2626 | bin: 2627 | zx: build/cli.js 2628 | checksum: 8/bf3bb23ae0d0a1198ea53a7ac7e341900b33251aeb4ed657dcbfcc76ed7b0411bd47cc6bdaf67f7b2b79f83339e25d1e47bbf359a8ededfdc33792fb22a92c4c 2629 | languageName: node 2630 | linkType: hard 2631 | --------------------------------------------------------------------------------