diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index abfef30..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,466 +0,0 @@ -OneFinity CNC Controller Firmware Changelog -=========================================== - -## v1.0.8 - - Fixed chatter and lost steps issues (most commonly seen by Fusion users), re-enabled support for G61, G61.1, G64. - - Fixed 3d preview on Safari-based web browsers (MacOS & iOS) - - Made it less likely for a user to upload a non-gcode file - - Fixed problems with UI freezing when attempting to process a non-gcode file - - Simplified error popup to make it less confusing - - Improved error messages for most internal errors - -## v1.0.7 - - Cleaned up UI layout a bit on the main screen - - Enabled auto expansion of partition and file system to fill SD card on first boot - - Added probe continuity test before probing (pop-up dialog) - - Added a popup after probing, reminding the user to put away the probe - - Lowered default probe seek speed - - Fixed file drop-down menu showing old files - - Added file system watcher for uploaded files - - Improved support for large gcode files, improves performance on Raspi - - Fixed a bug where the UI could become unresponsive at boot, or when uploading the first gcode file - - Changed default max-deviation to 0.001 to reduce issues with chattering while cutting arcs and circles - - Hides ratpoison (window manager) message during boot up - - Disabled G61, G61.1, G64 gcodes until the root cause of circle chatter is identified and fixed - - Increased icon size on the main GUI - - Improved version comparison logic for handling public beta releases in the future - - Changed default max-jerk to 1000 for X/Y axes - - Changed default idle current to 1A - - Force-set some critical configuration values to help with reliability - - Metric units only for junction-accel and max-deviation - - Rewrote the homing procedure to be more consistent - - Small improvements to the stall homing procedure - - Fixed error messages in the console (webgl) - - Fixed styling bug with error dialog - - Added a setting to allow enable/disable of probing safety prompts - -## v1.0.6 - - Tweaked stall homing procedure to clear stepper stall condition before homing - - Modified motor homing parameters (8 microsteps, 1.688 m/min search velocity, 2 stall volts, 1 stall current, 1.5mm zero backoff) - - Added pop up message while loading/simulating file on upload - - Decreased max velocity in default settings for X and Y axes - - Restored jerk to 1000 on all axes - - Fixed issue with default units not displaying on Control page (thanks to Robin Goldstone) - -## v1.0.5 - - Changed the jog commands so that save/restore modal states are not used to avoid situation where spindle/loads could - turn back on if the stop button was used instead of the M5/M9 gcode commands. - - Added tool path status to control page - - Moved over/under/no-fit warnings to tool status from machine status - - Added "home machine" pop up on start if the machine is not homed - - Added confirmation for X0Y0 and Z0 buttons - -## v1.0.4 - - Fixed text sticking out of some dialog boxes - - Added changes to PWR microcontroller to support new precharge circuitry on V3 of the PCB - - Added a Shutdown button under the menu - - Added confirmation dialog to shutdown - - Fixed Reset Defaults for OneFinity settings - - Probe buttons now turn green when probe input is active - - Added defaults for both machinist and woodworker machines - - Re-activated "Upgrade" button under Admin to grab updates directly from the web - -## v1.0.3 - - Changed upgrade scripts to point at OneFinity github repository - - Upgrade function not yet fully implemented - -## v1.0.2 - - Initial release of customized OneFinity firmware - - Includes GUI customizations, stall homing - -Note: This firmware was forked from version 0.4.14 of the Buildbotics firmware - -Buildbotics CNC Controller Firmware Changelog -============================================= - -## v0.4.14 - - Handle file uploads with '#' or '?' in the name. - - Added "step mode" to Web based jogging. - - Fixed touch screen Web jogging. - -## v0.4.13 - - Support for OMRON MX2 VFD. - - Better error handling in WiFi configuration. - - Fix open WiFi access. - - Improved video camera performance. - - Allow up to 4 camera clients at once. - - Add axis bounds GCode variables ``#<_x_min>``, ``#<_x_max>``, etc. - - Expose ``junction-accel`` planning parameter. - - Fixed problem with manual firmware upload on OSX. - - Ignore cameras that do not support MJPEG format video. - -## v0.4.12 - - Segments straddle arc in linearization. - - Control max-arc-error with GCode var. - - Implemented path modes G61, G61.1 & G64 with naive CAM and basic blending. - - Log GCode messages to "Messages" tab. - - Acknowledging a message on one browser clears it for all. - - Automatically reload Web view when file changes. - - Added ``config-screen`` script. Web based screen config to come later. - - Suppress message popup with (MSG,# No popup message). - - Show latest GCode message in ``Message`` field on CONTROL page. - - Marked several GCodes supported in cheat sheet. - - Solved planner lookahead failure for most reasonable cases. - - Prevent cutting off distant parts of 3D path view. - - Raised default ``latch-backoff`` to 100mm and ``zero-backoff`` to 5mm. - - Added ``max-deviation`` option. - - Fixed problem with GCode boolean expression parsing. #232. - - Ensure 2uS step pulse width. - -## v0.4.11 - - Don't reset global offsets on M2. - - Test shunt and show error on failure. - - Report spindle status codes from Modbus. - - Save more log files in bug report. - - Fixed indicators low-side units. - - Support for YL600, YL620 & YL620-A VFDs. - - Move Modbus indicators to tool page. - - Support for Sunfar E300 VFD. - - Set GCODE_SCRIPT_PATH to support GCode file routines. - - Fix pause bug introduced in v0.4.10. - -## v0.4.10 - - Fix demo password check - - Fix bug were fast clicks could cause jog commands to arrive out of order. - - Fix bug where planner position may not sync after jog. - - Show power shutdown on indicators page. - - Show all motors in shutdown when in power shutdown. - - Improved GCode error messages. - - Put controller into estop when in power shutdown. - -## v0.4.9 - - Enforce 6A per motor channel peak current limit. - - Adjust config values above max or below min instead of resetting to default. - -## v0.4.8 - - Fixed log rotating. - - Use systemd service instead of init.d. - - Fix planner terminate. - - Changed AVR serial interrupt priorites. - - Increased AVR serial and command buffers. - - Boost HDMI signal. - - Rewrote RPi serial driver. - - Automatically scale max CPU speed to reduce RPi temp. - - Disable USB camera if RPi temperature above 80°C, back on at 75°C. - - Respect offsets in canned cycle moves. #219 - - Fixed G53 warning. - - Fixed delayed offset update after M2 or M30 end of program. - - Handle multiple consecutive config resets correctly. - - Fixed log CPU usage problem introduced in v0.4.6. - - Show RPi temp on indicators page. - - Show red thermometer if RPi temp exceeds 80°C. - -## v0.4.7 - - Fix homing switch to motor channel mapping with non-standard axis order. - - Added ``switch-debounce`` and ``switch-lockout`` config options. - - Handle corrupt GCode simulation data correctly. - - Fixes for exception logging. - - Always limit motor max-velocity. #209 - - Sync GCode and planner files to disk after write. - - Added warning about reliability in a noisy environment on WiFi config page. - - EStop on motor fault. - - Fixed ETA line wrapping on Web interface. - - Fixed zeroing with non-zero offset when unhomed. #211 - - Handle file paths uploaded from Windows correctly. #212 - - Don't retain estop state through reboot. - - Log when RPi gets hot. - - Support Modbus multi-write mode. - - Added support for Nowforever VFDs. - -## v0.4.6 - - Fixed a rare ``Negative s-curve time`` error. - - Don't allow manual axis homing when soft limits are not set. - - Right click to enable camera crosshair. - - Demo mode. - - Limit idle-current to 2A. - - Removed dangerous ``power-mode`` in favor of simpler ``enabled`` option. - - Fixed bug where motor driver could fail to disabled during estop. - - Restored estop text. - -## v0.4.5 - - Fix for random errors while running VFD. - - Fix bug where planner would not continue after optional pause (M1). - - Fix lockup on invalid no move probe G38.x. #183 - - Fix zeroing homed axis after jog. - - Fix VFD communication at higher baud rates (> 9600). #184 - -## v0.4.4 - - Write version to log file. - - Write time to log file periodically. - - Show simulation progress with or with out 3D view. - - Synchronize file list between browsers. - - Increased max simulation time to 24hrs. - - Added button to download current GCode file. - - Blink play button to indicate pause. - - Many layout tweaks/improvements. - - Don't abort simulations when system time changes. - - Only allow one camera stream at a time. - -## v0.4.2 - - Suppress ``Auto-creating missing tool`` warning. - - Prevent ``Stream is closed`` error. - - Suppress ``WebGL not supported`` warning. - - Fixed Web disconnect during simulation of large GCode. - - Disable outputs on estop. - - Improved switch debouncing for better homing. - - Handle zero length dwell correctly. - - Fixed problem with cached GCode file upload when file changed on disk. - - Run simulation at low process priority. - - Added ``Bug Report`` button to ``Admin`` -> ``General``. - - Only render 3D view as needed to save CPU. - - Prevent lockup due to browser causing out of memory condition. - - Show error message when too large GCode upload fails. - - Much faster 3D view loading. - -## v0.4.1 - - Fix toolpath view axes bug. - - Added LASER intensity view. - - Fixed reverse path planner bug. - - Video size and path view controls persistent over browser reload. - - Fixed time and progress bugs. - - Added PWM rapid auto off feature for LASER/Plasma. - - Added dynamic PWM for LASER/Plasma. - - Added motor faults table to indicators page. - - Emit error and indicate FAULT on axis for motor driver faults. - - Display axis motor FAULT on LCD. - - Fixed bug with rapid repeated unpause. - -## v0.4.0 - - Increased display precision of position and motor config. - - Added support for 256 microstepping. - - Smoother operation at 250k step rate by doubling clock as needed. - - Indicators tab improvements. - - Much improved camera support. - - Camera hotpluging. - - Move camera video to header. - - Click to switch video size. - - Automount/unmount USB drives. - - Automatically install ``buildbotics.gc`` when no other GCode exists. - - Preplan GCode and check for errors. - - Display 3D view of program tool paths in browser. - - Display accurate time remaining, ETA and progress during run. - - Automatically collapse moves in planner which are too short in time. - - Show IO status indicators on configuration pages. - - Check that axis dimensions fit path plan dimensions. - - Show machine working envelope in path plan viewer. - - Don't reload browser view on reconnect unless controller has reloaded. - - Increased max switch backoff search distance. - - Major improvements for LASER raster GCodes. - - Fixed major bug in command queuing. - - Ignore Program Number O-Codes. - - Improved planning of collinear line segments. - - Allow PWM output up to 320kHz and no slower than 8Hz. - -## v0.3.28 - - Show step rate on motor configuration page. - - Limit motor max-velocity such that step rate cannot exceed 250k. - - Fixed deceleration bug at full 250k step rate. - -## v0.3.27 - - Fixed homing in imperial mode. - -## v0.3.26 - - Removed VFD test. - - Show VFD status on configuration page. - - Show VFD commands fail counts. - - Marked some VFD types as beta. - -## v0.3.25 - - Error on home if max-soft-limit <= min-soft-limit + 1. #139 - - Decrease boot time networking delay. - - Default to US keyboard layout. #145 - - Added configuration option to show metric or imperial units in browser. #74 - - Implemented fine jogging control in Web interface. #147 - -## v0.3.24 - - Added unhome button on axis position popup. - - Ignore soft limits of max <= min. - - Fixed problem with restarting program in imperial units mode. - - Handle GCode with infinite or very long loops correctly. - - Fixed Huanyang spindle restart after stop. - -## v0.3.23 - - Fix for modbus read operation. - - Finalized AC-Tech VFD support. - - Preliminary FR-D700 VFD support. - - Ignore leading zeros in modbus messages. - - Handle older PWR firmwares. - -## v0.3.22 - - Fix position loss after program pause. #130 - - Correctly handle disabled axes. - - Fixed config checkbox not displaying defaulted enabled correctly. - - Added Custom Modbus VFD programming. - -## v0.3.21 - - Implemented M70-M73 modal state save/restore. - - Added support for modbus VFDs. - - Start Huanyang spindle with out first pressing Start button on VFD. - - Faster switching of large GCode files in Web. - - Fixed reported gcode line off by one. - - Disable MDI input while running. - - Stabilized direction pin output during slow moves. - -## v0.3.20 - - Eliminated drift caused by miscounting half microsteps. - - Fixed disappearing GCode in Web. - - More efficient GCode scrolling with very large files. - - Fully functional soft-limited jogging. - - Added client and access-point Wifi configuration. - - Fixed broken hostname Web redirect after change. - - Split admin page -> General & Network. - - Improved calculation of junction velocity limits. - -## v0.3.19 - - Fixed stopping problems. #127 - - Fixed ``Negative s-curve time`` error. - - Improved jogging with soft limits. - - Added site favicon. - - Fixed problems with offsets and imperial units. - - Fixed ``All zero s-curve times`` caused by extremely short, non-zero moves. - - Fixed position drift. - -## v0.3.18 - - Don't enable any tool by default. - -## v0.3.17 - - Fixed pausing fail near end of run bug. - - Show "Upgrading firmware" when upgrading. - - Log excessive pwr communication failures as errors. - - Ensure we can still get out of non-idle cycles when there are errors. - - Less frequent pwr variable updates. - - Stop cancels seek and subsequent estop. - - Fixed bug in AVR/Planner command synchronization. - - Consistently display HOMING state during homing operation. - - Homing zeros axis global offset. - - Added zero all button. #126 - - Separate "Auto" and "MDI" play/pause & stop buttons. #126 - - Moved home all button. #126 - - Display "Video camera not found." instead of broken image icon. - - Show offset positions not absolute on LCD. - - Don't change gcode lines while homing. - - Don't change button states while homing. - - Adding warning about power cyclying during an upgrade. - - Reset planner on AVR errors. - - Fixed pausing with short moves. - - Corrected s-curve accel increasing jogging velocities. - -## v0.3.16 - - Fixed switch debounce bug. - -## v0.3.15 - - Suppress warning missing config.json warning after config reset. - - Fixed EStop reboot loop. - - Removed AVR unexpected reboot error. - -## v0.3.14 - - Fixed: Config fails silently after web disconnect #112 - - Always reload the page after a disconnect. - - Honor soft limits #111 (but not when jogging) - - Limit switch going active while moving causes estop. #54 - - Added more links to help page. - - Fixed axis display on LCD. #122 - - Added GCode cheat sheet. - - Fixed LCD boot splash screen. #121 - - Implemented tool change procedures and pause message box. #81 - - Implemented program start and end procedures. - -## v0.3.13 - - Disable spindle and loads on stop. - - Fixed several state transition (stop, pause, estop, etc.) problems. - -## v0.3.12 - - Updated DB25 M2 breakout diagram. - - Enabled AVR watchdog. - - Fixed problem with selecting newly uploaded file. - - More thorough shutdown of stepper driver in estop. - - Fixed spindle type specific options. - - No more ``Unexpected AVR firmware reboot`` errors on estop clear. - - Downgraded ``Machine alarmed - Command not processed`` errors to warnings. - - Suppress unnecessary axis homing warnings. - - More details for axis homing errors. - - Support GCode messages e.g. (MSG, Hello World!) - - Support programmed pauses. i.e. M0 - -## v0.3.11 - - Suppressed ``firmware rebooted`` warning. - - Error on unexpected AVR reboot. - - Fixed pin fault output. - - No longer using interrupts for switch inputs. Debouncing on clock tick. - -## v0.3.10 - - Fixed "Flood" display, changed to "Load 1" and "Load 2". #108 - - Highlight loads when on. - - Fixed axis zeroing. - - Fixed bug in home position set after successful home. #109 - - Fixed ugly Web error dumps. - - Allow access to log file from Web. - - Rotate log so it does not grow too big. - - Keep same GCode file through browser reload. #20 - -## v0.3.9 - - Fixed bug in move exec that was causing bumping between moves. - - Fixed planner bug which could create negative s-curve times. - - Hide step and optional pause buttons until they are implemented. - - Fixed pausing problems. - - Limit number of console messages. - - Scrollbar on console view. - - Log debug messages to console in developer mode. - - Fixed AVR log message source. - - Fixed step correction. - - JOGGING, HOMMING and MDI states. - - Fixed position problem with rapid MDI entry. - -## v0.3.8 - - Fixed pwr flags display - - Added pwr fault flags to indicators - -## v0.3.7 - - Allow blocking error dialog for a period of time - - Show actual error message on planner errors - - Reset planner on serious error - - Fixed console clear - - Added helpful info to Video tab - - Changed "Console" tab to "Messages" - - Removed spin up/down velocity options, they don't do anything - - Allow RS485 to work when wires are swapped - - Allow setting VFD ID - - Only show relevant spindle config items - - More robust video camera reset - - Added help page - - Allow upgrade with out Internet - - Limit power fault reporting - - Added load over temp, load limiting and motor overload power faults - -## v0.3.6 - - Set max_usb_current=1 in /boot/config.txt from installer #103 - -## v0.3.5 - - Fixed dwell (G4) - - Always show limit switch indicators regardless of motor enable - - Fixed feed rate display - - Added current GCode unit display - - Fixed homed axis zeroing - - Fixed probe pin input - - Added reload button to video tab - - Don't open error dialog on repeat messages - - Handle large GCode files in browser - - Added max lookahead limit to planner - - Fixed GCode stopping/pausing where ramp down needs more than is in the queue - - Added breakout box diagram to indicators - - Initialize axes offsets to zero on startup - - Fixed conflict between ``x`` state variable and ``x`` axis variable - - Don't show ipv6 addresses on LCD. They don't fit. - -## v0.3.4 - - Added alternate units for motor parameters - - Automatic config file upgrading - - Fixed planner/jog sync - - Fixed planner limits config - - Accel units mm/min² -> m/min² - - Search and latch velocity mm/min -> m/min - - Fixed password update (broken in last version) - - Start Web server earlier in case of Python coding errors - - -Changelog not maintained in previous versions. See git commit log. diff --git a/CODE_TAG b/CODE_TAG deleted file mode 100644 index d36ffb0..0000000 --- a/CODE_TAG +++ /dev/null @@ -1,22 +0,0 @@ - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" diff --git a/Makefile b/Makefile index a6a6548..bfa1a8c 100644 --- a/Makefile +++ b/Makefile @@ -22,12 +22,8 @@ RSYNC_OPTS := $(RSYNC_EXCLUDE) -rv --no-g --delete --force VERSION := $(shell sed -n 's/^.*"version": "\([^"]*\)",.*$$/\1/p' package.json) PKG_NAME := bbctrl-$(VERSION) -PUB_PATH := root@buildbotics.com:/var/www/buildbotics.com/bbctrl -BETA_VERSION := $(VERSION)-rc$(shell ./scripts/next-rc) -BETA_PKG_NAME := bbctrl-$(BETA_VERSION) SUBPROJECTS := avr boot pwr jig -WATCH := src/pug src/pug/templates src/stylus src/js src/resources src/svelte-components src/static Makefile ifndef HOST HOST=onefinity @@ -37,16 +33,12 @@ ifndef PASSWORD PASSWORD=onefinity endif - all: $(HTML) $(RESOURCES) @for SUB in $(SUBPROJECTS); do $(MAKE) -C src/$$SUB; done pkg: all $(AVR_FIRMWARE) bbserial ./setup.py sdist -beta-pkg: pkg - cp dist/$(PKG_NAME).tar.bz2 dist/$(BETA_PKG_NAME).tar.bz2 - bbserial: $(MAKE) -C src/bbserial @@ -74,15 +66,6 @@ $(GPLAN_IMG): $(AVR_FIRMWARE): $(MAKE) -C src/avr -publish: pkg - echo -n $(VERSION) > dist/latest.txt - rsync $(RSYNC_OPTS) dist/$(PKG_NAME).tar.bz2 dist/latest.txt $(PUB_PATH)/ - -publish-beta: beta-pkg - echo -n $(BETA_VERSION) > dist/latest-beta.txt - rsync $(RSYNC_OPTS) dist/$(BETA_PKG_NAME).tar.bz2 dist/latest-beta.txt \ - $(PUB_PATH)/ - update: pkg http_proxy= curl -i -X PUT -H "Content-Type: multipart/form-data" \ -F "firmware=@dist/$(PKG_NAME).tar.bz2" -F "password=$(PASSWORD)" \ @@ -122,34 +105,4 @@ $(TARGET_DIR)/%.html: src/pug/%.pug node_modules FORCE @mkdir -p $(TARGET_DIR) $(PUG) -O pug-opts.js -P $< -o $(TARGET_DIR) || (rm -f $@; exit 1) -pylint: - pylint3 -E $(shell find src/py -name \*.py | grep -v flycheck_) - -jshint: - ./node_modules/jshint/bin/jshint --config jshint.json src/js/*.js - -lint: pylint jshint - -watch: - @clear - $(MAKE) - @while sleep 1; do \ - inotifywait -qr -e modify -e create -e delete \ - --exclude .*~ --exclude \#.* $(WATCH); \ - clear; \ - $(MAKE); \ - done - -tidy: - rm -f $(shell find "$(DIR)" -name \*~) - -clean: tidy - rm -rf build html dist - @for SUB in $(SUBPROJECTS); do \ - $(MAKE) -C src/$$SUB clean; \ - done - -dist-clean: clean - rm -rf node_modules - .PHONY: all install clean tidy pkg gplan lint pylint jshint bbserial diff --git a/package-lock.json b/package-lock.json index dbefd97..3833918 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "bbctrl", "version": "1.0.10b6", + "hasInstallScript": true, "license": "GPL-3.0+", "dependencies": { "browserify": "^17.0.0", diff --git a/package.json b/package.json index 0464291..f209545 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "homepage": "https://onefinitycnc.com/", "repository": "https://github.com/OneFinityCNC/onefinity", "license": "GPL-3.0+", + "scripts": { + "postinstall": "cd src/svelte-components && npm i" + }, "dependencies": { "browserify": "^17.0.0", "jshint": "^2.13.4", diff --git a/scripts/check-config-vars.py b/scripts/check-config-vars.py deleted file mode 100644 index 6fd567a..0000000 --- a/scripts/check-config-vars.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 - -'''Check that the configuration variable template used on the RPi matches the -variables used in the AVR''' - -import sys -import json - -templ = json.load(open('src/resources/config-template.json', 'r')) -vars = json.load(open('avr/build/vars.json', 'r')) - - -def check(section): - errors = 0 - - for name, entry in section.items(): - if 'type' in entry: - ok = False - - # TODO check that defaults are valid - # TODO check that types match - - if 'code' in entry and not entry['code'] in vars: - print('"%s" with code "%s" not found' % (name, entry['code'])) - - else: ok = True - - if not ok: errors += 1 - - else: errors += check(entry) - - return errors - - -errors = check(templ) -print('\n%d errors' % errors) -sys.exit(errors != 0) diff --git a/scripts/demo-chroot b/scripts/demo-chroot deleted file mode 100644 index 75e7578..0000000 --- a/scripts/demo-chroot +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -ex - -ROOT="$PWD/demo" - -# Clean up on EXIT -function cleanup { - umount "$ROOT"/{dev/pts,dev,sys,proc} 2>/dev/null || true -} -trap cleanup EXIT - -# mount binds -mount --bind /dev "$ROOT/dev/" -mount --bind /sys "$ROOT/sys/" -mount --bind /proc "$ROOT/proc/" -mount --bind /dev/pts "$ROOT/dev/pts" - -chroot "$ROOT" "$@" diff --git a/scripts/install.sh b/scripts/install.sh index a13d7ed..bf318dd 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -93,6 +93,14 @@ if [ $? -ne 0 ]; then REBOOT=true fi +# Set the default locale to en_US +grep '^en_US.UTF-8 UTF-8' /etc/locale.gen >/dev/null +if [ $? -ne 0 ]; then + perl -pi -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen + locale-gen en_US.UTF-8 + update-locale en_US.UTF-8 +fi + # Install .Xresources & .xinitrc cp scripts/Xresources ~pi/.Xresources chown pi:pi ~pi/.Xresources diff --git a/scripts/log-position-to-gcode b/scripts/log-position-to-gcode deleted file mode 100644 index 7597fb4..0000000 --- a/scripts/log-position-to-gcode +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python3 - -import json -import sys - -p = [0, 0, 0] - - -print('F400 G21') - -for line in sys.stdin: - try: - if not line.startswith('I:Comm:> '): continue - line = line[9:] - - data = json.loads(line) - - changed = False - for axis in range(3): - var = 'xyz'[axis] + 'p' - if var in data: - p[axis] = data[var] - changed = True - - if changed: print('G1 X%d Y%d Z%d' % tuple(p)) - - except json.decoder.JSONDecodeError: pass diff --git a/scripts/reset-video b/scripts/reset-video deleted file mode 100644 index 94b46cd..0000000 --- a/scripts/reset-video +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import subprocess -import os.path -import time - -if not os.path.exists('/dev/video0'): - print('/dev/video0 not found') - sys.exit(1) - -p = subprocess.Popen('udevadm info -q path /dev/video0'.split(), - stdout = subprocess.PIPE) -s = p.communicate()[0].decode('utf-8') -dev = s.split('/')[7] - -with open('/sys/bus/usb/drivers/usb/unbind', 'w') as f: - f.write(dev) - -time.sleep(1) - -with open('/sys/bus/usb/drivers/usb/bind', 'w') as f: - f.write(dev) diff --git a/scripts/ssh-bbctrl b/scripts/ssh-bbctrl deleted file mode 100644 index ad9ed9a..0000000 --- a/scripts/ssh-bbctrl +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -USER=bbmc -HOST=bbctrl.local - -if [ $# -eq 1 ]; then - if [[ "$1" = *@ ]]; then - LOGIN="$1" - else - LOGIN=$USER@"$1" - fi -else - LOGIN=$USER@$HOST -fi - -ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$LOGIN" diff --git a/scripts/svg2abs.js b/scripts/svg2abs.js deleted file mode 100644 index 7cfc6dd..0000000 --- a/scripts/svg2abs.js +++ /dev/null @@ -1,64 +0,0 @@ -function convertToAbsolute(path) { - var x0, y0, x1, y1, x2, y2, segs = path.pathSegList; - - for (var x = 0, y = 0, i = 0, len = segs.numberOfItems; i < len; i++) { - var seg = segs.getItem(i), c = seg.pathSegTypeAsLetter; - - if (/[MLHVCSQTA]/.test(c)){ - if ('x' in seg) x = seg.x; - if ('y' in seg) y = seg.y; - - } else { - if ('x1' in seg) x1 = x + seg.x1; - if ('x2' in seg) x2 = x + seg.x2; - if ('y1' in seg) y1 = y + seg.y1; - if ('y2' in seg) y2 = y + seg.y2; - if ('x' in seg) x += seg.x; - if ('y' in seg) y += seg.y; - - switch(c) { - case 'm': - segs.replaceItem(path.createSVGPathSegMovetoAbs(x, y), i); - break; - case 'l': - segs.replaceItem(path.createSVGPathSegLinetoAbs(x, y), i); - break; - case 'h': - segs.replaceItem(path.createSVGPathSegLinetoHorizontalAbs(x), i); - break; - case 'v': - segs.replaceItem(path.createSVGPathSegLinetoVerticalAbs(y), i); - break; - case 'c': - segs.replaceItem( - path.createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2), i); - break; - case 's': - segs.replaceItem( - path.createSVGPathSegCurvetoCubicSmoothAbs(x, y, x2, y2), i); - break; - case 'q': - segs.replaceItem( - path.createSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1), i); - break; - case 't': - segs.replaceItem( - path.createSVGPathSegCurvetoQuadraticSmoothAbs(x, y), i); - break; - case 'a': - segs.replaceItem( - path.createSVGPathSegArcAbs(x, y, seg.r1, seg.r2, seg.angle, - seg.largeArcFlag, seg.sweepFlag), i); - break; - - case 'z': case 'Z': - x = x0; - y = y0; - break; - } - } - - // Record the start of a subpath - if (c == 'M' || c == 'm') x0 = x, y0 = y; - } -} diff --git a/setup.py b/setup.py index d57ae67..7475c6d 100755 --- a/setup.py +++ b/setup.py @@ -32,7 +32,6 @@ setup( 'scripts/update-bbctrl', 'scripts/upgrade-bbctrl', 'scripts/sethostname', - 'scripts/reset-video', 'scripts/config-wifi', 'scripts/edit-config', 'scripts/edit-boot-config', diff --git a/src/py/bbctrl/AVREmu.py b/src/py/bbctrl/AVREmu.py deleted file mode 100644 index 05181af..0000000 --- a/src/py/bbctrl/AVREmu.py +++ /dev/null @@ -1,207 +0,0 @@ -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software is distributed in the hope that it will be useful, but # -# WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - -import os -import sys -import traceback -import signal - -import bbctrl -import bbctrl.Cmd as Cmd - - -class AVREmu(object): - def __init__(self, ctrl): - self.ctrl = ctrl - self.log = ctrl.log.get('AVREmu') - - self.avrOut = None - self.avrIn = None - self.i2cOut = None - self.read_cb = None - self.write_cb = None - self.pid = None - - - def close(self): - # Close pipes - def _close(fd, withHandle): - if fd is None: return - try: - if withHandle: self.ctrl.ioloop.remove_handler(fd) - except: pass - try: - os.close(fd) - except: pass - - _close(self.avrOut, True) - _close(self.avrIn, True) - _close(self.i2cOut, False) - - self.avrOut, self.avrIn, self.i2cOut = None, None, None - - # Kill process and wait for it - if self.pid is not None: - os.kill(self.pid, signal.SIGKILL) - os.waitpid(self.pid, 0) - self.pid = None - - - def _start(self): - try: - self.close() - - # Create pipes - stdinFDs = os.pipe() - stdoutFDs = os.pipe() - i2cFDs = os.pipe() - - self.pid = os.fork() - - if not self.pid: - # Dup child ends - os.dup2(stdinFDs[0], 0) - os.dup2(stdoutFDs[1], 1) - os.dup2(i2cFDs[0], 3) - - # Close orig fds - os.close(stdinFDs[0]) - os.close(stdoutFDs[1]) - os.close(i2cFDs[0]) - - # Close parent ends - os.close(stdinFDs[1]) - os.close(stdoutFDs[0]) - os.close(i2cFDs[1]) - - cmd = ['bbemu'] - if self.ctrl.args.fast_emu: cmd.append('--fast') - - os.execvp(cmd[0], cmd) - os._exit(1) # In case of failure - - # Parent, close child ends - os.close(stdinFDs[0]) - os.close(stdoutFDs[1]) - os.close(i2cFDs[0]) - - # Non-blocking IO - os.set_blocking(stdinFDs[1], False) - os.set_blocking(stdoutFDs[0], False) - os.set_blocking(i2cFDs[1], False) - - self.avrOut = stdinFDs[1] - self.avrIn = stdoutFDs[0] - self.i2cOut = i2cFDs[1] - - ioloop = self.ctrl.ioloop - ioloop.add_handler(self.avrOut, self._avr_write_handler, - ioloop.WRITE | ioloop.ERROR) - ioloop.add_handler(self.avrIn, self._avr_read_handler, - ioloop.READ | ioloop.ERROR) - - self.write_enabled = True - - except Exception: - self.close() - self.log.exception('Internal error: Failed to start bbemu') - - - def set_handlers(self, read_cb, write_cb): - if self.read_cb is not None or self.write_cb is not None: - raise Exception('AVR handler already set') - - self.read_cb = read_cb - self.write_cb = write_cb - self._start() - - - def enable_write(self, enable): - if self.avrOut is None: return - - flags = self.ctrl.ioloop.WRITE if enable else 0 - self.ctrl.ioloop.update_handler(self.avrOut, flags) - self.write_enabled = enable - - - def _avr_write(self, data): - try: - length = os.write(self.avrOut, data) - self.continue_write = length and length == len(data) - return length - - except BlockingIOError: pass - except BrokenPipeError: pass - - return 0 - - - def _avr_write_handler(self, fd, events): - if self.avrOut is None: return - - if events & self.ctrl.ioloop.ERROR: - self._start() - return - - try: - while True: - self.continue_write = False - self.write_cb(self._avr_write) - if not self.continue_write: break - - except Exception as e: - self.log.warning('AVR write handler error: %s', - traceback.format_exc()) - - - def _avr_read_handler(self, fd, events): - if self.avrIn is None: return - - if events & self.ctrl.ioloop.ERROR: - self._start() - return - - try: - data = os.read(self.avrIn, 4096) - if data is not None: self.read_cb(data) - - except Exception as e: - self.log.warning('AVR read handler error: %s %s' % - (data, traceback.format_exc())) - - - def i2c_command(self, cmd, byte = None, word = None, block = None): - if byte is not None: data = chr(byte) - elif word is not None: data = word - elif block is not None: data = block - else: data = '' - - try: - if self.i2cOut is not None: - os.write(self.i2cOut, bytes(cmd + data + '\n', 'utf-8')) - - except BrokenPipeError: pass diff --git a/src/py/bbctrl/Ctrl.py b/src/py/bbctrl/Ctrl.py index f66f39d..31728c7 100644 --- a/src/py/bbctrl/Ctrl.py +++ b/src/py/bbctrl/Ctrl.py @@ -25,10 +25,7 @@ class Ctrl(object): self.log.get('Ctrl').info('Starting %s' % self.id) try: - if args.demo: - self.avr = bbctrl.AVREmu(self) - else: - self.avr = bbctrl.AVR(self) + self.avr = bbctrl.AVR(self) self.i2c = bbctrl.I2C(args.i2c_port, args.demo) self.mach = bbctrl.Mach(self, self.avr) diff --git a/src/py/bbctrl/ObjGraph.py b/src/py/bbctrl/ObjGraph.py deleted file mode 100644 index 7957bbb..0000000 --- a/src/py/bbctrl/ObjGraph.py +++ /dev/null @@ -1,1223 +0,0 @@ -""" -Tools for drawing Python object reference graphs with graphviz. - -You can find documentation online at https://mg.pov.lt/objgraph/ - -Copyright (c) 2008-2017 Marius Gedminas and contributors - -Released under the MIT licence. -""" -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -from __future__ import print_function - -import codecs -import collections -import gc -import re -import inspect -import types -import operator -import os -import subprocess -import tempfile -import sys -import itertools - -try: - # Python 2.x compatibility - from StringIO import StringIO -except ImportError: - from io import StringIO - -try: - from types import InstanceType -except ImportError: - # Python 3.x compatibility - InstanceType = None - - -__author__ = "Marius Gedminas (marius@gedmin.as)" -__copyright__ = "Copyright (c) 2008-2017 Marius Gedminas and contributors" -__license__ = "MIT" -__version__ = '3.4.1.dev0' -__date__ = '2018-02-13' - - -try: - basestring -except NameError: - # Python 3.x compatibility - basestring = str - -try: - iteritems = dict.iteritems -except AttributeError: - # Python 3.x compatibility - iteritems = dict.items - -IS_INTERACTIVE = False -try: # pragma: nocover - import graphviz - if get_ipython().__class__.__name__ != 'TerminalInteractiveShell': - IS_INTERACTIVE = True -except (NameError, ImportError): - pass - - -def _isinstance(object, classinfo): - """Return whether an object is an instance of a class or its subclass. - - Differs from the builtin isinstance() implementation in that it does not - depend on the ``__class__`` attribute which is proxied by - mock.Mock(spec=...). - """ - return issubclass(type(object), classinfo) - - -def count(typename, objects=None): - """Count objects tracked by the garbage collector with a given class name. - - The class name can optionally be fully qualified. - - Example: - - >>> count('dict') - 42 - >>> count('mymodule.MyClass') - 2 - - .. note:: - - The Python garbage collector does not track simple - objects like int or str. See - https://docs.python.org/3/library/gc.html#gc.is_tracked - for more information. - - Instead of looking through all objects tracked by the GC, you may - specify your own collection, e.g. - - >>> count('MyClass', get_leaking_objects()) - 3 - - See also: :func:`get_leaking_objects`. - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - Accepts fully-qualified type names (i.e. 'package.module.ClassName') - as well as short type names (i.e. 'ClassName'). - - """ - if objects is None: - objects = gc.get_objects() - try: - if '.' in typename: - return sum(1 for o in objects if _long_typename(o) == typename) - else: - return sum(1 for o in objects if _short_typename(o) == typename) - finally: - del objects # clear cyclic references to frame - - -def typestats(objects=None, shortnames=True, filter=None): - """Count the number of instances for each type tracked by the GC. - - Note that the GC does not track simple objects like int or str. - - Note that classes with the same name but defined in different modules - will be lumped together if ``shortnames`` is True. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - Example: - - >>> typestats() - {'list': 12041, 'tuple': 10245, ...} - >>> typestats(get_leaking_objects()) - {'MemoryError': 1, 'tuple': 2795, 'RuntimeError': 1, 'list': 47, ...} - - .. versionadded:: 1.1 - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - if objects is None: - objects = gc.get_objects() - try: - if shortnames: - typename = _short_typename - else: - typename = _long_typename - stats = {} - for o in objects: - if filter and not filter(o): - continue - n = typename(o) - stats[n] = stats.get(n, 0) + 1 - return stats - finally: - del objects # clear cyclic references to frame - - -def most_common_types(limit=10, objects=None, shortnames=True, filter=None): - """Count the names of types with the most instances. - - Returns a list of (type_name, count), sorted most-frequent-first. - - Limits the return value to at most ``limit`` items. You may set ``limit`` - to None to avoid that. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - The caveats documented in :func:`typestats` apply. - - Example: - - >>> most_common_types(limit=2) - [('list', 12041), ('tuple', 10245)] - - .. versionadded:: 1.4 - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - stats = sorted( - typestats(objects, shortnames=shortnames, filter=filter).items(), - key=operator.itemgetter(1), reverse=True) - if limit: - stats = stats[:limit] - return stats - - -def show_most_common_types( - limit=10, - objects=None, - shortnames=True, - file=None, - filter=None): - """Print the table of types of most common instances. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - The caveats documented in :func:`typestats` apply. - - Example: - - >>> show_most_common_types(limit=5) - tuple 8959 - function 2442 - wrapper_descriptor 1048 - dict 953 - builtin_function_or_method 800 - - .. versionadded:: 1.1 - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 3.0 - New parameter: ``file``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - if file is None: - file = sys.stdout - stats = most_common_types(limit, objects, shortnames=shortnames, - filter=filter) - width = max(len(name) for name, count in stats) - for name, count in stats: - file.write('%-*s %i\n' % (width, name, count)) - - -def growth(limit=10, peak_stats={}, shortnames=True, filter=None): - """Count the increase in peak object since last call. - - Returns a list of (type_name, total_count, increase_delta), - descending order by increase_delta. - - Limits the output to ``limit`` largest deltas. You may set ``limit`` to - None to see all of them. - - Uses and updates ``peak_stats``, a dictionary from type names to previously - seen peak object counts. Usually you don't need to pay attention to this - argument. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - The caveats documented in :func:`typestats` apply. - - Example: - - >>> growth(2) - [(tuple, 12282, 10), (dict, 1922, 7)] - - .. versionadded:: 3.3.0 - - """ - gc.collect() - stats = typestats(shortnames=shortnames, filter=filter) - deltas = {} - for name, count in iteritems(stats): - old_count = peak_stats.get(name, 0) - if count > old_count: - deltas[name] = count - old_count - peak_stats[name] = count - deltas = sorted(deltas.items(), key=operator.itemgetter(1), - reverse=True) - if limit: - deltas = deltas[:limit] - - return [(name, stats[name], delta) for name, delta in deltas] - - -def show_growth(limit=10, peak_stats=None, shortnames=True, file=None, - filter=None): - """Show the increase in peak object counts since last call. - - if ``peak_stats`` is None, peak object counts will recorded in - func `growth`, and your can record the counts by yourself with set - ``peak_stats`` to a dictionary. - - The caveats documented in :func:`growth` apply. - - Example: - - >>> show_growth() - wrapper_descriptor 970 +14 - tuple 12282 +10 - dict 1922 +7 - ... - - .. versionadded:: 1.5 - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 2.1 - New parameter: ``file``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - if peak_stats is None: - result = growth(limit, shortnames=shortnames, filter=filter) - else: - result = growth(limit, peak_stats, shortnames, filter) - if result: - if file is None: - file = sys.stdout - width = max(len(name) for name, _, _ in result) - for name, count, delta in result: - file.write('%-*s%9d %+9d\n' % (width, name, count, delta)) - - -def get_new_ids(skip_update=False, limit=10, sortby='deltas', - shortnames=None, file=None, _state={}): - """Find and display new objects allocated since last call. - - Shows the increase in object counts since last call to this - function and returns the memory address ids for new objects. - - Returns a dictionary mapping object type names to sets of object IDs - that have been created since the last time this function was called. - - ``skip_update`` (bool): If True, returns the same dictionary that - was returned during the previous call without updating the internal - state or examining the objects currently in memory. - - ``limit`` (int): The maximum number of rows that you want to print - data for. Use 0 to suppress the printing. Use None to print everything. - - ``sortby`` (str): This is the column that you want to sort by in - descending order. Possible values are: 'old', 'current', 'new', - 'deltas' - - ``shortnames`` (bool): If True, classes with the same name but - defined in different modules will be lumped together. If False, - all type names will be qualified with the module name. If None (default), - ``get_new_ids`` will remember the value from previous calls, so it's - enough to prime this once. By default the primed value is True. - - ``_state`` (dict): Stores old, current, and new_ids in memory. - It is used by the function to store the internal state between calls. - Never pass in this argument unless you know what you're doing. - - The caveats documented in :func:`growth` apply. - - When one gets new_ids from :func:`get_new_ids`, one can use - :func:`at_addrs` to get a list of those objects. Then one can iterate over - the new objects, print out what they are, and call :func:`show_backrefs` or - :func:`show_chain` to see where they are referenced. - - Example: - - >>> _ = get_new_ids() # store current objects in _state - >>> _ = get_new_ids() # current_ids become old_ids in _state - >>> a = [0, 1, 2] # list we don't know about - >>> b = [3, 4, 5] # list we don't know about - >>> new_ids = get_new_ids(limit=3) # we see new lists - ====================================================================== - Type Old_ids Current_ids New_ids Count_Deltas - ====================================================================== - list 324 326 +3 +2 - dict 1125 1125 +0 +0 - wrapper_descriptor 1001 1001 +0 +0 - ====================================================================== - >>> new_lists = at_addrs(new_ids['list']) - >>> a in new_lists - True - >>> b in new_lists - True - - .. versionadded:: 3.4 - """ - if not _state: - _state['old'] = collections.defaultdict(set) - _state['current'] = collections.defaultdict(set) - _state['new'] = collections.defaultdict(set) - _state['shortnames'] = True - new_ids = _state['new'] - if skip_update: - return new_ids - old_ids = _state['old'] - current_ids = _state['current'] - if shortnames is None: - shortnames = _state['shortnames'] - else: - _state['shortnames'] = shortnames - gc.collect() - objects = gc.get_objects() - for class_name in old_ids: - old_ids[class_name].clear() - for class_name, ids_set in current_ids.items(): - old_ids[class_name].update(ids_set) - for class_name in current_ids: - current_ids[class_name].clear() - for o in objects: - if shortnames: - class_name = _short_typename(o) - else: - class_name = _long_typename(o) - id_number = id(o) - current_ids[class_name].add(id_number) - for class_name in new_ids: - new_ids[class_name].clear() - rows = [] - keys_to_remove = [] - for class_name in current_ids: - num_old = len(old_ids[class_name]) - num_current = len(current_ids[class_name]) - if num_old == 0 and num_current == 0: - # remove the key from our dicts if we don't have any old or - # current class_name objects - keys_to_remove.append(class_name) - continue - new_ids_set = current_ids[class_name] - old_ids[class_name] - new_ids[class_name].update(new_ids_set) - num_new = len(new_ids_set) - num_delta = num_current - num_old - row = (class_name, num_old, num_current, num_new, num_delta) - rows.append(row) - for key in keys_to_remove: - del old_ids[key] - del current_ids[key] - del new_ids[key] - index_by_sortby = {'old': 1, 'current': 2, 'new': 3, 'deltas': 4} - rows.sort(key=operator.itemgetter(index_by_sortby[sortby], 0), - reverse=True) - if limit is not None: - rows = rows[:limit] - if not rows: - return new_ids - if file is None: - file = sys.stdout - width = max(len(row[0]) for row in rows) - print('='*(width+13*4), file=file) - print('%-*s%13s%13s%13s%13s' % - (width, 'Type', 'Old_ids', 'Current_ids', 'New_ids', 'Count_Deltas'), - file=file) - print('='*(width+13*4), file=file) - for row_class, old, current, new, delta in rows: - print('%-*s%13d%13d%+13d%+13d' % - (width, row_class, old, current, new, delta), file=file) - print('='*(width+13*4), file=file) - return new_ids - - -def get_leaking_objects(objects=None): - """Return objects that do not have any referents. - - These could indicate reference-counting bugs in C code. Or they could - be legitimate. - - Note that the GC does not track simple objects like int or str. - - .. versionadded:: 1.7 - """ - if objects is None: - gc.collect() - objects = gc.get_objects() - try: - ids = set(id(i) for i in objects) - for i in objects: - ids.difference_update(id(j) for j in gc.get_referents(i)) - # this then is our set of objects without referrers - return [i for i in objects if id(i) in ids] - finally: - del objects, i # clear cyclic references to frame - - -def by_type(typename, objects=None): - """Return objects tracked by the garbage collector with a given class name. - - Example: - - >>> by_type('MyClass') - [] - - Note that the GC does not track simple objects like int or str. - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - Accepts fully-qualified type names (i.e. 'package.module.ClassName') - as well as short type names (i.e. 'ClassName'). - - """ - if objects is None: - objects = gc.get_objects() - try: - if '.' in typename: - return [o for o in objects if _long_typename(o) == typename] - else: - return [o for o in objects if _short_typename(o) == typename] - finally: - del objects # clear cyclic references to frame - - -def at(addr): - """Return an object at a given memory address. - - The reverse of id(obj): - - >>> at(id(obj)) is obj - True - - Note that this function does not work on objects that are not tracked by - the GC (e.g. ints or strings). - """ - for o in gc.get_objects(): - if id(o) == addr: - return o - return None - - -def at_addrs(address_set): - """Return a list of objects for a given set of memory addresses. - - The reverse of [id(obj1), id(obj2), ...]. Note that objects are returned - in an arbitrary order. - - When one gets ``new_ids`` from :func:`get_new_ids`, one can use this - function to get a list of those objects. Then one can iterate over the new - objects, print out what they are, and call :func:`show_backrefs` or - :func:`show_chain` to see where they are referenced. - - >>> a = [0, 1, 2] - >>> new_ids = get_new_ids() - >>> new_lists = at_addrs(new_ids['list']) - >>> a in new_lists - True - - Note that this function does not work on objects that are not tracked - by the GC (e.g. ints or strings). - - .. versionadded:: 3.4 - """ - res = [] - for o in gc.get_objects(): - if id(o) in address_set: - res.append(o) - return res - - -def find_ref_chain(obj, predicate, max_depth=20, extra_ignore=()): - """Find a shortest chain of references leading from obj. - - The end of the chain will be some object that matches your predicate. - - ``predicate`` is a function taking one argument and returning a boolean. - - ``max_depth`` limits the search depth. - - ``extra_ignore`` can be a list of object IDs to exclude those objects from - your search. - - Example: - - >>> find_ref_chain(obj, lambda x: isinstance(x, MyClass)) - [obj, ..., ] - - Returns ``[obj]`` if such a chain could not be found. - - .. versionadded:: 1.7 - """ - return _find_chain(obj, predicate, gc.get_referents, - max_depth=max_depth, extra_ignore=extra_ignore)[::-1] - - -def find_backref_chain(obj, predicate, max_depth=20, extra_ignore=()): - """Find a shortest chain of references leading to obj. - - The start of the chain will be some object that matches your predicate. - - ``predicate`` is a function taking one argument and returning a boolean. - - ``max_depth`` limits the search depth. - - ``extra_ignore`` can be a list of object IDs to exclude those objects from - your search. - - Example: - - >>> find_backref_chain(obj, is_proper_module) - [, ..., obj] - - Returns ``[obj]`` if such a chain could not be found. - - .. versionchanged:: 1.5 - Returns ``obj`` instead of ``None`` when a chain could not be found. - - """ - return _find_chain(obj, predicate, gc.get_referrers, - max_depth=max_depth, extra_ignore=extra_ignore) - - -def show_backrefs(objs, max_depth=3, extra_ignore=(), filter=None, too_many=10, - highlight=None, filename=None, extra_info=None, - refcounts=False, shortnames=True, output=None): - """Generate an object reference graph ending at ``objs``. - - The graph will show you what objects refer to ``objs``, directly and - indirectly. - - ``objs`` can be a single object, or it can be a list of objects. If - unsure, wrap the single object in a new list. - - ``filename`` if specified, can be the name of a .dot or a image - file, whose extension indicates the desired output format; note - that output to a specific format is entirely handled by GraphViz: - if the desired format is not supported, you just get the .dot - file. If ``filename`` and ``output`` are not specified, ``show_backrefs`` - will try to display the graph inline (if you're using IPython), otherwise - it'll try to produce a .dot file and spawn a viewer (xdot). If xdot is - not available, ``show_backrefs`` will convert the .dot file to a - .png and print its name. - - ``output`` if specified, the GraphViz output will be written to this - file object. ``output`` and ``filename`` should not both be specified. - - Use ``max_depth`` and ``too_many`` to limit the depth and breadth of the - graph. - - Use ``filter`` (a predicate) and ``extra_ignore`` (a list of object IDs) to - remove undesired objects from the graph. - - Use ``highlight`` (a predicate) to highlight certain graph nodes in blue. - - Use ``extra_info`` (a function taking one argument and returning a - string) to report extra information for objects. - - Specify ``refcounts=True`` if you want to see reference counts. - These will mostly match the number of arrows pointing to an object, - but can be different for various reasons. - - Specify ``shortnames=False`` if you want to see fully-qualified type - names ('package.module.ClassName'). By default you get to see only the - class name part. - - Examples: - - >>> show_backrefs(obj) - >>> show_backrefs([obj1, obj2]) - >>> show_backrefs(obj, max_depth=5) - >>> show_backrefs(obj, filter=lambda x: not inspect.isclass(x)) - >>> show_backrefs(obj, highlight=inspect.isclass) - >>> show_backrefs(obj, extra_ignore=[id(locals())]) - - .. versionchanged:: 1.3 - New parameters: ``filename``, ``extra_info``. - - .. versionchanged:: 1.5 - New parameter: ``refcounts``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 2.0 - New parameter: ``output``. - - """ - # For show_backrefs(), it makes sense to stop when reaching a - # module because you'll end up in sys.modules and explode the - # graph with useless clutter. That's why we're specifying - # cull_func here, but not in show_graph(). - return _show_graph(objs, max_depth=max_depth, extra_ignore=extra_ignore, - filter=filter, too_many=too_many, highlight=highlight, - edge_func=gc.get_referrers, swap_source_target=False, - filename=filename, output=output, extra_info=extra_info, - refcounts=refcounts, shortnames=shortnames, - cull_func=is_proper_module) - - -def show_refs(objs, max_depth=3, extra_ignore=(), filter=None, too_many=10, - highlight=None, filename=None, extra_info=None, - refcounts=False, shortnames=True, output=None): - """Generate an object reference graph starting at ``objs``. - - The graph will show you what objects are reachable from ``objs``, directly - and indirectly. - - ``objs`` can be a single object, or it can be a list of objects. If - unsure, wrap the single object in a new list. - - ``filename`` if specified, can be the name of a .dot or a image - file, whose extension indicates the desired output format; note - that output to a specific format is entirely handled by GraphViz: - if the desired format is not supported, you just get the .dot - file. If ``filename`` and ``output`` is not specified, ``show_refs`` will - try to display the graph inline (if you're using IPython), otherwise it'll - try to produce a .dot file and spawn a viewer (xdot). If xdot is - not available, ``show_refs`` will convert the .dot file to a - .png and print its name. - - ``output`` if specified, the GraphViz output will be written to this - file object. ``output`` and ``filename`` should not both be specified. - - Use ``max_depth`` and ``too_many`` to limit the depth and breadth of the - graph. - - Use ``filter`` (a predicate) and ``extra_ignore`` (a list of object IDs) to - remove undesired objects from the graph. - - Use ``highlight`` (a predicate) to highlight certain graph nodes in blue. - - Use ``extra_info`` (a function returning a string) to report extra - information for objects. - - Specify ``refcounts=True`` if you want to see reference counts. - - Examples: - - >>> show_refs(obj) - >>> show_refs([obj1, obj2]) - >>> show_refs(obj, max_depth=5) - >>> show_refs(obj, filter=lambda x: not inspect.isclass(x)) - >>> show_refs(obj, highlight=inspect.isclass) - >>> show_refs(obj, extra_ignore=[id(locals())]) - - .. versionadded:: 1.1 - - .. versionchanged:: 1.3 - New parameters: ``filename``, ``extra_info``. - - .. versionchanged:: 1.5 - Follows references from module objects instead of stopping. - New parameter: ``refcounts``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 2.0 - New parameter: ``output``. - """ - return _show_graph(objs, max_depth=max_depth, extra_ignore=extra_ignore, - filter=filter, too_many=too_many, highlight=highlight, - edge_func=gc.get_referents, swap_source_target=True, - filename=filename, extra_info=extra_info, - refcounts=refcounts, shortnames=shortnames, - output=output) - - -def show_chain(*chains, **kw): - """Show a chain (or several chains) of object references. - - Useful in combination with :func:`find_ref_chain` or - :func:`find_backref_chain`, e.g. - - >>> show_chain(find_backref_chain(obj, is_proper_module)) - - You can specify if you want that chain traced backwards or forwards - by passing a ``backrefs`` keyword argument, e.g. - - >>> show_chain(find_ref_chain(obj, is_proper_module), - ... backrefs=False) - - Ideally this shouldn't matter, but for some objects - :func:`gc.get_referrers` and :func:`gc.get_referents` are not perfectly - symmetrical. - - You can specify ``highlight``, ``extra_info``, ``refcounts``, - ``shortnames``, ``filename`` or ``output`` arguments like for - :func:`show_backrefs` or :func:`show_refs`. - - .. versionadded:: 1.5 - - .. versionchanged:: 1.7 - New parameter: ``backrefs``. - - .. versionchanged:: 2.0 - New parameter: ``output``. - - """ - backrefs = kw.pop('backrefs', True) - chains = [chain for chain in chains if chain] # remove empty ones - - def in_chains(x, ids=set(map(id, itertools.chain(*chains)))): - return id(x) in ids - max_depth = max(map(len, chains)) - 1 - if backrefs: - show_backrefs([chain[-1] for chain in chains], max_depth=max_depth, - filter=in_chains, **kw) - else: - show_refs([chain[0] for chain in chains], max_depth=max_depth, - filter=in_chains, **kw) - - -def is_proper_module(obj): - """ - Returns ``True`` if ``obj`` can be treated like a garbage collector root. - - That is, if ``obj`` is a module that is in ``sys.modules``. - - >>> import types - >>> is_proper_module([]) - False - >>> is_proper_module(types) - True - >>> is_proper_module(types.ModuleType('foo')) - False - - .. versionadded:: 1.8 - """ - return ( - inspect.ismodule(obj) - and obj is sys.modules.get(getattr(obj, '__name__', None)) - ) - - -# -# Internal helpers -# - -def _find_chain(obj, predicate, edge_func, max_depth=20, extra_ignore=()): - queue = [obj] - depth = {id(obj): 0} - parent = {id(obj): None} - ignore = set(extra_ignore) - ignore.add(id(extra_ignore)) - ignore.add(id(queue)) - ignore.add(id(depth)) - ignore.add(id(parent)) - ignore.add(id(ignore)) - ignore.add(id(sys._getframe())) # this function - ignore.add(id(sys._getframe(1))) # find_chain/find_backref_chain - gc.collect() - while queue: - target = queue.pop(0) - if predicate(target): - chain = [target] - while parent[id(target)] is not None: - target = parent[id(target)] - chain.append(target) - return chain - tdepth = depth[id(target)] - if tdepth < max_depth: - referrers = edge_func(target) - ignore.add(id(referrers)) - for source in referrers: - if id(source) in ignore: - continue - if id(source) not in depth: - depth[id(source)] = tdepth + 1 - parent[id(source)] = target - queue.append(source) - return [obj] # not found - - -def _show_graph(objs, edge_func, swap_source_target, - max_depth=3, extra_ignore=(), filter=None, too_many=10, - highlight=None, filename=None, extra_info=None, - refcounts=False, shortnames=True, output=None, - cull_func=None): - if not _isinstance(objs, (list, tuple)): - objs = [objs] - - is_interactive = False - if filename and output: - raise ValueError('Cannot specify both output and filename.') - elif output: - f = output - elif filename and filename.endswith('.dot'): - f = codecs.open(filename, 'w', encoding='utf-8') - dot_filename = filename - elif IS_INTERACTIVE: - is_interactive = True - f = StringIO() - else: - fd, dot_filename = tempfile.mkstemp(prefix='objgraph-', - suffix='.dot', text=True) - f = os.fdopen(fd, "w") - if getattr(f, 'encoding', None): - # Python 3 will wrap the file in the user's preferred encoding - # Re-wrap it for utf-8 - import io - f = io.TextIOWrapper(f.detach(), 'utf-8') - f.write('digraph ObjectGraph {\n' - ' node[shape=box, style=filled, fillcolor=white];\n') - queue = [] - depth = {} - ignore = set(extra_ignore) - ignore.add(id(objs)) - ignore.add(id(extra_ignore)) - ignore.add(id(queue)) - ignore.add(id(depth)) - ignore.add(id(ignore)) - ignore.add(id(sys._getframe())) # this function - ignore.add(id(sys._getframe().f_locals)) - ignore.add(id(sys._getframe(1))) # show_refs/show_backrefs - ignore.add(id(sys._getframe(1).f_locals)) - for obj in objs: - f.write(' %s[fontcolor=red];\n' % (_obj_node_id(obj))) - depth[id(obj)] = 0 - queue.append(obj) - del obj - gc.collect() - nodes = 0 - while queue: - nodes += 1 - # The names "source" and "target" are reversed here because - # originally there was just show_backrefs() and we were - # traversing the reference graph backwards. - target = queue.pop(0) - tdepth = depth[id(target)] - f.write(' %s[label="%s"];\n' % (_obj_node_id(target), - _obj_label(target, extra_info, - refcounts, shortnames))) - h, s, v = _gradient((0, 0, 1), (0, 0, .3), tdepth, max_depth) - if inspect.ismodule(target): - h = .3 - s = 1 - if highlight and highlight(target): - h = .6 - s = .6 - v = 0.5 + v * 0.5 - f.write(' %s[fillcolor="%g,%g,%g"];\n' - % (_obj_node_id(target), h, s, v)) - if v < 0.5: - f.write(' %s[fontcolor=white];\n' % (_obj_node_id(target))) - if hasattr(getattr(target, '__class__', None), '__del__'): - f.write(' %s->%s_has_a_del[color=red,style=dotted,' - 'len=0.25,weight=10];\n' % (_obj_node_id(target), - _obj_node_id(target))) - f.write(' %s_has_a_del[label="__del__",shape=doublecircle,' - 'height=0.25,color=red,fillcolor="0,.5,1",fontsize=6];\n' - % (_obj_node_id(target))) - if tdepth >= max_depth: - continue - if cull_func is not None and cull_func(target): - continue - neighbours = edge_func(target) - ignore.add(id(neighbours)) - n = 0 - skipped = 0 - for source in neighbours: - if id(source) in ignore: - continue - if filter and not filter(source): - continue - if n >= too_many: - skipped += 1 - continue - if swap_source_target: - srcnode, tgtnode = target, source - else: - srcnode, tgtnode = source, target - elabel = _edge_label(srcnode, tgtnode, shortnames) - f.write(' %s -> %s%s;\n' % (_obj_node_id(srcnode), - _obj_node_id(tgtnode), elabel)) - if id(source) not in depth: - depth[id(source)] = tdepth + 1 - queue.append(source) - n += 1 - del source - del neighbours - if skipped > 0: - h, s, v = _gradient((0, 1, 1), (0, 1, .3), tdepth + 1, max_depth) - if swap_source_target: - label = "%d more references" % skipped - edge = "%s->too_many_%s" % (_obj_node_id(target), - _obj_node_id(target)) - else: - label = "%d more backreferences" % skipped - edge = "too_many_%s->%s" % (_obj_node_id(target), - _obj_node_id(target)) - f.write(' %s[color=red,style=dotted,len=0.25,weight=10];\n' - % edge) - f.write(' too_many_%s[label="%s",shape=box,height=0.25,' - 'color=red,fillcolor="%g,%g,%g",fontsize=6];\n' - % (_obj_node_id(target), label, h, s, v)) - f.write(' too_many_%s[fontcolor=white];\n' - % (_obj_node_id(target))) - f.write("}\n") - - if output: - return - - if is_interactive: - return graphviz.Source(f.getvalue()) - else: - # The file should only be closed if this function was in charge of - # opening the file. - f.close() - print("Graph written to %s (%d nodes)" % (dot_filename, nodes)) - _present_graph(dot_filename, filename) - - -def _present_graph(dot_filename, filename=None): - """Present a .dot file to the user in the requested fashion. - - If ``filename`` is provided, runs ``dot`` to convert the .dot file - into the desired format, determined by the filename extension. - - If ``filename`` is not provided, tries to launch ``xdot``, a - graphical .dot file viewer. If ``xdot`` is not present on the system, - converts the graph to a PNG. - """ - if filename == dot_filename: - # nothing to do, the user asked for a .dot file and got it - return - if not filename and _program_in_path('xdot'): - print("Spawning graph viewer (xdot)") - subprocess.Popen(['xdot', dot_filename], close_fds=True) - elif _program_in_path('dot'): - if not filename: - print("Graph viewer (xdot) not found, generating a png instead") - filename = dot_filename[:-4] + '.png' - stem, ext = os.path.splitext(filename) - cmd = ['dot', '-T' + ext[1:], '-o' + filename, dot_filename] - dot = subprocess.Popen(cmd, close_fds=False) - dot.wait() - if dot.returncode != 0: - # XXX: shouldn't this go to stderr or a log? - print('dot failed (exit code %d) while executing "%s"' - % (dot.returncode, ' '.join(cmd))) - else: - print("Image generated as %s" % filename) - else: - if not filename: - print("Graph viewer (xdot) and image renderer (dot) not found," - " not doing anything else") - else: - print("Image renderer (dot) not found, not doing anything else") - - -def _obj_node_id(obj): - return ('o%d' % id(obj)).replace('-', '_') - - -def _obj_label(obj, extra_info=None, refcounts=False, shortnames=True): - if shortnames: - label = [_short_typename(obj)] - else: - label = [_long_typename(obj)] - if refcounts: - label[0] += ' [%d]' % (sys.getrefcount(obj) - 4) - # Why -4? To ignore the references coming from - # obj_label's frame (obj) - # show_graph's frame (target variable) - # sys.getrefcount()'s argument - # something else that doesn't show up in gc.get_referrers() - label.append(_safe_repr(obj)) - if extra_info: - label.append(str(extra_info(obj))) - return _quote('\n'.join(label)) - - -def _quote(s): - return (s.replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("\0", "\\\\0")) - - -def _get_obj_type(obj): - objtype = type(obj) - if type(obj) == InstanceType: - objtype = obj.__class__ - return objtype - - -def _short_typename(obj): - return _get_obj_type(obj).__name__ - - -def _long_typename(obj): - objtype = _get_obj_type(obj) - name = objtype.__name__ - module = getattr(objtype, '__module__', None) - if module: - return '%s.%s' % (module, name) - else: - return name - - -def _safe_repr(obj): - try: - return _short_repr(obj) - except Exception: - return '(unrepresentable)' - - -def _name_or_repr(value): - try: - result = value.__name__ - except AttributeError: - result = repr(value)[:40] - - if _isinstance(result, basestring): - return result - else: - return repr(value)[:40] - - -def _short_repr(obj): - if _isinstance(obj, (type, types.ModuleType, types.BuiltinMethodType, - types.BuiltinFunctionType)): - return _name_or_repr(obj) - if _isinstance(obj, types.MethodType): - name = _name_or_repr(obj.__func__) - if obj.__self__: - return name + ' (bound)' - else: - return name - # NB: types.LambdaType is an alias for types.FunctionType! - if _isinstance(obj, types.LambdaType) and obj.__name__ == '': - return 'lambda: %s:%s' % (os.path.basename(obj.__code__.co_filename), - obj.__code__.co_firstlineno) - if _isinstance(obj, types.FrameType): - return '%s:%s' % (obj.f_code.co_filename, obj.f_lineno) - if _isinstance(obj, (tuple, list, dict, set)): - return '%d items' % len(obj) - return repr(obj)[:40] - - -def _gradient(start_color, end_color, depth, max_depth): - if max_depth == 0: - # avoid division by zero - return start_color - h1, s1, v1 = start_color - h2, s2, v2 = end_color - f = float(depth) / max_depth - h = h1 * (1-f) + h2 * f - s = s1 * (1-f) + s2 * f - v = v1 * (1-f) + v2 * f - return h, s, v - - -def _edge_label(source, target, shortnames=True): - if (_isinstance(target, dict) - and target is getattr(source, '__dict__', None)): - return ' [label="__dict__",weight=10]' - if _isinstance(source, types.FrameType): - if target is source.f_locals: - return ' [label="f_locals",weight=10]' - if target is source.f_globals: - return ' [label="f_globals",weight=10]' - if _isinstance(source, types.MethodType): - try: - if target is source.__self__: - return ' [label="__self__",weight=10]' - if target is source.__func__: - return ' [label="__func__",weight=10]' - except AttributeError: # pragma: nocover - # Python < 2.6 compatibility - if target is source.im_self: - return ' [label="im_self",weight=10]' - if target is source.im_func: - return ' [label="im_func",weight=10]' - if _isinstance(source, types.FunctionType): - for k in dir(source): - if target is getattr(source, k): - return ' [label="%s",weight=10]' % _quote(k) - if _isinstance(source, dict): - for k, v in iteritems(source): - if v is target: - if _isinstance(k, basestring) and _is_identifier(k): - return ' [label="%s",weight=2]' % _quote(k) - else: - if shortnames: - tn = _short_typename(k) - else: - tn = _long_typename(k) - return ' [label="%s"]' % _quote(tn + "\n" + _safe_repr(k)) - return '' - - -_is_identifier = re.compile('[a-zA-Z_][a-zA-Z_0-9]*$').match - - -def _program_in_path(program): - # XXX: Consider using distutils.spawn.find_executable or shutil.which - path = os.environ.get("PATH", os.defpath).split(os.pathsep) - path = [os.path.join(dir, program) for dir in path] - path = [True for file in path - if os.path.isfile(file) or os.path.isfile(file + '.exe')] - return bool(path) diff --git a/src/py/bbctrl/State.py b/src/py/bbctrl/State.py index 888d05e..89badcc 100644 --- a/src/py/bbctrl/State.py +++ b/src/py/bbctrl/State.py @@ -123,8 +123,6 @@ class State(object): if not os.path.exists(upload): os.mkdir(upload) - from shutil import copy - copy(bbctrl.get_resource('http/buildbotics.nc'), upload) for path in os.listdir(upload): if os.path.isfile(upload + '/' + path): diff --git a/src/py/bbctrl/__init__.py b/src/py/bbctrl/__init__.py index c5cae69..3b5c03f 100644 --- a/src/py/bbctrl/__init__.py +++ b/src/py/bbctrl/__init__.py @@ -1,33 +1,5 @@ #!/usr/bin/env python3 -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software is distributed in the hope that it will be useful, but # -# WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - -import os import sys import signal import tornado @@ -53,13 +25,11 @@ from bbctrl.Comm import Comm from bbctrl.CommandQueue import CommandQueue from bbctrl.Camera import Camera, VideoHandler from bbctrl.AVR import AVR -from bbctrl.AVREmu import AVREmu from bbctrl.IOLoop import IOLoop from bbctrl.MonitorTemp import MonitorTemp import bbctrl.Cmd as Cmd import bbctrl.v4l2 as v4l2 import bbctrl.Log as log -import bbctrl.ObjGraph as ObjGraph ctrl = None @@ -69,7 +39,7 @@ def get_resource(path): return resource_filename(Requirement.parse('bbctrl'), 'bbctrl/' + path) -def on_exit(sig = 0, func = None): +def on_exit(sig=0, func=None): global ctrl print('Exit handler triggered: signal = %d', sig) @@ -85,76 +55,46 @@ def time_str(): return datetime.datetime.now().strftime('%Y%m%d-%H:%M:%S') - -class Debugger: - def __init__(self, ioloop, freq = 60 * 15, depth = 100): - self.ioloop = ioloop - self.freq = freq - self.depth = depth - self._callback() - - - def _callback(self): - with open('bbctrl-debug-%s.log' % time_str(), 'w') as log: - def line(name): - log.write('==== ' + name + ' ' + '=' * (74 - len(name)) + '\n') - - line('Common') - ObjGraph.show_most_common_types(limit = self.depth, file = log) - - log.write('\n') - line('Growth') - ObjGraph.show_growth(limit = self.depth, file = log) - - log.write('\n') - line('New IDs') - ObjGraph.get_new_ids(limit = self.depth, file = log) - - log.flush() - self.ioloop.call_later(self.freq, self._callback) - - - def parse_args(): parser = argparse.ArgumentParser( - description = 'Buildbotics Machine Controller') + description='Buildbotics Machine Controller') - parser.add_argument('-p', '--port', default = 80, - type = int, help = 'HTTP port') - parser.add_argument('-a', '--addr', metavar = 'IP', default = '0.0.0.0', - help = 'HTTP address to bind') - parser.add_argument('-s', '--serial', default = '/dev/ttyAMA0', - help = 'Serial device') - parser.add_argument('-b', '--baud', default = 230400, type = int, - help = 'Serial baud rate') - parser.add_argument('--i2c-port', default = 1, type = int, - help = 'I2C port') - parser.add_argument('--avr-addr', default = 0x2b, type = int, - help = 'AVR I2C address') - parser.add_argument('--pwr-addr', default = 0x60, type = int, - help = 'Power AVR I2C address') - parser.add_argument('-v', '--verbose', action = 'store_true', - help = 'Verbose output') - parser.add_argument('-l', '--log', metavar = "FILE", - help = 'Set a log file') - parser.add_argument('--disable-camera', action = 'store_true', - help = 'Disable the camera') - parser.add_argument('--width', default = 640, type = int, - help = 'Camera width') - parser.add_argument('--height', default = 480, type = int, - help = 'Camera height') - parser.add_argument('--fps', default = 15, type = int, - help = 'Camera frames per second') - parser.add_argument('--camera-clients', default = 4, - help = 'Maximum simultaneous camera clients') - parser.add_argument('--demo', action = 'store_true', - help = 'Enter demo mode') - parser.add_argument('--debug', default = 0, type = int, - help = 'Enable debug mode and set frequency in seconds') - parser.add_argument('--fast-emu', action = 'store_true', - help = 'Enter demo mode') - parser.add_argument('--client-timeout', default = 5 * 60, type = int, - help = 'Demo client timeout in seconds') + parser.add_argument('-p', '--port', default=80, + type=int, help='HTTP port') + parser.add_argument('-a', '--addr', metavar='IP', default='0.0.0.0', + help='HTTP address to bind') + parser.add_argument('-s', '--serial', default='/dev/ttyAMA0', + help='Serial device') + parser.add_argument('-b', '--baud', default=230400, type=int, + help='Serial baud rate') + parser.add_argument('--i2c-port', default=1, type=int, + help='I2C port') + parser.add_argument('--avr-addr', default=0x2b, type=int, + help='AVR I2C address') + parser.add_argument('--pwr-addr', default=0x60, type=int, + help='Power AVR I2C address') + parser.add_argument('-v', '--verbose', action='store_true', + help='Verbose output') + parser.add_argument('-l', '--log', metavar="FILE", + help='Set a log file') + parser.add_argument('--disable-camera', action='store_true', + help='Disable the camera') + parser.add_argument('--width', default=640, type=int, + help='Camera width') + parser.add_argument('--height', default=480, type=int, + help='Camera height') + parser.add_argument('--fps', default=15, type=int, + help='Camera frames per second') + parser.add_argument('--camera-clients', default=4, + help='Maximum simultaneous camera clients') + parser.add_argument('--demo', action='store_true', + help='Enter demo mode') + parser.add_argument('--debug', default=0, type=int, + help='Enable debug mode and set frequency in seconds') + parser.add_argument('--fast-emu', action='store_true', + help='Enter demo mode') + parser.add_argument('--client-timeout', default=5 * 60, type=int, + help='Demo client timeout in seconds') return parser.parse_args() @@ -170,16 +110,15 @@ def run(): # Create ioloop ioloop = tornado.ioloop.IOLoop.current() - # Set ObjGraph signal handler - if args.debug: Debugger(ioloop, args.debug) - # Start server web = Web(args, ioloop) try: ioloop.start() - except KeyboardInterrupt: on_exit() + except KeyboardInterrupt: + on_exit() -if __name__ == '__main__': run() +if __name__ == '__main__': + run() diff --git a/src/resources/buildbotics.nc b/src/resources/buildbotics.nc deleted file mode 100644 index 8c5ddb0..0000000 --- a/src/resources/buildbotics.nc +++ /dev/null @@ -1,403 +0,0 @@ -G21 -(File: 'buildbotics_logo.tpl') -G0 Z3 -F1600 -M3 S10000 -M6 T2 -G0 X59.25 Y5.85 -G1 Z-1.5 -G1 X61.68 Y6.7 -G1 X63.86 Y8.07 -G1 X65.68 Y9.89 -G1 X67.05 Y12.07 -G1 X67.9 Y14.5 -G1 X68.2 Y17.09 -G1 Y56.6 -G1 X67.73 Y59.04 -G1 X50.8 -G1 Y34.9 -G1 X50.65 Y34.55 -G1 X50.3 Y34.4 -G1 X23.46 -G1 X23.1 Y34.55 -G1 X22.96 Y34.9 -G1 X22.98 Y49.88 -G1 X22.96 Y59.05 -G1 X22.41 -G1 X19.26 -G1 X6.04 -G1 X5.56 Y56.53 -G1 Y17.09 -G1 X5.85 Y14.5 -G1 X6.7 Y12.07 -G1 X8.07 Y9.89 -G1 X9.89 Y8.07 -G1 X12.07 Y6.7 -G1 X14.5 Y5.85 -G1 X17.09 Y5.56 -G1 X56.67 -G1 X59.25 Y5.85 -G0 Z3 -G0 X64.26 Y64.72 -G1 Z-1.5 -G1 X61.78 Y66.52 -G1 X58.91 Y67.68 -G1 X56.54 Y68.08 -G1 X17.22 -G1 X14.84 Y67.68 -G1 X11.97 Y66.52 -G1 X9.49 Y64.72 -G1 X8.08 Y63.16 -G1 X27.35 -G1 X27.89 Y63.45 -G1 X27.96 Y63.48 -G1 X31.48 Y64.75 -G1 X31.52 Y64.76 -G1 X31.56 Y64.77 -G1 X35.19 Y65.41 -G1 X35.26 -G1 X35.97 Y65.44 -G1 X36.04 Y65.45 -G1 X36.07 -G1 X36.82 Y65.44 -G1 X36.83 -G1 X36.89 -G1 X36.95 -G1 X36.97 -G1 X37.72 Y65.43 -G1 X37.74 -G1 X37.8 -G1 X37.81 -G1 X37.88 -G1 X37.89 -G1 X38.65 Y65.38 -G1 X38.68 -G1 X38.75 Y65.37 -G1 X39.38 Y65.32 -G1 X39.44 Y65.31 -G1 X42.68 Y64.64 -G1 X42.76 Y64.62 -G1 X45.87 Y63.44 -G1 X45.93 Y63.41 -G1 X46.4 Y63.16 -G1 X65.67 -G1 X64.26 Y64.72 -G0 Z3 -G0 X36.88 Y9.4 -G1 Z-1.5 -G1 X37.31 Y9.64 -G1 X39.58 Y13.48 -G1 X39.63 Y13.6 -G1 X39.65 Y13.73 -G1 Y27.54 -G1 X41.67 -G1 Y25.39 -G1 X41.75 Y25.12 -G1 X41.97 Y24.93 -G1 X46.41 Y22.92 -G1 Y19.97 -G1 X45.44 -G1 X45.08 Y19.82 -G1 X44.94 Y19.47 -G1 Y13.73 -G1 X45.08 Y13.38 -G1 X45.44 Y13.23 -G1 X49.94 Y13.24 -G1 X50.29 Y13.39 -G1 X50.44 Y13.74 -G1 Y19.47 -G1 X50.29 Y19.83 -G1 X49.93 Y19.97 -G1 X48.92 -G1 Y23.61 -G1 X48.84 Y23.88 -G1 X48.63 Y24.06 -G1 X44.19 Y26.12 -G1 Y27.54 -G1 X49.22 -G1 X49.33 Y27.56 -G1 X49.44 Y27.6 -G1 X50.13 Y27.94 -G1 X50.25 Y28.02 -G1 X50.34 Y28.13 -G1 X50.73 Y28.77 -G1 X50.78 Y28.89 -G1 X50.8 Y29.03 -G1 Y33.05 -G1 Y34.25 -G1 Y34.65 -G1 X50.66 Y35.01 -G1 X50.3 Y35.15 -G1 X23.46 -G1 X23.1 Y35.01 -G1 X22.96 Y34.65 -G1 Y29.07 -G1 X22.97 Y28.94 -G1 X23.02 Y28.82 -G1 X23.4 Y28.17 -G1 X23.49 Y28.06 -G1 X23.6 Y27.98 -G1 X24.29 Y27.6 -G1 X24.4 Y27.56 -G1 X24.52 Y27.54 -G1 X25.55 -G1 Y26.4 -G1 X23.4 Y25.52 -G1 X23.17 Y25.33 -G1 X23.09 Y25.06 -G1 Y17.54 -G1 X23.23 Y17.19 -G1 X23.59 Y17.04 -G1 X24.6 -G1 Y10.36 -G1 X24.62 Y10.23 -G1 X24.66 Y10.11 -G1 X24.8 Y9.88 -G1 X24.88 Y9.77 -G1 X24.99 Y9.68 -G1 X25.25 Y9.54 -G1 X25.37 Y9.5 -G1 X25.49 Y9.48 -G1 X26.53 -G1 X26.65 Y9.49 -G1 X26.76 Y9.54 -G1 X27.01 Y9.66 -G1 X27.12 Y9.74 -G1 X27.21 Y9.85 -G1 X27.35 Y10.09 -G1 X27.41 Y10.22 -G1 X27.43 Y10.35 -G1 Y10.43 -G1 X27.47 Y17.04 -G1 X28.57 -G1 X28.92 Y17.19 -G1 X29.07 Y17.54 -G1 Y24.64 -G1 X30.72 Y25.3 -G1 X30.95 Y25.49 -G1 X31.03 Y25.77 -G1 X31.02 Y27.54 -G1 X34.03 -G1 Y13.73 -G1 X34.05 Y13.59 -G1 X34.1 Y13.47 -G1 X36.45 Y9.64 -G1 X36.88 Y9.4 -G0 Z3 -G0 X49.94 Y10.82 -G1 Z-1.5 -G1 X50.29 Y10.97 -G1 X50.44 Y11.32 -G1 Y13.34 -G1 X50.29 Y13.69 -G1 X49.94 Y13.84 -G1 X45.44 -G1 X45.08 Y13.69 -G1 X44.94 Y13.34 -G1 Y11.32 -G1 X45.08 Y10.97 -G1 X45.44 Y10.82 -G1 X49.94 -G0 Z3 -G0 X48.46 Y9.7 -G1 Z-1.5 -G1 X48.59 Y9.72 -G1 X48.71 Y9.77 -G1 X50.03 Y10.53 -G1 X50.21 Y10.71 -G1 X50.28 Y10.96 -G1 X50.14 Y11.31 -G1 X49.78 Y11.46 -G1 X45.62 -G1 X45.14 Y11.09 -G1 X45.37 Y10.53 -G1 X46.69 Y9.77 -G1 X46.81 Y9.72 -G1 X46.94 Y9.7 -G1 X48.46 -G0 Z3 -G0 X50.3 Y34.4 -G1 Z-1.5 -G1 X50.66 Y34.55 -G1 X50.8 Y34.9 -G1 Y49.88 -G1 X50.79 Y59.52 -G1 X50.76 Y59.69 -G1 X50.67 Y59.84 -G1 X50.09 Y60.52 -G1 X50.06 Y60.55 -G1 X50.02 Y60.58 -G1 X47.89 Y62.26 -G1 X47.85 Y62.28 -G1 X47.81 Y62.31 -G1 X44.46 Y64.03 -G1 X44.41 Y64.05 -G1 X44.37 Y64.06 -G1 X40.69 Y65.1 -G1 X40.62 Y65.12 -G1 X37.86 Y65.45 -G1 X37.8 Y65.46 -G1 X36.89 Y65.44 -G1 X36.83 -G1 X36.82 -G1 X36.07 Y65.45 -G1 X36.04 Y65.44 -G1 X35.97 -G1 X35.1 Y65.41 -G1 X35.04 Y65.4 -G1 X32.44 Y64.99 -G1 X32.37 Y64.97 -G1 X28.94 Y63.9 -G1 X28.89 Y63.88 -G1 X28.85 Y63.86 -G1 X25.74 Y62.2 -G1 X25.7 Y62.18 -G1 X25.66 Y62.15 -G1 X23.68 Y60.56 -G1 X23.65 Y60.53 -G1 X23.62 Y60.5 -G1 X23.08 Y59.87 -G1 X22.99 Y59.71 -G1 X22.96 Y59.54 -G1 X22.98 Y49.88 -G1 X22.96 Y34.9 -G1 X23.1 Y34.55 -G1 X23.46 Y34.4 -G1 X50.3 -G0 Z3 -G0 X55.2 Y43.67 -G1 Z-1.5 -G1 Y51.34 -G1 X55.11 Y51.94 -G1 X54.83 Y52.88 -G1 X54.39 Y53.88 -G1 X53.8 Y54.85 -G1 X53.09 Y55.74 -G1 X52.28 Y56.47 -G1 X51.41 Y56.98 -G1 X51.07 Y57.09 -G1 Y43.67 -G1 X55.2 -G0 Z3 -G0 X22.69 Y43.63 -G1 Z-1.5 -G1 Y57.09 -G1 X22.35 Y56.98 -G1 X21.47 Y56.47 -G1 X20.67 Y55.74 -G1 X19.95 Y54.85 -G1 X19.36 Y53.88 -G1 X18.92 Y52.88 -G1 X18.64 Y51.94 -G1 X18.55 Y51.34 -G1 Y43.63 -G1 X22.69 -G0 Z3 -G0 X28.55 Y35.84 -G1 Z-0.99 -G1 X30.11 Y36.15 -G1 X31.43 Y37.03 -G1 X32.32 Y38.35 -G1 X32.63 Y39.91 -G1 X32.32 Y41.47 -G1 X31.43 Y42.79 -G1 X30.11 Y43.68 -G1 X28.55 Y43.99 -G1 X26.99 Y43.68 -G1 X25.67 Y42.79 -G1 X24.79 Y41.47 -G1 X24.48 Y39.91 -G1 X24.79 Y38.35 -G1 X25.67 Y37.03 -G1 X26.99 Y36.15 -G1 X28.55 Y35.84 -G0 Z3 -G0 X45.33 Y35.93 -G1 Z-0.99 -G1 X46.88 Y36.24 -G1 X48.21 Y37.12 -G1 X49.09 Y38.45 -G1 X49.4 Y40 -G1 X49.09 Y41.56 -G1 X48.21 Y42.88 -G1 X46.88 Y43.77 -G1 X45.33 Y44.08 -G1 X43.77 Y43.77 -G1 X42.45 Y42.88 -G1 X41.56 Y41.56 -G1 X41.25 Y40 -G1 X41.56 Y38.45 -G1 X42.45 Y37.12 -G1 X43.77 Y36.24 -G1 X45.33 Y35.93 -G0 Z3 -G0 X45.2 Y39.12 -G1 Z-0.99 -G1 X45.7 Y39.19 -G1 X46.07 Y39.52 -G1 X46.22 Y40 -G1 X46.07 Y40.49 -G1 X45.7 Y40.81 -G1 X45.2 Y40.89 -G1 X44.74 Y40.68 -G1 X44.47 Y40.26 -G1 Y39.75 -G1 X44.74 Y39.33 -G1 X45.2 Y39.12 -G0 Z3 -G0 X28.43 Y39.03 -G1 Z-0.99 -G1 X28.92 Y39.1 -G1 X29.3 Y39.43 -G1 X29.44 Y39.91 -G1 X29.3 Y40.4 -G1 X28.92 Y40.72 -G1 X28.43 Y40.8 -G1 X27.97 Y40.59 -G1 X27.7 Y40.16 -G1 Y39.66 -G1 X27.97 Y39.24 -G1 X28.43 Y39.03 -G0 Z3 -G0 X55.76 Y0 -G1 Z-1.5 -G1 X59.27 Y0.35 -G1 X62.65 Y1.37 -G1 X65.76 Y3.03 -G1 X68.49 Y5.27 -G1 X70.73 Y8 -G1 X72.39 Y11.11 -G1 X73.42 Y14.49 -G1 X73.76 Y18 -G1 Y55.69 -G1 X73.42 Y59.2 -G1 X72.39 Y62.57 -G1 X70.73 Y65.69 -G1 X68.49 Y68.41 -G1 X65.76 Y70.65 -G1 X62.65 Y72.31 -G1 X59.27 Y73.34 -G1 X55.76 Y73.69 -G1 X18 -G1 X14.49 Y73.34 -G1 X11.11 Y72.31 -G1 X8 Y70.65 -G1 X5.27 Y68.41 -G1 X3.03 Y65.69 -G1 X1.37 Y62.57 -G1 X0.35 Y59.2 -G1 X0 Y55.69 -G1 Y18 -G1 X0.35 Y14.49 -G1 X1.37 Y11.11 -G1 X3.03 Y8 -G1 X5.27 Y5.27 -G1 X8 Y3.03 -G1 X11.11 Y1.37 -G1 X14.49 Y0.35 -G1 X18 Y0 -G1 X55.76 -G0 Z3 -M5 -G0 X40 Y75 -M2 diff --git a/src/svelte-components/package-lock.json b/src/svelte-components/package-lock.json index a98b03f..25137e5 100644 --- a/src/svelte-components/package-lock.json +++ b/src/svelte-components/package-lock.json @@ -8,21 +8,21 @@ "name": "svelte-components", "version": "0.0.0", "devDependencies": { - "@sveltejs/kit": "^1.0.0-next.357", - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.49", + "@sveltejs/kit": "^1.0.0-next.392", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "@tsconfig/svelte": "^3.0.0", "node-sass": "^7.0.1", "polyfill-object.fromentries": "^1.0.1", "smui-theme": "^6.0.0-beta.16", "string.prototype.matchall": "^4.0.7", - "svelte": "^3.48.0", + "svelte": "^3.49.0", "svelte-check": "^2.8.0", "svelte-material-ui": "^6.0.0-beta.16", "svelte-preprocess": "^4.10.7", "svelte-tiny-virtual-list": "^2.0.5", "tslib": "^2.4.0", "typescript": "^4.7.4", - "vite": "^2.9.13" + "vite": "^3.0.2" } }, "node_modules/@babel/code-frame": { @@ -129,9 +129,9 @@ "dev": true }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1516,46 +1516,46 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.357", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.357.tgz", - "integrity": "sha512-nCAehVybIEpQNnPu61V/EFVdfDb1nBSiQUfW9EcSSDEUbyAMCVBOKZZuzQ0qQDp3xniqRkyDzpBA4wN+ADxHBw==", + "version": "1.0.0-next.392", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.392.tgz", + "integrity": "sha512-od4rDJ/Soq0I7mda7sTbAnNKERHSDEGNa7QBpLA859xgBkwC1JnEIymYOh9dm+hMyHhB0bUoRoaur0qxKLqOOw==", "dev": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.48", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "chokidar": "^3.5.3", - "sade": "^1.8.1", - "vite": "^2.9.10" + "sade": "^1.8.1" }, "bin": { "svelte-kit": "svelte-kit.js" }, "engines": { - "node": ">=16.7" + "node": ">=16.9" }, "peerDependencies": { - "svelte": "^3.44.0" + "svelte": "^3.44.0", + "vite": "^3.0.0" } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.49", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", - "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz", + "integrity": "sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^4.2.1", "debug": "^4.3.4", "deepmerge": "^4.2.2", - "kleur": "^4.1.4", + "kleur": "^4.1.5", "magic-string": "^0.26.2", "svelte-hmr": "^0.14.12" }, "engines": { - "node": "^14.13.1 || >= 16" + "node": "^14.18.0 || >= 16" }, "peerDependencies": { "diff-match-patch": "^1.0.5", "svelte": "^3.44.0", - "vite": "^2.9.0" + "vite": "^3.0.0" }, "peerDependenciesMeta": { "diff-match-patch": { @@ -1585,9 +1585,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", - "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -2301,9 +2301,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz", - "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", "dev": true, "hasInstallScript": true, "bin": { @@ -2313,32 +2313,32 @@ "node": ">=12" }, "optionalDependencies": { - "esbuild-android-64": "0.14.48", - "esbuild-android-arm64": "0.14.48", - "esbuild-darwin-64": "0.14.48", - "esbuild-darwin-arm64": "0.14.48", - "esbuild-freebsd-64": "0.14.48", - "esbuild-freebsd-arm64": "0.14.48", - "esbuild-linux-32": "0.14.48", - "esbuild-linux-64": "0.14.48", - "esbuild-linux-arm": "0.14.48", - "esbuild-linux-arm64": "0.14.48", - "esbuild-linux-mips64le": "0.14.48", - "esbuild-linux-ppc64le": "0.14.48", - "esbuild-linux-riscv64": "0.14.48", - "esbuild-linux-s390x": "0.14.48", - "esbuild-netbsd-64": "0.14.48", - "esbuild-openbsd-64": "0.14.48", - "esbuild-sunos-64": "0.14.48", - "esbuild-windows-32": "0.14.48", - "esbuild-windows-64": "0.14.48", - "esbuild-windows-arm64": "0.14.48" + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" } }, "node_modules/esbuild-android-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz", - "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", "cpu": [ "x64" ], @@ -2352,9 +2352,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz", - "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", "cpu": [ "arm64" ], @@ -2368,9 +2368,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz", - "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", "cpu": [ "x64" ], @@ -2384,9 +2384,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz", - "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", "cpu": [ "arm64" ], @@ -2400,9 +2400,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz", - "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", "cpu": [ "x64" ], @@ -2416,9 +2416,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz", - "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", "cpu": [ "arm64" ], @@ -2432,9 +2432,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz", - "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", "cpu": [ "ia32" ], @@ -2448,9 +2448,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz", - "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", "cpu": [ "x64" ], @@ -2464,9 +2464,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz", - "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", "cpu": [ "arm" ], @@ -2480,9 +2480,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz", - "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", "cpu": [ "arm64" ], @@ -2496,9 +2496,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz", - "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", "cpu": [ "mips64el" ], @@ -2512,9 +2512,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz", - "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", "cpu": [ "ppc64" ], @@ -2528,9 +2528,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz", - "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", "cpu": [ "riscv64" ], @@ -2544,9 +2544,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz", - "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", "cpu": [ "s390x" ], @@ -2560,9 +2560,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz", - "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", "cpu": [ "x64" ], @@ -2576,9 +2576,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz", - "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", "cpu": [ "x64" ], @@ -2592,9 +2592,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz", - "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", "cpu": [ "x64" ], @@ -2608,9 +2608,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz", - "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", "cpu": [ "ia32" ], @@ -2624,9 +2624,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz", - "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", "cpu": [ "x64" ], @@ -2640,9 +2640,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz", - "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "cpu": [ "arm64" ], @@ -3283,9 +3283,9 @@ } }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "node_modules/is-arrayish": { @@ -4422,9 +4422,9 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/punycode": { @@ -4709,9 +4709,9 @@ } }, "node_modules/rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz", + "integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -4821,9 +4821,9 @@ } }, "node_modules/sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -4952,12 +4952,12 @@ } }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "dev": true, "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -5245,9 +5245,9 @@ } }, "node_modules/svelte": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz", - "integrity": "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", + "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", "dev": true, "engines": { "node": ">= 8" @@ -5418,9 +5418,9 @@ "dev": true }, "node_modules/svelte2tsx": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.11.tgz", - "integrity": "sha512-Is95G1wqNvEUJZ9DITRS2zfMwVJRZztMduPs1vJJ0cm65WUg/avBl5vBXjHycQL/qmFpaqa3NG4qWnf7bCHPag==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.12.tgz", + "integrity": "sha512-43ayMivmh1IDCgb+4YDf54YuOJZGCUKFpp37RbfjGgNU+Pmb9HhP+zRXa1pMh4mwSTBfqZS0FbJZP3Q8CSxvvg==", "dev": true, "dependencies": { "dedent-js": "^1.0.1", @@ -5629,21 +5629,21 @@ } }, "node_modules/vite": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz", - "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.2.tgz", + "integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==", "dev": true, "dependencies": { - "esbuild": "^0.14.27", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": "^2.59.0" + "esbuild": "^0.14.47", + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": ">=12.2.0" + "node": "^14.18.0 || >=16.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" @@ -5651,7 +5651,8 @@ "peerDependencies": { "less": "*", "sass": "*", - "stylus": "*" + "stylus": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { "less": { @@ -5662,6 +5663,9 @@ }, "stylus": { "optional": true + }, + "terser": { + "optional": true } } }, @@ -5882,9 +5886,9 @@ "dev": true }, "@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -7251,27 +7255,26 @@ } }, "@sveltejs/kit": { - "version": "1.0.0-next.357", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.357.tgz", - "integrity": "sha512-nCAehVybIEpQNnPu61V/EFVdfDb1nBSiQUfW9EcSSDEUbyAMCVBOKZZuzQ0qQDp3xniqRkyDzpBA4wN+ADxHBw==", + "version": "1.0.0-next.392", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.392.tgz", + "integrity": "sha512-od4rDJ/Soq0I7mda7sTbAnNKERHSDEGNa7QBpLA859xgBkwC1JnEIymYOh9dm+hMyHhB0bUoRoaur0qxKLqOOw==", "dev": true, "requires": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.48", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "chokidar": "^3.5.3", - "sade": "^1.8.1", - "vite": "^2.9.10" + "sade": "^1.8.1" } }, "@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.49", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", - "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz", + "integrity": "sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==", "dev": true, "requires": { "@rollup/pluginutils": "^4.2.1", "debug": "^4.3.4", "deepmerge": "^4.2.2", - "kleur": "^4.1.4", + "kleur": "^4.1.5", "magic-string": "^0.26.2", "svelte-hmr": "^0.14.12" } @@ -7295,9 +7298,9 @@ "dev": true }, "@types/node": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", - "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", "dev": true }, "@types/normalize-package-data": { @@ -7858,170 +7861,170 @@ "dev": true }, "esbuild": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz", - "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", "dev": true, "requires": { - "esbuild-android-64": "0.14.48", - "esbuild-android-arm64": "0.14.48", - "esbuild-darwin-64": "0.14.48", - "esbuild-darwin-arm64": "0.14.48", - "esbuild-freebsd-64": "0.14.48", - "esbuild-freebsd-arm64": "0.14.48", - "esbuild-linux-32": "0.14.48", - "esbuild-linux-64": "0.14.48", - "esbuild-linux-arm": "0.14.48", - "esbuild-linux-arm64": "0.14.48", - "esbuild-linux-mips64le": "0.14.48", - "esbuild-linux-ppc64le": "0.14.48", - "esbuild-linux-riscv64": "0.14.48", - "esbuild-linux-s390x": "0.14.48", - "esbuild-netbsd-64": "0.14.48", - "esbuild-openbsd-64": "0.14.48", - "esbuild-sunos-64": "0.14.48", - "esbuild-windows-32": "0.14.48", - "esbuild-windows-64": "0.14.48", - "esbuild-windows-arm64": "0.14.48" + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" } }, "esbuild-android-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz", - "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", "dev": true, "optional": true }, "esbuild-android-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz", - "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz", - "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz", - "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz", - "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz", - "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz", - "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz", - "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz", - "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz", - "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz", - "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz", - "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", "dev": true, "optional": true }, "esbuild-linux-riscv64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz", - "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz", - "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz", - "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz", - "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz", - "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz", - "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz", - "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz", - "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "dev": true, "optional": true }, @@ -8505,9 +8508,9 @@ } }, "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "is-arrayish": { @@ -9352,9 +9355,9 @@ } }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "punycode": { @@ -9558,9 +9561,9 @@ } }, "rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz", + "integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -9629,9 +9632,9 @@ } }, "sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -9726,12 +9729,12 @@ } }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "dev": true, "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, @@ -9967,9 +9970,9 @@ "dev": true }, "svelte": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz", - "integrity": "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", + "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", "dev": true }, "svelte-check": { @@ -10076,9 +10079,9 @@ "dev": true }, "svelte2tsx": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.11.tgz", - "integrity": "sha512-Is95G1wqNvEUJZ9DITRS2zfMwVJRZztMduPs1vJJ0cm65WUg/avBl5vBXjHycQL/qmFpaqa3NG4qWnf7bCHPag==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.12.tgz", + "integrity": "sha512-43ayMivmh1IDCgb+4YDf54YuOJZGCUKFpp37RbfjGgNU+Pmb9HhP+zRXa1pMh4mwSTBfqZS0FbJZP3Q8CSxvvg==", "dev": true, "requires": { "dedent-js": "^1.0.1", @@ -10245,16 +10248,16 @@ } }, "vite": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz", - "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.2.tgz", + "integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==", "dev": true, "requires": { - "esbuild": "^0.14.27", + "esbuild": "^0.14.47", "fsevents": "~2.3.2", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": "^2.59.0" + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" } }, "webidl-conversions": { diff --git a/src/svelte-components/package.json b/src/svelte-components/package.json index 80a77fa..3b40fd4 100644 --- a/src/svelte-components/package.json +++ b/src/svelte-components/package.json @@ -11,20 +11,20 @@ "check": "svelte-check --tsconfig ./tsconfig.json" }, "devDependencies": { - "@sveltejs/kit": "^1.0.0-next.357", - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.49", + "@sveltejs/kit": "^1.0.0-next.392", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "@tsconfig/svelte": "^3.0.0", "node-sass": "^7.0.1", "polyfill-object.fromentries": "^1.0.1", "smui-theme": "^6.0.0-beta.16", "string.prototype.matchall": "^4.0.7", - "svelte": "^3.48.0", + "svelte": "^3.49.0", "svelte-check": "^2.8.0", "svelte-material-ui": "^6.0.0-beta.16", "svelte-preprocess": "^4.10.7", "svelte-tiny-virtual-list": "^2.0.5", "tslib": "^2.4.0", "typescript": "^4.7.4", - "vite": "^2.9.13" + "vite": "^3.0.2" } }