├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── nodejs.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test ├── homebridge └── config.json ├── init.js └── testserver.js /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: Supereg 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **Expected behavior** 11 | A clear and concise description of what you expected to happen. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. ... 16 | 2. ... 17 | 3. ... 18 | 19 | **Version** (output of `npm list -g homebridge homebridge-http-switch`) 20 | - homebridge: 21 | - homebridge-http-switch: 22 | 23 | **Configuration** 24 | ```json 25 | Your configuration goes in here 26 | ``` 27 | 28 | **Additional context** 29 | Add any other context about the problem here. 30 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Additional context** 14 | Add any other context about the feature request here. 15 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node-CI 2 | 3 | on: [push, pull_request, create] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [10.x, 12.x, 13.x] 13 | 14 | steps: 15 | - uses: actions/checkout@v1 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | - name: npm install 21 | run: npm ci 22 | env: 23 | CI: true 24 | - name: npm build 25 | run: npm run build --if-present 26 | env: 27 | CI: true 28 | - name: npm test 29 | run: npm test 30 | env: 31 | CI: true 32 | 33 | publish-npm: 34 | if: github.repository == 'Supereg/homebridge-http-switch' && github.event_name == 'create' && startsWith(github.ref, 'refs/tags/v') 35 | 36 | needs: build 37 | 38 | runs-on: ubuntu-latest 39 | 40 | steps: 41 | - uses: actions/checkout@v1 42 | - uses: actions/setup-node@v1 43 | with: 44 | node-version: 10 45 | registry-url: https://registry.npmjs.org/ 46 | - run: npm ci 47 | - run: npm publish 48 | env: 49 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.log 3 | .npmignore 4 | .jshintrc 5 | .idea 6 | **/*.iml 7 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License (ISC) 2 | Copyright (c) 2017-2019, Andreas Bauer 3 | 4 | Permission to use, copy, modify, and/or distribute this software for any 5 | purpose with or without fee is hereby granted, provided that the above 6 | copyright notice and this permission notice appear in all copies. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 | PERFORMANCE OF THIS SOFTWARE. 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # homebridge-http-switch Plugin 2 | 3 | [![npm](https://img.shields.io/npm/v/homebridge-http-switch?style=for-the-badge)](https://www.npmjs.com/package/homebridge-http-switch) 4 | [![npm](https://img.shields.io/npm/dt/homebridge-http-switch?style=for-the-badge)](https://www.npmjs.com/package/homebridge-http-switch) 5 | [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/Supereg/homebridge-http-switch/Node-CI?style=for-the-badge)](https://github.com/Supereg/homebridge-http-switch/actions?query=workflow%3A%22Node-CI%22) 6 | [![GitHub issues](https://img.shields.io/github/issues/Supereg/homebridge-http-switch?style=for-the-badge)](https://github.com/Supereg/homebridge-http-switch/issues) 7 | [![GitHub pull requests](https://img.shields.io/github/issues-pr/Supereg/homebridge-http-switch?style=for-the-badge)](https://github.com/Supereg/homebridge-http-switch/pulls) 8 | 9 | 10 | `homebridge-http-switch` is a [Homebridge](https://github.com/nfarina/homebridge) plugin with which you can configure 11 | HomeKit switches which forward any requests to a defined http server. This comes in handy when you already have home 12 | automated equipment which can be controlled via http requests. Or you have built your own equipment, for example some sort 13 | of lightning controlled with an wifi enabled Arduino board which than can be integrated via this plugin into Homebridge. 14 | 15 | `homebridge-http-switch` supports three different type of switches. A normal `stateful` switch and two variants of 16 | _stateless_ switches (`stateless` and `stateless-reverse`) which differ in their original position. For stateless switches 17 | you can specify multiple urls to be targeted when the switch is turned On/Off. 18 | More about on how to configure such switches can be read further down. 19 | 20 | ## Installation 21 | 22 | First of all you need to have [Homebridge](https://github.com/nfarina/homebridge) installed. Refer to the repo for 23 | instructions. 24 | Then run the following command to install `homebridge-http-switch` 25 | 26 | ``` 27 | sudo npm install -g homebridge-http-switch 28 | ``` 29 | 30 | ## Updating the switch state in HomeKit 31 | 32 | The _'On'_ characteristic from the _'switch'_ service has the permission to `notify` the HomeKit controller of state 33 | changes. `homebridge-http-switch` supports two ways to send state changes to HomeKit. 34 | 35 | ### The 'pull' way: 36 | 37 | The 'pull' way is probably the easiest to set up and supported in every scenario. `homebridge-http-switch` requests the 38 | state of the switch in an specified interval (pulling) and sends the value to HomeKit. 39 | Look for `pullInterval` in the list of configuration options if you want to configure it. 40 | 41 | ### The 'push' way: 42 | 43 | When using the 'push' concept, the http device itself sends the updated value to `homebridge-http-switch` whenever 44 | the value changes. This is more efficient as the new value is updated instantly and `homebridge-http-switch` does not 45 | need to make needless requests when the value didn't actually change. 46 | However because the http device needs to actively notify the `homebridge-http-switch` there is more work needed 47 | to implement this method into your http device. 48 | 49 | #### Using MQTT: 50 | 51 | MQTT (Message Queuing Telemetry Transport) is a protocol widely used by IoT devices. IoT devices can publish messages 52 | on a certain topic to the MQTT broker which then sends this message to all clients subscribed to the specified topic. 53 | In order to use MQTT you need to setup a broker server ([mosquitto](https://github.com/eclipse/mosquitto) is a solid 54 | open source MQTT broker running perfectly on a device like the Raspberry Pi) and then instruct all clients to 55 | publish/subscribe to it. 56 | For [shelly.cloud](https://shelly.cloud) devices mqtt is the best and only option to implement push-updates. 57 | 58 | #### Using 'homebridge-http-notification-server': 59 | 60 | For those of you who are developing the http device by themselves I developed a pretty simple 'protocol' based on http 61 | to send push-updates. 62 | How to implement the protocol into your http device can be read in the chapter 63 | [**Notification Server**](#notification-server) 64 | 65 | ## Configuration: 66 | 67 | The configuration can contain the following properties: 68 | 69 | #### Basic configuration options: 70 | 71 | - `name` \ **required**: Defines the name which is later displayed in HomeKit 72 | - `switchType` \ **optional** \(Default: **"stateful"**\): Defines the type of the switch: 73 | * **"stateful"**: A normal switch and thus the default value. 74 | * **"stateless"**: A stateless switch remains in only one state. If you switch it to on, it immediately goes back to off. 75 | Configuration example is further [down](#stateless-switch). 76 | * **"stateless-reverse"**: Default position is ON. If you switch it to off, it immediately goes back to on. 77 | Configuration example is further [down](#reverse-stateless-switch). 78 | * **"toggle"**: The toggle switch is a stateful switch however does not use the `statusUrl` to determine the current 79 | state. It uses the last set state as the current state. Default position is OFF. 80 | * **"toggle-reverse""**: Same as **"toggle"** but switch default position is ON. 81 | 82 | * `onUrl` \ **required**: Defines the url 83 | (and other properties when using an urlObject) which is called when you turn on the switch. 84 | * `offUrl` \ **required**: Defines the url 85 | (and other properties when using an urlObject) which is called when you turn off the switch. 86 | * `statusUrl` \ **required**: Defines the url 87 | (and other properties when using an urlObject) to query the current state from the switch. By default it expects the http 88 | server to return **'1'** for ON and **'0'** for OFF leaving out any html markup. 89 | You can change this using `statusPattern` option. 90 | 91 | #### Advanced configuration options: 92 | 93 | - `serialNumber` \ **optional** \(Default: **"SW01"**\): Defines a custom serial number shown in the home app. 94 | - `statusPattern` \ **optional** \(Default: **"1"**\): Defines a regex pattern which is compared to the body of the `statusUrl`. 95 | When matching the status of the switch is set to ON otherwise OFF. [Some examples](#examples-for-custom-statuspatterns). 96 | - `statusCache` \ **optional** \(Default: **0**\): Defines the amount of time in milliseconds a queried state 97 | of the switch is cached before a new request is made to the http device. 98 | Default is **0** which indicates no caching. A value of **-1** will indicate infinite caching. 99 | - `auth` \ **optional**: If your http server requires authentication you can specify your credential in this 100 | object. It uses those credentials for all http requests and thus overrides all possibly specified credentials inside 101 | an urlObject for `onUrl`, `offUrl` and `statusUrl`. 102 | The object can contain the following properties: 103 | * `username` \ **required** 104 | * `password` \ **required** 105 | * `sendImmediately` \ **optional** \(Default: **true**\): When set to **true** the plugin will send the 106 | credentials immediately to the http server. This is best practice for basic authentication. 107 | When set to **false** the plugin will send the proper authentication header after receiving an 401 error code 108 | (unauthenticated). The response must include a proper `WWW-Authenticate` header. 109 | Digest authentication requires this property to be set to **false**! 110 | - `httpMethod` _**deprecated**_ \ **optional**: If defined it sets the http method for `onUrl` and `offUrl`. 111 | This property is deprecated and only present for backwards compatibility. It is recommended to use an 112 | [[urlObject](#urlobject)] to set the http method per url. 113 | 114 | * `timeout` \ **optional** \(Default: **1000**\): When using a stateless switch this timeout in 115 | **milliseconds** specifies the time after which the switch is reset back to its original state. 116 | * `pullInterval` \ **optional**: The property expects an interval in **milliseconds** in which the plugin 117 | pulls updates from your http device. For more information read [pulling updates](#the-pull-way). 118 | (This option is only supported when `switchType` is **"stateful"**) 119 | 120 | - `mqtt` \<[mqttObject](#mqttobject)\> **optional**: Defines all properties used for mqtt connection. 121 | See [mqttObject](#mqttobject). 122 | 123 | * `multipleUrlExecutionStrategy` \ **optional** \(Default: **"parallel"**\): Defines the strategy used when 124 | executing multiple urls. The following are available: 125 | * **"parallel"**: All urls are executed in parallel. No particular order is guaranteed. Execution as fast as possible. 126 | * **"series"**: All urls are executed in the given order. Each url must complete first before the next one is executed. 127 | When using series execution you can also have a look at the [delay url](#the-delay-url). 128 | 129 | - `debug` \ **optional**: If set to true debug mode is enabled and the plugin prints more detailed information. 130 | 131 | Below are two example configurations. One is using simple string urls and the other is using simple urlObjects. 132 | Both configs can be used for a basic plugin configuration. 133 | 134 | ```json 135 | { 136 | "accessories": [ 137 | { 138 | "accessory": "HTTP-SWITCH", 139 | "name": "Switch", 140 | 141 | "switchType": "stateful", 142 | 143 | "onUrl": "http://localhost/api/switchOn", 144 | "offUrl": "http://localhost/api/switchOff", 145 | 146 | "statusUrl": "http://localhost/api/switchStatus" 147 | } 148 | ] 149 | } 150 | ``` 151 | 152 | ```json 153 | { 154 | "accessories": [ 155 | { 156 | "accessory": "HTTP-SWITCH", 157 | "name": "Switch", 158 | 159 | "switchType": "stateful", 160 | 161 | "onUrl": { 162 | "url": "http://localhost/api/switchOn", 163 | "method": "GET" 164 | }, 165 | "offUrl": { 166 | "url": "http://localhost/api/switchOff", 167 | "method": "GET" 168 | }, 169 | 170 | "statusUrl": { 171 | "url": "http://localhost/api/switchStatus", 172 | "method": "GET" 173 | } 174 | } 175 | ] 176 | } 177 | ``` 178 | 179 | #### UrlObject 180 | 181 | A urlObject can have the following properties: 182 | * `url` \ **required**: Defines the url pointing to your http server 183 | * `method` \ **optional** \(Default: **"GET"**\): Defines the http method used to make the http request 184 | * `body` \ **optional**: Defines the body sent with the http request. If value is not a string it will be 185 | converted to a JSON string automatically. 186 | * `strictSSL` \ **optional** \(Default: **false**\): If enabled the SSL certificate used must be valid and 187 | the whole certificate chain must be trusted. The default is false because most people will work with self signed 188 | certificates in their homes and their devices are already authorized since being in their networks. 189 | * `auth` \ **optional**: If your http server requires authentication you can specify your credential in this 190 | object. When defined the object can contain the following properties: 191 | * `username` \ **required** 192 | * `password` \ **required** 193 | * `sendImmediately` \ **optional** \(Default: **true**\): When set to **true** the plugin will send the 194 | credentials immediately to the http server. This is best practice for basic authentication. 195 | When set to **false** the plugin will send the proper authentication header after receiving an 401 error code 196 | (unauthenticated). The response must include a proper `WWW-Authenticate` header. 197 | Digest authentication requires this property to be set to **false**! 198 | * `headers` \ **optional**: Using this object you can define any http headers which are sent with the http 199 | request. The object must contain only string key value pairs. 200 | * `requestTimeout` \ **optional** \(Default: **20000**\): Time in milliseconds specifying timeout (Time to wait 201 | for http response and also setting socket timeout). 202 | * `repeat` \ **optional** \(Default: **1**\): Defines how often the execution of this urlObject should 203 | be repeated. 204 | Notice that this property only has an effect on ulrObject specified in `onUrl` or `offUrl`. 205 | Also have a look at the `multipleUrlExecutionStrategy` property. Using "parallel" execution could result in 206 | unpredictable behaviour. 207 | * `delayBeforeExecution` \ **optional** \(Default: **0**\): Defines the time in milliseconds to wait 208 | before executing the urlObject. 209 | Notice that this property only has an effect on ulrObject specified in `onUrl` or `offUrl`. 210 | Also have a look at the `multipleUrlExecutionStrategy` property. 211 | 212 | Below is an example of an urlObject containing the basic properties: 213 | ```json 214 | { 215 | "url": "http://example.com:8080", 216 | "method": "GET", 217 | "body": "exampleBody", 218 | 219 | "strictSSL": false, 220 | 221 | "auth": { 222 | "username": "yourUsername", 223 | "password": "yourPassword" 224 | }, 225 | 226 | "headers": { 227 | "Content-Type": "text/html" 228 | } 229 | } 230 | ``` 231 | 232 | #### MQTTObject 233 | 234 | A mqttObject can have the following properties: 235 | 236 | ##### Basic configuration options: 237 | 238 | * `host` \ **required**: Defines the host of the mqtt broker. 239 | * `port` \ **optional** \(Default: **1883**\): Defines the port of the mqtt broker. 240 | * `credentials` \ **optional**: Defines the credentials used to authenticate with the mqtt broker. 241 | * `username` \ **required** 242 | * `password` \ **optional** 243 | - `subscriptions` \ **required**: Defines an array (or one single object) of subscriptions. 244 | - `topic` \ **required**: Defines the topic to subscribe to. 245 | - `characteristic` \ **required**: Defines the characteristic this subscription updates. 246 | - `messagePattern` \ **optional**: Defines a regex pattern. If `messagePattern` is not specified the 247 | message received will be used as value. If the characteristic expects a boolean value it is tested if the 248 | specified regex is contained in the received message. Otherwise the pattern is matched against the message 249 | and the data from regex group can be extracted using the given `patternGroupToExtract`. 250 | - `patternGroupToExtract` \ **optional** \(Default: **1**\): Defines the regex group of which data is 251 | extracted. 252 | 253 | ##### Advanced configuration options: 254 | 255 | * `protocol` \ **optional** \(Default: **"mqtt"**\): Defines protocol used to connect to the mqtt broker 256 | * `qos` \ **optional** \(Default: **1**\): Defines the Quality of Service (Notice, the QoS of the publisher 257 | must also be configured accordingly). 258 | In contrast to most implementations the default value is **1**. 259 | * `0`: 'At most once' - the message is sent only once and the client and broker take no additional steps to 260 | acknowledge delivery (fire and forget). 261 | * `1`: 'At least once' - the message is re-tried by the sender multiple times until acknowledgement is 262 | received (acknowledged delivery). 263 | * `2`: 'Exactly once' - the sender and receiver engage in a two-level handshake to ensure only one copy of the 264 | message is received (assured delivery). 265 | * `clientId` \ **optional** \(Default: `'mqttjs_' + Math.random().toString(16).substr(2, 8)`\): Defines clientId 266 | * `keepalive` \ **optional** \(Default: **60**\): Time in seconds to send a keepalive. Set to 0 to disable. 267 | * `clean` \ **optional** \(Default: **true**\): Set to false to receive QoS 1 and 2 messages while offline. 268 | * `reconnectPeriod` \ **optional** \(Default: **1000**\): Time in milliseconds after which a reconnect is tried. 269 | * `connectTimeout` \ **optional** \(Default: **30000**\): Time in milliseconds the client waits until the 270 | CONNECT needs to be acknowledged (CONNACK). 271 | 272 | Below is an example of an mqttObject containing the basic properties for a switch service: 273 | ```json 274 | { 275 | "host": "127.0.0.1", 276 | "port": 1883, 277 | 278 | "credentials": { 279 | "username": "yourUsername", 280 | "password": "yourPassword" 281 | }, 282 | 283 | "subscriptions": [ 284 | { 285 | "topic": "your/topic/here", 286 | "characteristic": "On", 287 | "messagePattern": "on" 288 | } 289 | ] 290 | } 291 | ``` 292 | 293 | ### Stateless Switch 294 | 295 | Since **OFF** is the only possible state you do not need to declare `offUrl` and `statusUrl` 296 | 297 | ```json 298 | { 299 | "accessories": [ 300 | { 301 | "accessory": "HTTP-SWITCH", 302 | "name": "Switch", 303 | 304 | "switchType": "stateless", 305 | 306 | "timeout": 1000, 307 | 308 | "onUrl": "http://localhost/api/switchOn" 309 | } 310 | ] 311 | } 312 | ``` 313 | 314 | ### Reverse Stateless Switch 315 | 316 | Since **ON** is the only possible state you do not need to declare `onUrl` and `statusUrl` 317 | 318 | ```json 319 | { 320 | "accessories": [ 321 | { 322 | "accessory": "HTTP-SWITCH", 323 | "name": "Switch", 324 | 325 | "switchType": "stateless-reverse", 326 | 327 | "timeout": 1000, 328 | 329 | "offUrl": "http://localhost/api/switchOff" 330 | } 331 | ] 332 | } 333 | ``` 334 | 335 | ### Multiple On or Off Urls 336 | If you wish to do so you can specify an array of urls or urlObjects (`onUrl` or `offUrl`) when your switch is a 337 | **stateless switch** or a **reverse-stateless switch**. 338 | **This is not possible with a normal stateful switch.** 339 | 340 | Below are two example configurations of an stateless switch with three urls. 341 | One is using simple string array and the other is using simple urlObject arrays. 342 | 343 | ```json 344 | { 345 | "accessories": [ 346 | { 347 | "accessory": "HTTP-SWITCH", 348 | "name": "Switch", 349 | 350 | "switchType": "stateless", 351 | "onUrl": [ 352 | "http://localhost/api/switch1On", 353 | "http://localhost/api/switch2On", 354 | "http://localhost/api/switch3On" 355 | ] 356 | } 357 | ] 358 | } 359 | ``` 360 | ```json 361 | { 362 | "accessories": [ 363 | { 364 | "accessory": "HTTP-SWITCH", 365 | "name": "Switch", 366 | 367 | "switchType": "stateless", 368 | "onUrl": [ 369 | { 370 | "url": "http://localhost/api/switch1On" 371 | }, 372 | { 373 | "url": "http://localhost/api/switch2On" 374 | }, 375 | { 376 | "url": "http://localhost/api/switch3On" 377 | } 378 | ] 379 | } 380 | ] 381 | } 382 | ``` 383 | 384 | #### The 'delay(...)' url 385 | 386 | When using multiple urls and **"series"** as `multipleUrlExecutionStrategy` you can also specify so called delay urls in the 387 | `onUrl` or `offUrl` arrays. This could be used to guarantee a certain delay between two urls. 388 | The delay url has the following pattern: **"delay(INTEGER)"** where 'INTEGER' is replaced with the delay in milliseconds. 389 | 390 | Here is an example: 391 | ```json 392 | { 393 | "accessories": [ 394 | { 395 | "accessory": "HTTP-SWITCH", 396 | "name": "Delayed Switch", 397 | 398 | "switchType": "stateless", 399 | "multipleUrlExecutionStrategy": "series", 400 | 401 | "onUrl": [ 402 | "http://localhost/api/switch1On", 403 | "delay(1000)", 404 | "http://localhost/api/switch2On" 405 | ] 406 | } 407 | ] 408 | } 409 | ``` 410 | 411 | ### Examples for custom statusPatterns 412 | 413 | The `statusPattern` property can be used to change the phrase which is used to identify if the switch should be turned on 414 | or off. So when you want the switch to be turned on when your server sends **"true"** in the body of the http response you 415 | could specify the following pattern: 416 | ```json 417 | { 418 | "statusPattern": "true" 419 | } 420 | ``` 421 | 422 | However using Regular Expressions much more complex patterns are possible. Let's assume your http enabled device responds 423 | with the following json string as body, where one property has an random value an the other indicates the status of the 424 | switch: 425 | ```json 426 | { 427 | "perRequestRandomValue": 89723789, 428 | "switchState": true 429 | } 430 | ``` 431 | Then you could use the following pattern: 432 | ```json 433 | { 434 | "statusPattern": "{\n \"perRequestRandomValue\": [0-9]+,\n \"switchState\": true\n}" 435 | } 436 | ``` 437 | **Note:** The `statusPattern` must be placed on the same level as the `statusUrl` property, not inside the `statusUrl` object. See below for example. 438 | 439 | ```json 440 | { 441 | "statusUrl": { 442 | }, 443 | "statusPattern": "....", 444 | } 445 | ``` 446 | 447 | More on how to build regex patterns: https://www.w3schools.com/jsref/jsref_obj_regexp.asp 448 | 449 | ## Notification Server 450 | 451 | `homebridge-http-switch` can be used together with 452 | [homebridge-http-notification-server](https://github.com/Supereg/homebridge-http-notification-server) in order to receive 453 | updates when the state changes at your external program. For details on how to implement those updates and how to 454 | install and configure `homebridge-http-notification-server`, please refer to the 455 | [README](https://github.com/Supereg/homebridge-http-notification-server) of the repository first. 456 | 457 | Down here is an example on how to configure `homebridge-http-switch` to work with your implementation of the 458 | `homebridge-http-notification-server`. 459 | 460 | ```json 461 | { 462 | "accessories": [ 463 | { 464 | "accessory": "HTTP-SWITCH", 465 | "name": "Switch", 466 | 467 | "notificationID": "my-switch", 468 | "notificationPassword": "superSecretPassword", 469 | 470 | "onUrl": "http://localhost/api/switchOn", 471 | "offUrl": "http://localhost/api/switchOff", 472 | 473 | "statusUrl": "http://localhost/api/switchStatus" 474 | } 475 | ] 476 | } 477 | ``` 478 | 479 | * `notificationID` is an per Homebridge instance unique id which must be included in any http request. 480 | * `notificationPassword` is **optional**. It can be used to secure any incoming requests. 481 | 482 | To get more details about the configuration have a look at the 483 | [README](https://github.com/Supereg/homebridge-http-notification-server). 484 | 485 | **Available characteristics (for the POST body)** 486 | 487 | Down here are all characteristics listed which can be updated with an request to the `homebridge-http-notification-server` 488 | 489 | * `characteristic` "On": expects a boolean `value` 490 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | let Service, Characteristic, api; 4 | 5 | const _http_base = require("homebridge-http-base"); 6 | const http = _http_base.http; 7 | const configParser = _http_base.configParser; 8 | const PullTimer = _http_base.PullTimer; 9 | const notifications = _http_base.notifications; 10 | const MQTTClient = _http_base.MQTTClient; 11 | const Cache = _http_base.Cache; 12 | const utils = _http_base.utils; 13 | 14 | const packageJSON = require('./package.json'); 15 | 16 | module.exports = function (homebridge) { 17 | Service = homebridge.hap.Service; 18 | Characteristic = homebridge.hap.Characteristic; 19 | 20 | api = homebridge; 21 | 22 | homebridge.registerAccessory("homebridge-http-switch", "HTTP-SWITCH", HTTP_SWITCH); 23 | }; 24 | 25 | const SwitchType = Object.freeze({ 26 | STATEFUL: "stateful", 27 | STATELESS: "stateless", 28 | STATELESS_REVERSE: "stateless-reverse", 29 | TOGGLE: "toggle", 30 | TOGGLE_REVERSE: "toggle-reverse", 31 | }); 32 | 33 | function HTTP_SWITCH(log, config) { 34 | this.log = log; 35 | this.name = config.name; 36 | this.debug = config.debug || false; 37 | 38 | this.switchType = utils.enumValueOf(SwitchType, config.switchType, SwitchType.STATEFUL); 39 | if (!this.switchType) { 40 | this.log.warn(`'${this.switchType}' is a invalid switchType! Aborting...`); 41 | return; 42 | } 43 | 44 | this.timeout = config.timeout; 45 | if (typeof this.timeout !== 'number') { 46 | this.timeout = 1000; 47 | } 48 | 49 | if (config.serialNumber !== undefined && typeof config.serialNumber === "string") { 50 | this.serialNumber = config.serialNumber; 51 | } 52 | 53 | if (this.switchType === SwitchType.STATEFUL) { 54 | this.statusPattern = /1/; 55 | if (config.statusPattern) { 56 | if (typeof config.statusPattern === "string") 57 | this.statusPattern = new RegExp(config.statusPattern); 58 | else 59 | this.log.warn("Property 'statusPattern' was given in an unsupported type. Using default one!"); 60 | } 61 | 62 | this.statusCache = new Cache(config.statusCache, 0); 63 | if (config.statusCache && typeof config.statusCache !== "number") 64 | this.log.warn("Property 'statusCache' was given in an unsupported type. Using default one!"); 65 | } 66 | 67 | /** @namespace config.multipleUrlExecutionStrategy */ 68 | if (config.multipleUrlExecutionStrategy) { 69 | const result = http.setMultipleUrlExecutionStrategy(config.multipleUrlExecutionStrategy); 70 | 71 | if (!result) 72 | this.log.warn("'multipleUrlExecutionStrategy' has an invalid value (" + config.multipleUrlExecutionStrategy + "). Continuing with defaults!"); 73 | } 74 | 75 | const success = this.parseUrls(config); // parsing 'onUrl', 'offUrl', 'statusUrl' 76 | if (!success) { 77 | this.log.warn("Aborting..."); 78 | return; 79 | } 80 | 81 | /** @namespace config.httpMethod */ 82 | if (config.httpMethod) { // if we have it defined globally override the existing one of ON and OFF config object 83 | this.log("Global 'httpMethod' is specified. Overriding method of on and off!"); 84 | if (this.on) 85 | this.on.forEach(urlObject => urlObject.method = config.httpMethod); 86 | if (this.off) 87 | this.off.forEach(urlObject => urlObject.method = config.httpMethod); 88 | 89 | /* 90 | * New way would expect to also override method of this.status, but old implementation used fixed 'httpMethod' (GET) 91 | * for this.status and was unaffected by this config property. So we leave this.status unaffected for now to maintain 92 | * backwards compatibility. 93 | */ 94 | } 95 | 96 | if (config.auth) { 97 | if (!(config.auth.username && config.auth.password)) 98 | this.log("'auth.username' and/or 'auth.password' was not set!"); 99 | else { 100 | if (this.on) { 101 | this.on.forEach(urlObject => { 102 | urlObject.auth.username = config.auth.username; 103 | urlObject.auth.password = config.auth.password; 104 | 105 | if (typeof config.auth.sendImmediately === "boolean") 106 | urlObject.auth.sendImmediately = config.auth.sendImmediately; 107 | }); 108 | } 109 | if (this.off) { 110 | this.off.forEach(urlObject => { 111 | urlObject.auth.username = config.auth.username; 112 | urlObject.auth.password = config.auth.password; 113 | 114 | if (typeof config.auth.sendImmediately === "boolean") 115 | urlObject.auth.sendImmediately = config.auth.sendImmediately; 116 | }); 117 | } 118 | if (this.status) { 119 | this.status.auth.username = config.auth.username; 120 | this.status.auth.password = config.auth.password; 121 | 122 | if (typeof config.auth.sendImmediately === "boolean") 123 | this.status.auth.sendImmediately = config.auth.sendImmediately; 124 | } 125 | } 126 | } 127 | 128 | this.homebridgeService = new Service.Switch(this.name); 129 | const onCharacteristic = this.homebridgeService.getCharacteristic(Characteristic.On) 130 | .on("get", this.getStatus.bind(this)) 131 | .on("set", this.setStatus.bind(this)); 132 | 133 | 134 | switch (this.switchType) { 135 | case SwitchType.TOGGLE_REVERSE: 136 | case SwitchType.STATELESS_REVERSE: 137 | onCharacteristic.updateValue(true); 138 | break; 139 | } 140 | 141 | /** @namespace config.pullInterval */ 142 | if (config.pullInterval) { 143 | if (this.switchType === SwitchType.STATEFUL) { 144 | this.pullTimer = new PullTimer(this.log, config.pullInterval, this.getStatus.bind(this), value => { 145 | this.homebridgeService.getCharacteristic(Characteristic.On).updateValue(value); 146 | }); 147 | this.pullTimer.start(); 148 | } 149 | else 150 | this.log("'pullInterval' was specified, however switch is stateless. Ignoring property and not enabling pull updates!"); 151 | } 152 | 153 | if (config.notificationID) { 154 | if (this.switchType === SwitchType.STATEFUL 155 | || this.switchType === SwitchType.TOGGLE || this.switchType === SwitchType.TOGGLE_REVERSE) { 156 | /** @namespace config.notificationPassword */ 157 | /** @namespace config.notificationID */ 158 | notifications.enqueueNotificationRegistrationIfDefined(api, log, config.notificationID, config.notificationPassword, this.handleNotification.bind(this)); 159 | } 160 | else 161 | this.log("'notificationID' was specified, however switch is stateless. Ignoring property and not enabling notifications!"); 162 | } 163 | 164 | if (config.mqtt) { 165 | if (this.switchType === SwitchType.STATEFUL 166 | || this.switchType === SwitchType.TOGGLE || this.switchType === SwitchType.TOGGLE_REVERSE) { 167 | let options; 168 | try { 169 | options = configParser.parseMQTTOptions(config.mqtt) 170 | } catch (error) { 171 | this.log.error("Error occurred while parsing MQTT property: " + error.message); 172 | this.log.error("MQTT will not be enabled!"); 173 | } 174 | 175 | if (options) { 176 | try { 177 | this.mqttClient = new MQTTClient(this.homebridgeService, options, this.log); 178 | this.mqttClient.connect(); 179 | } catch (error) { 180 | this.log.error("Error occurred creating mqtt client: " + error.message); 181 | } 182 | } 183 | } 184 | else 185 | this.log("'mqtt' options were specified, however switch is stateless. Ignoring it!"); 186 | } 187 | 188 | this.log("Switch successfully configured..."); 189 | if (this.debug) { 190 | this.log("Switch started with the following options: "); 191 | this.log(" - switchType: " + this.switchType); 192 | if (this.switchType === SwitchType.STATEFUL) 193 | this.log(" - statusPattern: " + this.statusPattern); 194 | 195 | if (this.auth) 196 | this.log(" - auth options: " + JSON.stringify(this.auth)); 197 | 198 | if (this.on) 199 | this.log(" - onUrls: " + JSON.stringify(this.on)); 200 | if (this.off) 201 | this.log(" - offUrls: " + JSON.stringify(this.off)); 202 | if (this.status) 203 | this.log(" - statusUrl: " + JSON.stringify(this.status)); 204 | 205 | if (this.switchType === SwitchType.STATELESS || this.switchType === SwitchType.STATELESS_REVERSE) 206 | this.log(" - timeout for stateless switch: " + this.timeout); 207 | 208 | if (this.pullTimer) 209 | this.log(" - pullTimer started with interval " + config.pullInterval); 210 | 211 | if (config.notificationID) 212 | this.log(" - notificationsID specified: " + config.notificationID); 213 | 214 | if (this.mqttClient) { 215 | const options = this.mqttClient.mqttOptions; 216 | this.log(` - mqtt client instantiated: ${options.protocol}://${options.host}:${options.port}`); 217 | this.log(" -> subscribing to topics:"); 218 | 219 | for (const topic in this.mqttClient.subscriptions) { 220 | if (!this.mqttClient.subscriptions.hasOwnProperty(topic)) 221 | continue; 222 | 223 | this.log(` - ${topic}`); 224 | } 225 | } 226 | } 227 | } 228 | 229 | HTTP_SWITCH.prototype = { 230 | 231 | parseUrls: function (config) { 232 | /** @namespace config.onUrl */ 233 | if (this.switchType !== SwitchType.STATELESS_REVERSE) { 234 | if (config.onUrl) { 235 | try { 236 | this.on = this.switchType === SwitchType.STATEFUL 237 | ? [configParser.parseUrlProperty(config.onUrl)] 238 | : configParser.parseMultipleUrlProperty(config.onUrl); 239 | } catch (error) { 240 | this.log.warn("Error occurred while parsing 'onUrl': " + error.message); 241 | return false; 242 | } 243 | } 244 | else { 245 | this.log.warn(`Property 'onUrl' is required when using switchType '${this.switchType}'`); 246 | return false; 247 | } 248 | } 249 | else if (config.onUrl) 250 | this.log.warn(`Property 'onUrl' is defined though it is not used with switchType ${this.switchType}. Ignoring it!`); 251 | 252 | /** @namespace config.offUrl */ 253 | if (this.switchType !== SwitchType.STATELESS) { 254 | if (config.offUrl) { 255 | try { 256 | this.off = this.switchType === SwitchType.STATEFUL 257 | ? [configParser.parseUrlProperty(config.offUrl)] 258 | : configParser.parseMultipleUrlProperty(config.offUrl); 259 | } catch (error) { 260 | this.log.warn("Error occurred while parsing 'offUrl': " + error.message); 261 | return false; 262 | } 263 | } 264 | else { 265 | this.log.warn(`Property 'offUrl' is required when using switchType '${this.switchType}'`); 266 | return false; 267 | } 268 | } 269 | else if (config.offUrl) 270 | this.log.warn(`Property 'offUrl' is defined though it is not used with switchType ${this.switchType}. Ignoring it!`); 271 | 272 | if (this.switchType === SwitchType.STATEFUL) { 273 | /** @namespace config.statusUrl */ 274 | if (config.statusUrl) { 275 | try { 276 | this.status = configParser.parseUrlProperty(config.statusUrl); 277 | } catch (error) { 278 | this.log.warn("Error occurred while parsing 'statusUrl': " + error.message); 279 | return false; 280 | } 281 | } 282 | else { 283 | this.log.warn(`Property 'statusUrl' is required when using switchType '${this.switchType}'`); 284 | return false; 285 | } 286 | } 287 | else if (config.statusUrl) 288 | this.log.warn(`Property 'statusUrl' is defined though it is not used with switchType ${this.switchType}. Ignoring it!`); 289 | 290 | return true; 291 | }, 292 | 293 | identify: function (callback) { 294 | this.log("Identify requested!"); 295 | callback(); 296 | }, 297 | 298 | getServices: function () { 299 | if (!this.homebridgeService) 300 | return []; 301 | 302 | const informationService = new Service.AccessoryInformation(); 303 | 304 | informationService 305 | .setCharacteristic(Characteristic.Manufacturer, "Andreas Bauer") 306 | .setCharacteristic(Characteristic.Model, "HTTP Switch") 307 | .setCharacteristic(Characteristic.SerialNumber, this.serialNumber || "SW01") 308 | .setCharacteristic(Characteristic.FirmwareRevision, packageJSON.version); 309 | 310 | return [informationService, this.homebridgeService]; 311 | }, 312 | 313 | /** @namespace body.characteristic */ 314 | handleNotification: function(body) { 315 | const value = body.value; 316 | 317 | let characteristic; 318 | switch (body.characteristic) { 319 | case "On": 320 | characteristic = Characteristic.On; 321 | break; 322 | default: 323 | this.log("Encountered unknown characteristic handling notification: " + body.characteristic); 324 | return; 325 | } 326 | 327 | if (this.debug) 328 | this.log("Updating '" + body.characteristic + "' to new value: " + body.value); 329 | 330 | if (this.pullTimer) 331 | this.pullTimer.resetTimer(); 332 | 333 | this.homebridgeService.getCharacteristic(characteristic).updateValue(value); 334 | }, 335 | 336 | getStatus: function (callback) { 337 | if (this.pullTimer) 338 | this.pullTimer.resetTimer(); 339 | 340 | switch (this.switchType) { 341 | case SwitchType.STATEFUL: 342 | if (!this.statusCache.shouldQuery()) { 343 | const value = this.homebridgeService.getCharacteristic(Characteristic.On).value; 344 | if (this.debug) 345 | this.log(`getStatus() returning cached value '${value? "ON": "OFF"}'${this.statusCache.isInfinite()? " (infinite cache)": ""}`); 346 | callback(null, value); 347 | break; 348 | } 349 | 350 | if (this.debug) 351 | this.log("getStatus() doing http request..."); 352 | 353 | http.httpRequest(this.status, (error, response, body) => { 354 | if (error) { 355 | this.log("getStatus() failed: %s", error.message); 356 | callback(error); 357 | } 358 | else if (!(http.isHttpSuccessCode(response.statusCode) || http.isHttpRedirectCode(response.statusCode))) { 359 | this.log("getStatus() http request returned http error code: %s", response.statusCode); 360 | callback(new Error("Got html error code " + response.statusCode)); 361 | } 362 | else { 363 | if (this.debug) 364 | this.log(`getStatus() request returned successfully (${response.statusCode}). Body: '${body}'`); 365 | 366 | if (http.isHttpRedirectCode(response.statusCode)) { 367 | this.log("getStatus() http request return with redirect status code (3xx). Accepting it anyways"); 368 | } 369 | 370 | const switchedOn = this.statusPattern.test(body); 371 | if (this.debug) 372 | this.log("Switch is currently %s", switchedOn? "ON": "OFF"); 373 | 374 | this.statusCache.queried(); // we only update lastQueried on successful query 375 | callback(null, switchedOn); 376 | } 377 | }); 378 | break; 379 | case SwitchType.STATELESS: 380 | callback(null, false); 381 | break; 382 | case SwitchType.STATELESS_REVERSE: 383 | callback(null, true); 384 | break; 385 | case SwitchType.TOGGLE: 386 | case SwitchType.TOGGLE_REVERSE: 387 | callback(null, this.homebridgeService.getCharacteristic(Characteristic.On).value); 388 | break; 389 | 390 | default: 391 | callback(new Error("Unrecognized switch type")); 392 | break; 393 | } 394 | }, 395 | 396 | setStatus: function (on, callback) { 397 | if (this.pullTimer) 398 | this.pullTimer.resetTimer(); 399 | 400 | switch (this.switchType) { 401 | case SwitchType.STATEFUL: 402 | this._makeSetRequest(on, callback); 403 | break; 404 | case SwitchType.STATELESS: 405 | if (!on) { 406 | callback(); 407 | break; 408 | } 409 | 410 | this._makeSetRequest(true, callback); 411 | break; 412 | case SwitchType.STATELESS_REVERSE: 413 | if (on) { 414 | callback(); 415 | break; 416 | } 417 | 418 | this._makeSetRequest(false, callback); 419 | break; 420 | case SwitchType.TOGGLE: 421 | case SwitchType.TOGGLE_REVERSE: 422 | this._makeSetRequest(on, callback); 423 | break; 424 | 425 | default: 426 | callback(new Error("Unrecognized switch type")); 427 | break; 428 | } 429 | }, 430 | 431 | _makeSetRequest: function (on, callback) { 432 | const urlObjectArray = on? this.on: this.off; 433 | 434 | if (this.debug) 435 | this.log("setStatus() doing http request..."); 436 | 437 | http.multipleHttpRequests(urlObjectArray, results => { 438 | const errors = []; 439 | const successes = []; 440 | 441 | results.forEach((result, i) => { 442 | if (result.error) { 443 | errors.push({ 444 | index: i, 445 | error: result.error 446 | }); 447 | } 448 | else if (!(http.isHttpSuccessCode(result.response.statusCode) || http.isHttpRedirectCode(result.response.statusCode))) { 449 | errors.push({ 450 | index: i, 451 | error: new Error(`HTTP request returned with error code ${result.response.statusCode}`), 452 | value: result.body 453 | }); 454 | } 455 | else { 456 | if (http.isHttpRedirectCode(result.response.statusCode)) { 457 | this.log("setStatus() http request return with redirect status code (3xx). Accepting it anyways"); 458 | } 459 | 460 | successes.push({ 461 | index: i, 462 | value: result.body 463 | }); 464 | } 465 | }); 466 | 467 | if (errors.length > 0) { 468 | if (successes.length === 0) { 469 | if (errors.length === 1) { 470 | const errorObject = errors[0]; 471 | const errorMessage = errorObject.error.message; 472 | this.log(`Error occurred setting state of switch: ${errorMessage}`); 473 | 474 | if (errorMessage && !errorMessage.startsWith("HTTP request returned with error code ")) 475 | this.log(errorObject.error); 476 | else if (errorObject.value && this.debug) 477 | this.log("Body of set response is: " + errorObject.value); 478 | } 479 | else { 480 | this.log(`Error occurred setting state of switch with every request (${errors.length}):`); 481 | this.log(errors); 482 | } 483 | } 484 | else { 485 | this.log(`${successes.length} requests successfully set switch to ${on? "ON": "OFF"}; ${errors.length} encountered and error:`); 486 | this.log(errors); 487 | } 488 | 489 | callback(new Error("Some or every request returned with an error. See above!")); 490 | } 491 | else { 492 | if (this.debug) 493 | this.log(`Successfully set switch to ${on ? "ON" : "OFF"}${successes.length > 1 ? ` with every request (${successes.length})` : ""}`); 494 | callback(); 495 | } 496 | 497 | this.resetSwitchWithTimeoutIfStateless(); 498 | }); 499 | }, 500 | 501 | resetSwitchWithTimeoutIfStateless: function () { 502 | switch (this.switchType) { 503 | case SwitchType.STATELESS: 504 | this.log("Resetting switch to OFF"); 505 | 506 | setTimeout(() => { 507 | this.homebridgeService.setCharacteristic(Characteristic.On, false); 508 | }, this.timeout); 509 | break; 510 | case SwitchType.STATELESS_REVERSE: 511 | this.log("Resetting switch to ON"); 512 | 513 | setTimeout(() => { 514 | this.homebridgeService.setCharacteristic(Characteristic.On, true); 515 | }, this.timeout); 516 | break; 517 | } 518 | }, 519 | 520 | }; 521 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homebridge-http-switch", 3 | "version": "0.5.36", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "homebridge-http-switch", 9 | "version": "0.5.36", 10 | "license": "ISC", 11 | "dependencies": { 12 | "homebridge-http-base": "~2.1.13" 13 | }, 14 | "devDependencies": { 15 | "homebridge": "^1.5.0" 16 | }, 17 | "engines": { 18 | "homebridge": ">=0.4.8", 19 | "node": ">=10.17.0" 20 | } 21 | }, 22 | "node_modules/@homebridge/ciao": { 23 | "version": "1.1.5", 24 | "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.1.5.tgz", 25 | "integrity": "sha512-ZI9tcbPfX2d8oP1PNeLzrZLXISAIDUtJQWk4JVVJKCxktC6tQ3JyWXT9t1FbB5xtl82M1jdCgyAbWbjhUtRWcA==", 26 | "dev": true, 27 | "dependencies": { 28 | "debug": "^4.3.4", 29 | "fast-deep-equal": "^3.1.3", 30 | "source-map-support": "^0.5.21", 31 | "tslib": "^2.4.0" 32 | }, 33 | "bin": { 34 | "ciao-bcs": "lib/bonjour-conformance-testing.js" 35 | } 36 | }, 37 | "node_modules/@homebridge/dbus-native": { 38 | "version": "0.4.2", 39 | "resolved": "https://registry.npmjs.org/@homebridge/dbus-native/-/dbus-native-0.4.2.tgz", 40 | "integrity": "sha512-rg6DUg6xOttzn73HA1+3G2o1ezRj0+DzPMEJqasrpq7FcAxMcTyOZ96GfcDN4pLUz62hMuywIeVZ4F6cc/g6Ig==", 41 | "dev": true, 42 | "dependencies": { 43 | "@homebridge/long": "^5.2.1", 44 | "@homebridge/put": "~0.0.8", 45 | "event-stream": "^4.0.0", 46 | "hexy": "^0.2.10", 47 | "minimist": "^1.2.6", 48 | "safe-buffer": "^5.1.1", 49 | "xml2js": "^0.4.17" 50 | }, 51 | "bin": { 52 | "dbus2js": "bin/dbus2js.js" 53 | } 54 | }, 55 | "node_modules/@homebridge/long": { 56 | "version": "5.2.1", 57 | "resolved": "https://registry.npmjs.org/@homebridge/long/-/long-5.2.1.tgz", 58 | "integrity": "sha512-i5Df8R63XNPCn+Nj1OgAoRdw9e+jHUQb3CNUbvJneI2iu3j4+OtzQj+5PA1Ce+747NR1SPqZSvyvD483dOT3AA==", 59 | "dev": true 60 | }, 61 | "node_modules/@homebridge/put": { 62 | "version": "0.0.8", 63 | "resolved": "https://registry.npmjs.org/@homebridge/put/-/put-0.0.8.tgz", 64 | "integrity": "sha512-mwxLHHqKebOmOSU0tsPEWQSBHGApPhuaqtNpCe7U+AMdsduweANiu64E9SXXUtdpyTjsOpgSMLhD1+kbLHD2gA==", 65 | "dev": true, 66 | "engines": { 67 | "node": ">=0.3.0" 68 | } 69 | }, 70 | "node_modules/@leichtgewicht/ip-codec": { 71 | "version": "2.0.4", 72 | "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", 73 | "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", 74 | "dev": true 75 | }, 76 | "node_modules/ajv": { 77 | "version": "6.12.6", 78 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 79 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 80 | "dependencies": { 81 | "fast-deep-equal": "^3.1.1", 82 | "fast-json-stable-stringify": "^2.0.0", 83 | "json-schema-traverse": "^0.4.1", 84 | "uri-js": "^4.2.2" 85 | }, 86 | "funding": { 87 | "type": "github", 88 | "url": "https://github.com/sponsors/epoberezkin" 89 | } 90 | }, 91 | "node_modules/ansi-styles": { 92 | "version": "4.3.0", 93 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 94 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 95 | "dev": true, 96 | "dependencies": { 97 | "color-convert": "^2.0.1" 98 | }, 99 | "engines": { 100 | "node": ">=8" 101 | }, 102 | "funding": { 103 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 104 | } 105 | }, 106 | "node_modules/array-flatten": { 107 | "version": "2.1.2", 108 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", 109 | "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", 110 | "dev": true 111 | }, 112 | "node_modules/asn1": { 113 | "version": "0.2.4", 114 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 115 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 116 | "dependencies": { 117 | "safer-buffer": "~2.1.0" 118 | } 119 | }, 120 | "node_modules/assert-plus": { 121 | "version": "1.0.0", 122 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 123 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 124 | "engines": { 125 | "node": ">=0.8" 126 | } 127 | }, 128 | "node_modules/async": { 129 | "version": "3.2.4", 130 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 131 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 132 | }, 133 | "node_modules/asynckit": { 134 | "version": "0.4.0", 135 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 136 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 137 | }, 138 | "node_modules/available-typed-arrays": { 139 | "version": "1.0.5", 140 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 141 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 142 | "dev": true, 143 | "engines": { 144 | "node": ">= 0.4" 145 | }, 146 | "funding": { 147 | "url": "https://github.com/sponsors/ljharb" 148 | } 149 | }, 150 | "node_modules/aws-sign2": { 151 | "version": "0.7.0", 152 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 153 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 154 | "engines": { 155 | "node": "*" 156 | } 157 | }, 158 | "node_modules/aws4": { 159 | "version": "1.11.0", 160 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 161 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 162 | }, 163 | "node_modules/balanced-match": { 164 | "version": "1.0.2", 165 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 166 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 167 | }, 168 | "node_modules/base64-js": { 169 | "version": "1.5.1", 170 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 171 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 172 | "funding": [ 173 | { 174 | "type": "github", 175 | "url": "https://github.com/sponsors/feross" 176 | }, 177 | { 178 | "type": "patreon", 179 | "url": "https://www.patreon.com/feross" 180 | }, 181 | { 182 | "type": "consulting", 183 | "url": "https://feross.org/support" 184 | } 185 | ] 186 | }, 187 | "node_modules/bcrypt-pbkdf": { 188 | "version": "1.0.2", 189 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 190 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 191 | "dependencies": { 192 | "tweetnacl": "^0.14.3" 193 | } 194 | }, 195 | "node_modules/bl": { 196 | "version": "4.1.0", 197 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 198 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 199 | "dependencies": { 200 | "buffer": "^5.5.0", 201 | "inherits": "^2.0.4", 202 | "readable-stream": "^3.4.0" 203 | } 204 | }, 205 | "node_modules/bonjour-hap": { 206 | "version": "3.6.4", 207 | "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.6.4.tgz", 208 | "integrity": "sha512-a76r95/qTAP5hOEZZhRoiosyFSVPPRSVev09Jh8yDf3JDKyrzELLf0vpQCuEXFueb9DcV9UJf2Jv3dktyuPBng==", 209 | "dev": true, 210 | "dependencies": { 211 | "array-flatten": "^2.1.2", 212 | "deep-equal": "^2.0.5", 213 | "ip": "^1.1.8", 214 | "multicast-dns": "^7.2.5", 215 | "multicast-dns-service-types": "^1.1.0" 216 | } 217 | }, 218 | "node_modules/brace-expansion": { 219 | "version": "1.1.11", 220 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 221 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 222 | "dependencies": { 223 | "balanced-match": "^1.0.0", 224 | "concat-map": "0.0.1" 225 | } 226 | }, 227 | "node_modules/buffer": { 228 | "version": "5.7.1", 229 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 230 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 231 | "funding": [ 232 | { 233 | "type": "github", 234 | "url": "https://github.com/sponsors/feross" 235 | }, 236 | { 237 | "type": "patreon", 238 | "url": "https://www.patreon.com/feross" 239 | }, 240 | { 241 | "type": "consulting", 242 | "url": "https://feross.org/support" 243 | } 244 | ], 245 | "dependencies": { 246 | "base64-js": "^1.3.1", 247 | "ieee754": "^1.1.13" 248 | } 249 | }, 250 | "node_modules/buffer-from": { 251 | "version": "1.1.2", 252 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 253 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 254 | }, 255 | "node_modules/call-bind": { 256 | "version": "1.0.2", 257 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 258 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 259 | "dev": true, 260 | "dependencies": { 261 | "function-bind": "^1.1.1", 262 | "get-intrinsic": "^1.0.2" 263 | }, 264 | "funding": { 265 | "url": "https://github.com/sponsors/ljharb" 266 | } 267 | }, 268 | "node_modules/caseless": { 269 | "version": "0.12.0", 270 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 271 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 272 | }, 273 | "node_modules/chalk": { 274 | "version": "4.1.2", 275 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 276 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 277 | "dev": true, 278 | "dependencies": { 279 | "ansi-styles": "^4.1.0", 280 | "supports-color": "^7.1.0" 281 | }, 282 | "engines": { 283 | "node": ">=10" 284 | }, 285 | "funding": { 286 | "url": "https://github.com/chalk/chalk?sponsor=1" 287 | } 288 | }, 289 | "node_modules/color-convert": { 290 | "version": "2.0.1", 291 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 292 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 293 | "dev": true, 294 | "dependencies": { 295 | "color-name": "~1.1.4" 296 | }, 297 | "engines": { 298 | "node": ">=7.0.0" 299 | } 300 | }, 301 | "node_modules/color-name": { 302 | "version": "1.1.4", 303 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 304 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 305 | "dev": true 306 | }, 307 | "node_modules/combined-stream": { 308 | "version": "1.0.8", 309 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 310 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 311 | "dependencies": { 312 | "delayed-stream": "~1.0.0" 313 | }, 314 | "engines": { 315 | "node": ">= 0.8" 316 | } 317 | }, 318 | "node_modules/commander": { 319 | "version": "5.1.0", 320 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 321 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", 322 | "dev": true, 323 | "engines": { 324 | "node": ">= 6" 325 | } 326 | }, 327 | "node_modules/commist": { 328 | "version": "1.1.0", 329 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 330 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 331 | "dependencies": { 332 | "leven": "^2.1.0", 333 | "minimist": "^1.1.0" 334 | } 335 | }, 336 | "node_modules/concat-map": { 337 | "version": "0.0.1", 338 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 339 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 340 | }, 341 | "node_modules/concat-stream": { 342 | "version": "2.0.0", 343 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 344 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 345 | "engines": [ 346 | "node >= 6.0" 347 | ], 348 | "dependencies": { 349 | "buffer-from": "^1.0.0", 350 | "inherits": "^2.0.3", 351 | "readable-stream": "^3.0.2", 352 | "typedarray": "^0.0.6" 353 | } 354 | }, 355 | "node_modules/core-util-is": { 356 | "version": "1.0.2", 357 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 358 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 359 | }, 360 | "node_modules/dashdash": { 361 | "version": "1.14.1", 362 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 363 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 364 | "dependencies": { 365 | "assert-plus": "^1.0.0" 366 | }, 367 | "engines": { 368 | "node": ">=0.10" 369 | } 370 | }, 371 | "node_modules/debug": { 372 | "version": "4.3.4", 373 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 374 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 375 | "dependencies": { 376 | "ms": "2.1.2" 377 | }, 378 | "engines": { 379 | "node": ">=6.0" 380 | }, 381 | "peerDependenciesMeta": { 382 | "supports-color": { 383 | "optional": true 384 | } 385 | } 386 | }, 387 | "node_modules/deep-equal": { 388 | "version": "2.0.5", 389 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", 390 | "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", 391 | "dev": true, 392 | "dependencies": { 393 | "call-bind": "^1.0.0", 394 | "es-get-iterator": "^1.1.1", 395 | "get-intrinsic": "^1.0.1", 396 | "is-arguments": "^1.0.4", 397 | "is-date-object": "^1.0.2", 398 | "is-regex": "^1.1.1", 399 | "isarray": "^2.0.5", 400 | "object-is": "^1.1.4", 401 | "object-keys": "^1.1.1", 402 | "object.assign": "^4.1.2", 403 | "regexp.prototype.flags": "^1.3.0", 404 | "side-channel": "^1.0.3", 405 | "which-boxed-primitive": "^1.0.1", 406 | "which-collection": "^1.0.1", 407 | "which-typed-array": "^1.1.2" 408 | }, 409 | "funding": { 410 | "url": "https://github.com/sponsors/ljharb" 411 | } 412 | }, 413 | "node_modules/define-properties": { 414 | "version": "1.1.4", 415 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 416 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 417 | "dev": true, 418 | "dependencies": { 419 | "has-property-descriptors": "^1.0.0", 420 | "object-keys": "^1.1.1" 421 | }, 422 | "engines": { 423 | "node": ">= 0.4" 424 | }, 425 | "funding": { 426 | "url": "https://github.com/sponsors/ljharb" 427 | } 428 | }, 429 | "node_modules/delayed-stream": { 430 | "version": "1.0.0", 431 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 432 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 433 | "engines": { 434 | "node": ">=0.4.0" 435 | } 436 | }, 437 | "node_modules/dns-packet": { 438 | "version": "5.4.0", 439 | "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", 440 | "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", 441 | "dev": true, 442 | "dependencies": { 443 | "@leichtgewicht/ip-codec": "^2.0.1" 444 | }, 445 | "engines": { 446 | "node": ">=6" 447 | } 448 | }, 449 | "node_modules/duplexer": { 450 | "version": "0.1.2", 451 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", 452 | "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", 453 | "dev": true 454 | }, 455 | "node_modules/duplexify": { 456 | "version": "4.1.2", 457 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", 458 | "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", 459 | "dependencies": { 460 | "end-of-stream": "^1.4.1", 461 | "inherits": "^2.0.3", 462 | "readable-stream": "^3.1.1", 463 | "stream-shift": "^1.0.0" 464 | } 465 | }, 466 | "node_modules/ecc-jsbn": { 467 | "version": "0.1.2", 468 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 469 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 470 | "dependencies": { 471 | "jsbn": "~0.1.0", 472 | "safer-buffer": "^2.1.0" 473 | } 474 | }, 475 | "node_modules/end-of-stream": { 476 | "version": "1.4.4", 477 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 478 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 479 | "dependencies": { 480 | "once": "^1.4.0" 481 | } 482 | }, 483 | "node_modules/es-abstract": { 484 | "version": "1.20.2", 485 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", 486 | "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", 487 | "dev": true, 488 | "dependencies": { 489 | "call-bind": "^1.0.2", 490 | "es-to-primitive": "^1.2.1", 491 | "function-bind": "^1.1.1", 492 | "function.prototype.name": "^1.1.5", 493 | "get-intrinsic": "^1.1.2", 494 | "get-symbol-description": "^1.0.0", 495 | "has": "^1.0.3", 496 | "has-property-descriptors": "^1.0.0", 497 | "has-symbols": "^1.0.3", 498 | "internal-slot": "^1.0.3", 499 | "is-callable": "^1.2.4", 500 | "is-negative-zero": "^2.0.2", 501 | "is-regex": "^1.1.4", 502 | "is-shared-array-buffer": "^1.0.2", 503 | "is-string": "^1.0.7", 504 | "is-weakref": "^1.0.2", 505 | "object-inspect": "^1.12.2", 506 | "object-keys": "^1.1.1", 507 | "object.assign": "^4.1.4", 508 | "regexp.prototype.flags": "^1.4.3", 509 | "string.prototype.trimend": "^1.0.5", 510 | "string.prototype.trimstart": "^1.0.5", 511 | "unbox-primitive": "^1.0.2" 512 | }, 513 | "engines": { 514 | "node": ">= 0.4" 515 | }, 516 | "funding": { 517 | "url": "https://github.com/sponsors/ljharb" 518 | } 519 | }, 520 | "node_modules/es-get-iterator": { 521 | "version": "1.1.2", 522 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", 523 | "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", 524 | "dev": true, 525 | "dependencies": { 526 | "call-bind": "^1.0.2", 527 | "get-intrinsic": "^1.1.0", 528 | "has-symbols": "^1.0.1", 529 | "is-arguments": "^1.1.0", 530 | "is-map": "^2.0.2", 531 | "is-set": "^2.0.2", 532 | "is-string": "^1.0.5", 533 | "isarray": "^2.0.5" 534 | }, 535 | "funding": { 536 | "url": "https://github.com/sponsors/ljharb" 537 | } 538 | }, 539 | "node_modules/es-to-primitive": { 540 | "version": "1.2.1", 541 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 542 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 543 | "dev": true, 544 | "dependencies": { 545 | "is-callable": "^1.1.4", 546 | "is-date-object": "^1.0.1", 547 | "is-symbol": "^1.0.2" 548 | }, 549 | "engines": { 550 | "node": ">= 0.4" 551 | }, 552 | "funding": { 553 | "url": "https://github.com/sponsors/ljharb" 554 | } 555 | }, 556 | "node_modules/event-stream": { 557 | "version": "4.0.1", 558 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", 559 | "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", 560 | "dev": true, 561 | "dependencies": { 562 | "duplexer": "^0.1.1", 563 | "from": "^0.1.7", 564 | "map-stream": "0.0.7", 565 | "pause-stream": "^0.0.11", 566 | "split": "^1.0.1", 567 | "stream-combiner": "^0.2.2", 568 | "through": "^2.3.8" 569 | } 570 | }, 571 | "node_modules/extend": { 572 | "version": "3.0.2", 573 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 574 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 575 | }, 576 | "node_modules/extsprintf": { 577 | "version": "1.3.0", 578 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 579 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 580 | "engines": [ 581 | "node >=0.6.0" 582 | ] 583 | }, 584 | "node_modules/fast-deep-equal": { 585 | "version": "3.1.3", 586 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 587 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 588 | }, 589 | "node_modules/fast-json-stable-stringify": { 590 | "version": "2.1.0", 591 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 592 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 593 | }, 594 | "node_modules/fast-srp-hap": { 595 | "version": "2.0.4", 596 | "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.4.tgz", 597 | "integrity": "sha512-lHRYYaaIbMrhZtsdGTwPN82UbqD9Bv8QfOlKs+Dz6YRnByZifOh93EYmf2iEWFtkOEIqR2IK8cFD0UN5wLIWBQ==", 598 | "dev": true, 599 | "engines": { 600 | "node": ">=10.17.0" 601 | } 602 | }, 603 | "node_modules/for-each": { 604 | "version": "0.3.3", 605 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 606 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 607 | "dev": true, 608 | "dependencies": { 609 | "is-callable": "^1.1.3" 610 | } 611 | }, 612 | "node_modules/forever-agent": { 613 | "version": "0.6.1", 614 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 615 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 616 | "engines": { 617 | "node": "*" 618 | } 619 | }, 620 | "node_modules/form-data": { 621 | "version": "2.3.3", 622 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 623 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 624 | "dependencies": { 625 | "asynckit": "^0.4.0", 626 | "combined-stream": "^1.0.6", 627 | "mime-types": "^2.1.12" 628 | }, 629 | "engines": { 630 | "node": ">= 0.12" 631 | } 632 | }, 633 | "node_modules/from": { 634 | "version": "0.1.7", 635 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 636 | "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", 637 | "dev": true 638 | }, 639 | "node_modules/fs-extra": { 640 | "version": "10.1.0", 641 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 642 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 643 | "dev": true, 644 | "dependencies": { 645 | "graceful-fs": "^4.2.0", 646 | "jsonfile": "^6.0.1", 647 | "universalify": "^2.0.0" 648 | }, 649 | "engines": { 650 | "node": ">=12" 651 | } 652 | }, 653 | "node_modules/fs.realpath": { 654 | "version": "1.0.0", 655 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 656 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 657 | }, 658 | "node_modules/function-bind": { 659 | "version": "1.1.1", 660 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 661 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 662 | "dev": true 663 | }, 664 | "node_modules/function.prototype.name": { 665 | "version": "1.1.5", 666 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 667 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 668 | "dev": true, 669 | "dependencies": { 670 | "call-bind": "^1.0.2", 671 | "define-properties": "^1.1.3", 672 | "es-abstract": "^1.19.0", 673 | "functions-have-names": "^1.2.2" 674 | }, 675 | "engines": { 676 | "node": ">= 0.4" 677 | }, 678 | "funding": { 679 | "url": "https://github.com/sponsors/ljharb" 680 | } 681 | }, 682 | "node_modules/functions-have-names": { 683 | "version": "1.2.3", 684 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 685 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 686 | "dev": true, 687 | "funding": { 688 | "url": "https://github.com/sponsors/ljharb" 689 | } 690 | }, 691 | "node_modules/futoin-hkdf": { 692 | "version": "1.4.3", 693 | "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.3.tgz", 694 | "integrity": "sha512-K4MIe2xSVRMYxsA4w0ap5fp1C2hA9StA2Ad1JZHX57VMCdHIRB5BSrd1FhuadTQG9MkjggaTCrw7v5XXFyY3/w==", 695 | "dev": true, 696 | "engines": { 697 | "node": ">=8" 698 | } 699 | }, 700 | "node_modules/get-intrinsic": { 701 | "version": "1.1.3", 702 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 703 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 704 | "dev": true, 705 | "dependencies": { 706 | "function-bind": "^1.1.1", 707 | "has": "^1.0.3", 708 | "has-symbols": "^1.0.3" 709 | }, 710 | "funding": { 711 | "url": "https://github.com/sponsors/ljharb" 712 | } 713 | }, 714 | "node_modules/get-symbol-description": { 715 | "version": "1.0.0", 716 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 717 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 718 | "dev": true, 719 | "dependencies": { 720 | "call-bind": "^1.0.2", 721 | "get-intrinsic": "^1.1.1" 722 | }, 723 | "engines": { 724 | "node": ">= 0.4" 725 | }, 726 | "funding": { 727 | "url": "https://github.com/sponsors/ljharb" 728 | } 729 | }, 730 | "node_modules/getpass": { 731 | "version": "0.1.7", 732 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 733 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 734 | "dependencies": { 735 | "assert-plus": "^1.0.0" 736 | } 737 | }, 738 | "node_modules/glob": { 739 | "version": "7.2.3", 740 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 741 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 742 | "dependencies": { 743 | "fs.realpath": "^1.0.0", 744 | "inflight": "^1.0.4", 745 | "inherits": "2", 746 | "minimatch": "^3.1.1", 747 | "once": "^1.3.0", 748 | "path-is-absolute": "^1.0.0" 749 | }, 750 | "engines": { 751 | "node": "*" 752 | }, 753 | "funding": { 754 | "url": "https://github.com/sponsors/isaacs" 755 | } 756 | }, 757 | "node_modules/graceful-fs": { 758 | "version": "4.2.10", 759 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 760 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 761 | "dev": true 762 | }, 763 | "node_modules/hap-nodejs": { 764 | "version": "0.10.4", 765 | "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.10.4.tgz", 766 | "integrity": "sha512-+ydtdh7Mw0Ttjv1ylWoGUMfU1Qhi0CVBAdABco+gdzOOkl9j2V1JKZKOduWvyAdhc73ZpElyREoTTVPQ7H0UoA==", 767 | "dev": true, 768 | "dependencies": { 769 | "@homebridge/ciao": "^1.1.5", 770 | "@homebridge/dbus-native": "^0.4.2", 771 | "bonjour-hap": "~3.6.3", 772 | "debug": "^4.3.4", 773 | "fast-srp-hap": "2.0.4", 774 | "futoin-hkdf": "~1.4.3", 775 | "node-persist": "^0.0.11", 776 | "source-map-support": "^0.5.21", 777 | "tslib": "^2.4.0", 778 | "tweetnacl": "^1.0.3" 779 | }, 780 | "engines": { 781 | "node": ">=10.17.0" 782 | } 783 | }, 784 | "node_modules/hap-nodejs/node_modules/tweetnacl": { 785 | "version": "1.0.3", 786 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 787 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", 788 | "dev": true 789 | }, 790 | "node_modules/har-schema": { 791 | "version": "2.0.0", 792 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 793 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 794 | "engines": { 795 | "node": ">=4" 796 | } 797 | }, 798 | "node_modules/har-validator": { 799 | "version": "5.1.5", 800 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 801 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 802 | "deprecated": "this library is no longer supported", 803 | "dependencies": { 804 | "ajv": "^6.12.3", 805 | "har-schema": "^2.0.0" 806 | }, 807 | "engines": { 808 | "node": ">=6" 809 | } 810 | }, 811 | "node_modules/has": { 812 | "version": "1.0.3", 813 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 814 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 815 | "dev": true, 816 | "dependencies": { 817 | "function-bind": "^1.1.1" 818 | }, 819 | "engines": { 820 | "node": ">= 0.4.0" 821 | } 822 | }, 823 | "node_modules/has-bigints": { 824 | "version": "1.0.2", 825 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 826 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 827 | "dev": true, 828 | "funding": { 829 | "url": "https://github.com/sponsors/ljharb" 830 | } 831 | }, 832 | "node_modules/has-flag": { 833 | "version": "4.0.0", 834 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 835 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 836 | "dev": true, 837 | "engines": { 838 | "node": ">=8" 839 | } 840 | }, 841 | "node_modules/has-property-descriptors": { 842 | "version": "1.0.0", 843 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 844 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 845 | "dev": true, 846 | "dependencies": { 847 | "get-intrinsic": "^1.1.1" 848 | }, 849 | "funding": { 850 | "url": "https://github.com/sponsors/ljharb" 851 | } 852 | }, 853 | "node_modules/has-symbols": { 854 | "version": "1.0.3", 855 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 856 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 857 | "dev": true, 858 | "engines": { 859 | "node": ">= 0.4" 860 | }, 861 | "funding": { 862 | "url": "https://github.com/sponsors/ljharb" 863 | } 864 | }, 865 | "node_modules/has-tostringtag": { 866 | "version": "1.0.0", 867 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 868 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 869 | "dev": true, 870 | "dependencies": { 871 | "has-symbols": "^1.0.2" 872 | }, 873 | "engines": { 874 | "node": ">= 0.4" 875 | }, 876 | "funding": { 877 | "url": "https://github.com/sponsors/ljharb" 878 | } 879 | }, 880 | "node_modules/help-me": { 881 | "version": "3.0.0", 882 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", 883 | "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", 884 | "dependencies": { 885 | "glob": "^7.1.6", 886 | "readable-stream": "^3.6.0" 887 | } 888 | }, 889 | "node_modules/hexy": { 890 | "version": "0.2.11", 891 | "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", 892 | "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", 893 | "dev": true, 894 | "bin": { 895 | "hexy": "bin/hexy_cmd.js" 896 | } 897 | }, 898 | "node_modules/homebridge": { 899 | "version": "1.5.0", 900 | "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-1.5.0.tgz", 901 | "integrity": "sha512-0t8WNBKz9NFCab5obBfJMnxFgkg4uJZqON+iM/uZpIyiMRWH9ycCHd1pYAPMk9vDdfDu8/VpxYafWsYx6luHtg==", 902 | "dev": true, 903 | "dependencies": { 904 | "chalk": "^4.1.2", 905 | "commander": "5.1.0", 906 | "fs-extra": "^10.1.0", 907 | "hap-nodejs": "^0.10.2", 908 | "qrcode-terminal": "^0.12.0", 909 | "semver": "^7.3.7", 910 | "source-map-support": "^0.5.21" 911 | }, 912 | "bin": { 913 | "homebridge": "bin/homebridge" 914 | }, 915 | "engines": { 916 | "node": ">=10.17.0" 917 | } 918 | }, 919 | "node_modules/homebridge-http-base": { 920 | "version": "2.1.13", 921 | "resolved": "https://registry.npmjs.org/homebridge-http-base/-/homebridge-http-base-2.1.13.tgz", 922 | "integrity": "sha512-r3CyrhcZLwcA6plhPQswzBlyVQZZggML6f5LAo56GQt7CpHr6Zm+T27Y6I47vyZJNkLRL/FLol1cGlKuHN4fEw==", 923 | "dependencies": { 924 | "async": "^3.2.4", 925 | "mqtt": "^4.3.7", 926 | "request": "^2.88.2" 927 | }, 928 | "engines": { 929 | "node": ">=10.17.0" 930 | } 931 | }, 932 | "node_modules/http-signature": { 933 | "version": "1.2.0", 934 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 935 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 936 | "dependencies": { 937 | "assert-plus": "^1.0.0", 938 | "jsprim": "^1.2.2", 939 | "sshpk": "^1.7.0" 940 | }, 941 | "engines": { 942 | "node": ">=0.8", 943 | "npm": ">=1.3.7" 944 | } 945 | }, 946 | "node_modules/ieee754": { 947 | "version": "1.2.1", 948 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 949 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 950 | "funding": [ 951 | { 952 | "type": "github", 953 | "url": "https://github.com/sponsors/feross" 954 | }, 955 | { 956 | "type": "patreon", 957 | "url": "https://www.patreon.com/feross" 958 | }, 959 | { 960 | "type": "consulting", 961 | "url": "https://feross.org/support" 962 | } 963 | ] 964 | }, 965 | "node_modules/inflight": { 966 | "version": "1.0.6", 967 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 968 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 969 | "dependencies": { 970 | "once": "^1.3.0", 971 | "wrappy": "1" 972 | } 973 | }, 974 | "node_modules/inherits": { 975 | "version": "2.0.4", 976 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 977 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 978 | }, 979 | "node_modules/internal-slot": { 980 | "version": "1.0.3", 981 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 982 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 983 | "dev": true, 984 | "dependencies": { 985 | "get-intrinsic": "^1.1.0", 986 | "has": "^1.0.3", 987 | "side-channel": "^1.0.4" 988 | }, 989 | "engines": { 990 | "node": ">= 0.4" 991 | } 992 | }, 993 | "node_modules/ip": { 994 | "version": "1.1.8", 995 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", 996 | "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", 997 | "dev": true 998 | }, 999 | "node_modules/is-arguments": { 1000 | "version": "1.1.1", 1001 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1002 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1003 | "dev": true, 1004 | "dependencies": { 1005 | "call-bind": "^1.0.2", 1006 | "has-tostringtag": "^1.0.0" 1007 | }, 1008 | "engines": { 1009 | "node": ">= 0.4" 1010 | }, 1011 | "funding": { 1012 | "url": "https://github.com/sponsors/ljharb" 1013 | } 1014 | }, 1015 | "node_modules/is-bigint": { 1016 | "version": "1.0.4", 1017 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1018 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1019 | "dev": true, 1020 | "dependencies": { 1021 | "has-bigints": "^1.0.1" 1022 | }, 1023 | "funding": { 1024 | "url": "https://github.com/sponsors/ljharb" 1025 | } 1026 | }, 1027 | "node_modules/is-boolean-object": { 1028 | "version": "1.1.2", 1029 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1030 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1031 | "dev": true, 1032 | "dependencies": { 1033 | "call-bind": "^1.0.2", 1034 | "has-tostringtag": "^1.0.0" 1035 | }, 1036 | "engines": { 1037 | "node": ">= 0.4" 1038 | }, 1039 | "funding": { 1040 | "url": "https://github.com/sponsors/ljharb" 1041 | } 1042 | }, 1043 | "node_modules/is-callable": { 1044 | "version": "1.2.6", 1045 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", 1046 | "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", 1047 | "dev": true, 1048 | "engines": { 1049 | "node": ">= 0.4" 1050 | }, 1051 | "funding": { 1052 | "url": "https://github.com/sponsors/ljharb" 1053 | } 1054 | }, 1055 | "node_modules/is-date-object": { 1056 | "version": "1.0.5", 1057 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1058 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1059 | "dev": true, 1060 | "dependencies": { 1061 | "has-tostringtag": "^1.0.0" 1062 | }, 1063 | "engines": { 1064 | "node": ">= 0.4" 1065 | }, 1066 | "funding": { 1067 | "url": "https://github.com/sponsors/ljharb" 1068 | } 1069 | }, 1070 | "node_modules/is-map": { 1071 | "version": "2.0.2", 1072 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 1073 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 1074 | "dev": true, 1075 | "funding": { 1076 | "url": "https://github.com/sponsors/ljharb" 1077 | } 1078 | }, 1079 | "node_modules/is-negative-zero": { 1080 | "version": "2.0.2", 1081 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1082 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1083 | "dev": true, 1084 | "engines": { 1085 | "node": ">= 0.4" 1086 | }, 1087 | "funding": { 1088 | "url": "https://github.com/sponsors/ljharb" 1089 | } 1090 | }, 1091 | "node_modules/is-number-object": { 1092 | "version": "1.0.7", 1093 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1094 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "has-tostringtag": "^1.0.0" 1098 | }, 1099 | "engines": { 1100 | "node": ">= 0.4" 1101 | }, 1102 | "funding": { 1103 | "url": "https://github.com/sponsors/ljharb" 1104 | } 1105 | }, 1106 | "node_modules/is-regex": { 1107 | "version": "1.1.4", 1108 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1109 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1110 | "dev": true, 1111 | "dependencies": { 1112 | "call-bind": "^1.0.2", 1113 | "has-tostringtag": "^1.0.0" 1114 | }, 1115 | "engines": { 1116 | "node": ">= 0.4" 1117 | }, 1118 | "funding": { 1119 | "url": "https://github.com/sponsors/ljharb" 1120 | } 1121 | }, 1122 | "node_modules/is-set": { 1123 | "version": "2.0.2", 1124 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 1125 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 1126 | "dev": true, 1127 | "funding": { 1128 | "url": "https://github.com/sponsors/ljharb" 1129 | } 1130 | }, 1131 | "node_modules/is-shared-array-buffer": { 1132 | "version": "1.0.2", 1133 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1134 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1135 | "dev": true, 1136 | "dependencies": { 1137 | "call-bind": "^1.0.2" 1138 | }, 1139 | "funding": { 1140 | "url": "https://github.com/sponsors/ljharb" 1141 | } 1142 | }, 1143 | "node_modules/is-string": { 1144 | "version": "1.0.7", 1145 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1146 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1147 | "dev": true, 1148 | "dependencies": { 1149 | "has-tostringtag": "^1.0.0" 1150 | }, 1151 | "engines": { 1152 | "node": ">= 0.4" 1153 | }, 1154 | "funding": { 1155 | "url": "https://github.com/sponsors/ljharb" 1156 | } 1157 | }, 1158 | "node_modules/is-symbol": { 1159 | "version": "1.0.4", 1160 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1161 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1162 | "dev": true, 1163 | "dependencies": { 1164 | "has-symbols": "^1.0.2" 1165 | }, 1166 | "engines": { 1167 | "node": ">= 0.4" 1168 | }, 1169 | "funding": { 1170 | "url": "https://github.com/sponsors/ljharb" 1171 | } 1172 | }, 1173 | "node_modules/is-typed-array": { 1174 | "version": "1.1.9", 1175 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", 1176 | "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", 1177 | "dev": true, 1178 | "dependencies": { 1179 | "available-typed-arrays": "^1.0.5", 1180 | "call-bind": "^1.0.2", 1181 | "es-abstract": "^1.20.0", 1182 | "for-each": "^0.3.3", 1183 | "has-tostringtag": "^1.0.0" 1184 | }, 1185 | "engines": { 1186 | "node": ">= 0.4" 1187 | }, 1188 | "funding": { 1189 | "url": "https://github.com/sponsors/ljharb" 1190 | } 1191 | }, 1192 | "node_modules/is-typedarray": { 1193 | "version": "1.0.0", 1194 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1195 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1196 | }, 1197 | "node_modules/is-weakmap": { 1198 | "version": "2.0.1", 1199 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 1200 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 1201 | "dev": true, 1202 | "funding": { 1203 | "url": "https://github.com/sponsors/ljharb" 1204 | } 1205 | }, 1206 | "node_modules/is-weakref": { 1207 | "version": "1.0.2", 1208 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1209 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1210 | "dev": true, 1211 | "dependencies": { 1212 | "call-bind": "^1.0.2" 1213 | }, 1214 | "funding": { 1215 | "url": "https://github.com/sponsors/ljharb" 1216 | } 1217 | }, 1218 | "node_modules/is-weakset": { 1219 | "version": "2.0.2", 1220 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 1221 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 1222 | "dev": true, 1223 | "dependencies": { 1224 | "call-bind": "^1.0.2", 1225 | "get-intrinsic": "^1.1.1" 1226 | }, 1227 | "funding": { 1228 | "url": "https://github.com/sponsors/ljharb" 1229 | } 1230 | }, 1231 | "node_modules/isarray": { 1232 | "version": "2.0.5", 1233 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1234 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 1235 | "dev": true 1236 | }, 1237 | "node_modules/isstream": { 1238 | "version": "0.1.2", 1239 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1240 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1241 | }, 1242 | "node_modules/js-sdsl": { 1243 | "version": "4.1.4", 1244 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", 1245 | "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==" 1246 | }, 1247 | "node_modules/jsbn": { 1248 | "version": "0.1.1", 1249 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1250 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1251 | }, 1252 | "node_modules/json-schema": { 1253 | "version": "0.4.0", 1254 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 1255 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 1256 | }, 1257 | "node_modules/json-schema-traverse": { 1258 | "version": "0.4.1", 1259 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1260 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1261 | }, 1262 | "node_modules/json-stringify-safe": { 1263 | "version": "5.0.1", 1264 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1265 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1266 | }, 1267 | "node_modules/jsonfile": { 1268 | "version": "6.1.0", 1269 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 1270 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 1271 | "dev": true, 1272 | "dependencies": { 1273 | "universalify": "^2.0.0" 1274 | }, 1275 | "optionalDependencies": { 1276 | "graceful-fs": "^4.1.6" 1277 | } 1278 | }, 1279 | "node_modules/jsprim": { 1280 | "version": "1.4.2", 1281 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 1282 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 1283 | "dependencies": { 1284 | "assert-plus": "1.0.0", 1285 | "extsprintf": "1.3.0", 1286 | "json-schema": "0.4.0", 1287 | "verror": "1.10.0" 1288 | }, 1289 | "engines": { 1290 | "node": ">=0.6.0" 1291 | } 1292 | }, 1293 | "node_modules/leven": { 1294 | "version": "2.1.0", 1295 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 1296 | "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", 1297 | "engines": { 1298 | "node": ">=0.10.0" 1299 | } 1300 | }, 1301 | "node_modules/lru-cache": { 1302 | "version": "6.0.0", 1303 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1304 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1305 | "dependencies": { 1306 | "yallist": "^4.0.0" 1307 | }, 1308 | "engines": { 1309 | "node": ">=10" 1310 | } 1311 | }, 1312 | "node_modules/map-stream": { 1313 | "version": "0.0.7", 1314 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", 1315 | "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", 1316 | "dev": true 1317 | }, 1318 | "node_modules/mime-db": { 1319 | "version": "1.44.0", 1320 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1321 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", 1322 | "engines": { 1323 | "node": ">= 0.6" 1324 | } 1325 | }, 1326 | "node_modules/mime-types": { 1327 | "version": "2.1.27", 1328 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1329 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1330 | "dependencies": { 1331 | "mime-db": "1.44.0" 1332 | }, 1333 | "engines": { 1334 | "node": ">= 0.6" 1335 | } 1336 | }, 1337 | "node_modules/minimatch": { 1338 | "version": "3.1.2", 1339 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1340 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1341 | "dependencies": { 1342 | "brace-expansion": "^1.1.7" 1343 | }, 1344 | "engines": { 1345 | "node": "*" 1346 | } 1347 | }, 1348 | "node_modules/minimist": { 1349 | "version": "1.2.6", 1350 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1351 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 1352 | }, 1353 | "node_modules/mkdirp": { 1354 | "version": "0.5.6", 1355 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1356 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1357 | "dev": true, 1358 | "dependencies": { 1359 | "minimist": "^1.2.6" 1360 | }, 1361 | "bin": { 1362 | "mkdirp": "bin/cmd.js" 1363 | } 1364 | }, 1365 | "node_modules/mqtt": { 1366 | "version": "4.3.7", 1367 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", 1368 | "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", 1369 | "dependencies": { 1370 | "commist": "^1.0.0", 1371 | "concat-stream": "^2.0.0", 1372 | "debug": "^4.1.1", 1373 | "duplexify": "^4.1.1", 1374 | "help-me": "^3.0.0", 1375 | "inherits": "^2.0.3", 1376 | "lru-cache": "^6.0.0", 1377 | "minimist": "^1.2.5", 1378 | "mqtt-packet": "^6.8.0", 1379 | "number-allocator": "^1.0.9", 1380 | "pump": "^3.0.0", 1381 | "readable-stream": "^3.6.0", 1382 | "reinterval": "^1.1.0", 1383 | "rfdc": "^1.3.0", 1384 | "split2": "^3.1.0", 1385 | "ws": "^7.5.5", 1386 | "xtend": "^4.0.2" 1387 | }, 1388 | "bin": { 1389 | "mqtt": "bin/mqtt.js", 1390 | "mqtt_pub": "bin/pub.js", 1391 | "mqtt_sub": "bin/sub.js" 1392 | }, 1393 | "engines": { 1394 | "node": ">=10.0.0" 1395 | } 1396 | }, 1397 | "node_modules/mqtt-packet": { 1398 | "version": "6.10.0", 1399 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", 1400 | "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", 1401 | "dependencies": { 1402 | "bl": "^4.0.2", 1403 | "debug": "^4.1.1", 1404 | "process-nextick-args": "^2.0.1" 1405 | } 1406 | }, 1407 | "node_modules/ms": { 1408 | "version": "2.1.2", 1409 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1410 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1411 | }, 1412 | "node_modules/multicast-dns": { 1413 | "version": "7.2.5", 1414 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", 1415 | "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", 1416 | "dev": true, 1417 | "dependencies": { 1418 | "dns-packet": "^5.2.2", 1419 | "thunky": "^1.0.2" 1420 | }, 1421 | "bin": { 1422 | "multicast-dns": "cli.js" 1423 | } 1424 | }, 1425 | "node_modules/multicast-dns-service-types": { 1426 | "version": "1.1.0", 1427 | "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", 1428 | "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", 1429 | "dev": true 1430 | }, 1431 | "node_modules/node-persist": { 1432 | "version": "0.0.11", 1433 | "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", 1434 | "integrity": "sha512-J3EPzQDgPxPBID7TqHSd5KkpTULFqJUvYDoISfOWg9EihpeVCH3b6YQeDeubzVuc4e6+aiVmkz2sdkWI4K+ghA==", 1435 | "dev": true, 1436 | "dependencies": { 1437 | "mkdirp": "~0.5.1", 1438 | "q": "~1.1.1" 1439 | } 1440 | }, 1441 | "node_modules/number-allocator": { 1442 | "version": "1.0.12", 1443 | "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.12.tgz", 1444 | "integrity": "sha512-sGB0qoQGmKimery9JubBQ9pQUr1V/LixJAk3Ygp7obZf6mpSXime8d7XHEobbIimkdZpgjkNlLt6G7LPEWFYWg==", 1445 | "dependencies": { 1446 | "debug": "^4.3.1", 1447 | "js-sdsl": "4.1.4" 1448 | } 1449 | }, 1450 | "node_modules/oauth-sign": { 1451 | "version": "0.9.0", 1452 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1453 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1454 | "engines": { 1455 | "node": "*" 1456 | } 1457 | }, 1458 | "node_modules/object-inspect": { 1459 | "version": "1.12.2", 1460 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1461 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 1462 | "dev": true, 1463 | "funding": { 1464 | "url": "https://github.com/sponsors/ljharb" 1465 | } 1466 | }, 1467 | "node_modules/object-is": { 1468 | "version": "1.1.5", 1469 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 1470 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "call-bind": "^1.0.2", 1474 | "define-properties": "^1.1.3" 1475 | }, 1476 | "engines": { 1477 | "node": ">= 0.4" 1478 | }, 1479 | "funding": { 1480 | "url": "https://github.com/sponsors/ljharb" 1481 | } 1482 | }, 1483 | "node_modules/object-keys": { 1484 | "version": "1.1.1", 1485 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1486 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1487 | "dev": true, 1488 | "engines": { 1489 | "node": ">= 0.4" 1490 | } 1491 | }, 1492 | "node_modules/object.assign": { 1493 | "version": "4.1.4", 1494 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 1495 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 1496 | "dev": true, 1497 | "dependencies": { 1498 | "call-bind": "^1.0.2", 1499 | "define-properties": "^1.1.4", 1500 | "has-symbols": "^1.0.3", 1501 | "object-keys": "^1.1.1" 1502 | }, 1503 | "engines": { 1504 | "node": ">= 0.4" 1505 | }, 1506 | "funding": { 1507 | "url": "https://github.com/sponsors/ljharb" 1508 | } 1509 | }, 1510 | "node_modules/once": { 1511 | "version": "1.4.0", 1512 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1513 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1514 | "dependencies": { 1515 | "wrappy": "1" 1516 | } 1517 | }, 1518 | "node_modules/path-is-absolute": { 1519 | "version": "1.0.1", 1520 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1521 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1522 | "engines": { 1523 | "node": ">=0.10.0" 1524 | } 1525 | }, 1526 | "node_modules/pause-stream": { 1527 | "version": "0.0.11", 1528 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 1529 | "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", 1530 | "dev": true, 1531 | "dependencies": { 1532 | "through": "~2.3" 1533 | } 1534 | }, 1535 | "node_modules/performance-now": { 1536 | "version": "2.1.0", 1537 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1538 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1539 | }, 1540 | "node_modules/process-nextick-args": { 1541 | "version": "2.0.1", 1542 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1543 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1544 | }, 1545 | "node_modules/psl": { 1546 | "version": "1.8.0", 1547 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1548 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1549 | }, 1550 | "node_modules/pump": { 1551 | "version": "3.0.0", 1552 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1553 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1554 | "dependencies": { 1555 | "end-of-stream": "^1.1.0", 1556 | "once": "^1.3.1" 1557 | } 1558 | }, 1559 | "node_modules/punycode": { 1560 | "version": "2.1.1", 1561 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1562 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1563 | "engines": { 1564 | "node": ">=6" 1565 | } 1566 | }, 1567 | "node_modules/q": { 1568 | "version": "1.1.2", 1569 | "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", 1570 | "integrity": "sha512-ROtylwux7Vkc4C07oKE/ReigUmb33kVoLtcR4SJ1QVqwaZkBEDL3vX4/kwFzIERQ5PfCl0XafbU8u2YUhyGgVA==", 1571 | "dev": true, 1572 | "engines": { 1573 | "node": ">=0.6.0", 1574 | "teleport": ">=0.2.0" 1575 | } 1576 | }, 1577 | "node_modules/qrcode-terminal": { 1578 | "version": "0.12.0", 1579 | "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", 1580 | "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", 1581 | "dev": true, 1582 | "bin": { 1583 | "qrcode-terminal": "bin/qrcode-terminal.js" 1584 | } 1585 | }, 1586 | "node_modules/qs": { 1587 | "version": "6.5.3", 1588 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 1589 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", 1590 | "engines": { 1591 | "node": ">=0.6" 1592 | } 1593 | }, 1594 | "node_modules/readable-stream": { 1595 | "version": "3.6.0", 1596 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1597 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1598 | "dependencies": { 1599 | "inherits": "^2.0.3", 1600 | "string_decoder": "^1.1.1", 1601 | "util-deprecate": "^1.0.1" 1602 | }, 1603 | "engines": { 1604 | "node": ">= 6" 1605 | } 1606 | }, 1607 | "node_modules/regexp.prototype.flags": { 1608 | "version": "1.4.3", 1609 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 1610 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 1611 | "dev": true, 1612 | "dependencies": { 1613 | "call-bind": "^1.0.2", 1614 | "define-properties": "^1.1.3", 1615 | "functions-have-names": "^1.2.2" 1616 | }, 1617 | "engines": { 1618 | "node": ">= 0.4" 1619 | }, 1620 | "funding": { 1621 | "url": "https://github.com/sponsors/ljharb" 1622 | } 1623 | }, 1624 | "node_modules/reinterval": { 1625 | "version": "1.1.0", 1626 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 1627 | "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" 1628 | }, 1629 | "node_modules/request": { 1630 | "version": "2.88.2", 1631 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1632 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1633 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", 1634 | "dependencies": { 1635 | "aws-sign2": "~0.7.0", 1636 | "aws4": "^1.8.0", 1637 | "caseless": "~0.12.0", 1638 | "combined-stream": "~1.0.6", 1639 | "extend": "~3.0.2", 1640 | "forever-agent": "~0.6.1", 1641 | "form-data": "~2.3.2", 1642 | "har-validator": "~5.1.3", 1643 | "http-signature": "~1.2.0", 1644 | "is-typedarray": "~1.0.0", 1645 | "isstream": "~0.1.2", 1646 | "json-stringify-safe": "~5.0.1", 1647 | "mime-types": "~2.1.19", 1648 | "oauth-sign": "~0.9.0", 1649 | "performance-now": "^2.1.0", 1650 | "qs": "~6.5.2", 1651 | "safe-buffer": "^5.1.2", 1652 | "tough-cookie": "~2.5.0", 1653 | "tunnel-agent": "^0.6.0", 1654 | "uuid": "^3.3.2" 1655 | }, 1656 | "engines": { 1657 | "node": ">= 6" 1658 | } 1659 | }, 1660 | "node_modules/rfdc": { 1661 | "version": "1.3.0", 1662 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", 1663 | "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" 1664 | }, 1665 | "node_modules/safe-buffer": { 1666 | "version": "5.2.1", 1667 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1668 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1669 | "funding": [ 1670 | { 1671 | "type": "github", 1672 | "url": "https://github.com/sponsors/feross" 1673 | }, 1674 | { 1675 | "type": "patreon", 1676 | "url": "https://www.patreon.com/feross" 1677 | }, 1678 | { 1679 | "type": "consulting", 1680 | "url": "https://feross.org/support" 1681 | } 1682 | ] 1683 | }, 1684 | "node_modules/safer-buffer": { 1685 | "version": "2.1.2", 1686 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1687 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1688 | }, 1689 | "node_modules/sax": { 1690 | "version": "1.2.4", 1691 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1692 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 1693 | "dev": true 1694 | }, 1695 | "node_modules/semver": { 1696 | "version": "7.3.7", 1697 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 1698 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 1699 | "dev": true, 1700 | "dependencies": { 1701 | "lru-cache": "^6.0.0" 1702 | }, 1703 | "bin": { 1704 | "semver": "bin/semver.js" 1705 | }, 1706 | "engines": { 1707 | "node": ">=10" 1708 | } 1709 | }, 1710 | "node_modules/side-channel": { 1711 | "version": "1.0.4", 1712 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1713 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1714 | "dev": true, 1715 | "dependencies": { 1716 | "call-bind": "^1.0.0", 1717 | "get-intrinsic": "^1.0.2", 1718 | "object-inspect": "^1.9.0" 1719 | }, 1720 | "funding": { 1721 | "url": "https://github.com/sponsors/ljharb" 1722 | } 1723 | }, 1724 | "node_modules/source-map": { 1725 | "version": "0.6.1", 1726 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1727 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1728 | "dev": true, 1729 | "engines": { 1730 | "node": ">=0.10.0" 1731 | } 1732 | }, 1733 | "node_modules/source-map-support": { 1734 | "version": "0.5.21", 1735 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1736 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1737 | "dev": true, 1738 | "dependencies": { 1739 | "buffer-from": "^1.0.0", 1740 | "source-map": "^0.6.0" 1741 | } 1742 | }, 1743 | "node_modules/split": { 1744 | "version": "1.0.1", 1745 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 1746 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 1747 | "dev": true, 1748 | "dependencies": { 1749 | "through": "2" 1750 | }, 1751 | "engines": { 1752 | "node": "*" 1753 | } 1754 | }, 1755 | "node_modules/split2": { 1756 | "version": "3.2.2", 1757 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 1758 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 1759 | "dependencies": { 1760 | "readable-stream": "^3.0.0" 1761 | } 1762 | }, 1763 | "node_modules/sshpk": { 1764 | "version": "1.16.1", 1765 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1766 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1767 | "dependencies": { 1768 | "asn1": "~0.2.3", 1769 | "assert-plus": "^1.0.0", 1770 | "bcrypt-pbkdf": "^1.0.0", 1771 | "dashdash": "^1.12.0", 1772 | "ecc-jsbn": "~0.1.1", 1773 | "getpass": "^0.1.1", 1774 | "jsbn": "~0.1.0", 1775 | "safer-buffer": "^2.0.2", 1776 | "tweetnacl": "~0.14.0" 1777 | }, 1778 | "bin": { 1779 | "sshpk-conv": "bin/sshpk-conv", 1780 | "sshpk-sign": "bin/sshpk-sign", 1781 | "sshpk-verify": "bin/sshpk-verify" 1782 | }, 1783 | "engines": { 1784 | "node": ">=0.10.0" 1785 | } 1786 | }, 1787 | "node_modules/stream-combiner": { 1788 | "version": "0.2.2", 1789 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", 1790 | "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", 1791 | "dev": true, 1792 | "dependencies": { 1793 | "duplexer": "~0.1.1", 1794 | "through": "~2.3.4" 1795 | } 1796 | }, 1797 | "node_modules/stream-shift": { 1798 | "version": "1.0.1", 1799 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1800 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1801 | }, 1802 | "node_modules/string_decoder": { 1803 | "version": "1.3.0", 1804 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1805 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1806 | "dependencies": { 1807 | "safe-buffer": "~5.2.0" 1808 | } 1809 | }, 1810 | "node_modules/string.prototype.trimend": { 1811 | "version": "1.0.5", 1812 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", 1813 | "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", 1814 | "dev": true, 1815 | "dependencies": { 1816 | "call-bind": "^1.0.2", 1817 | "define-properties": "^1.1.4", 1818 | "es-abstract": "^1.19.5" 1819 | }, 1820 | "funding": { 1821 | "url": "https://github.com/sponsors/ljharb" 1822 | } 1823 | }, 1824 | "node_modules/string.prototype.trimstart": { 1825 | "version": "1.0.5", 1826 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", 1827 | "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", 1828 | "dev": true, 1829 | "dependencies": { 1830 | "call-bind": "^1.0.2", 1831 | "define-properties": "^1.1.4", 1832 | "es-abstract": "^1.19.5" 1833 | }, 1834 | "funding": { 1835 | "url": "https://github.com/sponsors/ljharb" 1836 | } 1837 | }, 1838 | "node_modules/supports-color": { 1839 | "version": "7.2.0", 1840 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1841 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1842 | "dev": true, 1843 | "dependencies": { 1844 | "has-flag": "^4.0.0" 1845 | }, 1846 | "engines": { 1847 | "node": ">=8" 1848 | } 1849 | }, 1850 | "node_modules/through": { 1851 | "version": "2.3.8", 1852 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1853 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1854 | "dev": true 1855 | }, 1856 | "node_modules/thunky": { 1857 | "version": "1.1.0", 1858 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", 1859 | "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", 1860 | "dev": true 1861 | }, 1862 | "node_modules/tough-cookie": { 1863 | "version": "2.5.0", 1864 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1865 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1866 | "dependencies": { 1867 | "psl": "^1.1.28", 1868 | "punycode": "^2.1.1" 1869 | }, 1870 | "engines": { 1871 | "node": ">=0.8" 1872 | } 1873 | }, 1874 | "node_modules/tslib": { 1875 | "version": "2.4.0", 1876 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 1877 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 1878 | "dev": true 1879 | }, 1880 | "node_modules/tunnel-agent": { 1881 | "version": "0.6.0", 1882 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1883 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1884 | "dependencies": { 1885 | "safe-buffer": "^5.0.1" 1886 | }, 1887 | "engines": { 1888 | "node": "*" 1889 | } 1890 | }, 1891 | "node_modules/tweetnacl": { 1892 | "version": "0.14.5", 1893 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1894 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1895 | }, 1896 | "node_modules/typedarray": { 1897 | "version": "0.0.6", 1898 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1899 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" 1900 | }, 1901 | "node_modules/unbox-primitive": { 1902 | "version": "1.0.2", 1903 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1904 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1905 | "dev": true, 1906 | "dependencies": { 1907 | "call-bind": "^1.0.2", 1908 | "has-bigints": "^1.0.2", 1909 | "has-symbols": "^1.0.3", 1910 | "which-boxed-primitive": "^1.0.2" 1911 | }, 1912 | "funding": { 1913 | "url": "https://github.com/sponsors/ljharb" 1914 | } 1915 | }, 1916 | "node_modules/universalify": { 1917 | "version": "2.0.0", 1918 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 1919 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 1920 | "dev": true, 1921 | "engines": { 1922 | "node": ">= 10.0.0" 1923 | } 1924 | }, 1925 | "node_modules/uri-js": { 1926 | "version": "4.4.0", 1927 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 1928 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 1929 | "dependencies": { 1930 | "punycode": "^2.1.0" 1931 | } 1932 | }, 1933 | "node_modules/util-deprecate": { 1934 | "version": "1.0.2", 1935 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1936 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1937 | }, 1938 | "node_modules/uuid": { 1939 | "version": "3.4.0", 1940 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1941 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1942 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", 1943 | "bin": { 1944 | "uuid": "bin/uuid" 1945 | } 1946 | }, 1947 | "node_modules/verror": { 1948 | "version": "1.10.0", 1949 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1950 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1951 | "engines": [ 1952 | "node >=0.6.0" 1953 | ], 1954 | "dependencies": { 1955 | "assert-plus": "^1.0.0", 1956 | "core-util-is": "1.0.2", 1957 | "extsprintf": "^1.2.0" 1958 | } 1959 | }, 1960 | "node_modules/which-boxed-primitive": { 1961 | "version": "1.0.2", 1962 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1963 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1964 | "dev": true, 1965 | "dependencies": { 1966 | "is-bigint": "^1.0.1", 1967 | "is-boolean-object": "^1.1.0", 1968 | "is-number-object": "^1.0.4", 1969 | "is-string": "^1.0.5", 1970 | "is-symbol": "^1.0.3" 1971 | }, 1972 | "funding": { 1973 | "url": "https://github.com/sponsors/ljharb" 1974 | } 1975 | }, 1976 | "node_modules/which-collection": { 1977 | "version": "1.0.1", 1978 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1979 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1980 | "dev": true, 1981 | "dependencies": { 1982 | "is-map": "^2.0.1", 1983 | "is-set": "^2.0.1", 1984 | "is-weakmap": "^2.0.1", 1985 | "is-weakset": "^2.0.1" 1986 | }, 1987 | "funding": { 1988 | "url": "https://github.com/sponsors/ljharb" 1989 | } 1990 | }, 1991 | "node_modules/which-typed-array": { 1992 | "version": "1.1.8", 1993 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", 1994 | "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", 1995 | "dev": true, 1996 | "dependencies": { 1997 | "available-typed-arrays": "^1.0.5", 1998 | "call-bind": "^1.0.2", 1999 | "es-abstract": "^1.20.0", 2000 | "for-each": "^0.3.3", 2001 | "has-tostringtag": "^1.0.0", 2002 | "is-typed-array": "^1.1.9" 2003 | }, 2004 | "engines": { 2005 | "node": ">= 0.4" 2006 | }, 2007 | "funding": { 2008 | "url": "https://github.com/sponsors/ljharb" 2009 | } 2010 | }, 2011 | "node_modules/wrappy": { 2012 | "version": "1.0.2", 2013 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2014 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2015 | }, 2016 | "node_modules/ws": { 2017 | "version": "7.5.9", 2018 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 2019 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 2020 | "engines": { 2021 | "node": ">=8.3.0" 2022 | }, 2023 | "peerDependencies": { 2024 | "bufferutil": "^4.0.1", 2025 | "utf-8-validate": "^5.0.2" 2026 | }, 2027 | "peerDependenciesMeta": { 2028 | "bufferutil": { 2029 | "optional": true 2030 | }, 2031 | "utf-8-validate": { 2032 | "optional": true 2033 | } 2034 | } 2035 | }, 2036 | "node_modules/xml2js": { 2037 | "version": "0.4.23", 2038 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 2039 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 2040 | "dev": true, 2041 | "dependencies": { 2042 | "sax": ">=0.6.0", 2043 | "xmlbuilder": "~11.0.0" 2044 | }, 2045 | "engines": { 2046 | "node": ">=4.0.0" 2047 | } 2048 | }, 2049 | "node_modules/xmlbuilder": { 2050 | "version": "11.0.1", 2051 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 2052 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 2053 | "dev": true, 2054 | "engines": { 2055 | "node": ">=4.0" 2056 | } 2057 | }, 2058 | "node_modules/xtend": { 2059 | "version": "4.0.2", 2060 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2061 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2062 | "engines": { 2063 | "node": ">=0.4" 2064 | } 2065 | }, 2066 | "node_modules/yallist": { 2067 | "version": "4.0.0", 2068 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2069 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2070 | } 2071 | }, 2072 | "dependencies": { 2073 | "@homebridge/ciao": { 2074 | "version": "1.1.5", 2075 | "resolved": "https://registry.npmjs.org/@homebridge/ciao/-/ciao-1.1.5.tgz", 2076 | "integrity": "sha512-ZI9tcbPfX2d8oP1PNeLzrZLXISAIDUtJQWk4JVVJKCxktC6tQ3JyWXT9t1FbB5xtl82M1jdCgyAbWbjhUtRWcA==", 2077 | "dev": true, 2078 | "requires": { 2079 | "debug": "^4.3.4", 2080 | "fast-deep-equal": "^3.1.3", 2081 | "source-map-support": "^0.5.21", 2082 | "tslib": "^2.4.0" 2083 | } 2084 | }, 2085 | "@homebridge/dbus-native": { 2086 | "version": "0.4.2", 2087 | "resolved": "https://registry.npmjs.org/@homebridge/dbus-native/-/dbus-native-0.4.2.tgz", 2088 | "integrity": "sha512-rg6DUg6xOttzn73HA1+3G2o1ezRj0+DzPMEJqasrpq7FcAxMcTyOZ96GfcDN4pLUz62hMuywIeVZ4F6cc/g6Ig==", 2089 | "dev": true, 2090 | "requires": { 2091 | "@homebridge/long": "^5.2.1", 2092 | "@homebridge/put": "~0.0.8", 2093 | "event-stream": "^4.0.0", 2094 | "hexy": "^0.2.10", 2095 | "minimist": "^1.2.6", 2096 | "safe-buffer": "^5.1.1", 2097 | "xml2js": "^0.4.17" 2098 | } 2099 | }, 2100 | "@homebridge/long": { 2101 | "version": "5.2.1", 2102 | "resolved": "https://registry.npmjs.org/@homebridge/long/-/long-5.2.1.tgz", 2103 | "integrity": "sha512-i5Df8R63XNPCn+Nj1OgAoRdw9e+jHUQb3CNUbvJneI2iu3j4+OtzQj+5PA1Ce+747NR1SPqZSvyvD483dOT3AA==", 2104 | "dev": true 2105 | }, 2106 | "@homebridge/put": { 2107 | "version": "0.0.8", 2108 | "resolved": "https://registry.npmjs.org/@homebridge/put/-/put-0.0.8.tgz", 2109 | "integrity": "sha512-mwxLHHqKebOmOSU0tsPEWQSBHGApPhuaqtNpCe7U+AMdsduweANiu64E9SXXUtdpyTjsOpgSMLhD1+kbLHD2gA==", 2110 | "dev": true 2111 | }, 2112 | "@leichtgewicht/ip-codec": { 2113 | "version": "2.0.4", 2114 | "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", 2115 | "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", 2116 | "dev": true 2117 | }, 2118 | "ajv": { 2119 | "version": "6.12.6", 2120 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 2121 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 2122 | "requires": { 2123 | "fast-deep-equal": "^3.1.1", 2124 | "fast-json-stable-stringify": "^2.0.0", 2125 | "json-schema-traverse": "^0.4.1", 2126 | "uri-js": "^4.2.2" 2127 | } 2128 | }, 2129 | "ansi-styles": { 2130 | "version": "4.3.0", 2131 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2132 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2133 | "dev": true, 2134 | "requires": { 2135 | "color-convert": "^2.0.1" 2136 | } 2137 | }, 2138 | "array-flatten": { 2139 | "version": "2.1.2", 2140 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", 2141 | "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", 2142 | "dev": true 2143 | }, 2144 | "asn1": { 2145 | "version": "0.2.4", 2146 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 2147 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 2148 | "requires": { 2149 | "safer-buffer": "~2.1.0" 2150 | } 2151 | }, 2152 | "assert-plus": { 2153 | "version": "1.0.0", 2154 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2155 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 2156 | }, 2157 | "async": { 2158 | "version": "3.2.4", 2159 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 2160 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" 2161 | }, 2162 | "asynckit": { 2163 | "version": "0.4.0", 2164 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 2165 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 2166 | }, 2167 | "available-typed-arrays": { 2168 | "version": "1.0.5", 2169 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 2170 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 2171 | "dev": true 2172 | }, 2173 | "aws-sign2": { 2174 | "version": "0.7.0", 2175 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 2176 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 2177 | }, 2178 | "aws4": { 2179 | "version": "1.11.0", 2180 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 2181 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 2182 | }, 2183 | "balanced-match": { 2184 | "version": "1.0.2", 2185 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2186 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 2187 | }, 2188 | "base64-js": { 2189 | "version": "1.5.1", 2190 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 2191 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 2192 | }, 2193 | "bcrypt-pbkdf": { 2194 | "version": "1.0.2", 2195 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 2196 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 2197 | "requires": { 2198 | "tweetnacl": "^0.14.3" 2199 | } 2200 | }, 2201 | "bl": { 2202 | "version": "4.1.0", 2203 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 2204 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 2205 | "requires": { 2206 | "buffer": "^5.5.0", 2207 | "inherits": "^2.0.4", 2208 | "readable-stream": "^3.4.0" 2209 | } 2210 | }, 2211 | "bonjour-hap": { 2212 | "version": "3.6.4", 2213 | "resolved": "https://registry.npmjs.org/bonjour-hap/-/bonjour-hap-3.6.4.tgz", 2214 | "integrity": "sha512-a76r95/qTAP5hOEZZhRoiosyFSVPPRSVev09Jh8yDf3JDKyrzELLf0vpQCuEXFueb9DcV9UJf2Jv3dktyuPBng==", 2215 | "dev": true, 2216 | "requires": { 2217 | "array-flatten": "^2.1.2", 2218 | "deep-equal": "^2.0.5", 2219 | "ip": "^1.1.8", 2220 | "multicast-dns": "^7.2.5", 2221 | "multicast-dns-service-types": "^1.1.0" 2222 | } 2223 | }, 2224 | "brace-expansion": { 2225 | "version": "1.1.11", 2226 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2227 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2228 | "requires": { 2229 | "balanced-match": "^1.0.0", 2230 | "concat-map": "0.0.1" 2231 | } 2232 | }, 2233 | "buffer": { 2234 | "version": "5.7.1", 2235 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 2236 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 2237 | "requires": { 2238 | "base64-js": "^1.3.1", 2239 | "ieee754": "^1.1.13" 2240 | } 2241 | }, 2242 | "buffer-from": { 2243 | "version": "1.1.2", 2244 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 2245 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 2246 | }, 2247 | "call-bind": { 2248 | "version": "1.0.2", 2249 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 2250 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 2251 | "dev": true, 2252 | "requires": { 2253 | "function-bind": "^1.1.1", 2254 | "get-intrinsic": "^1.0.2" 2255 | } 2256 | }, 2257 | "caseless": { 2258 | "version": "0.12.0", 2259 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 2260 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 2261 | }, 2262 | "chalk": { 2263 | "version": "4.1.2", 2264 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2265 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2266 | "dev": true, 2267 | "requires": { 2268 | "ansi-styles": "^4.1.0", 2269 | "supports-color": "^7.1.0" 2270 | } 2271 | }, 2272 | "color-convert": { 2273 | "version": "2.0.1", 2274 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2275 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2276 | "dev": true, 2277 | "requires": { 2278 | "color-name": "~1.1.4" 2279 | } 2280 | }, 2281 | "color-name": { 2282 | "version": "1.1.4", 2283 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2284 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2285 | "dev": true 2286 | }, 2287 | "combined-stream": { 2288 | "version": "1.0.8", 2289 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 2290 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 2291 | "requires": { 2292 | "delayed-stream": "~1.0.0" 2293 | } 2294 | }, 2295 | "commander": { 2296 | "version": "5.1.0", 2297 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 2298 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", 2299 | "dev": true 2300 | }, 2301 | "commist": { 2302 | "version": "1.1.0", 2303 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 2304 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 2305 | "requires": { 2306 | "leven": "^2.1.0", 2307 | "minimist": "^1.1.0" 2308 | } 2309 | }, 2310 | "concat-map": { 2311 | "version": "0.0.1", 2312 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2313 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 2314 | }, 2315 | "concat-stream": { 2316 | "version": "2.0.0", 2317 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 2318 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 2319 | "requires": { 2320 | "buffer-from": "^1.0.0", 2321 | "inherits": "^2.0.3", 2322 | "readable-stream": "^3.0.2", 2323 | "typedarray": "^0.0.6" 2324 | } 2325 | }, 2326 | "core-util-is": { 2327 | "version": "1.0.2", 2328 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 2329 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 2330 | }, 2331 | "dashdash": { 2332 | "version": "1.14.1", 2333 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 2334 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 2335 | "requires": { 2336 | "assert-plus": "^1.0.0" 2337 | } 2338 | }, 2339 | "debug": { 2340 | "version": "4.3.4", 2341 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2342 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2343 | "requires": { 2344 | "ms": "2.1.2" 2345 | } 2346 | }, 2347 | "deep-equal": { 2348 | "version": "2.0.5", 2349 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", 2350 | "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", 2351 | "dev": true, 2352 | "requires": { 2353 | "call-bind": "^1.0.0", 2354 | "es-get-iterator": "^1.1.1", 2355 | "get-intrinsic": "^1.0.1", 2356 | "is-arguments": "^1.0.4", 2357 | "is-date-object": "^1.0.2", 2358 | "is-regex": "^1.1.1", 2359 | "isarray": "^2.0.5", 2360 | "object-is": "^1.1.4", 2361 | "object-keys": "^1.1.1", 2362 | "object.assign": "^4.1.2", 2363 | "regexp.prototype.flags": "^1.3.0", 2364 | "side-channel": "^1.0.3", 2365 | "which-boxed-primitive": "^1.0.1", 2366 | "which-collection": "^1.0.1", 2367 | "which-typed-array": "^1.1.2" 2368 | } 2369 | }, 2370 | "define-properties": { 2371 | "version": "1.1.4", 2372 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 2373 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 2374 | "dev": true, 2375 | "requires": { 2376 | "has-property-descriptors": "^1.0.0", 2377 | "object-keys": "^1.1.1" 2378 | } 2379 | }, 2380 | "delayed-stream": { 2381 | "version": "1.0.0", 2382 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 2383 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 2384 | }, 2385 | "dns-packet": { 2386 | "version": "5.4.0", 2387 | "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", 2388 | "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", 2389 | "dev": true, 2390 | "requires": { 2391 | "@leichtgewicht/ip-codec": "^2.0.1" 2392 | } 2393 | }, 2394 | "duplexer": { 2395 | "version": "0.1.2", 2396 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", 2397 | "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", 2398 | "dev": true 2399 | }, 2400 | "duplexify": { 2401 | "version": "4.1.2", 2402 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", 2403 | "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", 2404 | "requires": { 2405 | "end-of-stream": "^1.4.1", 2406 | "inherits": "^2.0.3", 2407 | "readable-stream": "^3.1.1", 2408 | "stream-shift": "^1.0.0" 2409 | } 2410 | }, 2411 | "ecc-jsbn": { 2412 | "version": "0.1.2", 2413 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 2414 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 2415 | "requires": { 2416 | "jsbn": "~0.1.0", 2417 | "safer-buffer": "^2.1.0" 2418 | } 2419 | }, 2420 | "end-of-stream": { 2421 | "version": "1.4.4", 2422 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 2423 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 2424 | "requires": { 2425 | "once": "^1.4.0" 2426 | } 2427 | }, 2428 | "es-abstract": { 2429 | "version": "1.20.2", 2430 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", 2431 | "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", 2432 | "dev": true, 2433 | "requires": { 2434 | "call-bind": "^1.0.2", 2435 | "es-to-primitive": "^1.2.1", 2436 | "function-bind": "^1.1.1", 2437 | "function.prototype.name": "^1.1.5", 2438 | "get-intrinsic": "^1.1.2", 2439 | "get-symbol-description": "^1.0.0", 2440 | "has": "^1.0.3", 2441 | "has-property-descriptors": "^1.0.0", 2442 | "has-symbols": "^1.0.3", 2443 | "internal-slot": "^1.0.3", 2444 | "is-callable": "^1.2.4", 2445 | "is-negative-zero": "^2.0.2", 2446 | "is-regex": "^1.1.4", 2447 | "is-shared-array-buffer": "^1.0.2", 2448 | "is-string": "^1.0.7", 2449 | "is-weakref": "^1.0.2", 2450 | "object-inspect": "^1.12.2", 2451 | "object-keys": "^1.1.1", 2452 | "object.assign": "^4.1.4", 2453 | "regexp.prototype.flags": "^1.4.3", 2454 | "string.prototype.trimend": "^1.0.5", 2455 | "string.prototype.trimstart": "^1.0.5", 2456 | "unbox-primitive": "^1.0.2" 2457 | } 2458 | }, 2459 | "es-get-iterator": { 2460 | "version": "1.1.2", 2461 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", 2462 | "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", 2463 | "dev": true, 2464 | "requires": { 2465 | "call-bind": "^1.0.2", 2466 | "get-intrinsic": "^1.1.0", 2467 | "has-symbols": "^1.0.1", 2468 | "is-arguments": "^1.1.0", 2469 | "is-map": "^2.0.2", 2470 | "is-set": "^2.0.2", 2471 | "is-string": "^1.0.5", 2472 | "isarray": "^2.0.5" 2473 | } 2474 | }, 2475 | "es-to-primitive": { 2476 | "version": "1.2.1", 2477 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 2478 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 2479 | "dev": true, 2480 | "requires": { 2481 | "is-callable": "^1.1.4", 2482 | "is-date-object": "^1.0.1", 2483 | "is-symbol": "^1.0.2" 2484 | } 2485 | }, 2486 | "event-stream": { 2487 | "version": "4.0.1", 2488 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", 2489 | "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", 2490 | "dev": true, 2491 | "requires": { 2492 | "duplexer": "^0.1.1", 2493 | "from": "^0.1.7", 2494 | "map-stream": "0.0.7", 2495 | "pause-stream": "^0.0.11", 2496 | "split": "^1.0.1", 2497 | "stream-combiner": "^0.2.2", 2498 | "through": "^2.3.8" 2499 | } 2500 | }, 2501 | "extend": { 2502 | "version": "3.0.2", 2503 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 2504 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 2505 | }, 2506 | "extsprintf": { 2507 | "version": "1.3.0", 2508 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 2509 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 2510 | }, 2511 | "fast-deep-equal": { 2512 | "version": "3.1.3", 2513 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2514 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 2515 | }, 2516 | "fast-json-stable-stringify": { 2517 | "version": "2.1.0", 2518 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2519 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 2520 | }, 2521 | "fast-srp-hap": { 2522 | "version": "2.0.4", 2523 | "resolved": "https://registry.npmjs.org/fast-srp-hap/-/fast-srp-hap-2.0.4.tgz", 2524 | "integrity": "sha512-lHRYYaaIbMrhZtsdGTwPN82UbqD9Bv8QfOlKs+Dz6YRnByZifOh93EYmf2iEWFtkOEIqR2IK8cFD0UN5wLIWBQ==", 2525 | "dev": true 2526 | }, 2527 | "for-each": { 2528 | "version": "0.3.3", 2529 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 2530 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 2531 | "dev": true, 2532 | "requires": { 2533 | "is-callable": "^1.1.3" 2534 | } 2535 | }, 2536 | "forever-agent": { 2537 | "version": "0.6.1", 2538 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 2539 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 2540 | }, 2541 | "form-data": { 2542 | "version": "2.3.3", 2543 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 2544 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 2545 | "requires": { 2546 | "asynckit": "^0.4.0", 2547 | "combined-stream": "^1.0.6", 2548 | "mime-types": "^2.1.12" 2549 | } 2550 | }, 2551 | "from": { 2552 | "version": "0.1.7", 2553 | "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", 2554 | "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", 2555 | "dev": true 2556 | }, 2557 | "fs-extra": { 2558 | "version": "10.1.0", 2559 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 2560 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 2561 | "dev": true, 2562 | "requires": { 2563 | "graceful-fs": "^4.2.0", 2564 | "jsonfile": "^6.0.1", 2565 | "universalify": "^2.0.0" 2566 | } 2567 | }, 2568 | "fs.realpath": { 2569 | "version": "1.0.0", 2570 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2571 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 2572 | }, 2573 | "function-bind": { 2574 | "version": "1.1.1", 2575 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2576 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2577 | "dev": true 2578 | }, 2579 | "function.prototype.name": { 2580 | "version": "1.1.5", 2581 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 2582 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 2583 | "dev": true, 2584 | "requires": { 2585 | "call-bind": "^1.0.2", 2586 | "define-properties": "^1.1.3", 2587 | "es-abstract": "^1.19.0", 2588 | "functions-have-names": "^1.2.2" 2589 | } 2590 | }, 2591 | "functions-have-names": { 2592 | "version": "1.2.3", 2593 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 2594 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 2595 | "dev": true 2596 | }, 2597 | "futoin-hkdf": { 2598 | "version": "1.4.3", 2599 | "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.3.tgz", 2600 | "integrity": "sha512-K4MIe2xSVRMYxsA4w0ap5fp1C2hA9StA2Ad1JZHX57VMCdHIRB5BSrd1FhuadTQG9MkjggaTCrw7v5XXFyY3/w==", 2601 | "dev": true 2602 | }, 2603 | "get-intrinsic": { 2604 | "version": "1.1.3", 2605 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 2606 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 2607 | "dev": true, 2608 | "requires": { 2609 | "function-bind": "^1.1.1", 2610 | "has": "^1.0.3", 2611 | "has-symbols": "^1.0.3" 2612 | } 2613 | }, 2614 | "get-symbol-description": { 2615 | "version": "1.0.0", 2616 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 2617 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 2618 | "dev": true, 2619 | "requires": { 2620 | "call-bind": "^1.0.2", 2621 | "get-intrinsic": "^1.1.1" 2622 | } 2623 | }, 2624 | "getpass": { 2625 | "version": "0.1.7", 2626 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 2627 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 2628 | "requires": { 2629 | "assert-plus": "^1.0.0" 2630 | } 2631 | }, 2632 | "glob": { 2633 | "version": "7.2.3", 2634 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2635 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2636 | "requires": { 2637 | "fs.realpath": "^1.0.0", 2638 | "inflight": "^1.0.4", 2639 | "inherits": "2", 2640 | "minimatch": "^3.1.1", 2641 | "once": "^1.3.0", 2642 | "path-is-absolute": "^1.0.0" 2643 | } 2644 | }, 2645 | "graceful-fs": { 2646 | "version": "4.2.10", 2647 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 2648 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 2649 | "dev": true 2650 | }, 2651 | "hap-nodejs": { 2652 | "version": "0.10.4", 2653 | "resolved": "https://registry.npmjs.org/hap-nodejs/-/hap-nodejs-0.10.4.tgz", 2654 | "integrity": "sha512-+ydtdh7Mw0Ttjv1ylWoGUMfU1Qhi0CVBAdABco+gdzOOkl9j2V1JKZKOduWvyAdhc73ZpElyREoTTVPQ7H0UoA==", 2655 | "dev": true, 2656 | "requires": { 2657 | "@homebridge/ciao": "^1.1.5", 2658 | "@homebridge/dbus-native": "^0.4.2", 2659 | "bonjour-hap": "~3.6.3", 2660 | "debug": "^4.3.4", 2661 | "fast-srp-hap": "2.0.4", 2662 | "futoin-hkdf": "~1.4.3", 2663 | "node-persist": "^0.0.11", 2664 | "source-map-support": "^0.5.21", 2665 | "tslib": "^2.4.0", 2666 | "tweetnacl": "^1.0.3" 2667 | }, 2668 | "dependencies": { 2669 | "tweetnacl": { 2670 | "version": "1.0.3", 2671 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 2672 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", 2673 | "dev": true 2674 | } 2675 | } 2676 | }, 2677 | "har-schema": { 2678 | "version": "2.0.0", 2679 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 2680 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 2681 | }, 2682 | "har-validator": { 2683 | "version": "5.1.5", 2684 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 2685 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 2686 | "requires": { 2687 | "ajv": "^6.12.3", 2688 | "har-schema": "^2.0.0" 2689 | } 2690 | }, 2691 | "has": { 2692 | "version": "1.0.3", 2693 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2694 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2695 | "dev": true, 2696 | "requires": { 2697 | "function-bind": "^1.1.1" 2698 | } 2699 | }, 2700 | "has-bigints": { 2701 | "version": "1.0.2", 2702 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 2703 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 2704 | "dev": true 2705 | }, 2706 | "has-flag": { 2707 | "version": "4.0.0", 2708 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2709 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2710 | "dev": true 2711 | }, 2712 | "has-property-descriptors": { 2713 | "version": "1.0.0", 2714 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 2715 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 2716 | "dev": true, 2717 | "requires": { 2718 | "get-intrinsic": "^1.1.1" 2719 | } 2720 | }, 2721 | "has-symbols": { 2722 | "version": "1.0.3", 2723 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2724 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 2725 | "dev": true 2726 | }, 2727 | "has-tostringtag": { 2728 | "version": "1.0.0", 2729 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 2730 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 2731 | "dev": true, 2732 | "requires": { 2733 | "has-symbols": "^1.0.2" 2734 | } 2735 | }, 2736 | "help-me": { 2737 | "version": "3.0.0", 2738 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", 2739 | "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", 2740 | "requires": { 2741 | "glob": "^7.1.6", 2742 | "readable-stream": "^3.6.0" 2743 | } 2744 | }, 2745 | "hexy": { 2746 | "version": "0.2.11", 2747 | "resolved": "https://registry.npmjs.org/hexy/-/hexy-0.2.11.tgz", 2748 | "integrity": "sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==", 2749 | "dev": true 2750 | }, 2751 | "homebridge": { 2752 | "version": "1.5.0", 2753 | "resolved": "https://registry.npmjs.org/homebridge/-/homebridge-1.5.0.tgz", 2754 | "integrity": "sha512-0t8WNBKz9NFCab5obBfJMnxFgkg4uJZqON+iM/uZpIyiMRWH9ycCHd1pYAPMk9vDdfDu8/VpxYafWsYx6luHtg==", 2755 | "dev": true, 2756 | "requires": { 2757 | "chalk": "^4.1.2", 2758 | "commander": "5.1.0", 2759 | "fs-extra": "^10.1.0", 2760 | "hap-nodejs": "^0.10.2", 2761 | "qrcode-terminal": "^0.12.0", 2762 | "semver": "^7.3.7", 2763 | "source-map-support": "^0.5.21" 2764 | } 2765 | }, 2766 | "homebridge-http-base": { 2767 | "version": "2.1.13", 2768 | "resolved": "https://registry.npmjs.org/homebridge-http-base/-/homebridge-http-base-2.1.13.tgz", 2769 | "integrity": "sha512-r3CyrhcZLwcA6plhPQswzBlyVQZZggML6f5LAo56GQt7CpHr6Zm+T27Y6I47vyZJNkLRL/FLol1cGlKuHN4fEw==", 2770 | "requires": { 2771 | "async": "^3.2.4", 2772 | "mqtt": "^4.3.7", 2773 | "request": "^2.88.2" 2774 | } 2775 | }, 2776 | "http-signature": { 2777 | "version": "1.2.0", 2778 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 2779 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 2780 | "requires": { 2781 | "assert-plus": "^1.0.0", 2782 | "jsprim": "^1.2.2", 2783 | "sshpk": "^1.7.0" 2784 | } 2785 | }, 2786 | "ieee754": { 2787 | "version": "1.2.1", 2788 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2789 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 2790 | }, 2791 | "inflight": { 2792 | "version": "1.0.6", 2793 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2794 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2795 | "requires": { 2796 | "once": "^1.3.0", 2797 | "wrappy": "1" 2798 | } 2799 | }, 2800 | "inherits": { 2801 | "version": "2.0.4", 2802 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2803 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2804 | }, 2805 | "internal-slot": { 2806 | "version": "1.0.3", 2807 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 2808 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 2809 | "dev": true, 2810 | "requires": { 2811 | "get-intrinsic": "^1.1.0", 2812 | "has": "^1.0.3", 2813 | "side-channel": "^1.0.4" 2814 | } 2815 | }, 2816 | "ip": { 2817 | "version": "1.1.8", 2818 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", 2819 | "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", 2820 | "dev": true 2821 | }, 2822 | "is-arguments": { 2823 | "version": "1.1.1", 2824 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 2825 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 2826 | "dev": true, 2827 | "requires": { 2828 | "call-bind": "^1.0.2", 2829 | "has-tostringtag": "^1.0.0" 2830 | } 2831 | }, 2832 | "is-bigint": { 2833 | "version": "1.0.4", 2834 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 2835 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 2836 | "dev": true, 2837 | "requires": { 2838 | "has-bigints": "^1.0.1" 2839 | } 2840 | }, 2841 | "is-boolean-object": { 2842 | "version": "1.1.2", 2843 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 2844 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 2845 | "dev": true, 2846 | "requires": { 2847 | "call-bind": "^1.0.2", 2848 | "has-tostringtag": "^1.0.0" 2849 | } 2850 | }, 2851 | "is-callable": { 2852 | "version": "1.2.6", 2853 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz", 2854 | "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==", 2855 | "dev": true 2856 | }, 2857 | "is-date-object": { 2858 | "version": "1.0.5", 2859 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 2860 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 2861 | "dev": true, 2862 | "requires": { 2863 | "has-tostringtag": "^1.0.0" 2864 | } 2865 | }, 2866 | "is-map": { 2867 | "version": "2.0.2", 2868 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 2869 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 2870 | "dev": true 2871 | }, 2872 | "is-negative-zero": { 2873 | "version": "2.0.2", 2874 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 2875 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 2876 | "dev": true 2877 | }, 2878 | "is-number-object": { 2879 | "version": "1.0.7", 2880 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 2881 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 2882 | "dev": true, 2883 | "requires": { 2884 | "has-tostringtag": "^1.0.0" 2885 | } 2886 | }, 2887 | "is-regex": { 2888 | "version": "1.1.4", 2889 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 2890 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 2891 | "dev": true, 2892 | "requires": { 2893 | "call-bind": "^1.0.2", 2894 | "has-tostringtag": "^1.0.0" 2895 | } 2896 | }, 2897 | "is-set": { 2898 | "version": "2.0.2", 2899 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 2900 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 2901 | "dev": true 2902 | }, 2903 | "is-shared-array-buffer": { 2904 | "version": "1.0.2", 2905 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 2906 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 2907 | "dev": true, 2908 | "requires": { 2909 | "call-bind": "^1.0.2" 2910 | } 2911 | }, 2912 | "is-string": { 2913 | "version": "1.0.7", 2914 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 2915 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 2916 | "dev": true, 2917 | "requires": { 2918 | "has-tostringtag": "^1.0.0" 2919 | } 2920 | }, 2921 | "is-symbol": { 2922 | "version": "1.0.4", 2923 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 2924 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 2925 | "dev": true, 2926 | "requires": { 2927 | "has-symbols": "^1.0.2" 2928 | } 2929 | }, 2930 | "is-typed-array": { 2931 | "version": "1.1.9", 2932 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", 2933 | "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", 2934 | "dev": true, 2935 | "requires": { 2936 | "available-typed-arrays": "^1.0.5", 2937 | "call-bind": "^1.0.2", 2938 | "es-abstract": "^1.20.0", 2939 | "for-each": "^0.3.3", 2940 | "has-tostringtag": "^1.0.0" 2941 | } 2942 | }, 2943 | "is-typedarray": { 2944 | "version": "1.0.0", 2945 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2946 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 2947 | }, 2948 | "is-weakmap": { 2949 | "version": "2.0.1", 2950 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 2951 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 2952 | "dev": true 2953 | }, 2954 | "is-weakref": { 2955 | "version": "1.0.2", 2956 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 2957 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 2958 | "dev": true, 2959 | "requires": { 2960 | "call-bind": "^1.0.2" 2961 | } 2962 | }, 2963 | "is-weakset": { 2964 | "version": "2.0.2", 2965 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 2966 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 2967 | "dev": true, 2968 | "requires": { 2969 | "call-bind": "^1.0.2", 2970 | "get-intrinsic": "^1.1.1" 2971 | } 2972 | }, 2973 | "isarray": { 2974 | "version": "2.0.5", 2975 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 2976 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 2977 | "dev": true 2978 | }, 2979 | "isstream": { 2980 | "version": "0.1.2", 2981 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2982 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 2983 | }, 2984 | "js-sdsl": { 2985 | "version": "4.1.4", 2986 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", 2987 | "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==" 2988 | }, 2989 | "jsbn": { 2990 | "version": "0.1.1", 2991 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 2992 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 2993 | }, 2994 | "json-schema": { 2995 | "version": "0.4.0", 2996 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", 2997 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" 2998 | }, 2999 | "json-schema-traverse": { 3000 | "version": "0.4.1", 3001 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3002 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 3003 | }, 3004 | "json-stringify-safe": { 3005 | "version": "5.0.1", 3006 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 3007 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 3008 | }, 3009 | "jsonfile": { 3010 | "version": "6.1.0", 3011 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 3012 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 3013 | "dev": true, 3014 | "requires": { 3015 | "graceful-fs": "^4.1.6", 3016 | "universalify": "^2.0.0" 3017 | } 3018 | }, 3019 | "jsprim": { 3020 | "version": "1.4.2", 3021 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", 3022 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", 3023 | "requires": { 3024 | "assert-plus": "1.0.0", 3025 | "extsprintf": "1.3.0", 3026 | "json-schema": "0.4.0", 3027 | "verror": "1.10.0" 3028 | } 3029 | }, 3030 | "leven": { 3031 | "version": "2.1.0", 3032 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 3033 | "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==" 3034 | }, 3035 | "lru-cache": { 3036 | "version": "6.0.0", 3037 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 3038 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 3039 | "requires": { 3040 | "yallist": "^4.0.0" 3041 | } 3042 | }, 3043 | "map-stream": { 3044 | "version": "0.0.7", 3045 | "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", 3046 | "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", 3047 | "dev": true 3048 | }, 3049 | "mime-db": { 3050 | "version": "1.44.0", 3051 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 3052 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 3053 | }, 3054 | "mime-types": { 3055 | "version": "2.1.27", 3056 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 3057 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 3058 | "requires": { 3059 | "mime-db": "1.44.0" 3060 | } 3061 | }, 3062 | "minimatch": { 3063 | "version": "3.1.2", 3064 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3065 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3066 | "requires": { 3067 | "brace-expansion": "^1.1.7" 3068 | } 3069 | }, 3070 | "minimist": { 3071 | "version": "1.2.6", 3072 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 3073 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 3074 | }, 3075 | "mkdirp": { 3076 | "version": "0.5.6", 3077 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 3078 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 3079 | "dev": true, 3080 | "requires": { 3081 | "minimist": "^1.2.6" 3082 | } 3083 | }, 3084 | "mqtt": { 3085 | "version": "4.3.7", 3086 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", 3087 | "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", 3088 | "requires": { 3089 | "commist": "^1.0.0", 3090 | "concat-stream": "^2.0.0", 3091 | "debug": "^4.1.1", 3092 | "duplexify": "^4.1.1", 3093 | "help-me": "^3.0.0", 3094 | "inherits": "^2.0.3", 3095 | "lru-cache": "^6.0.0", 3096 | "minimist": "^1.2.5", 3097 | "mqtt-packet": "^6.8.0", 3098 | "number-allocator": "^1.0.9", 3099 | "pump": "^3.0.0", 3100 | "readable-stream": "^3.6.0", 3101 | "reinterval": "^1.1.0", 3102 | "rfdc": "^1.3.0", 3103 | "split2": "^3.1.0", 3104 | "ws": "^7.5.5", 3105 | "xtend": "^4.0.2" 3106 | } 3107 | }, 3108 | "mqtt-packet": { 3109 | "version": "6.10.0", 3110 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", 3111 | "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", 3112 | "requires": { 3113 | "bl": "^4.0.2", 3114 | "debug": "^4.1.1", 3115 | "process-nextick-args": "^2.0.1" 3116 | } 3117 | }, 3118 | "ms": { 3119 | "version": "2.1.2", 3120 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3121 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 3122 | }, 3123 | "multicast-dns": { 3124 | "version": "7.2.5", 3125 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", 3126 | "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", 3127 | "dev": true, 3128 | "requires": { 3129 | "dns-packet": "^5.2.2", 3130 | "thunky": "^1.0.2" 3131 | } 3132 | }, 3133 | "multicast-dns-service-types": { 3134 | "version": "1.1.0", 3135 | "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", 3136 | "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", 3137 | "dev": true 3138 | }, 3139 | "node-persist": { 3140 | "version": "0.0.11", 3141 | "resolved": "https://registry.npmjs.org/node-persist/-/node-persist-0.0.11.tgz", 3142 | "integrity": "sha512-J3EPzQDgPxPBID7TqHSd5KkpTULFqJUvYDoISfOWg9EihpeVCH3b6YQeDeubzVuc4e6+aiVmkz2sdkWI4K+ghA==", 3143 | "dev": true, 3144 | "requires": { 3145 | "mkdirp": "~0.5.1", 3146 | "q": "~1.1.1" 3147 | } 3148 | }, 3149 | "number-allocator": { 3150 | "version": "1.0.12", 3151 | "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.12.tgz", 3152 | "integrity": "sha512-sGB0qoQGmKimery9JubBQ9pQUr1V/LixJAk3Ygp7obZf6mpSXime8d7XHEobbIimkdZpgjkNlLt6G7LPEWFYWg==", 3153 | "requires": { 3154 | "debug": "^4.3.1", 3155 | "js-sdsl": "4.1.4" 3156 | } 3157 | }, 3158 | "oauth-sign": { 3159 | "version": "0.9.0", 3160 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 3161 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 3162 | }, 3163 | "object-inspect": { 3164 | "version": "1.12.2", 3165 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 3166 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 3167 | "dev": true 3168 | }, 3169 | "object-is": { 3170 | "version": "1.1.5", 3171 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 3172 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 3173 | "dev": true, 3174 | "requires": { 3175 | "call-bind": "^1.0.2", 3176 | "define-properties": "^1.1.3" 3177 | } 3178 | }, 3179 | "object-keys": { 3180 | "version": "1.1.1", 3181 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 3182 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 3183 | "dev": true 3184 | }, 3185 | "object.assign": { 3186 | "version": "4.1.4", 3187 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 3188 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 3189 | "dev": true, 3190 | "requires": { 3191 | "call-bind": "^1.0.2", 3192 | "define-properties": "^1.1.4", 3193 | "has-symbols": "^1.0.3", 3194 | "object-keys": "^1.1.1" 3195 | } 3196 | }, 3197 | "once": { 3198 | "version": "1.4.0", 3199 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3200 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 3201 | "requires": { 3202 | "wrappy": "1" 3203 | } 3204 | }, 3205 | "path-is-absolute": { 3206 | "version": "1.0.1", 3207 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3208 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" 3209 | }, 3210 | "pause-stream": { 3211 | "version": "0.0.11", 3212 | "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 3213 | "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", 3214 | "dev": true, 3215 | "requires": { 3216 | "through": "~2.3" 3217 | } 3218 | }, 3219 | "performance-now": { 3220 | "version": "2.1.0", 3221 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 3222 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 3223 | }, 3224 | "process-nextick-args": { 3225 | "version": "2.0.1", 3226 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 3227 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 3228 | }, 3229 | "psl": { 3230 | "version": "1.8.0", 3231 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 3232 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 3233 | }, 3234 | "pump": { 3235 | "version": "3.0.0", 3236 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 3237 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 3238 | "requires": { 3239 | "end-of-stream": "^1.1.0", 3240 | "once": "^1.3.1" 3241 | } 3242 | }, 3243 | "punycode": { 3244 | "version": "2.1.1", 3245 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 3246 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 3247 | }, 3248 | "q": { 3249 | "version": "1.1.2", 3250 | "resolved": "https://registry.npmjs.org/q/-/q-1.1.2.tgz", 3251 | "integrity": "sha512-ROtylwux7Vkc4C07oKE/ReigUmb33kVoLtcR4SJ1QVqwaZkBEDL3vX4/kwFzIERQ5PfCl0XafbU8u2YUhyGgVA==", 3252 | "dev": true 3253 | }, 3254 | "qrcode-terminal": { 3255 | "version": "0.12.0", 3256 | "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", 3257 | "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", 3258 | "dev": true 3259 | }, 3260 | "qs": { 3261 | "version": "6.5.3", 3262 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", 3263 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" 3264 | }, 3265 | "readable-stream": { 3266 | "version": "3.6.0", 3267 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 3268 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 3269 | "requires": { 3270 | "inherits": "^2.0.3", 3271 | "string_decoder": "^1.1.1", 3272 | "util-deprecate": "^1.0.1" 3273 | } 3274 | }, 3275 | "regexp.prototype.flags": { 3276 | "version": "1.4.3", 3277 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 3278 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 3279 | "dev": true, 3280 | "requires": { 3281 | "call-bind": "^1.0.2", 3282 | "define-properties": "^1.1.3", 3283 | "functions-have-names": "^1.2.2" 3284 | } 3285 | }, 3286 | "reinterval": { 3287 | "version": "1.1.0", 3288 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 3289 | "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" 3290 | }, 3291 | "request": { 3292 | "version": "2.88.2", 3293 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 3294 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 3295 | "requires": { 3296 | "aws-sign2": "~0.7.0", 3297 | "aws4": "^1.8.0", 3298 | "caseless": "~0.12.0", 3299 | "combined-stream": "~1.0.6", 3300 | "extend": "~3.0.2", 3301 | "forever-agent": "~0.6.1", 3302 | "form-data": "~2.3.2", 3303 | "har-validator": "~5.1.3", 3304 | "http-signature": "~1.2.0", 3305 | "is-typedarray": "~1.0.0", 3306 | "isstream": "~0.1.2", 3307 | "json-stringify-safe": "~5.0.1", 3308 | "mime-types": "~2.1.19", 3309 | "oauth-sign": "~0.9.0", 3310 | "performance-now": "^2.1.0", 3311 | "qs": "~6.5.2", 3312 | "safe-buffer": "^5.1.2", 3313 | "tough-cookie": "~2.5.0", 3314 | "tunnel-agent": "^0.6.0", 3315 | "uuid": "^3.3.2" 3316 | } 3317 | }, 3318 | "rfdc": { 3319 | "version": "1.3.0", 3320 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", 3321 | "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" 3322 | }, 3323 | "safe-buffer": { 3324 | "version": "5.2.1", 3325 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 3326 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 3327 | }, 3328 | "safer-buffer": { 3329 | "version": "2.1.2", 3330 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3331 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 3332 | }, 3333 | "sax": { 3334 | "version": "1.2.4", 3335 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 3336 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 3337 | "dev": true 3338 | }, 3339 | "semver": { 3340 | "version": "7.3.7", 3341 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", 3342 | "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", 3343 | "dev": true, 3344 | "requires": { 3345 | "lru-cache": "^6.0.0" 3346 | } 3347 | }, 3348 | "side-channel": { 3349 | "version": "1.0.4", 3350 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 3351 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 3352 | "dev": true, 3353 | "requires": { 3354 | "call-bind": "^1.0.0", 3355 | "get-intrinsic": "^1.0.2", 3356 | "object-inspect": "^1.9.0" 3357 | } 3358 | }, 3359 | "source-map": { 3360 | "version": "0.6.1", 3361 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3362 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3363 | "dev": true 3364 | }, 3365 | "source-map-support": { 3366 | "version": "0.5.21", 3367 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 3368 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 3369 | "dev": true, 3370 | "requires": { 3371 | "buffer-from": "^1.0.0", 3372 | "source-map": "^0.6.0" 3373 | } 3374 | }, 3375 | "split": { 3376 | "version": "1.0.1", 3377 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 3378 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 3379 | "dev": true, 3380 | "requires": { 3381 | "through": "2" 3382 | } 3383 | }, 3384 | "split2": { 3385 | "version": "3.2.2", 3386 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 3387 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 3388 | "requires": { 3389 | "readable-stream": "^3.0.0" 3390 | } 3391 | }, 3392 | "sshpk": { 3393 | "version": "1.16.1", 3394 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 3395 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 3396 | "requires": { 3397 | "asn1": "~0.2.3", 3398 | "assert-plus": "^1.0.0", 3399 | "bcrypt-pbkdf": "^1.0.0", 3400 | "dashdash": "^1.12.0", 3401 | "ecc-jsbn": "~0.1.1", 3402 | "getpass": "^0.1.1", 3403 | "jsbn": "~0.1.0", 3404 | "safer-buffer": "^2.0.2", 3405 | "tweetnacl": "~0.14.0" 3406 | } 3407 | }, 3408 | "stream-combiner": { 3409 | "version": "0.2.2", 3410 | "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", 3411 | "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", 3412 | "dev": true, 3413 | "requires": { 3414 | "duplexer": "~0.1.1", 3415 | "through": "~2.3.4" 3416 | } 3417 | }, 3418 | "stream-shift": { 3419 | "version": "1.0.1", 3420 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 3421 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 3422 | }, 3423 | "string_decoder": { 3424 | "version": "1.3.0", 3425 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 3426 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 3427 | "requires": { 3428 | "safe-buffer": "~5.2.0" 3429 | } 3430 | }, 3431 | "string.prototype.trimend": { 3432 | "version": "1.0.5", 3433 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", 3434 | "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", 3435 | "dev": true, 3436 | "requires": { 3437 | "call-bind": "^1.0.2", 3438 | "define-properties": "^1.1.4", 3439 | "es-abstract": "^1.19.5" 3440 | } 3441 | }, 3442 | "string.prototype.trimstart": { 3443 | "version": "1.0.5", 3444 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", 3445 | "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", 3446 | "dev": true, 3447 | "requires": { 3448 | "call-bind": "^1.0.2", 3449 | "define-properties": "^1.1.4", 3450 | "es-abstract": "^1.19.5" 3451 | } 3452 | }, 3453 | "supports-color": { 3454 | "version": "7.2.0", 3455 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3456 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3457 | "dev": true, 3458 | "requires": { 3459 | "has-flag": "^4.0.0" 3460 | } 3461 | }, 3462 | "through": { 3463 | "version": "2.3.8", 3464 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3465 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 3466 | "dev": true 3467 | }, 3468 | "thunky": { 3469 | "version": "1.1.0", 3470 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", 3471 | "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", 3472 | "dev": true 3473 | }, 3474 | "tough-cookie": { 3475 | "version": "2.5.0", 3476 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 3477 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 3478 | "requires": { 3479 | "psl": "^1.1.28", 3480 | "punycode": "^2.1.1" 3481 | } 3482 | }, 3483 | "tslib": { 3484 | "version": "2.4.0", 3485 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 3486 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", 3487 | "dev": true 3488 | }, 3489 | "tunnel-agent": { 3490 | "version": "0.6.0", 3491 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3492 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3493 | "requires": { 3494 | "safe-buffer": "^5.0.1" 3495 | } 3496 | }, 3497 | "tweetnacl": { 3498 | "version": "0.14.5", 3499 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3500 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 3501 | }, 3502 | "typedarray": { 3503 | "version": "0.0.6", 3504 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3505 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" 3506 | }, 3507 | "unbox-primitive": { 3508 | "version": "1.0.2", 3509 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 3510 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 3511 | "dev": true, 3512 | "requires": { 3513 | "call-bind": "^1.0.2", 3514 | "has-bigints": "^1.0.2", 3515 | "has-symbols": "^1.0.3", 3516 | "which-boxed-primitive": "^1.0.2" 3517 | } 3518 | }, 3519 | "universalify": { 3520 | "version": "2.0.0", 3521 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 3522 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 3523 | "dev": true 3524 | }, 3525 | "uri-js": { 3526 | "version": "4.4.0", 3527 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 3528 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 3529 | "requires": { 3530 | "punycode": "^2.1.0" 3531 | } 3532 | }, 3533 | "util-deprecate": { 3534 | "version": "1.0.2", 3535 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3536 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 3537 | }, 3538 | "uuid": { 3539 | "version": "3.4.0", 3540 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 3541 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 3542 | }, 3543 | "verror": { 3544 | "version": "1.10.0", 3545 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3546 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3547 | "requires": { 3548 | "assert-plus": "^1.0.0", 3549 | "core-util-is": "1.0.2", 3550 | "extsprintf": "^1.2.0" 3551 | } 3552 | }, 3553 | "which-boxed-primitive": { 3554 | "version": "1.0.2", 3555 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 3556 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 3557 | "dev": true, 3558 | "requires": { 3559 | "is-bigint": "^1.0.1", 3560 | "is-boolean-object": "^1.1.0", 3561 | "is-number-object": "^1.0.4", 3562 | "is-string": "^1.0.5", 3563 | "is-symbol": "^1.0.3" 3564 | } 3565 | }, 3566 | "which-collection": { 3567 | "version": "1.0.1", 3568 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 3569 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 3570 | "dev": true, 3571 | "requires": { 3572 | "is-map": "^2.0.1", 3573 | "is-set": "^2.0.1", 3574 | "is-weakmap": "^2.0.1", 3575 | "is-weakset": "^2.0.1" 3576 | } 3577 | }, 3578 | "which-typed-array": { 3579 | "version": "1.1.8", 3580 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", 3581 | "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", 3582 | "dev": true, 3583 | "requires": { 3584 | "available-typed-arrays": "^1.0.5", 3585 | "call-bind": "^1.0.2", 3586 | "es-abstract": "^1.20.0", 3587 | "for-each": "^0.3.3", 3588 | "has-tostringtag": "^1.0.0", 3589 | "is-typed-array": "^1.1.9" 3590 | } 3591 | }, 3592 | "wrappy": { 3593 | "version": "1.0.2", 3594 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3595 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 3596 | }, 3597 | "ws": { 3598 | "version": "7.5.9", 3599 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 3600 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 3601 | "requires": {} 3602 | }, 3603 | "xml2js": { 3604 | "version": "0.4.23", 3605 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 3606 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 3607 | "dev": true, 3608 | "requires": { 3609 | "sax": ">=0.6.0", 3610 | "xmlbuilder": "~11.0.0" 3611 | } 3612 | }, 3613 | "xmlbuilder": { 3614 | "version": "11.0.1", 3615 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 3616 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 3617 | "dev": true 3618 | }, 3619 | "xtend": { 3620 | "version": "4.0.2", 3621 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3622 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 3623 | }, 3624 | "yallist": { 3625 | "version": "4.0.0", 3626 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3627 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3628 | } 3629 | } 3630 | } 3631 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "homebridge-http-switch", 3 | "version": "0.5.36", 4 | "description": "Powerful http switch for Homebridge", 5 | "license": "ISC", 6 | "keywords": [ 7 | "homebridge-plugin" 8 | ], 9 | "scripts": { 10 | "test": "echo no test defined" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/Supereg/homebridge-http-switch" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/Supereg/homebridge-http-switch/issues" 18 | }, 19 | "engines": { 20 | "node": ">=10.17.0", 21 | "homebridge": ">=0.4.8" 22 | }, 23 | "dependencies": { 24 | "homebridge-http-base": "~2.1.13" 25 | }, 26 | "devDependencies": { 27 | "homebridge": "^1.5.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test/homebridge/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "bridge": { 3 | "name": "Homebridge", 4 | "username": "AE:72:E6:5D:1D:83", 5 | "port": 51826, 6 | "pin": "897-23-872" 7 | }, 8 | 9 | "accessories": [ 10 | { 11 | "accessory": "HTTP-SWITCH", 12 | "name": "Test Switch", 13 | 14 | "onUrl": { 15 | "url": "http://localhost:8085/on" 16 | }, 17 | "offUrl": "http://localhost:8085/off", 18 | 19 | "statusUrl": { 20 | "url": "http://localhost:8085/get", 21 | "method": "GET" 22 | }, 23 | 24 | "pullInterval": 5000, 25 | 26 | "debug": true 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /test/init.js: -------------------------------------------------------------------------------- 1 | const spawn = require('child_process').spawn; 2 | const path = require('path'); 3 | const fs = require("fs"); 4 | const TestServer = require('./testserver'); 5 | 6 | 7 | 8 | const server = new TestServer(); 9 | server.start(); 10 | 11 | const pluginPath = path.join(__dirname, "../"); 12 | const storagePath = path.join(__dirname, 'homebridge'); 13 | 14 | const args = `--plugin-path ${pluginPath} --user-storage-path ${storagePath} --debug`; // TODO debug option?; --no-qrcode 15 | 16 | const homebridge = spawn('homebridge', args.split(' '), {env: process.env}); // TODO maybe test with hap-nodejs, this method needs homebridge installed globally 17 | homebridge.stderr.on('data', data => { 18 | console.log(String(data)); 19 | }); 20 | homebridge.stdout.on('data', data => { 21 | console.log(String(data)); 22 | }); 23 | 24 | const signals = { 'SIGINT': 2, 'SIGTERM': 15 }; 25 | Object.keys(signals).forEach(signal => { 26 | process.on(signal, () => { 27 | console.log("Got %s, shutting down tests...", signal); 28 | 29 | console.log("Cleaning up files..."); 30 | 31 | deleteDirectorySync(path.join(storagePath, "accessories")); 32 | deleteDirectorySync(path.join(storagePath, "persist")); 33 | 34 | homebridge.kill("SIGKILL"); 35 | 36 | setTimeout(() => { 37 | process.exit(0); 38 | }); 39 | }); 40 | }); 41 | 42 | function deleteDirectorySync(pathname) { 43 | 44 | if (fs.existsSync(pathname)) { 45 | let files = fs.readdirSync(pathname); 46 | 47 | files.forEach(file => { 48 | const nextPath = path.join(pathname, file); 49 | 50 | if (fs.lstatSync(nextPath).isDirectory()) 51 | deleteDirectorySync(pathname); 52 | else 53 | fs.unlinkSync(nextPath); 54 | }); 55 | 56 | fs.rmdirSync(pathname); 57 | } 58 | } -------------------------------------------------------------------------------- /test/testserver.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const url = require('url'); 3 | 4 | let value = false; 5 | 6 | module.exports = TestServer; 7 | 8 | function TestServer() { 9 | // TODO maybe make this configurable. However ist currently hardcoded in config.json 10 | this.port = 8085; 11 | } 12 | 13 | TestServer.prototype.start = function () { 14 | http.createServer(this.handleHTTPCall.bind(this)).listen(this.port); 15 | console.log("Listening on 8085..."); 16 | }; 17 | 18 | TestServer.prototype.handleHTTPCall = function (request, response) { 19 | if (request.method !== "GET") { 20 | response.writeHead(405, {'Content-Type': "text/html"}); 21 | response.write("Method Not Allowed"); 22 | response.end(); 23 | 24 | console.log("Someone tried to access the server without an GET request"); 25 | return; 26 | } 27 | 28 | const parts = url.parse(request.url, true); 29 | 30 | const pathname = parts.pathname.charAt(0) === "/" 31 | ? parts.pathname.substring(1) 32 | : parts.pathname; 33 | const path = pathname.split("/"); 34 | 35 | if (path.length === 0) { 36 | response.writeHead(400, {'Content-Type': "text/html"}); 37 | response.write("Bad Request"); 38 | response.end(); 39 | 40 | console.log("Bad Request: " + parts.pathname); 41 | return; 42 | } 43 | 44 | switch (path[0]) { 45 | case "get": 46 | response.writeHead(200, {'Content-Type': "text/html"}); 47 | response.write(value? "1": "0"); 48 | response.end(); 49 | 50 | value = !value; 51 | break; 52 | case "on": 53 | value = true; 54 | response.writeHead(200, {'Content-Type': "text/html"}); 55 | response.end(); 56 | break; 57 | case "off": 58 | value = false; 59 | response.writeHead(200, {'Content-Type': "text/html"}); 60 | response.end(); 61 | break; 62 | default: 63 | response.writeHead(404, {'Content-Type': "text/html"}); 64 | response.write("Not Found"); 65 | response.end(); 66 | 67 | console.log("Route not found: " + path[0]); 68 | } 69 | }; 70 | --------------------------------------------------------------------------------