├── .gitignore ├── README.md ├── examples ├── example.html ├── example1.js └── example2.js ├── index.js ├── math.js ├── package-lock.json ├── package.json └── test ├── __snapshots__ └── test.js.snap └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | node_modules 3 | .DS_Store 4 | dist 5 | testc 6 | test_*.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mindwave 2 | 3 | A cross-platform driver for bluetooth Neurosky Mindwave headsets. 4 | 5 | ![screenshot of example](https://user-images.githubusercontent.com/83857/127944145-e530f147-7d35-4199-a1d8-049e6daf6b84.png) 6 | 7 | There are 2 examples included, and if you'd like to see an example GUI project, check out [mindgraph](https://github.com/brainbang/mindgraph). 8 | 9 | 10 | # WARNING 11 | 12 | I created a C version (based on [docs](http://developer.neurosky.com/docs/doku.php?id=thinkgear_communications_protocol), compiled it to wasm & native, and compared the results between wasm & native, and js. Currently C implementation does not match my javascript: 13 | 14 | ``` 15 | Wasmer 16 | real 0m0.352s 17 | user 0m0.234s 18 | sys 0m0.158s 19 | 136777 test_wasmer.txt 20 | 21 | WASI (node) 22 | real 0m0.131s 23 | user 0m0.141s 24 | sys 0m0.010s 25 | 136777 test_wasijs.txt 26 | 27 | Native (C) 28 | real 0m0.039s 29 | user 0m0.039s 30 | sys 0m0.004s 31 | 136777 test_c.txt 32 | 33 | Plain JS 34 | real 0m0.992s 35 | user 0m0.843s 36 | sys 0m0.221s 37 | 139937 test_js.txt 38 | 39 | Files test_c.txt and test_js.txt differ 40 | ``` 41 | 42 | But I'll be working on fixing it, and update this once I get it squared away. If I can't figure it out, I may just need to parse in C (and use wasm.) 43 | 44 | 45 | ## usage 46 | 47 | ### hardware 48 | 49 | This library uses lower-level serial-over-bluetooth to communicate. For it to work, you will need to pair with it. It should be noted, you can put the headset in pairing-mode by holding up the power until it double-blinks blue (before it turns red.) Solid-blue means you have a working bluetooth/serial connection. 50 | 51 | #### linux 52 | 53 | Here is what I did: 54 | 55 | - Install [gort](https://gort.io/documentation/getting_started/downloads/) 56 | - Put headset in "pairing mode" (hold power up until it double-flashes, but before it turns red) 57 | - Run `sudo gort scan bluetooth` to get mac-address of "MindWave Mobile". Mine was `20:68:9D:4C:0E:93`, but yours might be different 58 | - Run `sudo gort bluetooth serial 20:68:9D:4C:0E:93` (with your address) to connect headset to a virtual serial port. In my case, it connected to `/dev/rfcomm0` 59 | - make sure your user is in `dialout` or whatever group owns that device. `sudo adduser konsumer dialout` did that for me (requires re-login.) 60 | - verify your connection with `node example1.js` (or `example2.js` for a nice graph.) 61 | 62 | **automation** 63 | 64 | I recommend you setup your system to automate the connection, which will alleviate connection headaches, and make it mostly just work whenever it's turned on. You can automate the connection on a systemd-based OS (debian, ubuntu, raspbian, etc) by editing `/etc/systemd/system/mindwave.service`: 65 | 66 | ``` 67 | [Unit] 68 | Description=Mindwave service 69 | After=bluetooth.service 70 | Requires=bluetooth.service 71 | 72 | [Service] 73 | ExecStart=/usr/bin/gort bluetooth serial 20:68:9D:4C:0E:93 74 | Restart=always 75 | RestartSec=5s 76 | 77 | [Install] 78 | WantedBy=multi-user.target 79 | ``` 80 | 81 | Now run this: 82 | 83 | ``` 84 | sudo systemctl daemon-reload 85 | sudo systemctl enable mindwave 86 | sudo systemctl start mindwave 87 | ``` 88 | 89 | Make sure to change `20:68:9D:4C:0E:93` to whatever you discovered in `gort scan bluetooth`. After all this, it should work anytime the mindwave is turned on (even outside of pairing-mode.) It is contantly restarting gort (every 5s) if it doesn't find the headset, but it has pretty low overhead. 90 | 91 | At any time you can get the status: 92 | 93 | ``` 94 | service mindwave status 95 | ``` 96 | 97 | 98 | #### windows 99 | 100 | I haven't tested as much here, but it should work with built-in windows stuff, setting up SPP (serial over bluetooth) and pairing. You can read more about the process [here](http://support.neurosky.com/kb/mindwave-mobile-2/cant-pair-mindwave-mobile-2-with-computer-or-mobile-device). In your device manager, under "Advanced" look for the COM port it sets up, and use that in your code. On mine, it was `COM4`. 101 | 102 | #### mac 103 | 104 | Install the [official mac driver](http://download.neurosky.com/public/Products/MindWave%20headset/RF%20driver%20for%20Mac/MindWaveDriver5.1.pkg). You can read more about it [here](http://support.neurosky.com/kb/mindwave/mindwave-cant-work-on-mac-osx-1011-or-higher). Your serial-device will be something like `/dev/tty.MindWaveMobile-DevA` or sometimes `/dev/cu.MindWaveMobile-DevA` works better (it seemed to have issues rapidly disconnecting and connecting, but changing devices would sometimes fix that.) Make sure to set this at the bottom of the examples, instead of `/dev/rfcomm0`. Put it in pairing-mode and pair with it, then start your program, and it should go solid-blue and start outputting data. 105 | 106 | 107 | ### code 108 | 109 | 110 | ```js 111 | var Mindwave = require('mindwave') 112 | var mw = new Mindwave() 113 | 114 | mw.on('eeg', (eeg) => { 115 | console.log('eeg', eeg) 116 | }); 117 | 118 | mw.on('signal', (signal) => { 119 | console.log('signal', signal) 120 | }) 121 | 122 | mw.on('attention', (attention) => { 123 | console.log('attention', attention) 124 | }) 125 | 126 | mw.on('meditation', (meditation) => { 127 | console.log('meditation', meditation) 128 | }) 129 | 130 | mw.on('blink', (blink) => { 131 | console.log('blink', blink) 132 | }) 133 | 134 | // These are the raw EEG data 135 | // They come in at about 512Hz 136 | // mw.on('wave', (wave) => { 137 | // console.log('wave', wave) 138 | // }) 139 | 140 | // common device for mac 141 | // mw.connect('/dev/cu.MindWaveMobile-DevA') 142 | 143 | // untested, but I think it's like this on windows: 144 | // mw.connect('COM4') 145 | 146 | // linux 147 | mw.connect('/dev/rfcomm0') 148 | ``` 149 | 150 | ## TODO 151 | 152 | - Currently, only 9600 baud is supported, but eventually I will add support for high-resolution data (57600.) 153 | - More cross-platform testing, try to get around having to setup mac driver/rfcomm (maybe with node bluetooth serial lib & web bluetooth API) 154 | - write comparison C function for parsing buffers, and compile for wasm. Do comparioson-tests on real traffic from device. I can verify my js code this way (using reference C implementation in docs) and it might improve performance for js (basically just hook native or web bluetooth API to parsing wasm.) Once I can verify they match, I could try another language I like more, like assmeblyscript or rust (and test them against the js.) 155 | -------------------------------------------------------------------------------- /examples/example.html: -------------------------------------------------------------------------------- 1 |

This not done, just testing out ideas with Bluetooth Web API

2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /examples/example1.js: -------------------------------------------------------------------------------- 1 | // this is a very simple example 2 | 3 | import { Mindwave } from '../index.js' 4 | const mw = new Mindwave() 5 | 6 | // normally I would do this in a loop, but explicit is good for demo-code 7 | 8 | // mw.on('battery', (data) => { 9 | // console.log('battery', data) 10 | // }) 11 | // 12 | // mw.on('signal', (data) => { 13 | // console.log('signal', data) 14 | // }) 15 | // 16 | // mw.on('heartRate', (data) => { 17 | // console.log('heartRate', data) 18 | // }) 19 | // 20 | // mw.on('attention', (data) => { 21 | // console.log('attention', data) 22 | // }) 23 | // 24 | // mw.on('meditation', (data) => { 25 | // console.log('meditation', data) 26 | // }) 27 | // 28 | // mw.on('raw8 ', (data) => { 29 | // console.log('raw8 ', data) 30 | // }) 31 | // 32 | // mw.on('marker', (data) => { 33 | // console.log('marker', data) 34 | // }) 35 | // 36 | // mw.on('raw16', (data) => { 37 | // console.log('raw16', data) 38 | // }) 39 | // 40 | // mw.on('eeg ', (data) => { 41 | // console.log('eeg ', data) 42 | // }) 43 | // 44 | // mw.on('eegAsic ', (data) => { 45 | // console.log('eegAsic ', data) 46 | // }) 47 | // 48 | // mw.on('rInterval', (data) => { 49 | // console.log('rInterval', data) 50 | // }) 51 | 52 | // all messages 53 | // mw.on('data', console.log) 54 | 55 | mw.on('attention', val => console.log('attention', val)) 56 | 57 | process.on('exit', () => { 58 | mw.disconnect() 59 | }) 60 | 61 | // I am leaving off path, will try to let it guess, based on OS 62 | mw.connect() 63 | -------------------------------------------------------------------------------- /examples/example2.js: -------------------------------------------------------------------------------- 1 | // this is a fancier example that uses blessed to make a graph in the terminal 2 | 3 | import { Mindwave } from '../index.js' 4 | import blessed from 'blessed' 5 | import contrib from 'blessed-contrib' 6 | 7 | const screen = blessed.screen() 8 | 9 | const line = contrib.line({ 10 | label: 'Mindwave', 11 | showLegend: true 12 | }) 13 | 14 | // should basically match the GUI 15 | const bands = { 16 | signal: [100, 100, 100], 17 | blink: [130, 130, 130], 18 | heartRate: [160, 130, 130], 19 | 20 | attention: [0, 255, 0], 21 | meditation: [255, 0, 0], 22 | delta: [127, 127, 0], 23 | theta: [127, 0, 0], 24 | loAlpha: [0, 127, 0], 25 | hiAlpha: [255, 255, 0], 26 | loBeta: [255, 127, 0], 27 | hiBeta: [127, 255, 0], 28 | loGamma: [0, 0, 127], 29 | midGamma: [255, 0, 127] 30 | } 31 | 32 | const size = 8 33 | const fields = ['signal', 'blink', 'heartRate', 'attention', 'meditation', 'delta', 'theta', 'lowAlpha', 'highAlpha', 'lowBeta', 'highBeta', 'lowGamma', 'midGamma'] 34 | const data = fields.map(title => ({ 35 | title, 36 | x: [...new Array(size)].map(() => '|'), 37 | y: [...new Array(size)].fill(0), 38 | style: { line: bands[title] } 39 | })) 40 | 41 | // set data from keyed-object 42 | function setData (newData) { 43 | Object.keys(newData).forEach(field => { 44 | const i = fields.indexOf(field) 45 | if (i !== -1) { 46 | data[i].y = [...data[i].y.slice(1), newData[field]] 47 | } 48 | }) 49 | line.setData(data) 50 | screen.render() 51 | } 52 | 53 | screen.append(line) 54 | line.setData(data) 55 | 56 | const mw = new Mindwave(undefined, true) // true starts it quietly 57 | 58 | screen.key(['escape', 'q', 'C-c'], (ch, key) => { 59 | mw.disconnect() 60 | process.exit(0) 61 | }) 62 | 63 | screen.render() 64 | 65 | // seperate eeg and all others, and send the data to their graphs 66 | mw.on('data', msg => { 67 | const { eeg, ...data } = msg 68 | setData(msg) 69 | }) 70 | 71 | mw.on('eeg', data => setData(data)) 72 | 73 | // I am leaving off path, will try to let it guess, based on OS 74 | mw.connect() 75 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // This is a class that represents several ways to connect to a Mindwave bluetooth headset 2 | 3 | import emitonoff from 'emitonoff' 4 | import { getScaledValue, toUInt24, toUInt16, toInt16, toFloat32 } from './math.js' 5 | 6 | const BATTERY_LEVEL = 0x01 // battery-level 0-127 7 | const SIGNAL_LEVEL = 0x02 // 1: Quality (0-255) 8 | const HEART_RATE = 0x03 // 1: Once/s on EGO. (0-255) 9 | const ATTENTION = 0x04 // 1: eSense (0-100) 10 | const MEDITATION = 0x05 // 1: eSense (0 to 100) 11 | const RAW_8BIT = 0x06 // 1: Wave Value (0-255) 12 | const RAW_MARKER = 0x07 // 1: Section Start (0) 13 | 14 | const RAW_16BIT = 0x80 // 2: a single big-endian 16-bit two's-compliment signed value (high-order byte followed by low-order byte) (-32768 to 32767) 15 | const EEG_POWER = 0x81 // 32: 8 big-endian 4-byte IEEE 754 floating point values representing delta, theta, low-alpha, high-alpha, low-beta, high-beta, low-gamma, and mid-gamma EEG band power values 16 | const ASIC_EEG_POWER = 0x83 // 24: 8 big-endian 3-byte unsigned integer values representing delta, theta, low-alpha, high-alpha, low-beta, high-beta, low-gamma, and mid-gamma EEG band power values 17 | const RRINTERVAL = 0x86 // 2: big-endian unsigned integer representing the milliseconds between two R-peaks 18 | 19 | const SYNC = 0xAA 20 | 21 | const names = { 22 | [BATTERY_LEVEL]: 'battery', 23 | [SIGNAL_LEVEL]: 'signal', 24 | [HEART_RATE]: 'heartRate', 25 | [ATTENTION]: 'attention', 26 | [MEDITATION]: 'meditation', 27 | [RAW_8BIT]: 'raw8', 28 | [RAW_MARKER]: 'marker', 29 | [RAW_16BIT]: 'raw16', 30 | [EEG_POWER]: 'eeg', 31 | [ASIC_EEG_POWER]: 'eegAsic', 32 | [RRINTERVAL]: 'interval' 33 | } 34 | 35 | export class Mindwave { 36 | constructor (path, quiet = false) { 37 | emitonoff(this) 38 | 39 | this.on('error', msg => { 40 | if (!quiet) { 41 | console.error('Error', msg) 42 | } 43 | }) 44 | 45 | this.on('warning', msg => { 46 | if (!quiet) { 47 | console.warn('Warning', msg) 48 | } 49 | }) 50 | 51 | if (path) { 52 | this.connect(path) 53 | } 54 | } 55 | 56 | // perform 1's comp inverse of 8-bit Payload sum 57 | static checksum (payload) { 58 | let checksum = 0 59 | for (let i = 0; i < payload.length; i++) { 60 | checksum += payload[i] 61 | } 62 | checksum &= 0xFF 63 | checksum = ~checksum & 0xFF 64 | return checksum 65 | } 66 | 67 | // try to guess the correct serial-port, based on platform 68 | static async getSerialPath (platform) { 69 | let path 70 | 71 | if (platform === 'darwin') { 72 | path = '/dev/tty.MindWaveMobile-DevA' 73 | } else if (platform === 'win32') { 74 | // TODO: really need a better guess for windows port 75 | path = 'COM4' 76 | } else { 77 | path = '/dev/rfcomm0' 78 | } 79 | 80 | return path 81 | } 82 | 83 | // turn a valid buffer of commands into an object 84 | // this discards everything outside of the packet 85 | static parse (payload, normalize = true) { 86 | const out = {} 87 | while (payload.length > 0) { 88 | const cmd = payload[0] 89 | if ( 90 | cmd === BATTERY_LEVEL || 91 | cmd === SIGNAL_LEVEL || 92 | cmd === HEART_RATE || 93 | cmd === ATTENTION || 94 | cmd === MEDITATION || 95 | cmd === RAW_8BIT || 96 | cmd === RAW_MARKER 97 | ) { 98 | out[names[cmd]] = payload[1] 99 | payload = payload.slice(2) 100 | } else if (cmd === RAW_16BIT) { 101 | out[names[cmd]] = toInt16(payload.slice(1, 3)) 102 | payload = payload.slice(3) 103 | } else if (cmd === EEG_POWER) { 104 | const data = toFloat32(payload.slice(1, 33)) 105 | out[names[cmd]] = { 106 | delta: data[0], 107 | theta: data[1], 108 | lowAlpha: data[2], 109 | highAlpha: data[3], 110 | lowBeta: data[4], 111 | highBeta: data[5], 112 | lowGamma: data[6], 113 | midGamma: data[7] 114 | } 115 | payload = payload.slice(33) 116 | } else if (cmd === ASIC_EEG_POWER) { 117 | const data = toUInt24(payload.slice(1, 25)) 118 | out[names[cmd]] = { 119 | delta: data[0], 120 | theta: data[1], 121 | lowAlpha: data[2], 122 | highAlpha: data[3], 123 | lowBeta: data[4], 124 | highBeta: data[5], 125 | lowGamma: data[6], 126 | midGamma: data[7] 127 | } 128 | payload = payload.slice(25) 129 | } else if (cmd === RRINTERVAL) { 130 | out[names[cmd]] = toUInt16(payload.slice(1, 3)) 131 | payload = payload.slice(3) 132 | } else { 133 | // something went wrong, zero payload 134 | payload = [] 135 | } 136 | } 137 | if (normalize) { 138 | Object.keys(out).forEach(k => { 139 | if (k === names[BATTERY_LEVEL]) { 140 | out[k] = getScaledValue(out[k], 0, 127) 141 | } else if (k === names[SIGNAL_LEVEL]) { 142 | out[k] = getScaledValue(out[k], 0, 255) 143 | } else if (k === names[HEART_RATE]) { 144 | out[k] = getScaledValue(out[k], 0, 255) 145 | } else if (k === names[RAW_8BIT]) { 146 | out[k] = getScaledValue(out[k], 0, 255) 147 | } else if (k === names[RAW_16BIT]) { 148 | out[k] = getScaledValue(out[k], -32768, 32767) 149 | } 150 | // TODO: range for eeg values? 151 | }) 152 | } 153 | return out 154 | } 155 | 156 | // use web Bluetooth API, pops up dialog, user chooses, connect stream of serial bytes to parser 157 | async connectBtWeb () { 158 | if (typeof navigator === 'undefined' || typeof navigator.bluetooth === 'undefined') { 159 | return this.emit('error', 'Your browser does not support bluetooth.') 160 | } 161 | // TODO 162 | } 163 | 164 | // use native bluetooth, connect stream of serial bytes to parser, mac is optional (otherwise, guess from list) 165 | async connectBt (mac) { 166 | // TODO 167 | } 168 | 169 | // use serialport API, connect stream of serial bytes to parser, path is optional and guessed based on OS if not provided 170 | async connectSerial (port, baudRate = 57600) { 171 | this.baudRate = baudRate 172 | 173 | if (baudRate !== 9600 && baudRate !== 57600) { 174 | return this.emit('error', 'Invalid baud. Set to 9600 or 57600') 175 | } 176 | 177 | if (!port) { 178 | port = await Mindwave.getSerialPath(process.platform) 179 | this.emit('warning', `Path not set, guessing ${port} based on OS.`) 180 | } 181 | 182 | this.port = port 183 | 184 | const SerialPort = (await import('@serialport/stream')).default 185 | SerialPort.Binding = (await import('@serialport/bindings')).default 186 | 187 | const Delimiter = (await import('@serialport/parser-delimiter')).default 188 | this.serialPort = new SerialPort(port, { baudRate }) 189 | // Delimite packets on SYNC+SYNC and feed to parser 190 | // then trigger data message (for packet object) and individual messages 191 | this.serialPort 192 | .pipe(new Delimiter({ delimiter: Buffer.from([SYNC, SYNC]) })) 193 | .on('data', data => { 194 | const len = data[0] 195 | const payload = data.slice(1, len + 1) 196 | const chk = data[len + 1] 197 | if (chk === Mindwave.checksum(payload)) { 198 | try { 199 | const data = Mindwave.parse(payload) 200 | this.emit('data', data) 201 | Object.keys(data).forEach(k => { 202 | this.emit(k, data[k]) 203 | }) 204 | } catch (e) { 205 | this.emit('error', e.messsage) 206 | } 207 | } 208 | }) 209 | } 210 | 211 | // guess connection-type based on path, connect stream of serial bytes to parser 212 | connect (path = '') { 213 | // MAC address = native bluetooth 214 | if (path.includes(':')) { 215 | return this.connectBt(path) 216 | } 217 | 218 | // COM or /dev/X is native serial path 219 | if (path.startsWith('/dev') || path.startsWith('COM')) { 220 | return this.connectSerial(path) 221 | } 222 | 223 | // no path triggers browser or serial (guessed based on OS) 224 | if (!path || path === '') { 225 | if (typeof process === 'undefined' || typeof process?.versions?.electron !== 'undefined') { 226 | return this.connectBtWeb() 227 | } else { 228 | return this.connectSerial() 229 | } 230 | } 231 | 232 | return this.emit('error', 'Unknown path-type.') 233 | } 234 | 235 | disconnect () { 236 | if (this.serialPort) { 237 | return new Promise((resolve, reject) => { 238 | this.serialPort.pause() 239 | this.serialPort.flush(() => { 240 | this.serialPort.close(() => { 241 | this.emit('disconnect') 242 | this.resolve(true) 243 | }) 244 | }) 245 | }) 246 | } 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /math.js: -------------------------------------------------------------------------------- 1 | import ieee754 from 'ieee754' 2 | 3 | // simple utility to scale a value to a range 4 | export function getScaledValue (value, sourceRangeMin, sourceRangeMax, targetRangeMin = 0, targetRangeMax = 100) { 5 | const targetRange = targetRangeMax - targetRangeMin 6 | const sourceRange = sourceRangeMax - sourceRangeMin 7 | return (value - sourceRangeMin) * targetRange / sourceRange + targetRangeMin 8 | } 9 | 10 | // These do byte-operations without Buffer (for browser) 11 | // lots of ideas from https://github.com/feross/buffer 12 | export function toInt16 (buffer) { 13 | if ((buffer.length % 2) !== 0) { 14 | throw new Error('Byte-length not divisible by 2.') 15 | } 16 | const out = (new Int16Array(buffer.length / 2)).map((v, i) => { 17 | const n = i * 2 18 | const val = buffer[n + 1] | (buffer[n] << 8) 19 | return (val & 0x8000) ? val | 0xFFFF0000 : val 20 | }) 21 | return out.length === 1 ? out[0] : out 22 | } 23 | 24 | export function toUInt16 (buffer) { 25 | if ((buffer.length % 2) !== 0) { 26 | throw new Error('Byte-length not divisible by 2.') 27 | } 28 | const out = (new Uint16Array(buffer.length / 2)).map((v, i) => { 29 | const n = i * 2 30 | return (buffer[n] << 8) | buffer[n + 1] 31 | }) 32 | return out.length === 1 ? out[0] : out 33 | } 34 | 35 | export function toUInt24 (buffer) { 36 | if ((buffer.length % 3) !== 0) { 37 | throw new Error('Byte-length not divisible by 3.') 38 | } 39 | const out = (new Uint32Array(buffer.length / 3)).map((v, i) => { 40 | const n = i * 3 41 | let byteLength = 3 42 | let val = buffer[n + --byteLength] 43 | let mul = 1 44 | while (byteLength > 0 && (mul *= 0x100)) { 45 | val += buffer[n + --byteLength] * mul 46 | } 47 | return val 48 | }) 49 | return out.length === 1 ? out[0] : out 50 | } 51 | 52 | export function toFloat32 (buffer) { 53 | if ((buffer.length % 4) !== 0) { 54 | throw new Error('Byte-length not divisible by 4.') 55 | } 56 | const out = (new Float32Array(buffer.length / 4)).map((v, i) => { 57 | const n = i * 4 58 | return ieee754.read(buffer, n, false, 23, 4) 59 | }) 60 | return out.length === 1 ? out[0] : out 61 | } 62 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mindwave", 3 | "version": "0.3.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "0.3.0", 9 | "license": "MIT", 10 | "dependencies": { 11 | "@serialport/bindings": "^9.2.0", 12 | "@serialport/parser-delimiter": "^9.0.7", 13 | "@serialport/stream": "^9.0.7" 14 | }, 15 | "devDependencies": { 16 | "blessed": "^0.1.81", 17 | "blessed-contrib": "^4.10.1", 18 | "emitonoff": "^0.1.0", 19 | "ieee754": "^1.2.1" 20 | } 21 | }, 22 | "node_modules/@serialport/binding-abstract": { 23 | "version": "9.0.7", 24 | "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-9.0.7.tgz", 25 | "integrity": "sha512-g1ncCMIG9rMsxo/28ObYmXZcHThlvtZygsCANmyMUuFS7SwXY4+PhcEnt2+ZcMkEDNRiOklT+ngtIVx5GGpt/A==", 26 | "dependencies": { 27 | "debug": "^4.3.1" 28 | }, 29 | "engines": { 30 | "node": ">=10.0.0" 31 | }, 32 | "funding": { 33 | "url": "https://opencollective.com/serialport/donate" 34 | } 35 | }, 36 | "node_modules/@serialport/bindings": { 37 | "version": "9.2.0", 38 | "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-9.2.0.tgz", 39 | "integrity": "sha512-s9EKHDZjLHipHhypxy6pz2XsoI1fPiOGU+X13AIGdQfoe7I6piEyhJ2znNgXMugMe43OxNk0/CmuVMzzcw1lmQ==", 40 | "hasInstallScript": true, 41 | "dependencies": { 42 | "@serialport/binding-abstract": "^9.0.7", 43 | "@serialport/parser-readline": "^9.0.7", 44 | "bindings": "^1.5.0", 45 | "debug": "^4.3.1", 46 | "nan": "^2.14.2", 47 | "prebuild-install": "^6.0.1" 48 | }, 49 | "engines": { 50 | "node": ">=10.0.0" 51 | }, 52 | "funding": { 53 | "url": "https://opencollective.com/serialport/donate" 54 | } 55 | }, 56 | "node_modules/@serialport/parser-delimiter": { 57 | "version": "9.0.7", 58 | "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-9.0.7.tgz", 59 | "integrity": "sha512-Vb2NPeXPZ/28M4m5x4OAHFd8jRAeddNCgvL+Q+H/hqFPY1w47JcMLchC7pigRW8Cnt1fklmzfwdNQ8Fb+kMkxQ==", 60 | "engines": { 61 | "node": ">=10.0.0" 62 | }, 63 | "funding": { 64 | "url": "https://opencollective.com/serialport/donate" 65 | } 66 | }, 67 | "node_modules/@serialport/parser-readline": { 68 | "version": "9.0.7", 69 | "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-9.0.7.tgz", 70 | "integrity": "sha512-ydoLbgVQQPxWrwbe3Fhh4XnZexbkEQAC6M/qgRTzjnKvTjrD61CJNxLc3vyDaAPI9bJIhTiI7eTX3JB5jJv8Hg==", 71 | "dependencies": { 72 | "@serialport/parser-delimiter": "^9.0.7" 73 | }, 74 | "engines": { 75 | "node": ">=10.0.0" 76 | }, 77 | "funding": { 78 | "url": "https://opencollective.com/serialport/donate" 79 | } 80 | }, 81 | "node_modules/@serialport/stream": { 82 | "version": "9.0.7", 83 | "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-9.0.7.tgz", 84 | "integrity": "sha512-c/h7HPAeFiryD9iTGlaSvPqHFHSZ0NMQHxC4rcmKS2Vu3qJuEtkBdTLABwsMp7iWEiSnI4KC3s7bHapaXP06FQ==", 85 | "dependencies": { 86 | "debug": "^4.3.1" 87 | }, 88 | "engines": { 89 | "node": ">=10.0.0" 90 | }, 91 | "funding": { 92 | "url": "https://opencollective.com/serialport/donate" 93 | } 94 | }, 95 | "node_modules/abbrev": { 96 | "version": "1.1.1", 97 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 98 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 99 | "dev": true 100 | }, 101 | "node_modules/ansi-escapes": { 102 | "version": "4.3.2", 103 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 104 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 105 | "dev": true, 106 | "dependencies": { 107 | "type-fest": "^0.21.3" 108 | }, 109 | "engines": { 110 | "node": ">=8" 111 | }, 112 | "funding": { 113 | "url": "https://github.com/sponsors/sindresorhus" 114 | } 115 | }, 116 | "node_modules/ansi-regex": { 117 | "version": "2.1.1", 118 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 119 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 120 | "engines": { 121 | "node": ">=0.10.0" 122 | } 123 | }, 124 | "node_modules/ansi-styles": { 125 | "version": "2.2.1", 126 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 127 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 128 | "dev": true, 129 | "engines": { 130 | "node": ">=0.10.0" 131 | } 132 | }, 133 | "node_modules/ansi-term": { 134 | "version": "0.0.2", 135 | "resolved": "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz", 136 | "integrity": "sha1-/XU++kvq2g6smZgbxSo/b/AZ3rc=", 137 | "dev": true, 138 | "dependencies": { 139 | "x256": ">=0.0.1" 140 | } 141 | }, 142 | "node_modules/ansicolors": { 143 | "version": "0.3.2", 144 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", 145 | "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", 146 | "dev": true 147 | }, 148 | "node_modules/aproba": { 149 | "version": "1.2.0", 150 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 151 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 152 | }, 153 | "node_modules/are-we-there-yet": { 154 | "version": "1.1.5", 155 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 156 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 157 | "dependencies": { 158 | "delegates": "^1.0.0", 159 | "readable-stream": "^2.0.6" 160 | } 161 | }, 162 | "node_modules/are-we-there-yet/node_modules/isarray": { 163 | "version": "1.0.0", 164 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 165 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 166 | }, 167 | "node_modules/are-we-there-yet/node_modules/readable-stream": { 168 | "version": "2.3.7", 169 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 170 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 171 | "dependencies": { 172 | "core-util-is": "~1.0.0", 173 | "inherits": "~2.0.3", 174 | "isarray": "~1.0.0", 175 | "process-nextick-args": "~2.0.0", 176 | "safe-buffer": "~5.1.1", 177 | "string_decoder": "~1.1.1", 178 | "util-deprecate": "~1.0.1" 179 | } 180 | }, 181 | "node_modules/are-we-there-yet/node_modules/safe-buffer": { 182 | "version": "5.1.2", 183 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 184 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 185 | }, 186 | "node_modules/are-we-there-yet/node_modules/string_decoder": { 187 | "version": "1.1.1", 188 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 189 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 190 | "dependencies": { 191 | "safe-buffer": "~5.1.0" 192 | } 193 | }, 194 | "node_modules/base64-js": { 195 | "version": "1.5.1", 196 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 197 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 198 | "funding": [ 199 | { 200 | "type": "github", 201 | "url": "https://github.com/sponsors/feross" 202 | }, 203 | { 204 | "type": "patreon", 205 | "url": "https://www.patreon.com/feross" 206 | }, 207 | { 208 | "type": "consulting", 209 | "url": "https://feross.org/support" 210 | } 211 | ] 212 | }, 213 | "node_modules/bindings": { 214 | "version": "1.5.0", 215 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 216 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 217 | "dependencies": { 218 | "file-uri-to-path": "1.0.0" 219 | } 220 | }, 221 | "node_modules/bl": { 222 | "version": "4.1.0", 223 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 224 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 225 | "dependencies": { 226 | "buffer": "^5.5.0", 227 | "inherits": "^2.0.4", 228 | "readable-stream": "^3.4.0" 229 | } 230 | }, 231 | "node_modules/bl/node_modules/readable-stream": { 232 | "version": "3.6.0", 233 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 234 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 235 | "dependencies": { 236 | "inherits": "^2.0.3", 237 | "string_decoder": "^1.1.1", 238 | "util-deprecate": "^1.0.1" 239 | }, 240 | "engines": { 241 | "node": ">= 6" 242 | } 243 | }, 244 | "node_modules/bl/node_modules/string_decoder": { 245 | "version": "1.3.0", 246 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 247 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 248 | "dependencies": { 249 | "safe-buffer": "~5.2.0" 250 | } 251 | }, 252 | "node_modules/blessed": { 253 | "version": "0.1.81", 254 | "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", 255 | "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=", 256 | "dev": true, 257 | "bin": { 258 | "blessed": "bin/tput.js" 259 | }, 260 | "engines": { 261 | "node": ">= 0.8.0" 262 | } 263 | }, 264 | "node_modules/blessed-contrib": { 265 | "version": "4.10.1", 266 | "resolved": "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-4.10.1.tgz", 267 | "integrity": "sha512-S3jE7riCbWnAK8OT+ta4Z8RX/X6nfISxzn0SDIMFYuY90qUwqx7w7e9fIsc2m2ODwma7dFcXNwGSjyayfKd1DQ==", 268 | "dev": true, 269 | "dependencies": { 270 | "ansi-term": ">=0.0.2", 271 | "chalk": "^1.1.0", 272 | "drawille-canvas-blessed-contrib": ">=0.1.3", 273 | "lodash": "~>=4.17.21", 274 | "map-canvas": ">=0.1.5", 275 | "marked": "^2.1.1", 276 | "marked-terminal": "^4.1.1", 277 | "memory-streams": "^0.1.0", 278 | "memorystream": "^0.3.1", 279 | "picture-tuber": "^1.0.1", 280 | "sparkline": "^0.1.1", 281 | "strip-ansi": "^3.0.0", 282 | "term-canvas": "0.0.5", 283 | "x256": ">=0.0.1" 284 | } 285 | }, 286 | "node_modules/bresenham": { 287 | "version": "0.0.3", 288 | "resolved": "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz", 289 | "integrity": "sha1-q9q55bGU4nx1fNMU2ERDFPKZh3o=", 290 | "dev": true 291 | }, 292 | "node_modules/buffer": { 293 | "version": "5.7.1", 294 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 295 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 296 | "funding": [ 297 | { 298 | "type": "github", 299 | "url": "https://github.com/sponsors/feross" 300 | }, 301 | { 302 | "type": "patreon", 303 | "url": "https://www.patreon.com/feross" 304 | }, 305 | { 306 | "type": "consulting", 307 | "url": "https://feross.org/support" 308 | } 309 | ], 310 | "dependencies": { 311 | "base64-js": "^1.3.1", 312 | "ieee754": "^1.1.13" 313 | } 314 | }, 315 | "node_modules/buffers": { 316 | "version": "0.1.1", 317 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 318 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", 319 | "dev": true, 320 | "engines": { 321 | "node": ">=0.2.0" 322 | } 323 | }, 324 | "node_modules/cardinal": { 325 | "version": "2.1.1", 326 | "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", 327 | "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", 328 | "dev": true, 329 | "dependencies": { 330 | "ansicolors": "~0.3.2", 331 | "redeyed": "~2.1.0" 332 | }, 333 | "bin": { 334 | "cdl": "bin/cdl.js" 335 | } 336 | }, 337 | "node_modules/chalk": { 338 | "version": "1.1.3", 339 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 340 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 341 | "dev": true, 342 | "dependencies": { 343 | "ansi-styles": "^2.2.1", 344 | "escape-string-regexp": "^1.0.2", 345 | "has-ansi": "^2.0.0", 346 | "strip-ansi": "^3.0.0", 347 | "supports-color": "^2.0.0" 348 | }, 349 | "engines": { 350 | "node": ">=0.10.0" 351 | } 352 | }, 353 | "node_modules/charm": { 354 | "version": "0.1.2", 355 | "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", 356 | "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", 357 | "dev": true 358 | }, 359 | "node_modules/chownr": { 360 | "version": "1.1.4", 361 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 362 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 363 | }, 364 | "node_modules/cli-table": { 365 | "version": "0.3.6", 366 | "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", 367 | "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", 368 | "dev": true, 369 | "dependencies": { 370 | "colors": "1.0.3" 371 | }, 372 | "engines": { 373 | "node": ">= 0.2.0" 374 | } 375 | }, 376 | "node_modules/code-point-at": { 377 | "version": "1.1.0", 378 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 379 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 380 | "engines": { 381 | "node": ">=0.10.0" 382 | } 383 | }, 384 | "node_modules/color-convert": { 385 | "version": "2.0.1", 386 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 387 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 388 | "dev": true, 389 | "dependencies": { 390 | "color-name": "~1.1.4" 391 | }, 392 | "engines": { 393 | "node": ">=7.0.0" 394 | } 395 | }, 396 | "node_modules/color-name": { 397 | "version": "1.1.4", 398 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 399 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 400 | "dev": true 401 | }, 402 | "node_modules/colors": { 403 | "version": "1.0.3", 404 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 405 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", 406 | "dev": true, 407 | "engines": { 408 | "node": ">=0.1.90" 409 | } 410 | }, 411 | "node_modules/console-control-strings": { 412 | "version": "1.1.0", 413 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 414 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 415 | }, 416 | "node_modules/core-util-is": { 417 | "version": "1.0.2", 418 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 419 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 420 | }, 421 | "node_modules/debug": { 422 | "version": "4.3.2", 423 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 424 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 425 | "dependencies": { 426 | "ms": "2.1.2" 427 | }, 428 | "engines": { 429 | "node": ">=6.0" 430 | }, 431 | "peerDependenciesMeta": { 432 | "supports-color": { 433 | "optional": true 434 | } 435 | } 436 | }, 437 | "node_modules/decompress-response": { 438 | "version": "4.2.1", 439 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 440 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 441 | "dependencies": { 442 | "mimic-response": "^2.0.0" 443 | }, 444 | "engines": { 445 | "node": ">=8" 446 | } 447 | }, 448 | "node_modules/deep-extend": { 449 | "version": "0.6.0", 450 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 451 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 452 | "engines": { 453 | "node": ">=4.0.0" 454 | } 455 | }, 456 | "node_modules/delegates": { 457 | "version": "1.0.0", 458 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 459 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 460 | }, 461 | "node_modules/detect-libc": { 462 | "version": "1.0.3", 463 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 464 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 465 | "bin": { 466 | "detect-libc": "bin/detect-libc.js" 467 | }, 468 | "engines": { 469 | "node": ">=0.10" 470 | } 471 | }, 472 | "node_modules/drawille-blessed-contrib": { 473 | "version": "1.0.0", 474 | "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz", 475 | "integrity": "sha1-FcJ5NPV6AFatE1luFWFje8lB8Lc=", 476 | "dev": true 477 | }, 478 | "node_modules/drawille-canvas-blessed-contrib": { 479 | "version": "0.1.3", 480 | "resolved": "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz", 481 | "integrity": "sha1-IS8HinIr/S7MJn6oarbd3BCB/Ug=", 482 | "dev": true, 483 | "dependencies": { 484 | "ansi-term": ">=0.0.2", 485 | "bresenham": "0.0.3", 486 | "drawille-blessed-contrib": ">=0.0.1", 487 | "gl-matrix": "^2.1.0", 488 | "x256": ">=0.0.1" 489 | } 490 | }, 491 | "node_modules/emitonoff": { 492 | "version": "0.1.0", 493 | "resolved": "https://registry.npmjs.org/emitonoff/-/emitonoff-0.1.0.tgz", 494 | "integrity": "sha512-GkBUPqCrdVGyfoDFKWkPPTuwrtW3KPkTPlyIXAFvsof5Kmo6PSth20rtvAlHmdaaNFHSitUimruWNcCFlu+4Fg==", 495 | "dev": true 496 | }, 497 | "node_modules/end-of-stream": { 498 | "version": "1.4.4", 499 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 500 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 501 | "dependencies": { 502 | "once": "^1.4.0" 503 | } 504 | }, 505 | "node_modules/escape-string-regexp": { 506 | "version": "1.0.5", 507 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 508 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 509 | "dev": true, 510 | "engines": { 511 | "node": ">=0.8.0" 512 | } 513 | }, 514 | "node_modules/esprima": { 515 | "version": "4.0.1", 516 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 517 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 518 | "dev": true, 519 | "bin": { 520 | "esparse": "bin/esparse.js", 521 | "esvalidate": "bin/esvalidate.js" 522 | }, 523 | "engines": { 524 | "node": ">=4" 525 | } 526 | }, 527 | "node_modules/event-stream": { 528 | "version": "0.9.8", 529 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz", 530 | "integrity": "sha1-XanPPHkAl1mJ21powo5bPJjr4Do=", 531 | "dev": true, 532 | "dependencies": { 533 | "optimist": "0.2" 534 | }, 535 | "engines": { 536 | "node": "*" 537 | } 538 | }, 539 | "node_modules/event-stream/node_modules/optimist": { 540 | "version": "0.2.8", 541 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", 542 | "integrity": "sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE=", 543 | "dev": true, 544 | "dependencies": { 545 | "wordwrap": ">=0.0.1 <0.1.0" 546 | }, 547 | "engines": { 548 | "node": "*" 549 | } 550 | }, 551 | "node_modules/expand-template": { 552 | "version": "2.0.3", 553 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 554 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 555 | "engines": { 556 | "node": ">=6" 557 | } 558 | }, 559 | "node_modules/file-uri-to-path": { 560 | "version": "1.0.0", 561 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 562 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 563 | }, 564 | "node_modules/fs-constants": { 565 | "version": "1.0.0", 566 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 567 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 568 | }, 569 | "node_modules/gauge": { 570 | "version": "2.7.4", 571 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 572 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 573 | "dependencies": { 574 | "aproba": "^1.0.3", 575 | "console-control-strings": "^1.0.0", 576 | "has-unicode": "^2.0.0", 577 | "object-assign": "^4.1.0", 578 | "signal-exit": "^3.0.0", 579 | "string-width": "^1.0.1", 580 | "strip-ansi": "^3.0.1", 581 | "wide-align": "^1.1.0" 582 | } 583 | }, 584 | "node_modules/github-from-package": { 585 | "version": "0.0.0", 586 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 587 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 588 | }, 589 | "node_modules/gl-matrix": { 590 | "version": "2.8.1", 591 | "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", 592 | "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==", 593 | "dev": true 594 | }, 595 | "node_modules/has-ansi": { 596 | "version": "2.0.0", 597 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 598 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 599 | "dev": true, 600 | "dependencies": { 601 | "ansi-regex": "^2.0.0" 602 | }, 603 | "engines": { 604 | "node": ">=0.10.0" 605 | } 606 | }, 607 | "node_modules/has-flag": { 608 | "version": "4.0.0", 609 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 610 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 611 | "dev": true, 612 | "engines": { 613 | "node": ">=8" 614 | } 615 | }, 616 | "node_modules/has-unicode": { 617 | "version": "2.0.1", 618 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 619 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 620 | }, 621 | "node_modules/here": { 622 | "version": "0.0.2", 623 | "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz", 624 | "integrity": "sha1-acGvPwISHz2HiOAuhNyLOQXXEZU=", 625 | "dev": true 626 | }, 627 | "node_modules/ieee754": { 628 | "version": "1.2.1", 629 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 630 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 631 | "funding": [ 632 | { 633 | "type": "github", 634 | "url": "https://github.com/sponsors/feross" 635 | }, 636 | { 637 | "type": "patreon", 638 | "url": "https://www.patreon.com/feross" 639 | }, 640 | { 641 | "type": "consulting", 642 | "url": "https://feross.org/support" 643 | } 644 | ] 645 | }, 646 | "node_modules/inherits": { 647 | "version": "2.0.4", 648 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 649 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 650 | }, 651 | "node_modules/ini": { 652 | "version": "1.3.8", 653 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 654 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 655 | }, 656 | "node_modules/is-fullwidth-code-point": { 657 | "version": "1.0.0", 658 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 659 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 660 | "dependencies": { 661 | "number-is-nan": "^1.0.0" 662 | }, 663 | "engines": { 664 | "node": ">=0.10.0" 665 | } 666 | }, 667 | "node_modules/isarray": { 668 | "version": "0.0.1", 669 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 670 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 671 | "dev": true 672 | }, 673 | "node_modules/lodash": { 674 | "version": "4.17.21", 675 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 676 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 677 | "dev": true 678 | }, 679 | "node_modules/lodash.toarray": { 680 | "version": "4.4.0", 681 | "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", 682 | "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", 683 | "dev": true 684 | }, 685 | "node_modules/map-canvas": { 686 | "version": "0.1.5", 687 | "resolved": "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz", 688 | "integrity": "sha1-i+a63gvz6fmotW6INqHR0TPKsYY=", 689 | "dev": true, 690 | "dependencies": { 691 | "drawille-canvas-blessed-contrib": ">=0.0.1", 692 | "xml2js": "^0.4.5" 693 | } 694 | }, 695 | "node_modules/marked": { 696 | "version": "2.1.3", 697 | "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", 698 | "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", 699 | "dev": true, 700 | "bin": { 701 | "marked": "bin/marked" 702 | }, 703 | "engines": { 704 | "node": ">= 10" 705 | } 706 | }, 707 | "node_modules/marked-terminal": { 708 | "version": "4.1.1", 709 | "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.1.tgz", 710 | "integrity": "sha512-t7Mdf6T3PvOEyN01c3tYxDzhyKZ8xnkp8Rs6Fohno63L/0pFTJ5Qtwto2AQVuDtbQiWzD+4E5AAu1Z2iLc8miQ==", 711 | "dev": true, 712 | "dependencies": { 713 | "ansi-escapes": "^4.3.1", 714 | "cardinal": "^2.1.1", 715 | "chalk": "^4.1.0", 716 | "cli-table": "^0.3.1", 717 | "node-emoji": "^1.10.0", 718 | "supports-hyperlinks": "^2.1.0" 719 | }, 720 | "peerDependencies": { 721 | "marked": "^1.0.0 || ^2.0.0" 722 | } 723 | }, 724 | "node_modules/marked-terminal/node_modules/ansi-styles": { 725 | "version": "4.3.0", 726 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 727 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 728 | "dev": true, 729 | "dependencies": { 730 | "color-convert": "^2.0.1" 731 | }, 732 | "engines": { 733 | "node": ">=8" 734 | }, 735 | "funding": { 736 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 737 | } 738 | }, 739 | "node_modules/marked-terminal/node_modules/chalk": { 740 | "version": "4.1.2", 741 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 742 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 743 | "dev": true, 744 | "dependencies": { 745 | "ansi-styles": "^4.1.0", 746 | "supports-color": "^7.1.0" 747 | }, 748 | "engines": { 749 | "node": ">=10" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/chalk/chalk?sponsor=1" 753 | } 754 | }, 755 | "node_modules/marked-terminal/node_modules/supports-color": { 756 | "version": "7.2.0", 757 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 758 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 759 | "dev": true, 760 | "dependencies": { 761 | "has-flag": "^4.0.0" 762 | }, 763 | "engines": { 764 | "node": ">=8" 765 | } 766 | }, 767 | "node_modules/memory-streams": { 768 | "version": "0.1.3", 769 | "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", 770 | "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", 771 | "dev": true, 772 | "dependencies": { 773 | "readable-stream": "~1.0.2" 774 | } 775 | }, 776 | "node_modules/memorystream": { 777 | "version": "0.3.1", 778 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 779 | "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", 780 | "dev": true, 781 | "engines": { 782 | "node": ">= 0.10.0" 783 | } 784 | }, 785 | "node_modules/mimic-response": { 786 | "version": "2.1.0", 787 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 788 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", 789 | "engines": { 790 | "node": ">=8" 791 | }, 792 | "funding": { 793 | "url": "https://github.com/sponsors/sindresorhus" 794 | } 795 | }, 796 | "node_modules/minimist": { 797 | "version": "1.2.5", 798 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 799 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 800 | }, 801 | "node_modules/mkdirp-classic": { 802 | "version": "0.5.3", 803 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 804 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 805 | }, 806 | "node_modules/ms": { 807 | "version": "2.1.2", 808 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 809 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 810 | }, 811 | "node_modules/nan": { 812 | "version": "2.15.0", 813 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", 814 | "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" 815 | }, 816 | "node_modules/napi-build-utils": { 817 | "version": "1.0.2", 818 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 819 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 820 | }, 821 | "node_modules/node-abi": { 822 | "version": "2.30.0", 823 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", 824 | "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", 825 | "dependencies": { 826 | "semver": "^5.4.1" 827 | } 828 | }, 829 | "node_modules/node-emoji": { 830 | "version": "1.10.0", 831 | "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", 832 | "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", 833 | "dev": true, 834 | "dependencies": { 835 | "lodash.toarray": "^4.4.0" 836 | } 837 | }, 838 | "node_modules/nopt": { 839 | "version": "2.1.2", 840 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", 841 | "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", 842 | "dev": true, 843 | "dependencies": { 844 | "abbrev": "1" 845 | }, 846 | "bin": { 847 | "nopt": "bin/nopt.js" 848 | } 849 | }, 850 | "node_modules/npmlog": { 851 | "version": "4.1.2", 852 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 853 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 854 | "dependencies": { 855 | "are-we-there-yet": "~1.1.2", 856 | "console-control-strings": "~1.1.0", 857 | "gauge": "~2.7.3", 858 | "set-blocking": "~2.0.0" 859 | } 860 | }, 861 | "node_modules/number-is-nan": { 862 | "version": "1.0.1", 863 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 864 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 865 | "engines": { 866 | "node": ">=0.10.0" 867 | } 868 | }, 869 | "node_modules/object-assign": { 870 | "version": "4.1.1", 871 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 872 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 873 | "engines": { 874 | "node": ">=0.10.0" 875 | } 876 | }, 877 | "node_modules/once": { 878 | "version": "1.4.0", 879 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 880 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 881 | "dependencies": { 882 | "wrappy": "1" 883 | } 884 | }, 885 | "node_modules/optimist": { 886 | "version": "0.3.7", 887 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 888 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 889 | "dev": true, 890 | "dependencies": { 891 | "wordwrap": "~0.0.2" 892 | } 893 | }, 894 | "node_modules/picture-tuber": { 895 | "version": "1.0.2", 896 | "resolved": "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz", 897 | "integrity": "sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw==", 898 | "dev": true, 899 | "dependencies": { 900 | "buffers": "~0.1.1", 901 | "charm": "~0.1.0", 902 | "event-stream": "~0.9.8", 903 | "optimist": "~0.3.4", 904 | "png-js": "~0.1.0", 905 | "x256": "~0.0.1" 906 | }, 907 | "bin": { 908 | "picture-tube": "bin/tube.js" 909 | }, 910 | "engines": { 911 | "node": ">=0.4.0" 912 | } 913 | }, 914 | "node_modules/png-js": { 915 | "version": "0.1.1", 916 | "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", 917 | "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=", 918 | "dev": true 919 | }, 920 | "node_modules/prebuild-install": { 921 | "version": "6.1.3", 922 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", 923 | "integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", 924 | "dependencies": { 925 | "detect-libc": "^1.0.3", 926 | "expand-template": "^2.0.3", 927 | "github-from-package": "0.0.0", 928 | "minimist": "^1.2.3", 929 | "mkdirp-classic": "^0.5.3", 930 | "napi-build-utils": "^1.0.1", 931 | "node-abi": "^2.21.0", 932 | "npmlog": "^4.0.1", 933 | "pump": "^3.0.0", 934 | "rc": "^1.2.7", 935 | "simple-get": "^3.0.3", 936 | "tar-fs": "^2.0.0", 937 | "tunnel-agent": "^0.6.0" 938 | }, 939 | "bin": { 940 | "prebuild-install": "bin.js" 941 | }, 942 | "engines": { 943 | "node": ">=6" 944 | } 945 | }, 946 | "node_modules/process-nextick-args": { 947 | "version": "2.0.1", 948 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 949 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 950 | }, 951 | "node_modules/pump": { 952 | "version": "3.0.0", 953 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 954 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 955 | "dependencies": { 956 | "end-of-stream": "^1.1.0", 957 | "once": "^1.3.1" 958 | } 959 | }, 960 | "node_modules/rc": { 961 | "version": "1.2.8", 962 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 963 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 964 | "dependencies": { 965 | "deep-extend": "^0.6.0", 966 | "ini": "~1.3.0", 967 | "minimist": "^1.2.0", 968 | "strip-json-comments": "~2.0.1" 969 | }, 970 | "bin": { 971 | "rc": "cli.js" 972 | } 973 | }, 974 | "node_modules/readable-stream": { 975 | "version": "1.0.34", 976 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 977 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 978 | "dev": true, 979 | "dependencies": { 980 | "core-util-is": "~1.0.0", 981 | "inherits": "~2.0.1", 982 | "isarray": "0.0.1", 983 | "string_decoder": "~0.10.x" 984 | } 985 | }, 986 | "node_modules/redeyed": { 987 | "version": "2.1.1", 988 | "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", 989 | "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", 990 | "dev": true, 991 | "dependencies": { 992 | "esprima": "~4.0.0" 993 | } 994 | }, 995 | "node_modules/safe-buffer": { 996 | "version": "5.2.1", 997 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 998 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 999 | "funding": [ 1000 | { 1001 | "type": "github", 1002 | "url": "https://github.com/sponsors/feross" 1003 | }, 1004 | { 1005 | "type": "patreon", 1006 | "url": "https://www.patreon.com/feross" 1007 | }, 1008 | { 1009 | "type": "consulting", 1010 | "url": "https://feross.org/support" 1011 | } 1012 | ] 1013 | }, 1014 | "node_modules/sax": { 1015 | "version": "1.2.4", 1016 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1017 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 1018 | "dev": true 1019 | }, 1020 | "node_modules/semver": { 1021 | "version": "5.7.1", 1022 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1023 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1024 | "bin": { 1025 | "semver": "bin/semver" 1026 | } 1027 | }, 1028 | "node_modules/set-blocking": { 1029 | "version": "2.0.0", 1030 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1031 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1032 | }, 1033 | "node_modules/signal-exit": { 1034 | "version": "3.0.3", 1035 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1036 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1037 | }, 1038 | "node_modules/simple-concat": { 1039 | "version": "1.0.1", 1040 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1041 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1042 | "funding": [ 1043 | { 1044 | "type": "github", 1045 | "url": "https://github.com/sponsors/feross" 1046 | }, 1047 | { 1048 | "type": "patreon", 1049 | "url": "https://www.patreon.com/feross" 1050 | }, 1051 | { 1052 | "type": "consulting", 1053 | "url": "https://feross.org/support" 1054 | } 1055 | ] 1056 | }, 1057 | "node_modules/simple-get": { 1058 | "version": "3.1.0", 1059 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 1060 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 1061 | "dependencies": { 1062 | "decompress-response": "^4.2.0", 1063 | "once": "^1.3.1", 1064 | "simple-concat": "^1.0.0" 1065 | } 1066 | }, 1067 | "node_modules/sparkline": { 1068 | "version": "0.1.2", 1069 | "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz", 1070 | "integrity": "sha1-w73kYlKxNU5xDEsgDVSBa9nwejI=", 1071 | "dev": true, 1072 | "dependencies": { 1073 | "here": "0.0.2", 1074 | "nopt": "~2.1.2" 1075 | }, 1076 | "bin": { 1077 | "sparkline": "bin/sparkline" 1078 | }, 1079 | "engines": { 1080 | "node": ">= 0.8.0" 1081 | } 1082 | }, 1083 | "node_modules/string_decoder": { 1084 | "version": "0.10.31", 1085 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1086 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1087 | "dev": true 1088 | }, 1089 | "node_modules/string-width": { 1090 | "version": "1.0.2", 1091 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1092 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1093 | "dependencies": { 1094 | "code-point-at": "^1.0.0", 1095 | "is-fullwidth-code-point": "^1.0.0", 1096 | "strip-ansi": "^3.0.0" 1097 | }, 1098 | "engines": { 1099 | "node": ">=0.10.0" 1100 | } 1101 | }, 1102 | "node_modules/strip-ansi": { 1103 | "version": "3.0.1", 1104 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1105 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1106 | "dependencies": { 1107 | "ansi-regex": "^2.0.0" 1108 | }, 1109 | "engines": { 1110 | "node": ">=0.10.0" 1111 | } 1112 | }, 1113 | "node_modules/strip-json-comments": { 1114 | "version": "2.0.1", 1115 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1116 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1117 | "engines": { 1118 | "node": ">=0.10.0" 1119 | } 1120 | }, 1121 | "node_modules/supports-color": { 1122 | "version": "2.0.0", 1123 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1124 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1125 | "dev": true, 1126 | "engines": { 1127 | "node": ">=0.8.0" 1128 | } 1129 | }, 1130 | "node_modules/supports-hyperlinks": { 1131 | "version": "2.2.0", 1132 | "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", 1133 | "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", 1134 | "dev": true, 1135 | "dependencies": { 1136 | "has-flag": "^4.0.0", 1137 | "supports-color": "^7.0.0" 1138 | }, 1139 | "engines": { 1140 | "node": ">=8" 1141 | } 1142 | }, 1143 | "node_modules/supports-hyperlinks/node_modules/supports-color": { 1144 | "version": "7.2.0", 1145 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1146 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1147 | "dev": true, 1148 | "dependencies": { 1149 | "has-flag": "^4.0.0" 1150 | }, 1151 | "engines": { 1152 | "node": ">=8" 1153 | } 1154 | }, 1155 | "node_modules/tar-fs": { 1156 | "version": "2.1.1", 1157 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1158 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1159 | "dependencies": { 1160 | "chownr": "^1.1.1", 1161 | "mkdirp-classic": "^0.5.2", 1162 | "pump": "^3.0.0", 1163 | "tar-stream": "^2.1.4" 1164 | } 1165 | }, 1166 | "node_modules/tar-stream": { 1167 | "version": "2.2.0", 1168 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 1169 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 1170 | "dependencies": { 1171 | "bl": "^4.0.3", 1172 | "end-of-stream": "^1.4.1", 1173 | "fs-constants": "^1.0.0", 1174 | "inherits": "^2.0.3", 1175 | "readable-stream": "^3.1.1" 1176 | }, 1177 | "engines": { 1178 | "node": ">=6" 1179 | } 1180 | }, 1181 | "node_modules/tar-stream/node_modules/readable-stream": { 1182 | "version": "3.6.0", 1183 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1184 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1185 | "dependencies": { 1186 | "inherits": "^2.0.3", 1187 | "string_decoder": "^1.1.1", 1188 | "util-deprecate": "^1.0.1" 1189 | }, 1190 | "engines": { 1191 | "node": ">= 6" 1192 | } 1193 | }, 1194 | "node_modules/tar-stream/node_modules/string_decoder": { 1195 | "version": "1.3.0", 1196 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1197 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1198 | "dependencies": { 1199 | "safe-buffer": "~5.2.0" 1200 | } 1201 | }, 1202 | "node_modules/term-canvas": { 1203 | "version": "0.0.5", 1204 | "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz", 1205 | "integrity": "sha1-WXr6wvpjaabxeGC86cX2bW6gypY=", 1206 | "dev": true 1207 | }, 1208 | "node_modules/tunnel-agent": { 1209 | "version": "0.6.0", 1210 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1211 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1212 | "dependencies": { 1213 | "safe-buffer": "^5.0.1" 1214 | }, 1215 | "engines": { 1216 | "node": "*" 1217 | } 1218 | }, 1219 | "node_modules/type-fest": { 1220 | "version": "0.21.3", 1221 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1222 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 1223 | "dev": true, 1224 | "engines": { 1225 | "node": ">=10" 1226 | }, 1227 | "funding": { 1228 | "url": "https://github.com/sponsors/sindresorhus" 1229 | } 1230 | }, 1231 | "node_modules/util-deprecate": { 1232 | "version": "1.0.2", 1233 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1234 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1235 | }, 1236 | "node_modules/wide-align": { 1237 | "version": "1.1.3", 1238 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1239 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1240 | "dependencies": { 1241 | "string-width": "^1.0.2 || 2" 1242 | } 1243 | }, 1244 | "node_modules/wordwrap": { 1245 | "version": "0.0.3", 1246 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1247 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1248 | "dev": true, 1249 | "engines": { 1250 | "node": ">=0.4.0" 1251 | } 1252 | }, 1253 | "node_modules/wrappy": { 1254 | "version": "1.0.2", 1255 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1256 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1257 | }, 1258 | "node_modules/x256": { 1259 | "version": "0.0.2", 1260 | "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", 1261 | "integrity": "sha1-ya8Yh296F1gB1WT+cK2egxd4STQ=", 1262 | "dev": true, 1263 | "engines": { 1264 | "node": ">=0.4.0" 1265 | } 1266 | }, 1267 | "node_modules/xml2js": { 1268 | "version": "0.4.23", 1269 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1270 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1271 | "dev": true, 1272 | "dependencies": { 1273 | "sax": ">=0.6.0", 1274 | "xmlbuilder": "~11.0.0" 1275 | }, 1276 | "engines": { 1277 | "node": ">=4.0.0" 1278 | } 1279 | }, 1280 | "node_modules/xmlbuilder": { 1281 | "version": "11.0.1", 1282 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1283 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 1284 | "dev": true, 1285 | "engines": { 1286 | "node": ">=4.0" 1287 | } 1288 | } 1289 | }, 1290 | "dependencies": { 1291 | "@serialport/binding-abstract": { 1292 | "version": "9.0.7", 1293 | "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-9.0.7.tgz", 1294 | "integrity": "sha512-g1ncCMIG9rMsxo/28ObYmXZcHThlvtZygsCANmyMUuFS7SwXY4+PhcEnt2+ZcMkEDNRiOklT+ngtIVx5GGpt/A==", 1295 | "requires": { 1296 | "debug": "^4.3.1" 1297 | } 1298 | }, 1299 | "@serialport/bindings": { 1300 | "version": "9.2.0", 1301 | "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-9.2.0.tgz", 1302 | "integrity": "sha512-s9EKHDZjLHipHhypxy6pz2XsoI1fPiOGU+X13AIGdQfoe7I6piEyhJ2znNgXMugMe43OxNk0/CmuVMzzcw1lmQ==", 1303 | "requires": { 1304 | "@serialport/binding-abstract": "^9.0.7", 1305 | "@serialport/parser-readline": "^9.0.7", 1306 | "bindings": "^1.5.0", 1307 | "debug": "^4.3.1", 1308 | "nan": "^2.14.2", 1309 | "prebuild-install": "^6.0.1" 1310 | } 1311 | }, 1312 | "@serialport/parser-delimiter": { 1313 | "version": "9.0.7", 1314 | "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-9.0.7.tgz", 1315 | "integrity": "sha512-Vb2NPeXPZ/28M4m5x4OAHFd8jRAeddNCgvL+Q+H/hqFPY1w47JcMLchC7pigRW8Cnt1fklmzfwdNQ8Fb+kMkxQ==" 1316 | }, 1317 | "@serialport/parser-readline": { 1318 | "version": "9.0.7", 1319 | "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-9.0.7.tgz", 1320 | "integrity": "sha512-ydoLbgVQQPxWrwbe3Fhh4XnZexbkEQAC6M/qgRTzjnKvTjrD61CJNxLc3vyDaAPI9bJIhTiI7eTX3JB5jJv8Hg==", 1321 | "requires": { 1322 | "@serialport/parser-delimiter": "^9.0.7" 1323 | } 1324 | }, 1325 | "@serialport/stream": { 1326 | "version": "9.0.7", 1327 | "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-9.0.7.tgz", 1328 | "integrity": "sha512-c/h7HPAeFiryD9iTGlaSvPqHFHSZ0NMQHxC4rcmKS2Vu3qJuEtkBdTLABwsMp7iWEiSnI4KC3s7bHapaXP06FQ==", 1329 | "requires": { 1330 | "debug": "^4.3.1" 1331 | } 1332 | }, 1333 | "abbrev": { 1334 | "version": "1.1.1", 1335 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1336 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1337 | "dev": true 1338 | }, 1339 | "ansi-escapes": { 1340 | "version": "4.3.2", 1341 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1342 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1343 | "dev": true, 1344 | "requires": { 1345 | "type-fest": "^0.21.3" 1346 | } 1347 | }, 1348 | "ansi-regex": { 1349 | "version": "2.1.1", 1350 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1351 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 1352 | }, 1353 | "ansi-styles": { 1354 | "version": "2.2.1", 1355 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1356 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 1357 | "dev": true 1358 | }, 1359 | "ansi-term": { 1360 | "version": "0.0.2", 1361 | "resolved": "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz", 1362 | "integrity": "sha1-/XU++kvq2g6smZgbxSo/b/AZ3rc=", 1363 | "dev": true, 1364 | "requires": { 1365 | "x256": ">=0.0.1" 1366 | } 1367 | }, 1368 | "ansicolors": { 1369 | "version": "0.3.2", 1370 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", 1371 | "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", 1372 | "dev": true 1373 | }, 1374 | "aproba": { 1375 | "version": "1.2.0", 1376 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 1377 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 1378 | }, 1379 | "are-we-there-yet": { 1380 | "version": "1.1.5", 1381 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 1382 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 1383 | "requires": { 1384 | "delegates": "^1.0.0", 1385 | "readable-stream": "^2.0.6" 1386 | }, 1387 | "dependencies": { 1388 | "isarray": { 1389 | "version": "1.0.0", 1390 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1391 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1392 | }, 1393 | "readable-stream": { 1394 | "version": "2.3.7", 1395 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1396 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1397 | "requires": { 1398 | "core-util-is": "~1.0.0", 1399 | "inherits": "~2.0.3", 1400 | "isarray": "~1.0.0", 1401 | "process-nextick-args": "~2.0.0", 1402 | "safe-buffer": "~5.1.1", 1403 | "string_decoder": "~1.1.1", 1404 | "util-deprecate": "~1.0.1" 1405 | } 1406 | }, 1407 | "safe-buffer": { 1408 | "version": "5.1.2", 1409 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1410 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1411 | }, 1412 | "string_decoder": { 1413 | "version": "1.1.1", 1414 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1415 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1416 | "requires": { 1417 | "safe-buffer": "~5.1.0" 1418 | } 1419 | } 1420 | } 1421 | }, 1422 | "base64-js": { 1423 | "version": "1.5.1", 1424 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1425 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 1426 | }, 1427 | "bindings": { 1428 | "version": "1.5.0", 1429 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 1430 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 1431 | "requires": { 1432 | "file-uri-to-path": "1.0.0" 1433 | } 1434 | }, 1435 | "bl": { 1436 | "version": "4.1.0", 1437 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 1438 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 1439 | "requires": { 1440 | "buffer": "^5.5.0", 1441 | "inherits": "^2.0.4", 1442 | "readable-stream": "^3.4.0" 1443 | }, 1444 | "dependencies": { 1445 | "readable-stream": { 1446 | "version": "3.6.0", 1447 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1448 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1449 | "requires": { 1450 | "inherits": "^2.0.3", 1451 | "string_decoder": "^1.1.1", 1452 | "util-deprecate": "^1.0.1" 1453 | } 1454 | }, 1455 | "string_decoder": { 1456 | "version": "1.3.0", 1457 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1458 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1459 | "requires": { 1460 | "safe-buffer": "~5.2.0" 1461 | } 1462 | } 1463 | } 1464 | }, 1465 | "blessed": { 1466 | "version": "0.1.81", 1467 | "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", 1468 | "integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=", 1469 | "dev": true 1470 | }, 1471 | "blessed-contrib": { 1472 | "version": "4.10.1", 1473 | "resolved": "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-4.10.1.tgz", 1474 | "integrity": "sha512-S3jE7riCbWnAK8OT+ta4Z8RX/X6nfISxzn0SDIMFYuY90qUwqx7w7e9fIsc2m2ODwma7dFcXNwGSjyayfKd1DQ==", 1475 | "dev": true, 1476 | "requires": { 1477 | "ansi-term": ">=0.0.2", 1478 | "chalk": "^1.1.0", 1479 | "drawille-canvas-blessed-contrib": ">=0.1.3", 1480 | "lodash": "~>=4.17.21", 1481 | "map-canvas": ">=0.1.5", 1482 | "marked": "^2.1.1", 1483 | "marked-terminal": "^4.1.1", 1484 | "memory-streams": "^0.1.0", 1485 | "memorystream": "^0.3.1", 1486 | "picture-tuber": "^1.0.1", 1487 | "sparkline": "^0.1.1", 1488 | "strip-ansi": "^3.0.0", 1489 | "term-canvas": "0.0.5", 1490 | "x256": ">=0.0.1" 1491 | } 1492 | }, 1493 | "bresenham": { 1494 | "version": "0.0.3", 1495 | "resolved": "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz", 1496 | "integrity": "sha1-q9q55bGU4nx1fNMU2ERDFPKZh3o=", 1497 | "dev": true 1498 | }, 1499 | "buffer": { 1500 | "version": "5.7.1", 1501 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 1502 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 1503 | "requires": { 1504 | "base64-js": "^1.3.1", 1505 | "ieee754": "^1.1.13" 1506 | } 1507 | }, 1508 | "buffers": { 1509 | "version": "0.1.1", 1510 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 1511 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", 1512 | "dev": true 1513 | }, 1514 | "cardinal": { 1515 | "version": "2.1.1", 1516 | "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", 1517 | "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", 1518 | "dev": true, 1519 | "requires": { 1520 | "ansicolors": "~0.3.2", 1521 | "redeyed": "~2.1.0" 1522 | } 1523 | }, 1524 | "chalk": { 1525 | "version": "1.1.3", 1526 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1527 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1528 | "dev": true, 1529 | "requires": { 1530 | "ansi-styles": "^2.2.1", 1531 | "escape-string-regexp": "^1.0.2", 1532 | "has-ansi": "^2.0.0", 1533 | "strip-ansi": "^3.0.0", 1534 | "supports-color": "^2.0.0" 1535 | } 1536 | }, 1537 | "charm": { 1538 | "version": "0.1.2", 1539 | "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", 1540 | "integrity": "sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=", 1541 | "dev": true 1542 | }, 1543 | "chownr": { 1544 | "version": "1.1.4", 1545 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 1546 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 1547 | }, 1548 | "cli-table": { 1549 | "version": "0.3.6", 1550 | "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", 1551 | "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", 1552 | "dev": true, 1553 | "requires": { 1554 | "colors": "1.0.3" 1555 | } 1556 | }, 1557 | "code-point-at": { 1558 | "version": "1.1.0", 1559 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 1560 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 1561 | }, 1562 | "color-convert": { 1563 | "version": "2.0.1", 1564 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1565 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1566 | "dev": true, 1567 | "requires": { 1568 | "color-name": "~1.1.4" 1569 | } 1570 | }, 1571 | "color-name": { 1572 | "version": "1.1.4", 1573 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1574 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1575 | "dev": true 1576 | }, 1577 | "colors": { 1578 | "version": "1.0.3", 1579 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 1580 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", 1581 | "dev": true 1582 | }, 1583 | "console-control-strings": { 1584 | "version": "1.1.0", 1585 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 1586 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 1587 | }, 1588 | "core-util-is": { 1589 | "version": "1.0.2", 1590 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 1591 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 1592 | }, 1593 | "debug": { 1594 | "version": "4.3.2", 1595 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1596 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1597 | "requires": { 1598 | "ms": "2.1.2" 1599 | } 1600 | }, 1601 | "decompress-response": { 1602 | "version": "4.2.1", 1603 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 1604 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 1605 | "requires": { 1606 | "mimic-response": "^2.0.0" 1607 | } 1608 | }, 1609 | "deep-extend": { 1610 | "version": "0.6.0", 1611 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 1612 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 1613 | }, 1614 | "delegates": { 1615 | "version": "1.0.0", 1616 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 1617 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 1618 | }, 1619 | "detect-libc": { 1620 | "version": "1.0.3", 1621 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 1622 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 1623 | }, 1624 | "drawille-blessed-contrib": { 1625 | "version": "1.0.0", 1626 | "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz", 1627 | "integrity": "sha1-FcJ5NPV6AFatE1luFWFje8lB8Lc=", 1628 | "dev": true 1629 | }, 1630 | "drawille-canvas-blessed-contrib": { 1631 | "version": "0.1.3", 1632 | "resolved": "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz", 1633 | "integrity": "sha1-IS8HinIr/S7MJn6oarbd3BCB/Ug=", 1634 | "dev": true, 1635 | "requires": { 1636 | "ansi-term": ">=0.0.2", 1637 | "bresenham": "0.0.3", 1638 | "drawille-blessed-contrib": ">=0.0.1", 1639 | "gl-matrix": "^2.1.0", 1640 | "x256": ">=0.0.1" 1641 | } 1642 | }, 1643 | "emitonoff": { 1644 | "version": "0.1.0", 1645 | "resolved": "https://registry.npmjs.org/emitonoff/-/emitonoff-0.1.0.tgz", 1646 | "integrity": "sha512-GkBUPqCrdVGyfoDFKWkPPTuwrtW3KPkTPlyIXAFvsof5Kmo6PSth20rtvAlHmdaaNFHSitUimruWNcCFlu+4Fg==", 1647 | "dev": true 1648 | }, 1649 | "end-of-stream": { 1650 | "version": "1.4.4", 1651 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1652 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1653 | "requires": { 1654 | "once": "^1.4.0" 1655 | } 1656 | }, 1657 | "escape-string-regexp": { 1658 | "version": "1.0.5", 1659 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1660 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1661 | "dev": true 1662 | }, 1663 | "esprima": { 1664 | "version": "4.0.1", 1665 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1666 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1667 | "dev": true 1668 | }, 1669 | "event-stream": { 1670 | "version": "0.9.8", 1671 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz", 1672 | "integrity": "sha1-XanPPHkAl1mJ21powo5bPJjr4Do=", 1673 | "dev": true, 1674 | "requires": { 1675 | "optimist": "0.2" 1676 | }, 1677 | "dependencies": { 1678 | "optimist": { 1679 | "version": "0.2.8", 1680 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", 1681 | "integrity": "sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE=", 1682 | "dev": true, 1683 | "requires": { 1684 | "wordwrap": ">=0.0.1 <0.1.0" 1685 | } 1686 | } 1687 | } 1688 | }, 1689 | "expand-template": { 1690 | "version": "2.0.3", 1691 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 1692 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 1693 | }, 1694 | "file-uri-to-path": { 1695 | "version": "1.0.0", 1696 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 1697 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 1698 | }, 1699 | "fs-constants": { 1700 | "version": "1.0.0", 1701 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1702 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 1703 | }, 1704 | "gauge": { 1705 | "version": "2.7.4", 1706 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 1707 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 1708 | "requires": { 1709 | "aproba": "^1.0.3", 1710 | "console-control-strings": "^1.0.0", 1711 | "has-unicode": "^2.0.0", 1712 | "object-assign": "^4.1.0", 1713 | "signal-exit": "^3.0.0", 1714 | "string-width": "^1.0.1", 1715 | "strip-ansi": "^3.0.1", 1716 | "wide-align": "^1.1.0" 1717 | } 1718 | }, 1719 | "github-from-package": { 1720 | "version": "0.0.0", 1721 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1722 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 1723 | }, 1724 | "gl-matrix": { 1725 | "version": "2.8.1", 1726 | "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", 1727 | "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==", 1728 | "dev": true 1729 | }, 1730 | "has-ansi": { 1731 | "version": "2.0.0", 1732 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1733 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1734 | "dev": true, 1735 | "requires": { 1736 | "ansi-regex": "^2.0.0" 1737 | } 1738 | }, 1739 | "has-flag": { 1740 | "version": "4.0.0", 1741 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1742 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1743 | "dev": true 1744 | }, 1745 | "has-unicode": { 1746 | "version": "2.0.1", 1747 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1748 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 1749 | }, 1750 | "here": { 1751 | "version": "0.0.2", 1752 | "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz", 1753 | "integrity": "sha1-acGvPwISHz2HiOAuhNyLOQXXEZU=", 1754 | "dev": true 1755 | }, 1756 | "ieee754": { 1757 | "version": "1.2.1", 1758 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1759 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1760 | }, 1761 | "inherits": { 1762 | "version": "2.0.4", 1763 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1764 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1765 | }, 1766 | "ini": { 1767 | "version": "1.3.8", 1768 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1769 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1770 | }, 1771 | "is-fullwidth-code-point": { 1772 | "version": "1.0.0", 1773 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1774 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1775 | "requires": { 1776 | "number-is-nan": "^1.0.0" 1777 | } 1778 | }, 1779 | "isarray": { 1780 | "version": "0.0.1", 1781 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1782 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1783 | "dev": true 1784 | }, 1785 | "lodash": { 1786 | "version": "4.17.21", 1787 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1788 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1789 | "dev": true 1790 | }, 1791 | "lodash.toarray": { 1792 | "version": "4.4.0", 1793 | "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", 1794 | "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", 1795 | "dev": true 1796 | }, 1797 | "map-canvas": { 1798 | "version": "0.1.5", 1799 | "resolved": "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz", 1800 | "integrity": "sha1-i+a63gvz6fmotW6INqHR0TPKsYY=", 1801 | "dev": true, 1802 | "requires": { 1803 | "drawille-canvas-blessed-contrib": ">=0.0.1", 1804 | "xml2js": "^0.4.5" 1805 | } 1806 | }, 1807 | "marked": { 1808 | "version": "2.1.3", 1809 | "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", 1810 | "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==", 1811 | "dev": true 1812 | }, 1813 | "marked-terminal": { 1814 | "version": "4.1.1", 1815 | "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.1.tgz", 1816 | "integrity": "sha512-t7Mdf6T3PvOEyN01c3tYxDzhyKZ8xnkp8Rs6Fohno63L/0pFTJ5Qtwto2AQVuDtbQiWzD+4E5AAu1Z2iLc8miQ==", 1817 | "dev": true, 1818 | "requires": { 1819 | "ansi-escapes": "^4.3.1", 1820 | "cardinal": "^2.1.1", 1821 | "chalk": "^4.1.0", 1822 | "cli-table": "^0.3.1", 1823 | "node-emoji": "^1.10.0", 1824 | "supports-hyperlinks": "^2.1.0" 1825 | }, 1826 | "dependencies": { 1827 | "ansi-styles": { 1828 | "version": "4.3.0", 1829 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1830 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1831 | "dev": true, 1832 | "requires": { 1833 | "color-convert": "^2.0.1" 1834 | } 1835 | }, 1836 | "chalk": { 1837 | "version": "4.1.2", 1838 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1839 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1840 | "dev": true, 1841 | "requires": { 1842 | "ansi-styles": "^4.1.0", 1843 | "supports-color": "^7.1.0" 1844 | } 1845 | }, 1846 | "supports-color": { 1847 | "version": "7.2.0", 1848 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1849 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1850 | "dev": true, 1851 | "requires": { 1852 | "has-flag": "^4.0.0" 1853 | } 1854 | } 1855 | } 1856 | }, 1857 | "memory-streams": { 1858 | "version": "0.1.3", 1859 | "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", 1860 | "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", 1861 | "dev": true, 1862 | "requires": { 1863 | "readable-stream": "~1.0.2" 1864 | } 1865 | }, 1866 | "memorystream": { 1867 | "version": "0.3.1", 1868 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 1869 | "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", 1870 | "dev": true 1871 | }, 1872 | "mimic-response": { 1873 | "version": "2.1.0", 1874 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 1875 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 1876 | }, 1877 | "minimist": { 1878 | "version": "1.2.5", 1879 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1880 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1881 | }, 1882 | "mkdirp-classic": { 1883 | "version": "0.5.3", 1884 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1885 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 1886 | }, 1887 | "ms": { 1888 | "version": "2.1.2", 1889 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1890 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1891 | }, 1892 | "nan": { 1893 | "version": "2.15.0", 1894 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", 1895 | "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" 1896 | }, 1897 | "napi-build-utils": { 1898 | "version": "1.0.2", 1899 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1900 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 1901 | }, 1902 | "node-abi": { 1903 | "version": "2.30.0", 1904 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", 1905 | "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", 1906 | "requires": { 1907 | "semver": "^5.4.1" 1908 | } 1909 | }, 1910 | "node-emoji": { 1911 | "version": "1.10.0", 1912 | "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", 1913 | "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", 1914 | "dev": true, 1915 | "requires": { 1916 | "lodash.toarray": "^4.4.0" 1917 | } 1918 | }, 1919 | "nopt": { 1920 | "version": "2.1.2", 1921 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", 1922 | "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", 1923 | "dev": true, 1924 | "requires": { 1925 | "abbrev": "1" 1926 | } 1927 | }, 1928 | "npmlog": { 1929 | "version": "4.1.2", 1930 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1931 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1932 | "requires": { 1933 | "are-we-there-yet": "~1.1.2", 1934 | "console-control-strings": "~1.1.0", 1935 | "gauge": "~2.7.3", 1936 | "set-blocking": "~2.0.0" 1937 | } 1938 | }, 1939 | "number-is-nan": { 1940 | "version": "1.0.1", 1941 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1942 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1943 | }, 1944 | "object-assign": { 1945 | "version": "4.1.1", 1946 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1947 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1948 | }, 1949 | "once": { 1950 | "version": "1.4.0", 1951 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1952 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1953 | "requires": { 1954 | "wrappy": "1" 1955 | } 1956 | }, 1957 | "optimist": { 1958 | "version": "0.3.7", 1959 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 1960 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 1961 | "dev": true, 1962 | "requires": { 1963 | "wordwrap": "~0.0.2" 1964 | } 1965 | }, 1966 | "picture-tuber": { 1967 | "version": "1.0.2", 1968 | "resolved": "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz", 1969 | "integrity": "sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw==", 1970 | "dev": true, 1971 | "requires": { 1972 | "buffers": "~0.1.1", 1973 | "charm": "~0.1.0", 1974 | "event-stream": "~0.9.8", 1975 | "optimist": "~0.3.4", 1976 | "png-js": "~0.1.0", 1977 | "x256": "~0.0.1" 1978 | } 1979 | }, 1980 | "png-js": { 1981 | "version": "0.1.1", 1982 | "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", 1983 | "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=", 1984 | "dev": true 1985 | }, 1986 | "prebuild-install": { 1987 | "version": "6.1.3", 1988 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", 1989 | "integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", 1990 | "requires": { 1991 | "detect-libc": "^1.0.3", 1992 | "expand-template": "^2.0.3", 1993 | "github-from-package": "0.0.0", 1994 | "minimist": "^1.2.3", 1995 | "mkdirp-classic": "^0.5.3", 1996 | "napi-build-utils": "^1.0.1", 1997 | "node-abi": "^2.21.0", 1998 | "npmlog": "^4.0.1", 1999 | "pump": "^3.0.0", 2000 | "rc": "^1.2.7", 2001 | "simple-get": "^3.0.3", 2002 | "tar-fs": "^2.0.0", 2003 | "tunnel-agent": "^0.6.0" 2004 | } 2005 | }, 2006 | "process-nextick-args": { 2007 | "version": "2.0.1", 2008 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2009 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2010 | }, 2011 | "pump": { 2012 | "version": "3.0.0", 2013 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2014 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2015 | "requires": { 2016 | "end-of-stream": "^1.1.0", 2017 | "once": "^1.3.1" 2018 | } 2019 | }, 2020 | "rc": { 2021 | "version": "1.2.8", 2022 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2023 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2024 | "requires": { 2025 | "deep-extend": "^0.6.0", 2026 | "ini": "~1.3.0", 2027 | "minimist": "^1.2.0", 2028 | "strip-json-comments": "~2.0.1" 2029 | } 2030 | }, 2031 | "readable-stream": { 2032 | "version": "1.0.34", 2033 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2034 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 2035 | "dev": true, 2036 | "requires": { 2037 | "core-util-is": "~1.0.0", 2038 | "inherits": "~2.0.1", 2039 | "isarray": "0.0.1", 2040 | "string_decoder": "~0.10.x" 2041 | } 2042 | }, 2043 | "redeyed": { 2044 | "version": "2.1.1", 2045 | "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", 2046 | "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", 2047 | "dev": true, 2048 | "requires": { 2049 | "esprima": "~4.0.0" 2050 | } 2051 | }, 2052 | "safe-buffer": { 2053 | "version": "5.2.1", 2054 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2055 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2056 | }, 2057 | "sax": { 2058 | "version": "1.2.4", 2059 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2060 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 2061 | "dev": true 2062 | }, 2063 | "semver": { 2064 | "version": "5.7.1", 2065 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2066 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2067 | }, 2068 | "set-blocking": { 2069 | "version": "2.0.0", 2070 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2071 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2072 | }, 2073 | "signal-exit": { 2074 | "version": "3.0.3", 2075 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2076 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 2077 | }, 2078 | "simple-concat": { 2079 | "version": "1.0.1", 2080 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2081 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 2082 | }, 2083 | "simple-get": { 2084 | "version": "3.1.0", 2085 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 2086 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 2087 | "requires": { 2088 | "decompress-response": "^4.2.0", 2089 | "once": "^1.3.1", 2090 | "simple-concat": "^1.0.0" 2091 | } 2092 | }, 2093 | "sparkline": { 2094 | "version": "0.1.2", 2095 | "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz", 2096 | "integrity": "sha1-w73kYlKxNU5xDEsgDVSBa9nwejI=", 2097 | "dev": true, 2098 | "requires": { 2099 | "here": "0.0.2", 2100 | "nopt": "~2.1.2" 2101 | } 2102 | }, 2103 | "string_decoder": { 2104 | "version": "0.10.31", 2105 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2106 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2107 | "dev": true 2108 | }, 2109 | "string-width": { 2110 | "version": "1.0.2", 2111 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2112 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2113 | "requires": { 2114 | "code-point-at": "^1.0.0", 2115 | "is-fullwidth-code-point": "^1.0.0", 2116 | "strip-ansi": "^3.0.0" 2117 | } 2118 | }, 2119 | "strip-ansi": { 2120 | "version": "3.0.1", 2121 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2122 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2123 | "requires": { 2124 | "ansi-regex": "^2.0.0" 2125 | } 2126 | }, 2127 | "strip-json-comments": { 2128 | "version": "2.0.1", 2129 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2130 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2131 | }, 2132 | "supports-color": { 2133 | "version": "2.0.0", 2134 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2135 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2136 | "dev": true 2137 | }, 2138 | "supports-hyperlinks": { 2139 | "version": "2.2.0", 2140 | "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", 2141 | "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", 2142 | "dev": true, 2143 | "requires": { 2144 | "has-flag": "^4.0.0", 2145 | "supports-color": "^7.0.0" 2146 | }, 2147 | "dependencies": { 2148 | "supports-color": { 2149 | "version": "7.2.0", 2150 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2151 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2152 | "dev": true, 2153 | "requires": { 2154 | "has-flag": "^4.0.0" 2155 | } 2156 | } 2157 | } 2158 | }, 2159 | "tar-fs": { 2160 | "version": "2.1.1", 2161 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 2162 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 2163 | "requires": { 2164 | "chownr": "^1.1.1", 2165 | "mkdirp-classic": "^0.5.2", 2166 | "pump": "^3.0.0", 2167 | "tar-stream": "^2.1.4" 2168 | } 2169 | }, 2170 | "tar-stream": { 2171 | "version": "2.2.0", 2172 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2173 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2174 | "requires": { 2175 | "bl": "^4.0.3", 2176 | "end-of-stream": "^1.4.1", 2177 | "fs-constants": "^1.0.0", 2178 | "inherits": "^2.0.3", 2179 | "readable-stream": "^3.1.1" 2180 | }, 2181 | "dependencies": { 2182 | "readable-stream": { 2183 | "version": "3.6.0", 2184 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2185 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2186 | "requires": { 2187 | "inherits": "^2.0.3", 2188 | "string_decoder": "^1.1.1", 2189 | "util-deprecate": "^1.0.1" 2190 | } 2191 | }, 2192 | "string_decoder": { 2193 | "version": "1.3.0", 2194 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2195 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2196 | "requires": { 2197 | "safe-buffer": "~5.2.0" 2198 | } 2199 | } 2200 | } 2201 | }, 2202 | "term-canvas": { 2203 | "version": "0.0.5", 2204 | "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz", 2205 | "integrity": "sha1-WXr6wvpjaabxeGC86cX2bW6gypY=", 2206 | "dev": true 2207 | }, 2208 | "tunnel-agent": { 2209 | "version": "0.6.0", 2210 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2211 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2212 | "requires": { 2213 | "safe-buffer": "^5.0.1" 2214 | } 2215 | }, 2216 | "type-fest": { 2217 | "version": "0.21.3", 2218 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 2219 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 2220 | "dev": true 2221 | }, 2222 | "util-deprecate": { 2223 | "version": "1.0.2", 2224 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2225 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2226 | }, 2227 | "wide-align": { 2228 | "version": "1.1.3", 2229 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2230 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2231 | "requires": { 2232 | "string-width": "^1.0.2 || 2" 2233 | } 2234 | }, 2235 | "wordwrap": { 2236 | "version": "0.0.3", 2237 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2238 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2239 | "dev": true 2240 | }, 2241 | "wrappy": { 2242 | "version": "1.0.2", 2243 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2244 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2245 | }, 2246 | "x256": { 2247 | "version": "0.0.2", 2248 | "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", 2249 | "integrity": "sha1-ya8Yh296F1gB1WT+cK2egxd4STQ=", 2250 | "dev": true 2251 | }, 2252 | "xml2js": { 2253 | "version": "0.4.23", 2254 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 2255 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 2256 | "dev": true, 2257 | "requires": { 2258 | "sax": ">=0.6.0", 2259 | "xmlbuilder": "~11.0.0" 2260 | } 2261 | }, 2262 | "xmlbuilder": { 2263 | "version": "11.0.1", 2264 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 2265 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 2266 | "dev": true 2267 | } 2268 | } 2269 | } 2270 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mindwave", 3 | "version": "0.3.0", 4 | "type": "module", 5 | "author": { 6 | "email": "konsumer@jetboystudio.com", 7 | "name": "David Konsumer" 8 | }, 9 | "homepage": "https://github.com/konsumer/mindwave#readme", 10 | "source": "./index.js", 11 | "exports": "./dist/mindwave.modern.js", 12 | "main": "./dist/mindwave.cjs", 13 | "module": "./dist/mindwave.module.js", 14 | "unpkg": "./dist/mindwave.umd.js", 15 | "dependencies": { 16 | "@serialport/bindings": "^9.2.0", 17 | "@serialport/parser-delimiter": "^9.0.7", 18 | "@serialport/stream": "^9.0.7" 19 | }, 20 | "description": "A cross-platform driver for bluetooth Neurosky Mindwave headsets", 21 | "keywords": [ 22 | "brainwave", 23 | "mindwav2e", 24 | "neurosky" 25 | ], 26 | "license": "MIT", 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/brainbang/mindwave.git" 30 | }, 31 | "devDependencies": { 32 | "blessed": "^0.1.81", 33 | "blessed-contrib": "^4.10.1", 34 | "emitonoff": "^0.1.0", 35 | "ieee754": "^1.2.1" 36 | }, 37 | "scripts": { 38 | "build": "npx microbundle", 39 | "test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' npx jest", 40 | "prepublishOnly": "npm run build" 41 | }, 42 | "files": [ 43 | "./index.js", 44 | "./dist/mindwave.cjs", 45 | "./dist/mindwave.cjs.map", 46 | "./dist/mindwave.modern.js", 47 | "./dist/mindwave.modern.js.map", 48 | "./dist/mindwave.module.js", 49 | "./dist/mindwave.module.js.map", 50 | "./dist/mindwave.umd.js", 51 | "./dist/mindwave.umd.js.map" 52 | ] 53 | } 54 | -------------------------------------------------------------------------------- /test/__snapshots__/test.js.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`mindwave parse buffer from docs 1`] = ` 4 | Object { 5 | "attention": 18, 6 | "battery": 99.21259842519684, 7 | "meditation": 96, 8 | "signal": 12.549019607843137, 9 | } 10 | `; 11 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | /* global describe, test, expect */ 2 | import { Mindwave } from '../index.js' 3 | import { getScaledValue, toUInt24, toUInt16, toInt16, toFloat32 } from '../math.js' 4 | 5 | // this was the example in the docs 6 | // since serial splits message up correctly, I just include the main packet 7 | const testBuffer = Buffer.from([ 8 | 0x02, // [CODE] POOR_SIGNAL Quality 9 | 0x20, // Some poor signal detected (32/255) 10 | 0x01, // [CODE] BATTERY Level 11 | 0x7E, // Almost full 3V of battery (126/127) 12 | 0x04, // [CODE] ATTENTION eSense 13 | 0x12, // eSense Attention level of 18% 14 | 0x05, // [CODE] MEDITATION eSense 15 | 0x60 // eSense Meditation level of 96% 16 | ]) 17 | 18 | describe('mindwave', () => { 19 | test('calculate checksum', () => { 20 | expect(Mindwave.checksum(testBuffer)).toBe(0xE3) 21 | }) 22 | 23 | test('parse buffer from docs', () => { 24 | expect(Mindwave.parse(testBuffer)).toMatchSnapshot() 25 | }) 26 | 27 | test('guess correct serial-port', async () => { 28 | expect(await Mindwave.getSerialPath('linux')).toBe('/dev/rfcomm0') 29 | expect(await Mindwave.getSerialPath('nooneeverheardof')).toBe('/dev/rfcomm0') 30 | expect(await Mindwave.getSerialPath('darwin')).toBe('/dev/tty.MindWaveMobile-DevA') 31 | expect(await Mindwave.getSerialPath('win32')).toBe('COM4') 32 | }) 33 | }) 34 | 35 | describe('math', () => { 36 | test('scale values correctly', () => { 37 | expect(getScaledValue(50, 0, 100)).toBe(50) 38 | expect(getScaledValue(50, 0, 200)).toBe(25) 39 | expect(getScaledValue(50, 100, 200)).toBe(-50) 40 | expect(getScaledValue(50, 0, 100, 100, 200)).toBe(150) 41 | expect(getScaledValue(50, 0, 100, 0, 300)).toBe(150) 42 | expect(getScaledValue(0, -100, 100)).toBe(50) 43 | }) 44 | 45 | // I use node's buffer to test my implementations 46 | 47 | describe('toInt16', () => { 48 | test('should error on non-2 bytes', () => { 49 | expect(() => toInt16([0, 0, 0])).toThrow('Byte-length not divisible by 2.') 50 | }) 51 | 52 | test('should handle 0,0', () => { 53 | const b = [0, 0] 54 | expect(toInt16(b)).toBe(Buffer.from(b).readInt16BE()) 55 | }) 56 | 57 | test('should handle 1,0', () => { 58 | const b = [1, 0] 59 | expect(toInt16(b)).toBe(Buffer.from(b).readInt16BE()) 60 | }) 61 | 62 | test('should handle 1,1', () => { 63 | const b = [1, 1] 64 | expect(toInt16(b)).toBe(Buffer.from(b).readInt16BE()) 65 | }) 66 | 67 | test('should handle 1,5', () => { 68 | const b = [1, 5] 69 | expect(toInt16(b)).toBe(Buffer.from(b).readInt16BE()) 70 | }) 71 | 72 | test('should handle 1,5,1,5', () => { 73 | const b = [1, 5, 1, 5] 74 | const r = toInt16(b) 75 | expect(r.length).toBe(2) 76 | expect(r[0]).toBe(Buffer.from(b).readInt16BE()) 77 | expect(r[1]).toBe(Buffer.from(b).readInt16BE(2)) 78 | }) 79 | }) 80 | 81 | describe('toUInt16', () => { 82 | test('should error on non-2 bytes', () => { 83 | expect(() => toUInt16([0, 0, 0])).toThrow('Byte-length not divisible by 2.') 84 | }) 85 | 86 | test('should handle 0,0', () => { 87 | const b = [0, 0] 88 | expect(toUInt16(b)).toBe(Buffer.from(b).readUInt16BE()) 89 | }) 90 | 91 | test('should handle 1,0', () => { 92 | const b = [1, 0] 93 | expect(toUInt16(b)).toBe(Buffer.from(b).readUInt16BE()) 94 | }) 95 | 96 | test('should handle 1,1', () => { 97 | const b = [1, 1] 98 | expect(toUInt16(b)).toBe(Buffer.from(b).readUInt16BE()) 99 | }) 100 | 101 | test('should handle 1,5', () => { 102 | const b = [1, 5] 103 | expect(toUInt16(b)).toBe(Buffer.from(b).readUInt16BE()) 104 | }) 105 | 106 | test('should handle 1,5,1,5', () => { 107 | const b = [1, 5, 1, 5] 108 | const r = toUInt16(b) 109 | expect(r.length).toBe(2) 110 | expect(r[0]).toBe(Buffer.from(b).readUInt16BE()) 111 | expect(r[1]).toBe(Buffer.from(b).readUInt16BE(2)) 112 | }) 113 | }) 114 | 115 | describe('toUInt24', () => { 116 | test('should error on non-3 bytes', () => { 117 | expect(() => toUInt24([0])).toThrow('Byte-length not divisible by 3.') 118 | }) 119 | 120 | test('should handle 0,0,0', () => { 121 | const b = [0, 0, 0] 122 | expect(toUInt24(b)).toBe(Buffer.from(b).readIntBE(0, 3)) 123 | }) 124 | 125 | test('should handle 1,1,1', () => { 126 | const b = [1, 1, 1] 127 | expect(toUInt24(b)).toBe(Buffer.from(b).readIntBE(0, 3)) 128 | }) 129 | 130 | test('should handle 1,5,1', () => { 131 | const b = [1, 5, 1] 132 | expect(toUInt24(b)).toBe(Buffer.from(b).readIntBE(0, 3)) 133 | }) 134 | 135 | test('should handle 5,5,7', () => { 136 | const b = [5, 5, 7] 137 | expect(toUInt24(b)).toBe(Buffer.from(b).readIntBE(0, 3)) 138 | }) 139 | 140 | test('should handle 5,5,7,5,5,0', () => { 141 | const b = [5, 5, 7, 5, 5, 0] 142 | const r = toUInt24(b) 143 | expect(r.length).toBe(2) 144 | expect(r[0]).toBe(Buffer.from(b).readIntBE(0, 3)) 145 | expect(r[1]).toBe(Buffer.from(b).readIntBE(3, 3)) 146 | }) 147 | }) 148 | 149 | describe('toFloat32', () => { 150 | test('should error on non-4 bytes', () => { 151 | expect(() => toFloat32([0])).toThrow('Byte-length not divisible by 4.') 152 | }) 153 | 154 | test('should handle 0,0,0,0', () => { 155 | const b = [0, 0, 0, 0] 156 | expect(toFloat32(b)).toBe(Buffer.from(b).readFloatBE()) 157 | }) 158 | 159 | test('should handle 1,1,1,1', () => { 160 | const b = [1, 1, 1, 1] 161 | expect(toFloat32(b)).toBe(Buffer.from(b).readFloatBE()) 162 | }) 163 | 164 | test('should handle 5,1,0,1', () => { 165 | const b = [5, 1, 0, 1] 166 | expect(toFloat32(b)).toBe(Buffer.from(b).readFloatBE()) 167 | }) 168 | 169 | test('should handle 5,1,0,1,6,5,3,2', () => { 170 | const b = [5, 1, 0, 1, 6, 5, 3, 2] 171 | const r = toFloat32(b) 172 | expect(r.length).toBe(2) 173 | expect(r[0]).toBe(Buffer.from(b).readFloatBE()) 174 | expect(r[1]).toBe(Buffer.from(b).readFloatBE(4)) 175 | }) 176 | }) 177 | }) 178 | --------------------------------------------------------------------------------