commit 95241c814ceac8e01e2c7d3e3393cd8024392396 Author: paulmataruso Date: Sat Oct 26 17:19:34 2024 +0000 First Upload diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9158795 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,619 @@ +# Changelog + + +* now require PHP 7.0.0+ +* fix archive-single-item problem +* add header/footer search stop condition +* update languages (`id`, `it`, `pt-br`, `pt-pt`) +* add EXIF-based image rotation +* add `where` to command detection command list +* fix #758 +* fix #760 +* add `@babel/core` 7.12.10 +* add `@babel/preset-env` 7.12.11 +* remove `babel-loader` +* update `eslint` to 7.18.0 +* update `ghu` to 0.26.0 +* update `jsdom` to 16.4.0 +* update `kjua` to 0.9.0 +* update `lolight` to 1.4.0 +* update `marked` to 1.2.7 +* update `null-loader` to 4.0.1 +* update `scar` to 2.3.0 + + +## v0.29.2 - *2019-03-22* + +* update `babel-loader` to 7.1.1 +* update `eslint` to 5.15.3 +* update `ghu` to 0.13.0 +* update `jsdom` to 14.0.0 +* update `kjua` to 0.2.0 +* update `lolight` to 1.0.0 +* update `scar` to 1.2.0 + + +## v0.29.1 - *2019-01-20* + +* replace `babel-preset-es2015` with `babel-preset-env` +* update `eslint` to 5.14.1 +* update `ghu` to 0.12.0 +* update `jsdom` to 9.2.0 +* update `kjua` to 0.1.2 +* update `lolight` to 0.6.0 +* update `marked` to 0.6.1 +* update `normalize.css` to 8.0.1 +* update `scar` to 1.0.0 + + +## v0.29.0 - *2016-08-12* + +* back to cleaner visual experience +* add option to disable sidebar +* add options to filter/search ignore case +* replace PHP `getenv` calls with `$_SERVER` lookups +* add `view.fallbackMode` option to generally serve only fallback mode +* serve fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`) +* change type `txt-svg` to `img-svg`, no thumbs but preview +* fix a tree indentation glitch +* fix shell command detection on Windows +* fix Piwik anayltics +* fix `.htaccess` auth issues +* fix drag-select on scrollable content +* fix download-all function +* fix audio and video preview loading +* fix thumbnail request issues +* add `rust` type and icon +* add `autoplay` option to audio and video preview +* add `--dereference` to `shell-du` to follow sym links +* remove *Install* section from `README.md`, causes too much trouble +* remove peer5 support +* update build process to use `node 6.0+`, no need for babel now +* replace `jquery-qrcode` with [`kjua`](https://larsjung.de/kjua/) +* replace `prism` with [`lolight`](https://larsjung.de/lolight/) +* move deps to `package.json` (`normalize.css`, `kjua`, `lolight` and `marked`) +* remove `jQuery` +* remove `lodash` +* remove [`modulejs`](https://larsjung.de/modulejs/) for now +* reduce JS code by 60% (~250kb -> ~100kb) +* update languages (`et`, `nl`, `pl`) + + +## v0.28.0 - *2015-12-19* + +* now require PHP 5.5.0+ +* change index path to `/_h5ai/public/index.php` +* now only `/_h5ai/public/` needs to be web-accessible +* add support for custom script and style additions +* add options to set font families +* add search +* add ignorecase sorting option to tree +* add wide links in tree view +* add IE edge mode +* add frontend tests +* fix some styles in IE10 +* fix preview bottom bar for small screen widths +* lots of code cleanup and refactorings +* change API +* update build process, now uses [`ghu`](https://larsjung.de/ghu/) +* switch from jshint and jscs to [`eslint`](http://eslint.org/) +* update `jQuery` to 2.1.4 +* update `lodash` to 3.9.3 (add debounce and trim) +* update `marked` to 0.3.5 +* update `modulejs` to 1.13.0 +* update `prism` to 2015-12-19 +* update h5bp styles to 5.2.0 +* update `normalize.css` to 3.0.3 +* remove `Moment.js` + + +## v0.27.0 - *2015-04-06* + +* new layout +* add editorconfig +* drop support for IE9 (gets fallback) +* update sidebar settings +* add info sidebar +* add opt-out for click'n'drag selection +* add package name option for single selections +* add initial support for Peer5 +* add option to down-sample images for preview +* add option for natural sorting in tree sidebar +* fix problems with files/folders named `0` +* change font from `Ubuntu` to `Roboto` (smaller footprint, clearer for small sizes) +* switch back to Google Fonts +* improve PDF thumbnail quality +* improve drag-select +* improve image preview +* prevent listing `_h5ai` folder and subfolders +* update build process, now uses [`mkr`](https://larsjung.de/mkr/) and [`fQuery`](https://larsjung.de/fquery/) +* update `jQuery` to 2.1.3 +* update `jQuery.qrcode` to 0.11.0 +* update `Lo-Dash` to 3.6.0 +* update `Modernizr` to 2.8.3 +* update `modulejs` to 1.4.0 +* update `Moment.js` to 2.9.0 +* update `Prism` to 2015-04-05 +* remove deprecated Google Analytics code +* remove `jQuery.fracs` +* remove `jQuery.scrollpanel` +* remove `jQuery.mousewheel` +* update languages (`af`, `es`, `ja`, `ko`, `ru`, `zh-cn`) + + +## v0.26.1 - *2014-08-17* + +* fix links + + +## v0.26.0 - *2014-08-16* + +* remove True Type fonts +* outsource themes to [h5ai-themes](https://github.com/lrsjng/h5ai-themes) +* add filesize fallback for large files and 32bit PHP +* fix server detection +* add config file tests to info page +* remove JSON shim +* add caching of command checks +* update `jQuery.mousewheel` to 3.1.12 +* update `jQuery.qrcode` to 0.8.0 +* replace `markdown` with [`marked`](https://github.com/chjj/marked) 0.3.2 +* update `modulejs` to 0.4.5 +* update `Moment.js` to 2.8.1 +* replace `underscore` with [`Lo-Dash`](https://github.com/lodash/lodash) 2.4.1 +* replace `SyntaxHighlighter` with [`Prism`](http://prismjs.com) 2014-08-04 + + +## v0.25.2 - *2014-07-01* + +* add optional info page protection +* fix `short_open_tag` issues for PHP < 5.4.0 +* fix default folder download (`alwaysVisible` option) +* minor fixes + + +## v0.25.1 - *2014-06-25* + +* fix broken paths for filenames containing '+' characters +* fix Google Universal Analytics +* fix file type check + + +## v0.25.0 - *2014-06-22* + +* add sidebar +* add initial theme support +* add icons from [Evolvere Icon Theme](http://franksouza183.deviantart.com/art/Evolvere-Icon-theme-440718295) +* add PHP variant to calc folder sizes +* add scroll position reset on location change (issue [#279](https://github.com/lrsjng/h5ai/issues/279)) +* add option to hide unreadable files +* add option where to place folders (top, inplace, bottom) +* add markdown support for custom header and footer files +* add video and audio preview via HTML5 elements (no fallback, works best in Chrome) +* add filter reset on location change +* add option to make download button always visible +* add Google UA support +* extend selectable icon sizes (add 128px, 192px, 256px, 384px) +* improve preview GUI +* disable thumbs in `cache` folder +* fix QR code URI origin (issue [#287](https://github.com/lrsjng/h5ai/issues/287)) +* replace PHP backtick operator with `exec` +* remove server side file manipulation extensions `dropbox`, `delete` and `rename` +* update `H5BP` to 4.3.0 +* update `jQuery` to 2.1.1 +* update `json2.js` to 2014-02-04 +* update `markdown-js` to 0.5.0 +* update `Modernizr` to 2.8.2 +* update `Moment.js` to 2.6.0 +* update `Underscore.js` to 1.6.0 +* update languages (`bg`, `ko`, `pt`, `sl`, `sv`, `zh-cn`) + + +## v0.24.1 - *2014-04-09* + +* security fixes! (issues [#268](https://github.com/lrsjng/h5ai/issues/268), [#269](https://github.com/lrsjng/h5ai/issues/269)) +* fix WinOS command detection +* update languages (`fi`, `fr`, `hi`, `it`, `zh-tw`) + + +## v0.24.0 - *2013-09-04* + +* updates image and text preview +* adds variable icon sizes +* adds optional natural sort of items +* adds optional checkboxes to select items +* adds text preview modes: none, fixed, markdown +* optionally hide folders in main view +* makes use of EXIF thumbnails optional +* fixes file deletion of multiple files +* fixes `setParentFolderLabels = false` +* fixes shell-arg and RegExp escape issues +* cleans code +* updates info page `/_h5ai` +* adds `aiff` to `audio` types +* adds `da` translation by Ronnie Milbo +* updates to `pl` translation by Mark + + +## v0.23.0 - *2013-07-21* + +* removes `aai` mode! +* drops support for IE7+8 (simple fallback, same as no javascript) +* uses History API if available (way faster browsing) +* faster thumbnail generation if EXIF thumbnails available +* adds optional custom headers/footers that are propageted to all subfolders +* optional hide parent folder links +* some fixes on previews +* speeds up packaged downloads +* add line wrap and line highlighting (on hover) to text preview +* new design (colors, images) +* now uses scalable images for the interface +* fixes filter (ignore parent folder, display of `no match`) +* lots of small fixes +* updates `H5BP` to 4.2.0 +* updates `jQuery` to 2.0.3 +* updates `jQuery.mousewheel` to 3.1.3 +* updates `Moment.js` to 2.1.0 +* updates `markdown-js` to 0.4.0-9c21acdf08 +* updates `json2.js` to 2013-05-26 +* adds `uk` translation by Viktor Matveenko +* updates to `pl` translation by Mark + + +## v0.22.1 - *2012-10-16* + +* bug fix concerning API requests in PHP mode +* minor changes in responsive styles + + +## v0.22 - *2012-10-14* + +* general changes h5ai directory layout and configuration +* splits configuration file (`config.json`) into files `options.json`, `types.json` and `langs.json` +* localization now in separate files +* adds auto-refresh +* adds drag'n'drop upload (PHP, experimental) +* adds file deletion (PHP, experimental) +* cleans and improves PHP code +* PHP no longer respects htaccess restrictions (so be careful) +* PHP ignore patterns might include paths now +* improves separation between aai and php mode +* improves performance in aai mode +* adds optional binary prefixes for file sizes +* improves filter: autofocus on keypress, clear on `ESC` +* download packages now packaged relative to current folder +* download package name changable +* splits type `js` into `js` and `json` +* prevents some errors with files > 2GB on 32bit OS +* adds max subfolder size in tree view +* adds ctrl-click file selection +* adds Piwik analytics extension +* temp download packages are now stored in the `cache`-folder and deleted as soon as possible +* updates translations +* adds `he` translation by [Tomer Cohen](https://github.com/tomer) +* updates 3rd party libs + + +## v0.21 - *2012-08-06* + +* fixes misaligned image previews +* adds no JavaScript fallback to PHP version +* fixes duplicate tree entries and empty main views +* adds Google Analytics support (async) +* improves filter (now ignorecase, now only checks if chars in right order) +* adds keyboard support to image preview (space, enter, backspace, left, right, up, down, f, esc) +* adds text file preview and highlighting with [SyntaxHighlighter](http://alexgorbatchev.com/SyntaxHighlighter/) (same keys as img preview) +* adds Markdown preview with [markdown-js](https://github.com/evilstreak/markdown-js) +* adds new type `markdown` +* changes language code `gr` to `el` +* adds localization for filter placeholder +* adds `hu` translation by [Rodolffo](https://github.com/Rodolffo) +* updates to [jQuery.qrcode](https://larsjung.de/qrcode/) 0.2 +* updates to [jQuery.scrollpanel](https://larsjung.de/scrollpanel/) 0.1 +* updates to [modulejs](https://larsjung.de/modulejs/) 0.2 +* updates to [Moment.js](http://momentjs.com) 1.7.0 +* updates to [Underscore.js](http://underscorejs.org) 1.3.3 + + +## v0.20 - *2012-05-11* + +* adds image preview +* adds thumbnails for video and pdf +* adds support for lighttpd, nginx and cherokee and maybe other webservers with PHP +* adds folder size in PHP version via shell `du` +* fixes some localization problems +* updates info page at `/_h5ai/` +* switches to JSHint + + +## v0.19 - *2012-04-19* + +* adds lots of config options +* changes in `config.js` and `h5ai.htaccess` +* fixes js problems in IE 7+8 +* hides broken tree view in IE < 9, adds a message to the footer +* removes hash changes since they break logical browser history +* fixes thumbnail size for portrait images in icon view +* fixes problems with file type recognition +* adds an info page at `/_h5ai/` +* sort order is preserved while browsing +* removes PHP error messages on thumbnail generation +* fixes PHP some problems with packed download +* adds support for tarred downloads +* changes crumb image for folders with an index file +* adds `index.php` to use h5ai in non-Apache environments +* switches from [Datejs](http://www.datejs.com) to [Moment.js](http://momentjs.com) +* adds [underscore.js](http://underscorejs.org) +* fixes mousewheel problems, updates [jQuery.mousewheel](https://github.com/brandonaaron/jquery-mousewheel) to 3.0.6 +* updates `lv` translation +* adds `ro` translation by [Jakob Cosoroabă](https://github.com/midday) +* adds `ja` translation by [metasta](https://github.com/metasta) +* adds `nb` translation by [Sindre Sorhus](https://github.com/sindresorhus) +* adds `sr` translation by [vBm](https://github.com/vBm) +* adds `gr` translation by [xhmikosr](https://github.com/xhmikosr) + + +## v0.18 - *2012-02-24* + +* adds optional QRCode display +* adds optional filtering for displayed files and folders +* updates design +* improves zipped download +* adds support for zipped download of htaccess restricted files +* changes h5ai.htaccess +* custom headers/footers are now optional and disabled by default +* fixes problems with folder recognition in the JS version +* fixes include problems in PHP version +* fixes path problems on servers running on Windows in PHP version +* fixes broken links in custom headers/footers while zipped download enabled +* fixes problems with thumbnails for files with single or double quotes in filename +* improves url hashes +* updates year in `LICENSE.TXT` +* updates es translation +* adds `zh-tw` translation by [Yao Wei](https://github.com/medicalwei) +* updates `zh-cn` translation + + +## v0.17 - *2011-11-28* + +* h5ai is now located in `_h5ai` to reduce collisions +* switches from HTML5 Boilerplate reset to normalization +* adds some style changes for small devices +* configuration (options, types, translations) now via `config.js` +* icons for JS version are now configured via `config.js` +* sort order configuration changed +* sorting is now done without page reload +* adds `customHeader` and `customFooter` to `config.js` +* supports restricted folders to some extent +* some style changes on tree and language menu +* fixes total file/folder count in status bar +* adds support for use with userdir (requires some manual changes) + + +## v0.16 - *2011-11-02* + +* sorts translations in `options.js` +* improves HTML head sections +* refactors JavaScript and PHP a lot +* improves/fixes file selection for zipped download +* fixes scrollbar and header/footer link issues (didn't work when zipped download enabled) +* adds support for ctrl-select +* `dateFormat` in `options.js` changed, now affecting JS and PHP version +* `dateFormat` is localizable by adding it to a translation in `options.js` +* PHP version is now configurable via `php/config.php` (set custom doc root and other PHP related things) +* image thumbs and zipped download is disabled by default now, but works fine if PHP is configured + + +## v0.15.2 - *2011-09-18* + +* adds `it` translation by [Salvo Gentile](https://github.com/SalvoGentile) and [Marco Patriarca](https://github.com/Fexys) +* switches build process from scripp to wepp + + +## v0.15.1 - *2011-09-06* + +* fixes security issues with the zipped download feature +* makes zipped download optional (but enabled by default) + + +## v0.15 - *2011-09-04* + +* adds zipped download for selected files +* cleans and refactores + + +## v0.14.1 - *2011-09-01* + +* display meta information in bottom bar (icon view) +* adds `zh-cn` translation by [Dongsheng Cai](https://github.com/dongsheng) +* adds `pl` translation by Radosław Zając +* adds `ru` translation by Богдан Илюхин + + +## v0.14 - *2011-08-16* + +* adds image thumbnails for PHP version +* new option `slideTree` to turn off auto slide in + + +## v0.13.2 - *2011-08-12* + +* changes in `/h5ai/.htaccess` ... PHP configuration ... + + +## v0.13.1 - *2011-08-12* + +* fixes initial tree display +* adds sort order option +* adds/fixes some translations +* adds `lv` translation by Sandis Veinbergs + + +## v0.13 - *2011-08-06* + +* adds PHP implementation! (should work with PHP 5.2+) +* adds new options +* changes layout of the bottom bar to display status information +* adds language selector to the bottom bar +* quotes keys in `options.js` to make it valid json +* changes value of option `lang` from `undefined` to `null` +* adds some new keys to `h5aiLangs` +* adds browser caching rules for css and js +* adds `pt` translation by [Jonnathan](https://github.com/jonnsl) +* adds `bg` translation by George Andonov + + +## v0.12.3 - *2011-07-30* + +* adds `tr` translation by [Batuhan Icoz](https://github.com/batuhanicoz) + + +## v0.12.2 - *2011-07-30* + +* adds `es` translation by Jose David Calderon Serrano + + +## v0.12.1 - *2011-07-29* + +* fixes unchecked use of console.log + + +## v0.12 - *2011-07-28* + +* improves performance + + +## v0.11 - *2011-07-27* + +* changes license to MIT license, see `LICENSE.txt` + + +## v0.10.2 - *2011-07-26* + +* improves tree scrollbar + + +## v0.10.1 - *2011-07-24* + +* fixes problems with ' in links + + +## v0.10 - *2011-07-24* + +* fixes problems with XAMPP on Windows (see `dot.htaccess` comments for instructions) +* fixes tree fade-in-fade-out effect for small displays ([issue #6](https://github.com/lrsjng/h5ai/issues/6)) +* adds custom scrollbar to tree ([issue #6](https://github.com/lrsjng/h5ai/issues/6)) +* fixes broken links caused by URI encoding/decoding ([issue #9](https://github.com/lrsjng/h5ai/issues/9)) +* adds "empty" to localization (hope Google Translate did a good job here) + + +## v0.9 - *2011-07-18* + +* links hover states between crumb, extended view and tree +* fixes size of tree view (now there's a ugly scrollbar, hopefully will be fixed) +* refactores js to improve performance and cleaned code +* adds caching for folder status codes and content +* adds `fr` translation by [Nicolas](https://github.com/Nicosmos) +* adds `nl` translation by [Stefan de Konink](https://github.com/skinkie) +* adds `sv` translation by Oscar Carlsson + + +## v0.8 - *2011-07-08* + +* removes slashes from folder labels +* optionally rename parent folder entries to real folder names, see `options.js` +* long breadcrumbs (multiple rows) no longer hide content +* error folder icons are opaque now +* refactores js a lot (again...) + + +## v0.7 - *2011-07-07* + +* removes shadows +* smarter tree side bar + + +## v0.6 - *2011-07-05* + +* refactores js +* adds localization, see `options.js` + + +## v0.5.3 - *2011-07-04* + +* refactores js +* adds basic options support via `options.js` +* adds comments to `options.js` +* adds optional tree sidebar + + +## v0.5.2 - *2011-07-02* + +* details view adjusts to window width +* links icon for *.gz and *.bz2 + + +## v0.5.1 - *2011-07-01* + +* disables tree sidebar for now, since it had unwanted side effects + + +## v0.5 - *2011-07-01* + +* adds tree sidebar +* some refactorings + + +## v0.4 - *2011-06-27* + +* adds better fallback, in case JavaScript is disabled +* rewrites js, fixed middle-button click etc. problems +* refactors css +* sorts, adds and moves icons and images +* updates dot.access + + +## v0.3.2 - *2011-06-24* + +* removes lib versions from file names +* adds 'empty' indicator for icons view + + +## v0.3.1 - *2011-06-24* + +* refactores js +* adds `folderClick` and `fileClick` callback hooks +* fixes .emtpy style + + +## v0.3 - *2011-06-23* + +* includes build stuff, files previously found in the base directory are now located in folder `target` +* styles and scripts are now minified +* adds Modernizr 2.0.4 for future use +* updates jQuery to version 1.6.1 + + +## v0.2.3 - *2011-06-17* + +* more refactoring in main.js + + +## v0.2.2 - *2011-06-16* + +* refactores a lot, adds some comments +* includes fixes from [NumEricR](https://github.com/NumEricR) +* adds top/bottom message support, only basicly styled + + +## v0.2.1 - *2011-06-16* + +* fixes croped filenames +* fixes missing .png extension in header +* adds some color to the links +* adds changelog + + +## v0.2 - *2011-06-15* + +* adds icon view diff --git a/README.md b/README.md new file mode 100644 index 0000000..b7ebb5d --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +# h5ai + +[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github] + +A modern HTTP web server index for Apache httpd, lighttpd, and nginx. + + +## Important + +* Do **not** install any files from the `src` folder, they need to be + preprocessed to work correctly! +* Find a preprocessed package and detailed install instructions on the + [project page][web]. +* For bug reports and feature requests please use [issues][github-issues]. + + +## Build + +There are installation ready packages for the latest [releases][release] and +[dev builds][develop]. But to build **h5ai** yourself either `git clone` or +download the repository. From within the root folder run the following +commands to find a fresh zipball in folder `build` (tested on linux only, +requires [`node 10.0+`][node] to be installed, might work on other +configurations). + +~~~sh +> npm install +> npm run build +~~~ + + +## License + +The MIT License (MIT) + +Copyright (c) 2020 Lars Jung (https://larsjung.de) + +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. + + +## References + +**h5ai** profits from other projects, all of them licensed under the MIT license +too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0). + + +[web]: https://larsjung.de/h5ai/ +[github]: https://github.com/lrsjng/h5ai +[github-issues]: https://github.com/lrsjng/h5ai/issues +[release]: https://release.larsjung.de/h5ai/ +[develop]: https://release.larsjung.de/h5ai/develop/ +[node]: https://nodejs.org +[material-design-icons]: https://github.com/google/material-design-icons + +[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square +[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-square +[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square diff --git a/ghu.js b/ghu.js new file mode 100644 index 0000000..8947751 --- /dev/null +++ b/ghu.js @@ -0,0 +1,157 @@ +const {resolve, join} = require('path'); +const { + ghu, autoprefixer, cssmin, each, ife, includeit, jszip, less, mapfn, + pug, read, remove, run, uglify, watch, webpack, wrap, write +} = require('ghu'); + +const ROOT = resolve(__dirname); +const SRC = join(ROOT, 'src'); +const TEST = join(ROOT, 'test'); +const BUILD = join(ROOT, 'build'); + +const mapper = mapfn.p(SRC, BUILD).s('.less', '.css').s('.pug', ''); +const WEBPACK_CFG = { + mode: 'none', + module: { + rules: [ + { + test: /\.js$/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + }, + { + test: /jsdom/, + use: 'null-loader' + } + ] + } +}; + +ghu.defaults('release'); + +ghu.before(runtime => { + runtime.pkg = Object.assign({}, require('./package.json')); + + const res = run.sync(`git rev-list v${runtime.pkg.version}..HEAD`, {silent: true}); + if (res.code === 0) { + const hashes = res.stdout.split(/\r?\n/).filter(x => x); + if (hashes.length) { + const counter = ('000' + hashes.length).substr(-3); + const hash = hashes[0].substr(0, 7); + runtime.pkg.version += `+${counter}~${hash}`; + } + } + + runtime.comment = `${runtime.pkg.name} v${runtime.pkg.version} - ${runtime.pkg.homepage}`; + runtime.comment_js = `/* ${runtime.comment} */\n`; + runtime.comment_html = ``; + console.log(runtime.comment); +}); + +ghu.task('force-production', 'ensure :production flag is set', runtime => { + if (!runtime.args.production) { + runtime.args.production = true; + console.log('forcing production mode'); + } +}); + +ghu.task('clean', 'delete build folder', () => { + return remove(BUILD); +}); + +ghu.task('build:scripts', runtime => { + return read(`${SRC}/_h5ai/public/js/scripts.js`) + .then(webpack(WEBPACK_CFG)) + .then(wrap('\n\n// @include "pre.js"\n\n')) + .then(includeit()) + .then(ife(() => runtime.args.production, uglify())) + .then(wrap(runtime.comment_js)) + .then(write(mapper, {overwrite: true})); +}); + +ghu.task('build:styles', runtime => { + return read(`${SRC}/_h5ai/public/css/*.less`) + .then(includeit()) + .then(less()) + .then(autoprefixer()) + .then(ife(() => runtime.args.production, cssmin())) + .then(wrap(runtime.comment_js)) + .then(write(mapper, {overwrite: true})); +}); + +ghu.task('build:pages', runtime => { + return read(`${SRC}: **/*.pug, ! **/*.tpl.pug`) + .then(pug({pkg: runtime.pkg})) + .then(wrap('', runtime.comment_html)) + .then(write(mapper, {overwrite: true})); +}); + +ghu.task('build:copy', runtime => { + const mapper_root = mapfn.p(ROOT, join(BUILD, '_h5ai')); + + return Promise.all([ + read(`${SRC}/**/conf/*.json`) + .then(wrap(runtime.comment_js)) + .then(write(mapper, {overwrite: true, cluster: true})), + + read(`${SRC}: **, ! **/*.js, ! **/*.less, ! **/*.pug, ! **/conf/*.json`) + .then(each(obj => { + if ((/index\.php$/).test(obj.source)) { + obj.content = obj.content.replace('{{VERSION}}', runtime.pkg.version); + } + })) + .then(write(mapper, {overwrite: true, cluster: true})), + + read(`${ROOT}/*.md`) + .then(write(mapper_root, {overwrite: true, cluster: true})) + ]); +}); + +ghu.task('build:tests', ['build:styles'], 'build the test suite', () => { + return Promise.all([ + read(`${BUILD}/_h5ai/public/css/styles.css`) + .then(write(`${BUILD}/test/h5ai-styles.css`, {overwrite: true})), + + read(`${TEST}/index.html`) + .then(write(`${BUILD}/test/index.html`, {overwrite: true})), + + read(`${TEST}: index.js`) + .then(webpack(WEBPACK_CFG)) + .then(wrap(`\n\n// @include "${SRC}/**/js/pre.js"\n\n`)) + .then(includeit()) + .then(write(mapfn.p(TEST, `${BUILD}/test`), {overwrite: true})) + ]).then(() => { + console.log(`browse to file://${BUILD}/test/index.html to run the test suite`); + }); +}); + +ghu.task('build', ['build:scripts', 'build:styles', 'build:pages', 'build:copy', 'build:tests'], + 'build all updated files, optionally use :production'); + +ghu.task('deploy', ['build'], 'deploy to a specified path with :dest=/some/path', runtime => { + if (typeof runtime.args.dest !== 'string') { + throw new Error('no destination path (e.g. :dest=/some/path)'); + } + console.log(`deploy to ${runtime.args.dest}`); + + const mapper_deploy = mapfn.p(BUILD, resolve(runtime.args.dest)); + + return read(`${BUILD}/_h5ai/**`) + .then(write(mapper_deploy, {overwrite: true, cluster: true})); +}); + +ghu.task('watch', runtime => { + return watch([SRC, TEST], () => ghu.run(runtime.sequence.filter(x => x !== 'watch'), runtime.args, true)); +}); + +ghu.task('release', ['force-production', 'clean', 'build'], 'create a zipball', runtime => { + const target = join(BUILD, `${runtime.pkg.name}-${runtime.pkg.version}.zip`); + + return read(`${BUILD}/_h5ai/**`) + .then(jszip({dir: BUILD, level: 9})) + .then(write(target, {overwrite: true})); +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7d50f49 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7428 @@ +{ + "name": "h5ai", + "version": "0.30.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true + }, + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + } + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", + "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", + "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", + "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.11", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.11", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.11", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "acorn": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz", + "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.5.tgz", + "integrity": "sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001097", + "colorette": "^1.2.0", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "browserslist": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "caniuse-lite": { + "version": "1.0.30001105", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz", + "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.509", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.509.tgz", + "integrity": "sha512-cN4lkjNRuTG8rtAqTOVgwpecEC2kbKA04PG6YijcKGHK/kD0xLjiqExcAOmLUwtXZRF8cBeam2I0VZcih919Ug==", + "dev": true + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + }, + "dependencies": { + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + } + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001179", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", + "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "dev": true, + "requires": { + "is-regex": "^1.0.3" + } + }, + "chokidar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", + "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", + "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dev": true, + "requires": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-compat": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", + "dev": true, + "requires": { + "browserslist": "^4.16.1", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cssmin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.4.3.tgz", + "integrity": "sha1-yRlAd+Dr2s1pHV9ZAVudgZ840BU=", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.644", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.644.tgz", + "integrity": "sha512-N7FLvjDPADxad+OXXBuYfcvDvCBG0aW8ZZGr7G91sZMviYbnQJFxdSvUus4SJ0K7Q8dzMxE+Wx1d/CrJIIJ0sw==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", + "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ghu": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/ghu/-/ghu-0.26.0.tgz", + "integrity": "sha512-kQmz56OE9czxZ/TtCFwhuu4THxzIVH+N1avgt2ncmHUVqYEnza+QG0CqWnnPpTlUwVUHZ1yffEUCUFC9D6wDlA==", + "dev": true, + "requires": { + "@babel/core": "7.10.5", + "@babel/preset-env": "7.10.4", + "autoprefixer": "9.8.5", + "babel-loader": "8.1.0", + "chalk": "4.1.0", + "commander": "6.0.0", + "cssmin": "0.4.3", + "dateformat": "3.0.3", + "glob": "7.1.6", + "html-minifier": "4.0.0", + "includeit": "1.7.0", + "jszip": "3.5.0", + "less": "3.12.2", + "minimist": "1.2.5", + "mkdirp": "1.0.4", + "pug": "3.0.0", + "rimraf": "3.0.2", + "uglify-js": "3.10.0", + "watch": "1.0.2", + "webpack": "4.43.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/preset-env": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", + "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.4", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-minifier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", + "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "clean-css": "^4.2.1", + "commander": "^2.19.0", + "he": "^1.2.0", + "param-case": "^2.1.1", + "relateurl": "^0.2.7", + "uglify-js": "^3.5.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "includeit": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/includeit/-/includeit-1.7.0.tgz", + "integrity": "sha512-QAFdorZxyh0ezCGKOox0gR4LoAqI6UQJdXyEfWjHRHrA/tah+pf6sn7SvKM9SB3Pyglo/ZcAIZTdE2BFlCPTfw==", + "dev": true, + "requires": { + "glob": "7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "dev": true, + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kjua": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/kjua/-/kjua-0.9.0.tgz", + "integrity": "sha512-Wmh5k6hpl+wiYkcEIx0/Ocj1DOxacw/myh/SQ3NbY0RWD4360CXaaAJkdeeV+moqf7fxvACYK95LXQ8vtLWKxA==", + "dev": true + }, + "less": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "native-request": "^1.0.5", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lolight": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/lolight/-/lolight-1.4.0.tgz", + "integrity": "sha512-d64i6wBResbga3rnM9JYG6Jq/foHDZvSCxoof4kAU48rtzffgbiJlmjs+CfMNlXH2tG3ct+2T6+ht1h4GP7DSg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.7.tgz", + "integrity": "sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "requires": { + "mime-db": "1.45.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "native-request": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", + "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true + }, + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true, + "optional": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz", + "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==", + "dev": true, + "requires": { + "pug-code-gen": "^3.0.0", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.0", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.0", + "pug-strip-comments": "^2.0.0" + } + }, + "pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "requires": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "pug-code-gen": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz", + "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==", + "dev": true, + "requires": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "dev": true + }, + "pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "requires": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "pug-lexer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz", + "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==", + "dev": true, + "requires": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "requires": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "requires": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "pug-runtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz", + "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA==", + "dev": true + }, + "pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dev": true, + "requires": { + "pug-error": "^2.0.0" + } + }, + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.6.tgz", + "integrity": "sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true, + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scar": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/scar/-/scar-2.3.0.tgz", + "integrity": "sha512-QNiSVABevJhQpYvHXBh2TWG4kZgooEPuu1h2YMlSqmgjIStEKW9W4iwXEw4A+WPmPiSQstLyyZ5oyJk+eYu4YA==", + "dev": true + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", + "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", + "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "watch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz", + "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dev": true, + "requires": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3dc6982 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "h5ai", + "version": "0.30.0", + "description": "Modern HTTP web server index.", + "homepage": "https://larsjung.de/h5ai/", + "author": "Lars Jung (https://larsjung.de)", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/lrsjng/h5ai.git" + }, + "scripts": { + "lint": "eslint .", + "test": "node test", + "build": "node ghu release", + "precommit": "npm run -s lint && npm run -s test" + }, + "devDependencies": { + "@babel/core": "7.12.10", + "@babel/preset-env": "7.12.11", + "eslint": "7.18.0", + "ghu": "0.26.0", + "jsdom": "16.4.0", + "kjua": "0.9.0", + "lolight": "1.4.0", + "marked": "1.2.7", + "normalize.css": "8.0.1", + "null-loader": "4.0.1", + "scar": "2.3.0" + } +} diff --git a/src/.eslintrc b/src/.eslintrc new file mode 100644 index 0000000..9e95c42 --- /dev/null +++ b/src/.eslintrc @@ -0,0 +1,4 @@ +--- + rules: + no-console: 1 + prefer-reflect: 0 diff --git a/src/_h5ai/.htaccess b/src/_h5ai/.htaccess new file mode 100644 index 0000000..95e775b --- /dev/null +++ b/src/_h5ai/.htaccess @@ -0,0 +1,165 @@ +## details here: https://github.com/h5bp/server-configs-apache + + + +## SECURITY ################################################################### + +DirectoryIndex disabled +FileETag None +ServerSignature Off + +# Apache < 2.3 + + Order allow,deny + Deny from all + Satisfy All + + +# Apache ≥ 2.3 + + Require all denied + + + + Header set X-Content-Type-Options "nosniff" + Header unset ETag + Header unset X-Powered-By + + + + Options -Indexes + + + + +## COMPAT ##################################################################### + +AddDefaultCharset utf-8 + + + AddCharset utf-8 .css .html .js .json .php .svg + + AddType application/font-woff woff + AddType application/font-woff2 woff2 + AddType application/json json + AddType application/javascript js + AddType application/vnd.ms-fontobject eot + AddType application/x-font-ttf ttc ttf + AddType image/jpeg jpeg jpg + AddType image/png png + AddType image/svg+xml svg svgz + AddType image/x-icon ico + AddType font/opentype otf + AddType text/css css + AddType text/html html + + + + +## SPEED ###################################################################### + + + ExpiresActive on + ExpiresDefault "access plus 1 month" + + ExpiresByType application/json "access plus 0 seconds" + + ExpiresByType text/html "access plus 1 minute" + + ExpiresByType image/x-icon "access plus 1 week" + + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType text/css "access plus 1 year" + + + + + + SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding + RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding + + + + # Apache ≥ 2.3 + + # mod_filter as module only available for Apache ≥ 2.3.7 + + AddOutputFilterByType DEFLATE "application/atom+xml" \ + "application/javascript" \ + "application/json" \ + "application/ld+json" \ + "application/manifest+json" \ + "application/rdf+xml" \ + "application/rss+xml" \ + "application/schema+json" \ + "application/vnd.geo+json" \ + "application/vnd.ms-fontobject" \ + "application/x-font-ttf" \ + "application/x-javascript" \ + "application/x-web-app-manifest+json" \ + "application/xhtml+xml" \ + "application/xml" \ + "font/eot" \ + "font/opentype" \ + "image/bmp" \ + "image/svg+xml" \ + "image/vnd.microsoft.icon" \ + "image/x-icon" \ + "text/cache-manifest" \ + "text/css" \ + "text/html" \ + "text/javascript" \ + "text/plain" \ + "text/vcard" \ + "text/vnd.rim.location.xloc" \ + "text/vtt" \ + "text/x-component" \ + "text/x-cross-domain-policy" \ + "text/xml" + + + + # Apache < 2.3 + + AddOutputFilterByType DEFLATE "application/atom+xml" \ + "application/javascript" \ + "application/json" \ + "application/ld+json" \ + "application/manifest+json" \ + "application/rdf+xml" \ + "application/rss+xml" \ + "application/schema+json" \ + "application/vnd.geo+json" \ + "application/vnd.ms-fontobject" \ + "application/x-font-ttf" \ + "application/x-javascript" \ + "application/x-web-app-manifest+json" \ + "application/xhtml+xml" \ + "application/xml" \ + "font/eot" \ + "font/opentype" \ + "image/bmp" \ + "image/svg+xml" \ + "image/vnd.microsoft.icon" \ + "image/x-icon" \ + "text/cache-manifest" \ + "text/css" \ + "text/html" \ + "text/javascript" \ + "text/plain" \ + "text/vcard" \ + "text/vnd.rim.location.xloc" \ + "text/vtt" \ + "text/x-component" \ + "text/x-cross-domain-policy" \ + "text/xml" + + + + AddEncoding gzip gz + AddEncoding gzip svgz + + diff --git a/src/_h5ai/private/cache/README.md b/src/_h5ai/private/cache/README.md new file mode 100644 index 0000000..60bc416 --- /dev/null +++ b/src/_h5ai/private/cache/README.md @@ -0,0 +1,9 @@ +# Cache + +Private cache. + +This directory is used for server side caching. To use caching make this +directory writable for your webserver. + +There is no critical data in here. You can savely remove any content. This +will clear the cache. diff --git a/src/_h5ai/private/conf/l10n/af.json b/src/_h5ai/private/conf/l10n/af.json new file mode 100644 index 0000000..5150c7b --- /dev/null +++ b/src/_h5ai/private/conf/l10n/af.json @@ -0,0 +1,18 @@ +{ + "lang": "afrikaans", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "besonderhede", + "download": "aflaai", + "empty": "leeg", + "files": "lêers", + "filter": "filter", + "folders": "gidse", + "grid": "rooster", + "icons": "ikone", + "lastModified": "Laas verander", + "name": "Naam", + "noMatch": "geen resultaat", + "parentDirectory": "Hoër Vlak", + "size": "Grootte" +} diff --git a/src/_h5ai/private/conf/l10n/bg.json b/src/_h5ai/private/conf/l10n/bg.json new file mode 100644 index 0000000..6808e62 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/bg.json @@ -0,0 +1,18 @@ +{ + "lang": "български", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "детайли", + "download": "изтегляне", + "empty": "празна", + "files": "файлове", + "filter": "филтър", + "folders": "директории", + "grid": "мрежа", + "icons": "икони", + "lastModified": "Последна промяна", + "name": "Име", + "noMatch": "няма съвпадение", + "parentDirectory": "Предходна директория", + "size": "Размер" +} diff --git a/src/_h5ai/private/conf/l10n/cs.json b/src/_h5ai/private/conf/l10n/cs.json new file mode 100644 index 0000000..1e34e61 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/cs.json @@ -0,0 +1,18 @@ +{ + "lang": "čeština", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "Podrobnosti", + "download": "Stáhnout", + "empty": "Prázdná složka", + "files": "souborů", + "filter": "Filtr", + "folders": "složek", + "grid": "Seznam", + "icons": "Velké ikony", + "lastModified": "Datum změny", + "name": "Název", + "noMatch": "Žádná shoda", + "parentDirectory": "Nadřazený adresář", + "size": "Velikost" +} diff --git a/src/_h5ai/private/conf/l10n/da.json b/src/_h5ai/private/conf/l10n/da.json new file mode 100644 index 0000000..3b8fa06 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/da.json @@ -0,0 +1,18 @@ +{ + "lang": "dansk", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detaljer", + "download": "download", + "empty": "tom", + "files": "filer", + "filter": "filter", + "folders": "mapper", + "grid": "grid", + "icons": "ikoner", + "lastModified": "Sidst ændret", + "name": "Navn", + "noMatch": "ingen match", + "parentDirectory": "Overordnet mappe", + "size": "Størrelse" +} diff --git a/src/_h5ai/private/conf/l10n/de.json b/src/_h5ai/private/conf/l10n/de.json new file mode 100644 index 0000000..6d8c613 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/de.json @@ -0,0 +1,22 @@ +{ + "lang": "deutsch", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "Details", + "download": "Download", + "empty": "leer", + "files": "Dateien", + "filter": "filtern", + "folders": "Ordner", + "grid": "Gitter", + "icons": "Icons", + "language": "Sprache", + "lastModified": "Geändert", + "name": "Name", + "noMatch": "keine Treffer", + "parentDirectory": "Übergeordnetes Verzeichnis", + "search": "suchen", + "size": "Größe", + "tree": "Baum", + "view": "Ansicht" +} diff --git a/src/_h5ai/private/conf/l10n/el.json b/src/_h5ai/private/conf/l10n/el.json new file mode 100644 index 0000000..2d9c00d --- /dev/null +++ b/src/_h5ai/private/conf/l10n/el.json @@ -0,0 +1,18 @@ +{ + "lang": "ελληνικά", + + "dateFormat": "DD/MM/YYYY HH:mm", + "details": "λεπτομέρειες", + "download": "μεταμόρφωση", + "empty": "κενό", + "files": "αρχεία", + "filter": "φίλτρο", + "folders": "φάκελοι", + "grid": "πλέγμα", + "icons": "εικονίδια", + "lastModified": "Τελευταία τροποποίηση", + "name": "Όνομα", + "noMatch": "κανένα αποτέλεσμα", + "parentDirectory": "Προηγούμενος Κατάλογος", + "size": "Μέγεθος" +} diff --git a/src/_h5ai/private/conf/l10n/en.json b/src/_h5ai/private/conf/l10n/en.json new file mode 100644 index 0000000..05e9b4e --- /dev/null +++ b/src/_h5ai/private/conf/l10n/en.json @@ -0,0 +1,23 @@ +/* only here as a reference, these values are the hardcoded defaults */ +{ + "lang": "english", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "details", + "download": "download", + "empty": "empty", + "files": "files", + "filter": "filter", + "folders": "folders", + "grid": "grid", + "icons": "icons", + "language": "Language", + "lastModified": "Last modified", + "name": "Name", + "noMatch": "no match", + "parentDirectory": "Parent Directory", + "search": "search", + "size": "Size", + "tree": "Tree", + "view": "View" +} diff --git a/src/_h5ai/private/conf/l10n/es.json b/src/_h5ai/private/conf/l10n/es.json new file mode 100644 index 0000000..e42a5b9 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/es.json @@ -0,0 +1,22 @@ +{ + "lang": "español", + + "dateFormat": "DD/MM/YYYY HH:mm", + "details": "Detalles", + "download": "Descargar", + "empty": "vacío", + "files": "Archivos", + "filter": "Filtrar", + "folders": "Directorios", + "grid": "Cuadrícula", + "icons": "Íconos", + "language": "Idioma", + "lastModified": "Última modificación", + "name": "Nombre", + "noMatch": "Sin coincidencias", + "parentDirectory": "Directorio superior", + "search": "buscar", + "size": "Tamaño", + "tree": "Arbol", + "view": "Vista" +} diff --git a/src/_h5ai/private/conf/l10n/et.json b/src/_h5ai/private/conf/l10n/et.json new file mode 100644 index 0000000..8f3d1dc --- /dev/null +++ b/src/_h5ai/private/conf/l10n/et.json @@ -0,0 +1,22 @@ +{ + "lang": "estonian", + + "dateFormat": "DD-MM-YYYY HH.mm", + "details": "täpsem info", + "download": "laadi alla", + "empty": "tühi", + "files": "failid", + "filter": "filter", + "folders": "kataloogid", + "grid": "võre", + "icons": "ikoonid", + "language": "Keel", + "lastModified": "Viimati muudetud", + "name": "Nimi", + "noMatch": "ei leitud sobivat", + "parentDirectory": "Emakataloog", + "search": "otsi", + "size": "Suurus", + "tree": "Puu", + "view": "Vaade" +} diff --git a/src/_h5ai/private/conf/l10n/fi.json b/src/_h5ai/private/conf/l10n/fi.json new file mode 100644 index 0000000..c19c0ed --- /dev/null +++ b/src/_h5ai/private/conf/l10n/fi.json @@ -0,0 +1,18 @@ +{ + "lang": "finnish", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "tiedot", + "download": "lataa", + "empty": "tyhjä", + "files": "tiedostoa", + "filter": "suodata", + "folders": "hakemistoa", + "grid": "ruudukko", + "icons": "ikonit", + "lastModified": "Viimeksi muokattu", + "name": "Nimi", + "noMatch": "ei osumia", + "parentDirectory": "Ylähakemisto", + "size": "Koko" +} diff --git a/src/_h5ai/private/conf/l10n/fr.json b/src/_h5ai/private/conf/l10n/fr.json new file mode 100644 index 0000000..9a4ac45 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/fr.json @@ -0,0 +1,22 @@ +{ + "lang": "français", + + "dateFormat": "DD/MM/YYYY HH:mm", + "details": "détails", + "download": "télécharger", + "empty": "vide", + "files": "Fichiers", + "filter": "filtrer", + "folders": "Répertoires", + "grid": "grille", + "icons": "icônes", + "language": "Langue", + "lastModified": "Dernière modification", + "name": "Nom", + "noMatch": "rien trouvé", + "parentDirectory": "Dossier parent", + "search": "rechercher", + "size": "Taille", + "tree": "Arborescence", + "view": "Disposition" +} diff --git a/src/_h5ai/private/conf/l10n/he.json b/src/_h5ai/private/conf/l10n/he.json new file mode 100644 index 0000000..bb37f7f --- /dev/null +++ b/src/_h5ai/private/conf/l10n/he.json @@ -0,0 +1,17 @@ +{ + "lang": "עברית", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "פרטים", + "download": "הורדה", + "empty": "ריק", + "files": "קבצים", + "filter": "סינון", + "folders": "תיקיות", + "icons": "צלמיות", + "lastModified": "שינוי אחרון", + "name": "שם", + "noMatch": "אין תוצאות", + "parentDirectory": "תיקיית הורה", + "size": "גודל" +} diff --git a/src/_h5ai/private/conf/l10n/hi.json b/src/_h5ai/private/conf/l10n/hi.json new file mode 100644 index 0000000..5941733 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/hi.json @@ -0,0 +1,18 @@ +{ + "lang": "हिंदी", + + "dateFormat": "DD.MM.YYYY HH:mm", + "details": "विस्तार", + "download": "डाउनलोड", + "empty": "खाली", + "files": "फ़ाइलें", + "filter": "फ़िल्टर", + "folders": "फोल्डर", + "grid": "ग्रिड", + "icons": "आइकॉन", + "lastModified": "पिछला परिवर्तन", + "name": "नाम", + "noMatch": "कोई समानता नहीं", + "parentDirectory": "मूल डायरेक्टरी", + "size": "माप" +} diff --git a/src/_h5ai/private/conf/l10n/hr.json b/src/_h5ai/private/conf/l10n/hr.json new file mode 100644 index 0000000..c044db4 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/hr.json @@ -0,0 +1,18 @@ +{ + "lang": "hrvatski", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "detalji", + "download": "preuzmi", + "empty": "prazno", + "files": "datoteka", + "filter": "filter", + "folders": "direktorij(a)", + "grid": "mreža", + "icons": "ikone", + "lastModified": "Posljednja izmjena", + "name": "Naziv", + "noMatch": "nema rezultata", + "parentDirectory": "Natrag", + "size": "Veličina" +} diff --git a/src/_h5ai/private/conf/l10n/hu.json b/src/_h5ai/private/conf/l10n/hu.json new file mode 100644 index 0000000..b2c1b34 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/hu.json @@ -0,0 +1,16 @@ +{ + "lang": "magyar", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "részletek", + "download": "letöltés", + "empty": "üres", + "files": "fájlok", + "folders": "mappák", + "icons": "ikonok", + "lastModified": "Utoljára módosítva", + "name": "Név", + "noMatch": "nincs találat", + "parentDirectory": "Szülő könyvtár", + "size": "Méret" +} diff --git a/src/_h5ai/private/conf/l10n/id.json b/src/_h5ai/private/conf/l10n/id.json new file mode 100644 index 0000000..1987f59 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/id.json @@ -0,0 +1,22 @@ +{ + "lang": "Bahasa Indonesia", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "rincian", + "download": "unduh", + "empty": "kosong", + "files": "berkas", + "filter": "saring", + "folders": "pelipat", + "grid": "jaring", + "icons": "ikon", + "language": "Bahasa", + "lastModified": "Di modifikasi", + "name": "Nama", + "noMatch": "tidak cocok", + "parentDirectory": "Direktori induk", + "search": "cari", + "size": "Ukuran", + "tree": "Pohon", + "view": "Tampil" +} diff --git a/src/_h5ai/private/conf/l10n/it.json b/src/_h5ai/private/conf/l10n/it.json new file mode 100644 index 0000000..4547c62 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/it.json @@ -0,0 +1,22 @@ +{ + "lang": "italiano", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "dettagli", + "download": "download", + "empty": "vuota", + "files": "file", + "filter": "filtra", + "folders": "cartelle", + "grid": "griglia", + "icons": "icone", + "language": "Linugua", + "lastModified": "Ultima modifica", + "name": "Nome", + "noMatch": "nessun risultato", + "parentDirectory": "Cartella Superiore", + "search": "cerca", + "size": "Dimensione", + "tree": "Albero", + "view": "Vista" +} diff --git a/src/_h5ai/private/conf/l10n/ja.json b/src/_h5ai/private/conf/l10n/ja.json new file mode 100644 index 0000000..88266e7 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/ja.json @@ -0,0 +1,20 @@ +{ + "lang": "日本語", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "詳細", + "download": "ダウンロード", + "empty": "(空)", + "files": "ファイル", + "filter": "フィルター", + "folders": "フォルダー", + "grid": "グリッド", + "icons": "アイコン", + "language": "言語", + "lastModified": "最終変更日時", + "name": "名前", + "noMatch": "一致する項目が見つかりません", + "parentDirectory": "親ディレクトリへ", + "size": "サイズ", + "view": "ビュー" +} diff --git a/src/_h5ai/private/conf/l10n/ko.json b/src/_h5ai/private/conf/l10n/ko.json new file mode 100644 index 0000000..8c48cdb --- /dev/null +++ b/src/_h5ai/private/conf/l10n/ko.json @@ -0,0 +1,22 @@ +{ + "lang": "한국어", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "자세히", + "download": "다운로드", + "empty": "빈 폴더", + "files": "파일", + "filter": "필터", + "folders": "폴더", + "grid": "그리드", + "icons": "아이콘", + "language": "언어", + "lastModified": "최근 수정일", + "name": "파일명", + "noMatch": "해당파일이 없습니다.", + "parentDirectory": "상위폴더", + "search": "검색", + "size": "크기", + "tree": "트리", + "view": "보기" +} diff --git a/src/_h5ai/private/conf/l10n/lv.json b/src/_h5ai/private/conf/l10n/lv.json new file mode 100644 index 0000000..fa672ce --- /dev/null +++ b/src/_h5ai/private/conf/l10n/lv.json @@ -0,0 +1,22 @@ +{ + "lang": "latviešu", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "detaļas", + "download": "lejupielādēt", + "empty": "tukšs", + "files": "faili", + "filter": "filtrēt", + "folders": "mapes", + "grid": "režģis", + "icons": "ikonas", + "language": "Valoda", + "lastModified": "Pēdējoreiz modificēts", + "name": "Nosaukums", + "noMatch": "nav sakritības", + "parentDirectory": "Vecākdirektorijs", + "search": "meklēt", + "size": "Izmērs", + "tree": "Koks", + "view": "Skats" +} diff --git a/src/_h5ai/private/conf/l10n/nb.json b/src/_h5ai/private/conf/l10n/nb.json new file mode 100644 index 0000000..44a1797 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/nb.json @@ -0,0 +1,15 @@ +{ + "lang": "norwegian", + + "details": "detaljer", + "download": "last ned", + "empty": "tom", + "files": "filer", + "folders": "mapper", + "icons": "ikoner", + "lastModified": "Sist endret", + "name": "Navn", + "noMatch": "ingen treff", + "parentDirectory": "Overordnet mappe", + "size": "Størrelse" +} diff --git a/src/_h5ai/private/conf/l10n/nl.json b/src/_h5ai/private/conf/l10n/nl.json new file mode 100644 index 0000000..8310f05 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/nl.json @@ -0,0 +1,22 @@ +{ + "lang": "nederlands", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "details", + "download": "download", + "empty": "leeg", + "files": "bestanden", + "filter": "filter", + "folders": "mappen", + "grid": "grid", + "icons": "iconen", + "language": "Taal", + "lastModified": "Laatste wijziging", + "name": "Naam", + "noMatch": "geen overeenkomst", + "parentDirectory": "Bovenliggende map", + "search": "zoeken", + "size": "Grootte", + "tree": "Boom", + "view": "Bekijk" +} diff --git a/src/_h5ai/private/conf/l10n/pl.json b/src/_h5ai/private/conf/l10n/pl.json new file mode 100644 index 0000000..da56967 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/pl.json @@ -0,0 +1,22 @@ +{ + "lang": "polski", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "szczegóły", + "download": "pobierz", + "empty": "pusty", + "files": "plików", + "filter": "filtr", + "folders": "folderów", + "grid": "kafelki", + "icons": "ikony", + "language": "Język", + "lastModified": "Ostatnia modyfikacja", + "name": "Nazwa", + "noMatch": "nie znaleziono", + "parentDirectory": "Katalog nadrzędny", + "search": "szukaj", + "size": "Rozmiar", + "tree": "Drzewo", + "view": "Układ" +} diff --git a/src/_h5ai/private/conf/l10n/pt-br.json b/src/_h5ai/private/conf/l10n/pt-br.json new file mode 100644 index 0000000..1b0d609 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/pt-br.json @@ -0,0 +1,22 @@ +{ + "lang": "português do Brasil", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "download", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grade", + "icons": "ícones", + "language": "Idioma", + "lastModified": "Última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "Diretório acima", + "search": "pesquisa", + "size": "Tamanho", + "tree": "Árvore", + "view": "Visualização" +} diff --git a/src/_h5ai/private/conf/l10n/pt-pt.json b/src/_h5ai/private/conf/l10n/pt-pt.json new file mode 100644 index 0000000..bc95686 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/pt-pt.json @@ -0,0 +1,22 @@ +{ + "lang": "português de Portugal", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "descarregar", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grelha", + "icons": "ícones", + "language": "Idioma", + "lastModified": "última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "Diretório acima", + "search": "pesquisa", + "size": "Tamanho", + "tree": "Árvore", + "view": "Visualização" +} diff --git a/src/_h5ai/private/conf/l10n/ro.json b/src/_h5ai/private/conf/l10n/ro.json new file mode 100644 index 0000000..4981dfe --- /dev/null +++ b/src/_h5ai/private/conf/l10n/ro.json @@ -0,0 +1,15 @@ +{ + "lang": "română", + + "details": "detalii", + "download": "descarcă", + "empty": "gol", + "files": "fişiere", + "folders": "dosar", + "icons": "pictograme", + "lastModified": "ultima modificare", + "name": "nume", + "noMatch": "0 rezultate", + "parentDirectory": "dosar părinte", + "size": "mărime" +} diff --git a/src/_h5ai/private/conf/l10n/ru.json b/src/_h5ai/private/conf/l10n/ru.json new file mode 100644 index 0000000..8056a0d --- /dev/null +++ b/src/_h5ai/private/conf/l10n/ru.json @@ -0,0 +1,20 @@ +{ + "lang": "русский", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "Детали", + "download": "Скачать", + "empty": "Пусто", + "files": "Файлы", + "filter": "Фильтр", + "folders": "Папки", + "grid": "Сетка", + "icons": "Иконки", + "language": "Язык", + "lastModified": "Последние изменения", + "name": "Имя", + "noMatch": "Нет совпадений", + "parentDirectory": "Главная директория", + "size": "Размер", + "view": "Вид" +} diff --git a/src/_h5ai/private/conf/l10n/sk.json b/src/_h5ai/private/conf/l10n/sk.json new file mode 100644 index 0000000..cfc9e45 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/sk.json @@ -0,0 +1,13 @@ +{ + "lang": "slovenčina", + + "details": "podrobnosti", + "empty": "prázdny", + "files": "súborov", + "folders": "priečinkov", + "icons": "ikony", + "lastModified": "Upravené", + "name": "Názov", + "parentDirectory": "Nadriadený priečinok", + "size": "Velkosť" +} diff --git a/src/_h5ai/private/conf/l10n/sl.json b/src/_h5ai/private/conf/l10n/sl.json new file mode 100644 index 0000000..5cdda21 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/sl.json @@ -0,0 +1,18 @@ +{ + "lang": "slovenščina", + + "dateFormat": "DD. MM. YYYY HH:mm", + "details": "podrobnosti", + "download": "prenesi", + "empty": "prazno", + "files": "datoteke", + "filter": "filter", + "folders": "mape", + "grid": "mreža", + "icons": "ikone", + "lastModified": "Zadnja sprememba", + "name": "Ime", + "noMatch": "ni zadetkov", + "parentDirectory": "Nadrejena mapa", + "size": "Velikost" +} diff --git a/src/_h5ai/private/conf/l10n/sr.json b/src/_h5ai/private/conf/l10n/sr.json new file mode 100644 index 0000000..845eeab --- /dev/null +++ b/src/_h5ai/private/conf/l10n/sr.json @@ -0,0 +1,15 @@ +{ + "lang": "srpski", + + "details": "detalji", + "download": "download", + "empty": "prazno", + "files": "fajlovi", + "folders": "direktorijum", + "icons": "ikone", + "lastModified": "Poslednja modifikacija", + "name": "Ime", + "noMatch": "bez poklapanja", + "parentDirectory": "Roditeljski direktorijum", + "size": "Veličina" +} diff --git a/src/_h5ai/private/conf/l10n/sv.json b/src/_h5ai/private/conf/l10n/sv.json new file mode 100644 index 0000000..75638e5 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/sv.json @@ -0,0 +1,16 @@ +{ + "lang": "svenska", + + "details": "detaljerad", + "download": "ladda ner", + "empty": "tom", + "files": "filer", + "folders": "kataloger", + "grid": "rutnät", + "icons": "ikoner", + "lastModified": "Senast ändrad", + "name": "Filnamn", + "noMatch": "ingen matchning", + "parentDirectory": "Till överordnad mapp", + "size": "Filstorlek" +} diff --git a/src/_h5ai/private/conf/l10n/tr.json b/src/_h5ai/private/conf/l10n/tr.json new file mode 100644 index 0000000..45cfc92 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/tr.json @@ -0,0 +1,14 @@ +{ + "lang": "türkçe", + + "details": "detaylar", + "download": "indir", + "empty": "boş", + "files": "dosyalar", + "folders": "klasörler", + "icons": "ikonlar", + "lastModified": "Son Düzenleme", + "name": "İsim", + "parentDirectory": "Üst Dizin", + "size": "Boyut" +} diff --git a/src/_h5ai/private/conf/l10n/uk.json b/src/_h5ai/private/conf/l10n/uk.json new file mode 100644 index 0000000..62908f5 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/uk.json @@ -0,0 +1,18 @@ +{ + "lang": "українська", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "Деталі", + "download": "Завантажити", + "empty": "Порожньо", + "files": "Файли(ів)", + "filter": "Фільтр", + "folders": "Тек(и)", + "grid": "Гратка", + "icons": "Піктограми", + "lastModified": "Останні зміни", + "name": "Ім'я", + "noMatch": "Немає співпадінь", + "parentDirectory": "Головна тека", + "size": "Розмір" +} diff --git a/src/_h5ai/private/conf/l10n/zh-cn.json b/src/_h5ai/private/conf/l10n/zh-cn.json new file mode 100644 index 0000000..7cdba51 --- /dev/null +++ b/src/_h5ai/private/conf/l10n/zh-cn.json @@ -0,0 +1,23 @@ +{ + "lang": "简体中文", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "详情", + "download": "下载", + "empty": "空文件夹", + "files": "文件", + "filter": "过滤", + "folders": "文件夹", + "grid": "网格", + "icons": "图标", + "language": "语言", + "lastModified": "修改时间", + "name": "文件名", + "noMatch": "无匹配项", + "parentDirectory": "父文件夹", + "search": "搜索", + "size": "大小", + "tree": "树形目录", + "view": "视图", + "info": "信息" +} diff --git a/src/_h5ai/private/conf/l10n/zh-tw.json b/src/_h5ai/private/conf/l10n/zh-tw.json new file mode 100644 index 0000000..7567f0d --- /dev/null +++ b/src/_h5ai/private/conf/l10n/zh-tw.json @@ -0,0 +1,23 @@ +{ + "lang": "正體中文", + + "dateFormat": "YYYY-MM-DD HH:mm", + "details": "詳細資料", + "download": "下載", + "empty": "空資料夾", + "files": "檔案", + "filter": "過濾", + "folders": "資料夾", + "grid": "網格", + "icons": "圖示", + "language": "語言", + "lastModified": "上次修改", + "name": "檔名", + "noMatch": "沒有符合的檔案", + "parentDirectory": "上層目錄", + "search": "搜尋", + "size": "大小", + "tree": "樹形目錄", + "view": "檢視", + "info": "資訊" +} diff --git a/src/_h5ai/private/conf/options.json b/src/_h5ai/private/conf/options.json new file mode 100644 index 0000000..a570da2 --- /dev/null +++ b/src/_h5ai/private/conf/options.json @@ -0,0 +1,396 @@ +{ + /* + Password hash. + + SHA512 hash of the info page password, the preset password is the empty string. + Online hash generator: http://md5hashing.net/hashing/sha512 + */ + "passhash": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + + + + /* + Resources. + + Additional script and style tags added to all pages. Paths not beginning + with "http://", "https://" or "/" will be looked up relative to + "_h5ai/public/ext/" (no check for existence). + + - scripts: array of strings + - styles: array of strings + */ + "resources": { + "scripts": [], + "styles": [ + "//fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700" + ] + }, + + + + /* + General view options. + + - binaryPrefix: boolean, set to true uses 1024B=1KiB when formatting file sizes (see http://en.wikipedia.org/wiki/Binary_prefix) + - disableSidebar: boolean, hides sidebar and toggle button + - fallbackMode: boolean, serve fallback mode + - fastBrowsing: boolean, use History API if available (no need to reload the whole page) + - fonts: array of strings, fonts to use in regular context + - fontsMono: array of strings, fonts to use in monopspaced context + - hidden: array of strings, don't list items matching these regular expressions + - hideFolders: boolean, hide all folders in the main view + - hideIf403: boolean, hide files and folders that are not readable by the server + - hideParentFolder: boolean, hide parent folder links in the main view + - maxIconSize: number, max size for icons in the main view + - modes: array of strings, subset of ["details", "grid", "icons"] + the first value indicates the default view mode. If only one value + is given the view mode is fixed and the selector buttons are hidden. + The user selected view mode is also stored local in modern browsers + so that it will be persistent. + - modeToggle: boolean, show a view mode toggle in the toolbar, or "next" + - setParentFolderLabels: boolean, set parent folder labels to real folder names + - sizes: array of numbers + the first value indicates the default view size. If only one value + is given the view size is fixed and the selector buttons are hidden. + The user selected view size is also stored local in modern browsers + so that it will be persistent. + - theme: string, name of one of the folders in "_h5ai/public/images/themes", defaults to "default" + - unmanaged: array of strings, don't manage folders containing one of those files + - unmanagedInNewWindow: boolean, open unmanaged links in new window/tab + */ + "view": { + "binaryPrefix": false, + "disableSidebar": false, + "fallbackMode": false, + "fastBrowsing": true, + "fonts": ["Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"], + "fontsMono": ["Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"], + "hidden": ["^\\.", "^_h5ai"], + "hideFolders": false, + "hideIf403": true, + "hideParentFolder": false, + "maxIconSize": 40, + "modes": ["details", "grid", "icons"], + "modeToggle": false, + "setParentFolderLabels": true, + "sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300], + "theme": "comity", + "unmanaged": ["index.html", "index.htm", "index.php"], + "unmanagedInNewWindow": false + }, + + + + /*** Extensions (in alphabetical order) ***/ + + /* + Watch and update current folder content. + + - interval: number, update interval in milliseconds, at least 1000 + */ + "autorefresh": { + "enabled": false, + "interval": 5000 + }, + + /* + Show a clickable breadcrumb. + */ + "crumb": { + "enabled": true + }, + + /* + Allow customized header and footer files. + First checks for files "_h5ai.header.html" and "_h5ai.footer.html" in the current directory. + If not successful it checks all parent directories (starting in the current directory) for + files "_h5ai.headers.html" and "_h5ai.footers.html". + Note the different filenames: "header" (only current) - "headers" (current and sub directories)! + The file's content will be placed inside a
tag above/below the main content. + If a file's extension is ".md" instead of ".html" its content will be interpreted as markdown. + + - stopSearchingAtRoot: boolean, only search for header and footer files until the web root + directory. if `false`, will search for header/footer up the entire directory structure, + even above the web root + */ + "custom": { + "enabled": true, + "stopSearchingAtRoot": true + }, + + /* + Enable packaged download of selected entries. + To select files the "select"-extension needs to be enabled. + + - type: string, "php-tar", "shell-tar" or "shell-zip" + - packageName: string, basename of the download package, null for current filename or foldername + - alwaysVisible: boolean, always show download button (defaults to download the current folder) + */ + "download": { + "enabled": true, + "type": "php-tar", + "packageName": null, + "alwaysVisible": false + }, + + /* + Allow filtering the displayed files and folders in current folder. + Checks for substrings. + + If advanced is enabled it checks entries for right order of characters, + i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated + sequences get OR-ed. Searches will be treated as JavaScript regular + expressions if you prefix them with "re:". + + - advanced: boolean, use advanced pattern parsing + - debounceTime: number, debounce wait time in milliseconds + - ignorecase: boolean, ignore case + */ + "filter": { + "enabled": false, + "advanced": true, + "debounceTime": 100, + "ignorecase": true + }, + + /* + Calc the size of folders. + This operation is real slow. The calculated sizes differ slightly for both + calculation types since "php" only adds the file size, while "shell-du" + also adds the sizes for the actual folder files. + + - type: string, "php" (sloooow) or "shell-du" (sloow) + */ + "foldersize": { + "enabled": true, + "type": "php" + }, + + /* + Adds Google Universial Analytics asynchronous tracking code. + see: https://developers.google.com/analytics/devguides/collection/analyticsjs/ + + - id: string, account ID + */ + "google-analytics-ua": { + "enabled": false, + "id": "UA-000000-0" + }, + + /* + Enable a generic info side bar. + + - show: boolean, initial visible to first time users + - qrcode: boolean, show a QR-Code + - qrColor: string, QR-Code fill color + */ + "info": { + "enabled": true, + "show": false, + "qrcode": true, + "qrFill": "#999", + "qrBack": "#fff" + }, + + /* + Localization, for example "en", "de" etc. - see "_h5ai/conf/l10n" folder for + possible values. Adjust it to your needs. If lang is not found + it defaults to "en". + + - lang: string, default language + - useBroserLang: boolean, try to use browser language + */ + "l10n": { + "enabled": true, + "lang": "en", + "useBrowserLang": true + }, + + /* + Adds Piwik tracker javascript code. + + - baseURL: string, do not include the protocol, e.g. "mydomain.tld/piwik" + - idSite: number + */ + "piwik-analytics": { + "enabled": false, + "baseURL": "some/url", + "idSite": 1 + }, + + /* + Play a audio preview on click. + + - autoplay: start playing as soon as ready + - types: array of strings + */ + "preview-aud": { + "enabled": true, + "autoplay": true, + "types": ["aud"] + }, + + /* + Show an image preview on click. + + - types: array of strings + - size: number, sample size, or false for original size + */ + "preview-img": { + "enabled": true, + "size": false, + "types": ["img", "img-bmp", "img-gif", "img-ico", "img-jpg", "img-png", "img-raw", "img-svg"] + }, + + /* + Show text file preview on click. + + Available styles are: + 0: floating text + 1: fixed width text + 2: markdown + 3: syntax highlighting + + - styles: dict string to int, maps types to styles + */ + "preview-txt": { + "enabled": true, + "styles": { + "txt": 1, + "txt-authors": 1, + "txt-c": 3, + "txt-cpp": 3, + "txt-css": 3, + "txt-diff": 1, + "txt-go": 3, + "txt-h": 3, + "txt-hpp": 3, + "txt-install": 1, + "txt-js": 3, + "txt-json": 3, + "txt-less": 3, + "txt-license": 1, + "txt-log": 1, + "txt-makefile": 1, + "txt-md": 2, + "txt-py": 3, + "txt-rb": 3, + "txt-readme": 1, + "txt-rtf": 1, + "txt-rust": 3, + "txt-script": 3, + "txt-xml": 1 + } + }, + + /* + Play a video preview on click. + + - autoplay: start playing as soon as ready + - types: array of strings + */ + "preview-vid": { + "enabled": true, + "autoplay": true, + "types": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"] + }, + + /* + Allow searching files and folders in and below current folder. + Checks for substrings. + + If advanced is enabled it checks entries for right order of characters, + i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated + sequences get OR-ed. Searches will be treated as JavaScript regular + expressions if you prefix them with "re:". + + - advanced: boolean, use advanced pattern parsing + - debounceTime: number, debounce wait time in milliseconds + - ignorecase: boolean, ignore case + */ + "search": { + "enabled": false, + "advanced": true, + "debounceTime": 300, + "ignorecase": true + }, + + /* + Make entries selectable. + At the moment only needed for packaged download. + + - clickndrag: boolean, allow first mouse button + drag selection + - checkboxes: boolean, show a checkbox on mouse over item + */ + "select": { + "enabled": true, + "clickndrag": true, + "checkboxes": true + }, + + /* + Default sort order. + "column" and "reverse" are locally stored. + + - column: number, 0 for "Name", 1 for "Date", 2 for "Size" + - reverse: boolean, false for ascending, true for descending + - ignorecase: boolean, compare ignorecase + - natural: boolean, use natural sort order + - folders: number, where to place folders, 0 for "top", 1 for "in place", 2 for "bottom" + */ + "sort": { + "enabled": true, + "column": 0, + "reverse": false, + "ignorecase": true, + "natural": true, + "folders": 0 + }, + + /* + Show thumbnails for image files. Needs the "/_h5ai/public/cache" folder to be + writable for the web Server. + + - img: array of strings + - mov: array of strings + - doc: array of strings + - delay: number, delay in milliseconds after "dom-ready" before thumb-requesting starts + - size: number, size in pixel of the generated thumbnails + - exif: boolean, use included EXIF thumbs if possible + - chunksize: int, number of thumbs per request + */ + "thumbnails": { + "enabled": true, + "img": ["img-bmp", "img-gif", "img-ico", "img-jpg", "img-png"], + "mov": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"], + "doc": ["x-pdf", "x-ps"], + "delay": 1, + "size": 240, + "exif": false, + "chunksize": 20 + }, + + /* + Replace window title with current breadcrumb. + */ + "title": { + "enabled": true + }, + + /* + Show a folder tree. + Note that this might affect performance significantly. + + - show: boolean, initial visible to first time users + - maxSubfolders: number, max number of subfolders to show in tree + - naturalSort: boolean, use natural sort order for folders + - ignorecase: boolean, sort ignorecase + */ + "tree": { + "enabled": true, + "show": true, + "maxSubfolders": 50, + "naturalSort": true, + "ignorecase": true + } +} diff --git a/src/_h5ai/private/conf/types.json b/src/_h5ai/private/conf/types.json new file mode 100644 index 0000000..3887164 --- /dev/null +++ b/src/_h5ai/private/conf/types.json @@ -0,0 +1,75 @@ +{ + "ar": ["*.tar.bz2", "*.crx"], + "ar-apk": ["*.apk"], + "ar-deb": ["*.deb"], + "ar-gz": ["*.gz", "*.tar.gz", "*.tgz"], + "ar-rar": ["*.rar"], + "ar-rpm": ["*.rpm"], + "ar-tar": ["*.tar"], + "ar-zip": ["*.7z", "*.bz2", "*.jar", "*.lzma", "*.war", "*.z", "*.Z", "*.zip"], + "aud": ["*.aif", "*.aiff", "*.flac", "*.m4a", "*.mid", "*.mp3", "*.mpa", "*.ra", "*.ogg", "*.wav", "*.wma"], + "aud-pls": ["*.m3u", "*.m3u8", "*.pls"], + "bin": ["*.class", "*.o", "*.so"], + "bin-exe": ["*.bat", "*.cmd", "*.exe"], + "img": ["*.xpm"], + "img-bmp": ["*.bmp"], + "img-gif": ["*.gif"], + "img-ico": ["*.ico"], + "img-jpg": ["*.jpg", "*.jpeg"], + "img-png": ["*.png"], + "img-raw": ["*.cr2", "*.nef"], + "img-svg": ["*.svg"], + "img-tiff": ["*.tiff"], + "txt": ["*.text", "*.txt"], + "txt-build": ["*.pom", "build.xml", "pom.xml"], + "txt-c": ["*.c"], + "txt-cpp": ["*.cpp"], + "txt-css": ["*.css"], + "txt-diff": ["*.diff", "*.patch"], + "txt-go": ["*.go"], + "txt-h": ["*.h"], + "txt-html": ["*.htm", "*.html", "*.shtml", "*.xhtml"], + "txt-hpp": ["*.hpp"], + "txt-java": ["*.java"], + "txt-scala": ["*.scala"], + "txt-js": ["*.js"], + "txt-json": ["*.json"], + "txt-less": ["*.less"], + "txt-log": ["*.log", "changelog*"], + "txt-md": ["*.markdown", "*.md"], + "txt-php": ["*.php"], + "txt-py": ["*.py"], + "txt-rb": ["*.rb"], + "txt-rss": ["*.rss"], + "txt-rtf": ["*.rtf"], + "txt-rust": ["*.rs", "*.rlib"], + "txt-script": ["*.conf", "*.bsh", "*.csh", "*.ini", "*.ksh", "*.sh", "*.shar", "*.tcl", "*.zsh"], + "txt-source": [], + "txt-tex": ["*.tex"], + "txt-vcal": ["*.vcal"], + "txt-xml": ["*.xml"], + "vid": [], + "vid-avi": ["*.avi"], + "vid-flv": ["*.flv"], + "vid-mkv": ["*.mkv"], + "vid-mov": ["*.mov"], + "vid-mp4": ["*.mp4", "*.m4v"], + "vid-mpg": ["*.mpg"], + "vid-rm": ["*.rm"], + "vid-swf": ["*.swf"], + "vid-ts": ["*.ts"], + "vid-vob": ["*.vob"], + "vid-webm": ["*.webm"], + "vid-wmv": ["*.wmv"], + "x": [], + "x-bak": ["*.bak", "*~"], + "x-calc": ["*.ods", "*.ots", "*.xlr", "*.xls", "*.xlsx"], + "x-disc": ["*.cue", "*.iso"], + "x-doc": ["*.doc", "*.docx", "*.odm", "*.odt", "*.ott"], + "x-draw": ["*.drw"], + "x-eps": ["*.eps"], + "x-pdf": ["*.pdf"], + "x-pres": ["*.odp", "*.otp", "*.pps", "*.ppt", "*.pptx"], + "x-ps": ["*.ps"], + "x-psd": ["*.psd"] +} diff --git a/src/_h5ai/private/php/class-bootstrap.php b/src/_h5ai/private/php/class-bootstrap.php new file mode 100644 index 0000000..4356523 --- /dev/null +++ b/src/_h5ai/private/php/class-bootstrap.php @@ -0,0 +1,45 @@ +query_boolean('refresh', false)); + $context = new Context($session, $request, $setup); + + if ($context->is_api_request()) { + (new Api($context))->apply(); + } elseif ($context->is_info_request()) { + $public_href = $setup->get('PUBLIC_HREF'); + $x_head_tags = $context->get_x_head_html(); + $fallback_mode = false; + require __DIR__ . '/pages/info.php'; + } else { + $public_href = $setup->get('PUBLIC_HREF'); + $x_head_tags = $context->get_x_head_html(); + $fallback_mode = $context->is_fallback_mode(); + $fallback_html = (new Fallback($context))->get_html(); + require __DIR__ . '/pages/index.php'; + } + } + + public static function autoload($class_name) { + $filename = 'class-' . strtolower($class_name) . '.php'; + + foreach (Bootstrap::$autopaths as $path) { + $file = __DIR__ . '/' . $path . '/' . $filename; + if (file_exists($file)) { + require_once $file; + return true; + } + } + } +} diff --git a/src/_h5ai/private/php/core/class-api.php b/src/_h5ai/private/php/core/class-api.php new file mode 100644 index 0000000..d850e65 --- /dev/null +++ b/src/_h5ai/private/php/core/class-api.php @@ -0,0 +1,110 @@ +context = $context; + $this->request = $context->get_request(); + $this->setup = $context->get_setup(); + } + + public function apply() { + $action = $this->request->query('action'); + $supported = ['download', 'get', 'login', 'logout']; + Util::json_fail(Util::ERR_UNSUPPORTED, 'unsupported action', !in_array($action, $supported)); + + $methodname = 'on_' . $action; + $this->$methodname(); + } + + private function on_download() { + Util::json_fail(Util::ERR_DISABLED, 'download disabled', !$this->context->query_option('download.enabled', false)); + + $as = $this->request->query('as'); + $type = $this->request->query('type'); + $base_href = $this->request->query('baseHref'); + $hrefs = $this->request->query('hrefs', ''); + + $archive = new Archive($this->context); + + set_time_limit(0); + session_write_close(); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $as . '"'); + header('Connection: close'); + $ok = $archive->output($type, $base_href, $hrefs); + + Util::json_fail(Util::ERR_FAILED, 'packaging failed', !$ok); + exit; + } + + private function on_get() { + $response = []; + + foreach (['langs', 'options', 'types'] as $name) { + if ($this->request->query_boolean($name, false)) { + $methodname = 'get_' . $name; + $response[$name] = $this->context->$methodname(); + } + } + + if ($this->request->query_boolean('setup', false)) { + $response['setup'] = $this->setup->to_jsono($this->context->is_admin()); + } + + if ($this->request->query_boolean('theme', false)) { + $theme = new Theme($this->context); + $response['theme'] = $theme->get_icons(); + } + + if ($this->request->query('items', false)) { + $href = $this->request->query('items.href'); + $what = $this->request->query_numeric('items.what'); + $response['items'] = $this->context->get_items($href, $what); + } + + if ($this->request->query('custom', false)) { + Util::json_fail(Util::ERR_DISABLED, 'custom disabled', !$this->context->query_option('custom.enabled', false)); + $href = $this->request->query('custom'); + $custom = new Custom($this->context); + $response['custom'] = $custom->get_customizations($href); + } + + if ($this->request->query('l10n', false)) { + Util::json_fail(Util::ERR_DISABLED, 'l10n disabled', !$this->context->query_option('l10n.enabled', false)); + $iso_codes = $this->request->query_array('l10n'); + $iso_codes = array_filter($iso_codes); + $response['l10n'] = $this->context->get_l10n($iso_codes); + } + + if ($this->request->query('search', false)) { + Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false)); + $href = $this->request->query('search.href'); + $pattern = $this->request->query('search.pattern'); + $ignorecase = $this->request->query_boolean('search.ignorecase', false); + $search = new Search($this->context); + $response['search'] = $search->get_items($href, $pattern, $ignorecase); + } + + if ($this->request->query('thumbs', false)) { + Util::json_fail(Util::ERR_DISABLED, 'thumbnails disabled', !$this->context->query_option('thumbnails.enabled', false)); + Util::json_fail(Util::ERR_UNSUPPORTED, 'thumbnails not supported', !$this->setup->get('HAS_PHP_JPEG')); + $thumbs = $this->request->query_array('thumbs'); + $response['thumbs'] = $this->context->get_thumbs($thumbs); + } + + Util::json_exit($response); + } + + private function on_login() { + $pass = $this->request->query('pass'); + Util::json_exit(['asAdmin' => $this->context->login_admin($pass)]); + } + + private function on_logout() { + Util::json_exit(['asAdmin' => $this->context->logout_admin()]); + } +} diff --git a/src/_h5ai/private/php/core/class-context.php b/src/_h5ai/private/php/core/class-context.php new file mode 100644 index 0000000..0a72cea --- /dev/null +++ b/src/_h5ai/private/php/core/class-context.php @@ -0,0 +1,304 @@ +session = $session; + $this->request = $request; + $this->setup = $setup; + + $this->options = Json::load($this->setup->get('CONF_PATH') . '/options.json'); + + $this->passhash = $this->query_option('passhash', ''); + $this->options['hasCustomPasshash'] = strcasecmp($this->passhash, Context::$DEFAULT_PASSHASH) !== 0; + unset($this->options['passhash']); + } + + public function get_session() { + return $this->session; + } + + public function get_request() { + return $this->request; + } + + public function get_setup() { + return $this->setup; + } + + public function get_options() { + return $this->options; + } + + public function query_option($keypath = '', $default = null) { + return Util::array_query($this->options, $keypath, $default); + } + + public function get_types() { + return Json::load($this->setup->get('CONF_PATH') . '/types.json'); + } + + public function login_admin($pass) { + $this->session->set(Context::$AS_ADMIN_SESSION_KEY, strcasecmp(hash('sha512', $pass), $this->passhash) === 0); + return $this->session->get(Context::$AS_ADMIN_SESSION_KEY); + } + + public function logout_admin() { + $this->session->set(Context::$AS_ADMIN_SESSION_KEY, false); + return $this->session->get(Context::$AS_ADMIN_SESSION_KEY); + } + + public function is_admin() { + return $this->session->get(Context::$AS_ADMIN_SESSION_KEY); + } + + public function is_api_request() { + return strtolower($this->setup->get('REQUEST_METHOD')) === 'post'; + } + + public function is_info_request() { + return Util::starts_with($this->setup->get('REQUEST_HREF') . '/', $this->setup->get('PUBLIC_HREF')); + } + + public function is_text_browser() { + return preg_match('/curl|links|lynx|w3m/i', $this->setup->get('HTTP_USER_AGENT')) === 1; + } + + public function is_fallback_mode() { + return $this->query_option('view.fallbackMode', false) || $this->is_text_browser(); + } + + public function to_href($path, $trailing_slash = true) { + $rel_path = substr($path, strlen($this->setup->get('ROOT_PATH'))); + $parts = explode('/', $rel_path); + $encoded_parts = []; + foreach ($parts as $part) { + if ($part != '') { + $encoded_parts[] = rawurlencode($part); + } + } + + return Util::normalize_path($this->setup->get('ROOT_HREF') . implode('/', $encoded_parts), $trailing_slash); + } + + public function to_path($href) { + $rel_href = substr($href, strlen($this->setup->get('ROOT_HREF'))); + return Util::normalize_path($this->setup->get('ROOT_PATH') . '/' . rawurldecode($rel_href)); + } + + public function is_hidden($name) { + // always hide + if ($name === '.' || $name === '..') { + return true; + } + + foreach ($this->query_option('view.hidden', []) as $re) { + $re = Util::wrap_pattern($re); + if (preg_match($re, $name)) { + return true; + } + } + + return false; + } + + public function read_dir($path) { + $names = []; + if (is_dir($path)) { + foreach (scandir($path) as $name) { + if ( + $this->is_hidden($name) + || $this->is_hidden($this->to_href($path) . $name) + || (!is_readable($path . '/' . $name) && $this->query_option('view.hideIf403', false)) + ) { + continue; + } + $names[] = $name; + } + } + return $names; + } + + public function is_managed_href($href) { + return $this->is_managed_path($this->to_path($href)); + } + + public function is_managed_path($path) { + if (!is_dir($path) || strpos($path, '../') !== false || strpos($path, '/..') !== false || $path === '..') { + return false; + } + + if (strpos($path, $this->setup->get('PUBLIC_PATH')) === 0) { + return false; + } + + if (strpos($path, $this->setup->get('PRIVATE_PATH')) === 0) { + return false; + } + + foreach ($this->query_option('view.unmanaged', []) as $name) { + if (file_exists($path . '/' . $name)) { + return false; + } + } + + while ($path !== $this->setup->get('ROOT_PATH')) { + if (@is_dir($path . '/_h5ai/private/conf')) { + return false; + } + $parent_path = Util::normalize_path(dirname($path)); + if ($parent_path === $path) { + return false; + } + $path = $parent_path; + } + return true; + } + + public function get_current_path() { + $current_href = Util::normalize_path($this->setup->get('REQUEST_HREF'), true); + $current_path = $this->to_path($current_href); + + if (!is_dir($current_path)) { + $current_path = Util::normalize_path(dirname($current_path), false); + } + + return $current_path; + } + + public function get_items($href, $what) { + if (!$this->is_managed_href($href)) { + return []; + } + + $cache = []; + $folder = Item::get($this, $this->to_path($href), $cache); + + // add content of subfolders + if ($what >= 2 && $folder !== null) { + foreach ($folder->get_content($cache) as $item) { + $item->get_content($cache); + } + $folder = $folder->get_parent($cache); + } + + // add content of this folder and all parent folders + while ($what >= 1 && $folder !== null) { + $folder->get_content($cache); + $folder = $folder->get_parent($cache); + } + + uasort($cache, ['Item', 'cmp']); + $result = []; + foreach ($cache as $p => $item) { + $result[] = $item->to_json_object(); + } + + return $result; + } + + public function get_langs() { + $langs = []; + $l10n_path = $this->setup->get('CONF_PATH') . '/l10n'; + if (is_dir($l10n_path)) { + if ($dir = opendir($l10n_path)) { + while (($file = readdir($dir)) !== false) { + if (Util::ends_with($file, '.json')) { + $translations = Json::load($l10n_path . '/' . $file); + $langs[basename($file, '.json')] = $translations['lang']; + } + } + closedir($dir); + } + } + ksort($langs); + return $langs; + } + + public function get_l10n($iso_codes) { + $results = []; + + foreach ($iso_codes as $iso_code) { + if (!in_array($iso_code, Context::$L10N_ISO_CODES)) { + continue; + } + + $file = $this->setup->get('CONF_PATH') . '/l10n/' . $iso_code . '.json'; + $results[$iso_code] = Json::load($file); + $results[$iso_code]['isoCode'] = $iso_code; + } + + return $results; + } + + public function get_thumbs($requests) { + $hrefs = []; + + foreach ($requests as $req) { + $thumb = new Thumb($this); + $hrefs[] = $thumb->thumb($req['type'], $req['href'], $req['width'], $req['height']); + } + + return $hrefs; + } + + private function prefix_x_head_href($href) { + if (preg_match('@^(https?://|/)@i', $href)) { + return $href; + } + + return $this->setup->get('PUBLIC_HREF') . 'ext/' . $href; + } + + private function get_fonts_html() { + $fonts = $this->query_option('view.fonts', []); + $fonts_mono = $this->query_option('view.fontsMono', []); + + $html = ''; + + return $html; + } + + public function get_x_head_html() { + $scripts = $this->query_option('resources.scripts', []); + $styles = $this->query_option('resources.styles', []); + + $html = ''; + + foreach ($styles as $href) { + $html .= ''; + } + + foreach ($scripts as $href) { + $html .= ''; + } + + $html .= $this->get_fonts_html(); + + return $html; + } +} diff --git a/src/_h5ai/private/php/core/class-fallback.php b/src/_h5ai/private/php/core/class-fallback.php new file mode 100644 index 0000000..7bd317f --- /dev/null +++ b/src/_h5ai/private/php/core/class-fallback.php @@ -0,0 +1,54 @@ +context = $context; + } + + public function get_html($path = null) { + if (!$path) { + $path = $this->context->get_current_path(); + } + $fallback_images_href = $this->context->get_setup()->get('PUBLIC_HREF') . 'images/fallback/'; + + $cache = []; + $folder = Item::get($this->context, $path, $cache); + $items = $folder->get_content($cache); + uasort($items, ['Item', 'cmp']); + + $html = ''; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + if ($folder->get_parent($cache)) { + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + foreach ($items as $item) { + $type = $item->is_folder ? 'folder' : 'file'; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + $html .= '
NameLast modifiedSize
folder-parentParent Directory
' . $type . '' . basename($item->path) . '' . date('Y-m-d H:i', $item->date) . '' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . '
'; + + return $html; + } +} diff --git a/src/_h5ai/private/php/core/class-filesize.php b/src/_h5ai/private/php/core/class-filesize.php new file mode 100644 index 0000000..477f9e2 --- /dev/null +++ b/src/_h5ai/private/php/core/class-filesize.php @@ -0,0 +1,96 @@ +size($path, $withFoldersize, $withDu); + } + + public static function getCachedSize($path, $withFoldersize, $withDu) { + if (array_key_exists($path, Filesize::$cache)) { + return Filesize::$cache[$path]; + } + + $size = Filesize::getSize($path, $withFoldersize, $withDu); + + Filesize::$cache[$path] = $size; + return $size; + } + + + private function __construct() {} + + private function read_dir($path) { + $paths = []; + if (is_dir($path)) { + foreach (scandir($path) as $name) { + if ($name !== '.' && $name !== '..') { + $paths[] = $path . '/' . $name; + } + } + } + return $paths; + } + + private function php_filesize($path, $recursive = false) { + // if (PHP_INT_SIZE < 8) { + // } + $size = @filesize($path); + + if (!is_dir($path) || !$recursive) { + return $size; + } + + foreach ($this->read_dir($path) as $p) { + $size += $this->php_filesize($p, true); + } + return $size; + } + + + private function exec($cmdv) { + $cmd = implode(' ', array_map('escapeshellarg', $cmdv)); + $lines = []; + $rc = null; + exec($cmd, $lines, $rc); + return $lines; + } + + private function exec_du_all($paths) { + $cmdv = array_merge(['du', '-sbL'], $paths); + $lines = $this->exec($cmdv); + + $sizes = []; + foreach ($lines as $line) { + $parts = preg_split('/[\s]+/', $line, 2); + $size = intval($parts[0], 10); + $path = $parts[1]; + $sizes[$path] = $size; + } + return $sizes; + } + + private function exec_du($path) { + $sizes = $this->exec_du_all([$path]); + return $sizes[$path]; + } + + + private function size($path, $withFoldersize = false, $withDu = false) { + if (is_file($path)) { + return $this->php_filesize($path); + } + + if (is_dir($path) && $withFoldersize) { + if ($withDu) { + return $this->exec_du($path); + } + + return $this->php_filesize($path, true); + } + + return null; + } +} diff --git a/src/_h5ai/private/php/core/class-item.php b/src/_h5ai/private/php/core/class-item.php new file mode 100644 index 0000000..2b9ce34 --- /dev/null +++ b/src/_h5ai/private/php/core/class-item.php @@ -0,0 +1,91 @@ +is_folder && !$item2->is_folder) { + return -1; + } + if (!$item1->is_folder && $item2->is_folder) { + return 1; + } + + return strcasecmp($item1->path, $item2->path); + } + + public static function get($context, $path, &$cache) { + if (!Util::starts_with($path, $context->get_setup()->get('ROOT_PATH'))) { + return null; + } + + if (is_array($cache) && array_key_exists($path, $cache)) { + return $cache[$path]; + } + + $item = new Item($context, $path); + + if (is_array($cache)) { + $cache[$path] = $item; + } + return $item; + } + + public $context; + public $path; + public $href; + public $date; + public $size; + public $is_folder; + public $is_content_fetched; + + private function __construct($context, $path) { + $this->context = $context; + + $this->path = Util::normalize_path($path, false); + $this->is_folder = is_dir($this->path); + $this->href = $context->to_href($this->path, $this->is_folder); + $this->date = @filemtime($this->path); + $this->size = Util::filesize($context, $this->path); + $this->is_content_fetched = false; + } + + public function to_json_object() { + $obj = [ + 'href' => $this->href, + 'time' => $this->date * 1000, // seconds (PHP) to milliseconds (JavaScript) + 'size' => $this->size + ]; + + if ($this->is_folder) { + $obj['managed'] = $this->context->is_managed_href($this->href); + $obj['fetched'] = $this->is_content_fetched; + } + + return $obj; + } + + public function get_parent(&$cache) { + $parent_path = Util::normalize_path(dirname($this->path), false); + if ($parent_path !== $this->path && Util::starts_with($parent_path, $this->context->get_setup()->get('ROOT_PATH'))) { + return Item::get($this->context, $parent_path, $cache); + } + return null; + } + + public function get_content(&$cache) { + $items = []; + + if (!$this->context->is_managed_href($this->href)) { + return $items; + } + + $files = $this->context->read_dir($this->path); + foreach ($files as $file) { + $item = Item::get($this->context, $this->path . '/' . $file, $cache); + $items[$item->path] = $item; + } + + $this->is_content_fetched = true; + + return $items; + } +} diff --git a/src/_h5ai/private/php/core/class-json.php b/src/_h5ai/private/php/core/class-json.php new file mode 100644 index 0000000..f662b9f --- /dev/null +++ b/src/_h5ai/private/php/core/class-json.php @@ -0,0 +1,65 @@ +params = $data !== null ? $data : $params; + } + + public function query($keypath = '', $default = Util::NO_DEFAULT) { + $value = Util::array_query($this->params, $keypath, Util::NO_DEFAULT); + + if ($value === Util::NO_DEFAULT) { + Util::json_fail(Util::ERR_MISSING_PARAM, 'parameter \'' . $keypath . '\' is missing', $default === Util::NO_DEFAULT); + return $default; + } + + return $value; + } + + public function query_boolean($keypath = '', $default = Util::NO_DEFAULT) { + $value = $this->query($keypath, $default); + return filter_var($value, FILTER_VALIDATE_BOOLEAN); + } + + public function query_numeric($keypath = '', $default = Util::NO_DEFAULT) { + $value = $this->query($keypath, $default); + Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is not numeric', !is_numeric($value)); + return intval($value, 10); + } + + public function query_array($keypath = '', $default = Util::NO_DEFAULT) { + $value = $this->query($keypath, $default); + Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is no array', !is_array($value)); + return $value; + } +} diff --git a/src/_h5ai/private/php/core/class-session.php b/src/_h5ai/private/php/core/class-session.php new file mode 100644 index 0000000..630d78f --- /dev/null +++ b/src/_h5ai/private/php/core/class-session.php @@ -0,0 +1,20 @@ +store = &$store; + } + + public function set($key, $value) { + $key = Session::$KEY_PREFIX . $key; + $this->store[$key] = $value; + } + + public function get($key, $default = null) { + $key = Session::$KEY_PREFIX . $key; + return array_key_exists($key, $this->store) ? $this->store[$key] : $default; + } +} diff --git a/src/_h5ai/private/php/core/class-setup.php b/src/_h5ai/private/php/core/class-setup.php new file mode 100644 index 0000000..cbb85f8 --- /dev/null +++ b/src/_h5ai/private/php/core/class-setup.php @@ -0,0 +1,188 @@ +store = []; + $this->refresh = $refresh; + + $this->add_globals_and_envs(); + $this->add_php_checks(); + $this->add_app_metadata(); + $this->add_server_metadata_and_check(); + $this->add_paths(); + $this->add_sys_cmd_checks(); + } + + private function set($key, $value) { + if (array_key_exists($key, $this->store)) { + Logger::log('setup key already taken', [ + 'key' => $key, + 'value' => $value, + 'found' => $this->store[$key] + ]); + exit; + } + if (!is_string($value) && !is_bool($value)) { + Logger::log('setup value neither string nor boolean', [ + 'key' => $key, + 'value' => $value + ]); + exit; + } + + $this->store[$key] = $value; + } + + public function get($key) { + if (!array_key_exists($key, $this->store)) { + Logger::log('setup key not found', ['key' => $key]); + exit; + } + + return $this->store[$key]; + } + + private function add_globals_and_envs() { + $this->set('PHP_VERSION', PHP_VERSION); + $this->set('MIN_PHP_VERSION', MIN_PHP_VERSION); + $this->set('PHP_ARCH', (PHP_INT_SIZE * 8) . '-bit'); + + $this->set('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']); + $this->set('REQUEST_HREF', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); + $this->set('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); + $this->set('SERVER_SOFTWARE', $_SERVER['SERVER_SOFTWARE']); + $this->set('HTTP_USER_AGENT', $_SERVER['HTTP_USER_AGENT']); + } + + private function add_php_checks() { + $this->set('HAS_PHP_EXIF', function_exists('exif_thumbnail')); + + $has_php_jpeg = false; + if (function_exists('gd_info')) { + $infos = gd_info(); + $has_php_jpeg = array_key_exists('JPEG Support', $infos) && $infos['JPEG Support']; + } + $this->set('HAS_PHP_JPEG', $has_php_jpeg); + } + + private function add_app_metadata() { + $this->set('NAME', 'h5ai'); + $this->set('VERSION', H5AI_VERSION); + $this->set('FILE_PREFIX', '_h5ai'); + } + + private function add_server_metadata_and_check() { + $server_software = $this->get('SERVER_SOFTWARE'); + $server_name = null; + $server_version = null; + + if ($server_software && preg_match('#^(.*?)(?:/(.*?))?(?: |$)#', strtolower($server_software), $matches)) { + $server_name = $matches[1]; + $server_version = count($matches) > 2 ? $matches[2] : ''; + } + + $this->set('SERVER_NAME', $server_name); + $this->set('SERVER_VERSION', $server_version); + $this->set('HAS_SERVER', in_array($server_name, ['apache', 'lighttpd', 'nginx', 'cherokee'])); + } + + private function add_paths() { + $script_name = $this->get('SCRIPT_NAME'); + if ($this->get('SERVER_NAME') === 'lighttpd') { + $script_name = preg_replace('#^.*?//#', '/', $script_name); + } + + $this->set('H5AI_HREF', Util::normalize_path(dirname(dirname($script_name)), true)); + $this->set('H5AI_PATH', Util::normalize_path(dirname(dirname(dirname(dirname(__FILE__)))), false)); + + $this->set('ROOT_HREF', Util::normalize_path(dirname($this->get('H5AI_HREF')), true)); + $this->set('ROOT_PATH', Util::normalize_path(dirname($this->get('H5AI_PATH')), false)); + + $this->set('PUBLIC_HREF', Util::normalize_path($this->get('H5AI_HREF') . '/public/', true)); + $this->set('PUBLIC_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/public/', false)); + + $this->set('INDEX_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/index.php', false)); + $this->set('CACHE_PUB_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/cache', true)); + $this->set('CACHE_PUB_PATH', Util::normalize_path($this->get('PUBLIC_PATH') . '/cache', false)); + $this->set('HAS_WRITABLE_CACHE_PUB', @is_writable($this->get('CACHE_PUB_PATH'))); + + $this->set('PRIVATE_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/private', false)); + $this->set('CONF_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/conf', false)); + $this->set('CACHE_PRV_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/cache', false)); + $this->set('HAS_WRITABLE_CACHE_PRV', @is_writable($this->get('CACHE_PRV_PATH'))); + } + + private function add_sys_cmd_checks() { + $cmds_cache_path = Util::normalize_path($this->get('CACHE_PRV_PATH') . '/cmds.json', false); + + $cmds = Json::load($cmds_cache_path); + if (sizeof($cmds) === 0 || $this->refresh) { + $cmds['command'] = Util::exec_0('command -v command'); + $cmds['which'] = Util::exec_0('which which') || Util::exec_0('which which.exe'); + $cmds['where'] = Util::exec_0('where where.exe'); + + $cmd = false; + if ($cmds['command']) { + $cmd = 'command -v'; + } elseif ($cmds['which']) { + $cmd = 'which'; + } elseif ($cmds['where']) { + $cmd = 'where'; + } + + foreach (['avconv', 'convert', 'du', 'ffmpeg', 'gm', 'tar', 'zip'] as $c) { + $cmds[$c] = ($cmd !== false) && (Util::exec_0($cmd . ' ' . $c) || Util::exec_0($cmd . ' ' . $c . '.exe')); + } + + Json::save($cmds_cache_path, $cmds); + } + foreach ($cmds as $c => $has) { + $this->set('HAS_CMD_' . strtoupper($c), $has); + } + } + + public function to_jsono($as_admin = false) { + $keys = [ + 'PUBLIC_HREF', + 'ROOT_HREF' + ]; + + if ($as_admin) { + $keys = array_merge($keys, [ + 'VERSION', + + 'PHP_VERSION', + 'MIN_PHP_VERSION', + 'PHP_ARCH', + 'HAS_PHP_EXIF', + 'HAS_PHP_JPEG', + + 'SERVER_NAME', + 'SERVER_VERSION', + 'HAS_SERVER', + + 'INDEX_HREF', + + 'HAS_WRITABLE_CACHE_PUB', + 'HAS_WRITABLE_CACHE_PRV', + + 'HAS_CMD_AVCONV', + 'HAS_CMD_CONVERT', + 'HAS_CMD_DU', + 'HAS_CMD_FFMPEG', + 'HAS_CMD_GM', + 'HAS_CMD_TAR', + 'HAS_CMD_ZIP' + ]); + } + + $jsono = ['AS_ADMIN' => $as_admin]; + foreach ($keys as $key) { + $jsono[$key] = $this->get($key); + } + return $jsono; + } +} diff --git a/src/_h5ai/private/php/core/class-theme.php b/src/_h5ai/private/php/core/class-theme.php new file mode 100644 index 0000000..8fcaddd --- /dev/null +++ b/src/_h5ai/private/php/core/class-theme.php @@ -0,0 +1,32 @@ +context = $context; + } + + public function get_icons() { + $public_path = $this->context->get_setup()->get('PUBLIC_PATH'); + $theme = $this->context->query_option('view.theme', '-NONE-'); + $theme_path = $public_path . '/images/themes/' . $theme; + + $icons = []; + + if (is_dir($theme_path)) { + if ($dir = opendir($theme_path)) { + while (($name = readdir($dir)) !== false) { + $path_parts = pathinfo($name); + if (in_array(@$path_parts['extension'], Theme::$EXTENSIONS)) { + $icons[$path_parts['filename']] = $theme . '/' . $name; + } + } + closedir($dir); + } + } + + return $icons; + } +} diff --git a/src/_h5ai/private/php/core/class-util.php b/src/_h5ai/private/php/core/class-util.php new file mode 100644 index 0000000..ce6c802 --- /dev/null +++ b/src/_h5ai/private/php/core/class-util.php @@ -0,0 +1,89 @@ + $err, 'msg' => $msg]); + } + } + + public static function array_query($array, $keypath = '', $default = Util::NO_DEFAULT) { + $value = $array; + + $keys = array_filter(explode('.', $keypath)); + foreach ($keys as $key) { + if (!is_array($value) || !array_key_exists($key, $value)) { + return $default; + } + $value = $value[$key]; + } + + return $value; + } + + public static function starts_with($sequence, $head) { + return substr($sequence, 0, strlen($head)) === $head; + } + + public static function ends_with($sequence, $tail) { + $len = strlen($tail); + return $len === 0 ? true : substr($sequence, -$len) === $tail; + } + + public static function wrap_pattern($pattern) { + return Util::RE_DELIMITER . str_replace(Util::RE_DELIMITER, '\\' . Util::RE_DELIMITER, $pattern) . Util::RE_DELIMITER; + } + + public static function passthru_cmd($cmd) { + $rc = null; + passthru($cmd, $rc); + return $rc; + } + + public static function exec_cmdv($cmdv) { + if (!is_array($cmdv)) { + $cmdv = func_get_args(); + } + $cmd = implode(' ', array_map('escapeshellarg', $cmdv)); + + $lines = []; + $rc = null; + exec($cmd, $lines, $rc); + return implode("\n", $lines); + } + + public static function exec_0($cmd) { + $lines = []; + $rc = null; + try { + @exec($cmd, $lines, $rc); + return $rc === 0; + } catch (Exception $e) {} + return false; + } + + public static function filesize($context, $path) { + $withFoldersize = $context->query_option('foldersize.enabled', false); + $withDu = $context->get_setup()->get('HAS_CMD_DU') && $context->query_option('foldersize.type', null) === 'shell-du'; + return Filesize::getCachedSize($path, $withFoldersize, $withDu); + } +} diff --git a/src/_h5ai/private/php/ext/class-archive.php b/src/_h5ai/private/php/ext/class-archive.php new file mode 100644 index 0000000..e1d9001 --- /dev/null +++ b/src/_h5ai/private/php/ext/class-archive.php @@ -0,0 +1,188 @@ +context = $context; + } + + public function output($type, $base_href, $hrefs) { + $this->base_path = $this->context->to_path($base_href); + if (!$this->context->is_managed_path($this->base_path)) { + return false; + } + + $this->dirs = []; + $this->files = []; + + $this->add_hrefs($hrefs); + + if (count($this->dirs) === 0 && count($this->files) === 0) { + if ($type === 'php-tar') { + $this->add_dir($this->base_path, '/'); + } else { + $this->add_dir($this->base_path, '.'); + } + } + + if ($type === 'php-tar') { + return $this->php_tar($this->dirs, $this->files); + } elseif ($type === 'shell-tar') { + return $this->shell_cmd(Archive::$TAR_PASSTHRU_CMD); + } elseif ($type === 'shell-zip') { + return $this->shell_cmd(Archive::$ZIP_PASSTHRU_CMD); + } + return false; + } + + private function shell_cmd($cmd) { + $cmd = str_replace('[ROOTDIR]', escapeshellarg($this->base_path), $cmd); + $cmd = str_replace('[DIRS]', count($this->dirs) ? implode(' ', array_map('escapeshellarg', $this->dirs)) : '', $cmd); + $cmd = str_replace('[FILES]', count($this->files) ? implode(' ', array_map('escapeshellarg', $this->files)) : '', $cmd); + try { + Util::passthru_cmd($cmd); + } catch (Exeption $err) { + return false; + } + return true; + } + + private function php_tar($dirs, $files) { + $filesizes = []; + $total_size = 512 * count($dirs); + foreach (array_keys($files) as $real_file) { + $size = filesize($real_file); + + $filesizes[$real_file] = $size; + $total_size += 512 + $size; + if ($size % 512 != 0) { + $total_size += 512 - ($size % 512); + } + } + + header('Content-Length: ' . $total_size); + + foreach ($dirs as $real_dir => $archived_dir) { + echo $this->php_tar_header($archived_dir, 0, @filemtime($real_dir . DIRECTORY_SEPARATOR . '.'), 5); + } + + foreach ($files as $real_file => $archived_file) { + $size = $filesizes[$real_file]; + + echo $this->php_tar_header($archived_file, $size, @filemtime($real_file), 0); + $this->print_file($real_file); + + if ($size % 512 != 0) { + echo str_repeat(Archive::NULL_BYTE, 512 - ($size % 512)); + } + } + + return true; + } + + private function php_tar_header($filename, $size, $mtime, $type) { + $name = substr(basename($filename), -99); + $prefix = substr(Util::normalize_path(dirname($filename)), -154); + if ($prefix === '.') { + $prefix = ''; + } + + $header = + str_pad($name, 100, Archive::NULL_BYTE) // filename [100] + . '0000755' . Archive::NULL_BYTE // file mode [8] + . '0000000' . Archive::NULL_BYTE // uid [8] + . '0000000' . Archive::NULL_BYTE // gid [8] + . str_pad(decoct($size), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file size [12] + . str_pad(decoct($mtime), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file modification time [12] + . ' ' // checksum [8] + . str_pad($type, 1) // file type [1] + . str_repeat(Archive::NULL_BYTE, 100) // linkname [100] + . 'ustar' . Archive::NULL_BYTE // magic [6] + . '00' // version [2] + . str_repeat(Archive::NULL_BYTE, 80) // uname, gname, defmajor, devminor [32 + 32 + 8 + 8] + . str_pad($prefix, 155, Archive::NULL_BYTE) // filename [155] + . str_repeat(Archive::NULL_BYTE, 12); // fill [12] + assert(strlen($header) === 512); + + // checksum + $checksum = array_sum(array_map('ord', str_split($header))); + $checksum = str_pad(decoct($checksum), 6, '0', STR_PAD_LEFT) . Archive::NULL_BYTE . ' '; + $header = substr_replace($header, $checksum, 148, 8); + + return $header; + } + + private function print_file($file) { + // Send file content in segments to not hit PHP's memory limit (default: 128M) + if ($fd = fopen($file, 'rb')) { + while (!feof($fd)) { + print fread($fd, Archive::$SEGMENT_SIZE); + @ob_flush(); + @flush(); + } + fclose($fd); + } + } + + private function add_hrefs($hrefs) { + if (!is_array($hrefs)) { + $hrefs = array($hrefs); + } + + foreach ($hrefs as $href) { + if (trim($href) === '') { + continue; + } + + $href = Util::normalize_path($href, false); + $d = dirname($href); + $n = basename($href); + + if ($this->context->is_managed_href($d) && !$this->context->is_hidden($n)) { + + $real_file = $this->context->to_path($href); + $archived_file = preg_replace('!^' . preg_quote(Util::normalize_path($this->base_path, true)) . '!', '', $real_file); + + if (is_dir($real_file)) { + $this->add_dir($real_file, $archived_file); + } else { + $this->add_file($real_file, $archived_file); + } + } + } + } + + private function add_file($real_file, $archived_file) { + if (is_readable($real_file)) { + $this->files[$real_file] = $archived_file; + } + } + + private function add_dir($real_dir, $archived_dir) { + if ($this->context->is_managed_path($real_dir)) { + $this->dirs[$real_dir] = $archived_dir; + + $files = $this->context->read_dir($real_dir); + foreach ($files as $file) { + $real_file = $real_dir . '/' . $file; + $archived_file = $archived_dir . '/' . $file; + + if (is_dir($real_file)) { + $this->add_dir($real_file, $archived_file); + } else { + $this->add_file($real_file, $archived_file); + } + } + } + } +} diff --git a/src/_h5ai/private/php/ext/class-custom.php b/src/_h5ai/private/php/ext/class-custom.php new file mode 100644 index 0000000..1a84bd2 --- /dev/null +++ b/src/_h5ai/private/php/ext/class-custom.php @@ -0,0 +1,73 @@ +context = $context; + } + + private function read_custom_file($path, $name, &$content, &$type) { + $file_prefix = $this->context->get_setup()->get('FILE_PREFIX'); + + foreach (Custom::$EXTENSIONS as $ext) { + $file = $path . '/' . $file_prefix . '.' . $name . '.' . $ext; + if (is_readable($file)) { + $content = file_get_contents($file); + $type = $ext; + return; + } + } + } + + public function get_customizations($href) { + if (!$this->context->query_option('custom.enabled', false)) { + return [ + 'header' => ['content' => null, 'type' => null], + 'footer' => ['content' => null, 'type' => null] + ]; + } + + $root_path = $this->context->get_setup()->get('FILE_PREFIX'); + $path = $this->context->to_path($href); + + $header = null; + $header_type = null; + $footer = null; + $footer_type = null; + + $this->read_custom_file($path, 'header', $header, $header_type); + $this->read_custom_file($path, 'footer', $footer, $footer_type); + + while ($header === null || $footer === null) { + if ($header === null) { + $this->read_custom_file($path, 'headers', $header, $header_type); + } + if ($footer === null) { + $this->read_custom_file($path, 'footers', $footer, $footer_type); + } + if ($path === $root_path) { + break; + } + $parent_path = Util::normalize_path(dirname($path)); + if ($parent_path === $path) { + break; + } + + // Stop once we reach the root + if ( + $this->context->query_option('custom.stopSearchingAtRoot', true) && + $path === $this->context->get_setup()->get('ROOT_PATH') + ) { + break; + } + $path = $parent_path; + } + + return [ + 'header' => ['content' => $header, 'type' => $header_type], + 'footer' => ['content' => $footer, 'type' => $footer_type] + ]; + } +} diff --git a/src/_h5ai/private/php/ext/class-search.php b/src/_h5ai/private/php/ext/class-search.php new file mode 100644 index 0000000..124954d --- /dev/null +++ b/src/_h5ai/private/php/ext/class-search.php @@ -0,0 +1,40 @@ +context = $context; + } + + public function get_paths($root, $pattern = null, $ignorecase = false) { + $paths = []; + if ($pattern && $this->context->is_managed_path($root)) { + $re = Util::wrap_pattern($pattern); + if ($ignorecase) { + $re .= 'i'; + } + $names = $this->context->read_dir($root); + foreach ($names as $name) { + $path = $root . '/' . $name; + if (preg_match($re, @basename($path))) { + $paths[] = $path; + } + if (@is_dir($path)) { + $paths = array_merge($paths, $this->get_paths($path, $pattern, $ignorecase)); + } + } + } + return $paths; + } + + public function get_items($href, $pattern = null, $ignorecase = false) { + $cache = []; + $root = $this->context->to_path($href); + $paths = $this->get_paths($root, $pattern, $ignorecase); + $items = array_map(function ($path) { + return Item::get($this->context, $path, $cache)->to_json_object(); + }, $paths); + return $items; + } +} diff --git a/src/_h5ai/private/php/ext/class-thumb.php b/src/_h5ai/private/php/ext/class-thumb.php new file mode 100644 index 0000000..d52d3e8 --- /dev/null +++ b/src/_h5ai/private/php/ext/class-thumb.php @@ -0,0 +1,253 @@ +context = $context; + $this->setup = $context->get_setup(); + $this->thumbs_path = $this->setup->get('CACHE_PUB_PATH') . '/' . Thumb::$THUMB_CACHE; + $this->thumbs_href = $this->setup->get('CACHE_PUB_HREF') . Thumb::$THUMB_CACHE; + + if (!is_dir($this->thumbs_path)) { + @mkdir($this->thumbs_path, 0755, true); + } + } + + public function thumb($type, $source_href, $width, $height) { + $source_path = $this->context->to_path($source_href); + if (!file_exists($source_path) || Util::starts_with($source_path, $this->setup->get('CACHE_PUB_PATH'))) { + return null; + } + + $capture_path = $source_path; + if ($type === 'img') { + $capture_path = $source_path; + } elseif ($type === 'mov') { + if ($this->setup->get('HAS_CMD_AVCONV')) { + $capture_path = $this->capture(Thumb::$AVCONV_CMDV, $source_path); + } elseif ($this->setup->get('HAS_CMD_FFMPEG')) { + $capture_path = $this->capture(Thumb::$FFMPEG_CMDV, $source_path); + } + } elseif ($type === 'doc') { + if ($this->setup->get('HAS_CMD_CONVERT')) { + $capture_path = $this->capture(Thumb::$CONVERT_CMDV, $source_path); + } elseif ($this->setup->get('HAS_CMD_GM')) { + $capture_path = $this->capture(Thumb::$GM_CONVERT_CMDV, $source_path); + } + } + + return $this->thumb_href($capture_path, $width, $height); + } + + private function thumb_href($source_path, $width, $height) { + if (!file_exists($source_path)) { + return null; + } + + $name = 'thumb-' . sha1($source_path) . '-' . $width . 'x' . $height . '.jpg'; + $thumb_path = $this->thumbs_path . '/' . $name; + $thumb_href = $this->thumbs_href . '/' . $name; + + if (!file_exists($thumb_path) || filemtime($source_path) >= filemtime($thumb_path)) { + $image = new Image(); + + $et = false; + if ($this->setup->get('HAS_PHP_EXIF') && $this->context->query_option('thumbnails.exif', false) === true && $height != 0) { + $et = @exif_thumbnail($source_path); + } + if($et !== false) { + file_put_contents($thumb_path, $et); + $image->set_source($thumb_path); + $image->normalize_exif_orientation($source_path); + } else { + $image->set_source($source_path); + } + + $image->thumb($width, $height); + $image->save_dest_jpeg($thumb_path, 80); + } + + return file_exists($thumb_path) ? $thumb_href : null; + } + + private function capture($cmdv, $source_path) { + if (!file_exists($source_path)) { + return null; + } + + $capture_path = $this->thumbs_path . '/capture-' . sha1($source_path) . '.jpg'; + + if (!file_exists($capture_path) || filemtime($source_path) >= filemtime($capture_path)) { + foreach ($cmdv as &$arg) { + $arg = str_replace('[SRC]', $source_path, $arg); + $arg = str_replace('[DEST]', $capture_path, $arg); + } + + Util::exec_cmdv($cmdv); + } + + return file_exists($capture_path) ? $capture_path : null; + } +} + +class Image { + private $source_file; + private $source; + private $width; + private $height; + private $type; + private $dest; + + public function __construct($filename = null) { + $this->source_file = null; + $this->source = null; + $this->width = null; + $this->height = null; + $this->type = null; + + $this->dest = null; + + $this->set_source($filename); + } + + public function __destruct() { + $this->release_source(); + $this->release_dest(); + } + + public function set_source($filename) { + $this->release_source(); + $this->release_dest(); + + if (is_null($filename)) { + return; + } + + $this->source_file = $filename; + + list($this->width, $this->height, $this->type) = @getimagesize($this->source_file); + + if (!$this->width || !$this->height) { + $this->source_file = null; + $this->width = null; + $this->height = null; + $this->type = null; + return; + } + + $this->source = imagecreatefromstring(file_get_contents($this->source_file)); + } + + public function save_dest_jpeg($filename, $quality = 80) { + if (!is_null($this->dest)) { + @imagejpeg($this->dest, $filename, $quality); + @chmod($filename, 0775); + } + } + + public function release_dest() { + if (!is_null($this->dest)) { + @imagedestroy($this->dest); + $this->dest = null; + } + } + + public function release_source() { + if (!is_null($this->source)) { + @imagedestroy($this->source); + $this->source_file = null; + $this->source = null; + $this->width = null; + $this->height = null; + $this->type = null; + } + } + + public function thumb($width, $height) { + if (is_null($this->source)) { + return; + } + + $src_r = 1.0 * $this->width / $this->height; + + if ($height == 0) { + if ($src_r >= 1) { + $height = 1.0 * $width / $src_r; + } else { + $height = $width; + $width = 1.0 * $height * $src_r; + } + if ($width > $this->width) { + $width = $this->width; + $height = $this->height; + } + } + + $ratio = 1.0 * $width / $height; + + if ($src_r <= $ratio) { + $src_w = $this->width; + $src_h = $src_w / $ratio; + $src_x = 0; + } else { + $src_h = $this->height; + $src_w = $src_h * $ratio; + $src_x = 0.5 * ($this->width - $src_w); + } + + $width = intval($width); + $height = intval($height); + $src_x = intval($src_x); + $src_w = intval($src_w); + $src_h = intval($src_h); + + $this->dest = imagecreatetruecolor($width, $height); + $icol = imagecolorallocate($this->dest, 255, 255, 255); + imagefill($this->dest, 0, 0, $icol); + imagecopyresampled($this->dest, $this->source, 0, 0, $src_x, 0, $width, $height, $src_w, $src_h); + } + + public function rotate($angle) { + if (is_null($this->source) || ($angle !== 90 && $angle !== 180 && $angle !== 270)) { + return; + } + + $this->source = imagerotate($this->source, $angle, 0); + if ( $angle === 90 || $angle === 270 ) { + list($this->width, $this->height) = [$this->height, $this->width]; + } + } + + public function normalize_exif_orientation($exif_source_file = null) { + if (is_null($this->source) || !function_exists('exif_read_data')) { + return; + } + + if ($exif_source_file === null) { + $exif_source_file = $this->source_file; + } + + $exif = exif_read_data($exif_source_file); + switch (@$exif['Orientation']) { + case 3: + $this->rotate(180); + break; + case 6: + $this->rotate(270); + break; + case 8: + $this->rotate(90); + break; + } + } +} diff --git a/src/_h5ai/private/php/pages/index.php.pug b/src/_h5ai/private/php/pages/index.php.pug new file mode 100644 index 0000000..522a3e7 --- /dev/null +++ b/src/_h5ai/private/php/pages/index.php.pug @@ -0,0 +1,8 @@ +extends ./page.tpl.pug + +block init + - var title = `index - powered by h5ai v${pkg.version} (${pkg.homepage})` + - var module = 'index' + +block body + div#fallback diff --git a/src/_h5ai/private/php/pages/info.php.pug b/src/_h5ai/private/php/pages/info.php.pug new file mode 100644 index 0000000..31f8e5a --- /dev/null +++ b/src/_h5ai/private/php/pages/info.php.pug @@ -0,0 +1,10 @@ +extends ./page.tpl.pug + +block init + - var title = `h5ai info page - v${pkg.version}` + - var module = 'info' + +block body + div#content + h1#header + a(href=pkg.homepage) h5ai diff --git a/src/_h5ai/private/php/pages/page.tpl.pug b/src/_h5ai/private/php/pages/page.tpl.pug new file mode 100644 index 0000000..9a7526b --- /dev/null +++ b/src/_h5ai/private/php/pages/page.tpl.pug @@ -0,0 +1,30 @@ +block init + + +doctype html +html(class='no-js', lang='en') + + head + meta(charset='utf-8') + meta(http-equiv='x-ua-compatible', content='ie=edge') + title #{title} + meta(name='description', content=title) + meta(name='viewport', content='width=device-width, initial-scale=1') + link(rel='shortcut icon', href!='images/favicon/favicon-16-32.ico') + link(rel='apple-touch-icon-precomposed', type='image/png', href!='images/favicon/favicon-152.png') + link(rel='stylesheet', href!='css/styles.css') + + script(src!='js/scripts.js', data-module=module) + + + + body#root(class=module) + + div#fallback-hints + + span.noJsMsg Works best with JavaScript enabled! + span.noBrowserMsg Works best in #[a(href='http://browsehappy.com') modern browsers]! + + span.backlink #[a(href=pkg.homepage, title=`h5ai v${pkg.version} - ${pkg.description}`) powered by h5ai] + + block body diff --git a/src/_h5ai/public/.htaccess b/src/_h5ai/public/.htaccess new file mode 100644 index 0000000..3f14990 --- /dev/null +++ b/src/_h5ai/public/.htaccess @@ -0,0 +1,13 @@ +## make this folder accessible + +# Apache < 2.3 + + Order allow,deny + Allow from all + Satisfy All + + +# Apache ≥ 2.3 + + Require all granted + diff --git a/src/_h5ai/public/cache/README.md b/src/_h5ai/public/cache/README.md new file mode 100644 index 0000000..fd2974c --- /dev/null +++ b/src/_h5ai/public/cache/README.md @@ -0,0 +1,9 @@ +# Cache + +Public cache. + +This directory is used for server side caching. To use caching make this +directory writable for your webserver. + +There is no critical data in here. You can savely remove any content. This +will clear the cache. diff --git a/src/_h5ai/public/css/lib/colors.less b/src/_h5ai/public/css/lib/colors.less new file mode 100644 index 0000000..6c180f0 --- /dev/null +++ b/src/_h5ai/public/css/lib/colors.less @@ -0,0 +1,46 @@ +@col-red-500: #f44336; +@col-green-500: #4caf50; +@col-blue-400: #42a5f5; +@col-pink-a200: #ff4081; + +@col-white: #ffffff; +@col-grey-50: #fafafa; +@col-grey-100: #f5f5f5; +@col-grey-300: #e0e0e0; +@col-grey-700: #616161; +@col-grey-900: #212121; + +@col-text-primary-black: rgba(0,0,0,0.87); +@col-text-secondary-black: rgba(0,0,0,0.54); +@col-text-disabled-black: rgba(0,0,0,0.26); +@col-divider-black: rgba(0,0,0,0.12); + +@col-text-primary-white: rgba(255,255,255,1.0); +@col-text-secondary-white: rgba(255,255,255,0.7); +@col-text-disabled-white: rgba(255,255,255,0.3); +@col-divider-white: rgba(255,255,255,0.12); + +@col-text-selected: @col-text-primary-white; +@col-back-selected: @col-blue-400; + +@col-text-native-selection: @col-text-primary-white; +@col-back-native-selection: @col-pink-a200; + +@col-text: @col-text-primary-black; +@col-back: @col-white; +@col-back-paper: @col-white; +@col-back-panel: @col-grey-50; +@col-text-hover: @col-blue-400; +@col-back-hover: rgba(0,0,0,0.03); +@col-border: rgba(0,0,0,0.05); +@col-border-strong: rgba(0,0,0,0.15); +@col-border-stronger: rgba(0,0,0,0.3); + +@col-okay: @col-green-500; +@col-error: @col-red-500; + +@col-link: @col-blue-400; +@col-link-hover: @col-grey-900; + +@col-range-back: @col-grey-300; +@col-range-thumb: @col-grey-700; diff --git a/src/_h5ai/public/css/lib/ext/contextmenu.less b/src/_h5ai/public/css/lib/ext/contextmenu.less new file mode 100644 index 0000000..fda4e36 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/contextmenu.less @@ -0,0 +1,72 @@ +#cm-overlay { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; + z-index: 200; + + .cm-panel { + .popup; + .rounded; + display: block; + position: absolute; + left: 100px; + top: 100px; + color: @col-text; + background: @col-back-paper; + z-index: 10; + overflow: auto; + min-width: 200px; + + ul { + margin: 0; + padding: 0; + list-style: none; + text-align: left; + } + } + + .cm-label { + padding: 8px 16px; + white-space: nowrap; + font-weight: bold; + } + + .cm-entry { + padding: 8px 16px; + white-space: nowrap; + cursor: pointer; + + &:hover { + color: @col-text-hover; + background: @col-back-hover; + } + } + + .cm-icon { + position: relative; + top: -2px; + + img { + width: 20px; + height: 20px; + } + + &.no-icon { + opacity: 0; + } + } + + .cm-text { + margin: 0 0 0 12px; + } + + .cm-sep { + height: 1px; + margin: 8px 0; + padding: 0; + border-top: 1px solid rgba(0,0,0,0.08); + } +} diff --git a/src/_h5ai/public/css/lib/ext/crumb.less b/src/_h5ai/public/css/lib/ext/crumb.less new file mode 100644 index 0000000..e7b24bc --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/crumb.less @@ -0,0 +1,54 @@ +#crumbbar { + overflow: hidden; + height: 48px; + font-size: 16px; + padding: 0 8px; + // border-left: 1px solid rgba(0,0,0,0.05); + + a, a:active, a:visited { + color: @col-text; + cursor: pointer; + text-decoration: none; + + &.active { + font-weight: bold; + } + &:hover { + color: @col-text-hover; + } + &:focus { + outline: 0; + } + } + .crumb { + .eased-transition; + display: inline-block; + } + .sep { + width: 24px; + height: 24px; + padding: 12px 0; + line-height: 48px; + display: inline-block; + vertical-align: top; + } + .crumb:first-of-type .sep { + width: 0; + } + .label { + line-height: 48px; + display: inline-block; + vertical-align: top; + padding: 0 8px; + } + .hint { + width: 20px; + height: 20px; + padding: 16px 0 0 0; + line-height: 48px; + display: inline-block; + vertical-align: top; + position: relative; + top: -2px; + } +} diff --git a/src/_h5ai/public/css/lib/ext/custom.less b/src/_h5ai/public/css/lib/ext/custom.less new file mode 100644 index 0000000..736e47e --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/custom.less @@ -0,0 +1,19 @@ +#content-header, #content-footer { + margin: 16px; + padding: 8px; + color: @col-text; + + a, a:active, a:visited { + color: @col-link; + text-decoration: none; + cursor: pointer; + + &:hover { + color: @col-link-hover; + } + } + + h1, h2, h3, h4, h5, h6, p { + margin: 0.1em 0; + } +} diff --git a/src/_h5ai/public/css/lib/ext/filter.less b/src/_h5ai/public/css/lib/ext/filter.less new file mode 100644 index 0000000..28ca3f7 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/filter.less @@ -0,0 +1,27 @@ +#filter { + + input { + display: none; + border: none; + font-size: 16px; + color: @col-text; + background: transparent; + outline: 0; + width: 160px; + padding: 0 12px 0 4px; + line-height: 48px; + vertical-align: top; + } + + &.active { + input { + display: inline-block; + } + } + + &.pending { + input { + color: @col-text-disabled-black; + } + } +} diff --git a/src/_h5ai/public/css/lib/ext/info.less b/src/_h5ai/public/css/lib/ext/info.less new file mode 100644 index 0000000..cc8d7e5 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/info.less @@ -0,0 +1,54 @@ +#info { + overflow: auto; + flex: 0 0 auto; + order: 99; + + padding: 32px 32px 32px 48px; + white-space: nowrap; + overflow-x: hidden; + width: 240px; + + .icon { + width: 240px; + height: 180px; + + img { + .rounded; + display: block; + overflow: hidden; + margin: 0 auto; + width: 180px; + height: 180px; + } + + .thumb { + width: 240px; + } + } + + .block { + border-top: 1px solid @col-border; + border-bottom: 1px solid @col-border; + margin: 0 0 24px 0; + padding: 24px 0; + } + + .label { + font-size: 16px; + margin-bottom: 16px; + } + + .time, .size, .content { + line-height: 20px; + height: 20px; + } + + .qrcode { + margin: 0 auto; + width: 200px; + + img { + display: block; + } + } +} diff --git a/src/_h5ai/public/css/lib/ext/preview-aud.less b/src/_h5ai/public/css/lib/ext/preview-aud.less new file mode 100644 index 0000000..97675df --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/preview-aud.less @@ -0,0 +1,8 @@ +#pv-content-aud { + .raised; + + position: absolute; + + max-width: 100%; + max-height: 100%; +} diff --git a/src/_h5ai/public/css/lib/ext/preview-img.less b/src/_h5ai/public/css/lib/ext/preview-img.less new file mode 100644 index 0000000..aeb1664 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/preview-img.less @@ -0,0 +1,29 @@ +#pv-content-img { + .raised; + + @check-white: #f8f8f8; + @check-black: #e8e8e8; + + position: absolute; + + image-orientation: from-image; + + max-width: 100%; + max-height: 100%; + + background-color: @check-white; + background-image: + -webkit-linear-gradient(45deg, @check-black 25%, transparent 25%, transparent 75%, @check-black 75%, @check-black), + -webkit-linear-gradient(45deg, @check-black 25%, transparent 25%, transparent 75%, @check-black 75%, @check-black); + background-size: 60px 60px; + background-position: 0 0, 30px 30px; + + &.loading { + opacity: 0.5; + margin-top: 32px; + width: 240px; + height: 240px; + border-radius: 1000px; + overflow: hidden; + } +} diff --git a/src/_h5ai/public/css/lib/ext/preview-txt.less b/src/_h5ai/public/css/lib/ext/preview-txt.less new file mode 100644 index 0000000..508a610 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/preview-txt.less @@ -0,0 +1,36 @@ +#pv-content-txt { + .raised; + + box-sizing: border-box; + max-width: 960px; + text-align: left; + background: @col-back-paper; + margin: 0 auto; + padding: 8px; + overflow: auto; + + a, a:active, a:visited { + color: #2080FF; + text-decoration: none; + cursor: pointer; + + &:hover { + color: #68A9FF; + } + } +} + +pre#pv-content-txt { + code { + line-height: 1.2em; + } +} + +div#pv-content-txt { + font-size: 1.1em; + padding: 8px 24px; + + code { + color: #008200; + } +} diff --git a/src/_h5ai/public/css/lib/ext/preview-vid.less b/src/_h5ai/public/css/lib/ext/preview-vid.less new file mode 100644 index 0000000..757dc26 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/preview-vid.less @@ -0,0 +1,13 @@ +#pv-content-vid { + .raised; + + position: absolute; + + max-width: 100%; + max-height: 100%; +} + +#pv-content-vid:-webkit-full-screen { + top: auto !important; + left: auto !important; +} diff --git a/src/_h5ai/public/css/lib/ext/preview.less b/src/_h5ai/public/css/lib/ext/preview.less new file mode 100644 index 0000000..f17b504 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/preview.less @@ -0,0 +1,148 @@ +#pv-overlay { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 100; + + background: rgba(0,0,0,0.5); + transition: background-color 0.3s ease-in-out; + + text-align: center; +} + +#pv-overlay.fullscreen { + background: @col-grey-900; +} + +#pv-container { + position: absolute; +} + +#pv-spinner { + position: absolute; + + .back { + width: 240px; + height: 240px; + margin: -120px -120px; + border-radius: 120px; + opacity: 0.5; + overflow: hidden; + } + .spinner { + width: 100px; + height: 100px; + margin: -50px -50px; + } +} + +#pv-prev-area, #pv-next-area { + position: absolute; + top: 50%; + cursor: pointer; + + img { + .eased-transition; + display: block; + width: 48px; + height: 48px; + margin: -36px 0; + padding: 12px; + opacity: 0.5; + } + + &:hover { + img { + .raised; + opacity: 1; + background: rgba(27,27,27,0.8); + } + } +} + +#pv-prev-area { + left: 0; + img { + border-radius: 0 8px 8px 0; + padding-left: 48px; + } +} + +#pv-next-area { + right: 0; + img { + border-radius: 8px 0 0 8px; + padding-right: 48px; + } +} + +#pv-buttons { + list-style: none; + list-style-image: none; + margin: 0; + padding: 0; + + img { + position: relative; + width: 24px; + height: 24px; + padding: 12px + } + + .bar-label { + .eased-transition; + display: block; + color: @col-text-primary-white; + height: 48px; + line-height: 48px; + padding: 0 12px; + opacity: 0.7; + } + + .bar-button { + .eased-transition; + display: block; + line-height: 48px; + opacity: 0.7; + cursor: pointer; + + &:hover { + opacity: 1.0; + background: rgba(255,255,255,0.1); + } + } + + .bar-left { + float: left; + } + + .bar-right { + float: right; + } +} + +#pv-bottombar { + .raised; + position: fixed; + z-index: 5; + left: 0; + right: 0; + bottom: 0; + background: rgb(27,27,27); + height: 48px; +} + +#pv-overlay.fullscreen { + + #pv-bottombar { + opacity: 0.5; + } +} + +@media only screen and (max-width: 700px) { + #pv-prev-area, #pv-next-area { + display: none !important; + } +} diff --git a/src/_h5ai/public/css/lib/ext/search.less b/src/_h5ai/public/css/lib/ext/search.less new file mode 100644 index 0000000..8e6f0b7 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/search.less @@ -0,0 +1,27 @@ +#search { + + input { + display: none; + border: none; + font-size: 16px; + color: @col-text; + background: transparent; + outline: 0; + width: 160px; + padding: 0 12px 0 4px; + line-height: 48px; + vertical-align: top; + } + + &.active { + input { + display: inline-block; + } + } + + &.pending { + input { + color: @col-text-disabled-black; + } + } +} diff --git a/src/_h5ai/public/css/lib/ext/select.less b/src/_h5ai/public/css/lib/ext/select.less new file mode 100644 index 0000000..f4ae5f4 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/select.less @@ -0,0 +1,75 @@ +#selection-rect { + position: absolute; + left: 0; + top: 0; + z-index: 2; + border: 1px dashed @col-border-strong; + background: rgba(0,0,0,0.1); +} + +html.drag-select, html.drag-select * { + cursor: move !important; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + #view .item:hover { + box-shadow: none !important; + } +} + +#view { + + .selector { + display: none; + position: absolute; + left: 0; + top: 0; + width: 22px; + height: 22px; + background: @col-back-selected; + cursor: pointer; + border-radius: 0 0 2px 0; + opacity: 0.6; + + &:hover { + opacity: 0.8; + } + img { + width: 100%; + height: 100%; + } + } + + .item:hover .selector { + display: block; + } + + .item.selected:not(.selecting), + .item.selecting:not(.selected) { + color: @col-text-selected; + background: @col-back-selected; + + .selector { + display: block; + opacity: 1; + } + &:hover { + color: @col-text-selected; + background: @col-back-selected; + } + } + + .no-match { + display: none; + margin-top: 36px; + text-align: center; + color: @col-border; + font-size: 5em; + font-weight: bold; + } +} diff --git a/src/_h5ai/public/css/lib/ext/tree.less b/src/_h5ai/public/css/lib/ext/tree.less new file mode 100644 index 0000000..46c9827 --- /dev/null +++ b/src/_h5ai/public/css/lib/ext/tree.less @@ -0,0 +1,84 @@ +#tree { + overflow: auto; + flex: 0 0 auto; + order: 1; + + padding: 32px 32px 32px 16px; + white-space: nowrap; + max-width: 250px; + overflow-x: hidden; + + a, a:active, a.visited { + display: block; + margin-left: 20px; + padding: 3px 0; + text-decoration: none; + color: @col-text; + + &:hover { + color: @col-text-hover; + } + } + + .active > a { + font-weight: bold; + } + + .indicator { + display: block; + float: left; + padding: 3px 0; + position: relative; + top: -2px; + cursor: pointer; + + img { + // .eased-transition; + width: 20px; + height: 20px; + zoom: 1; + } + } + + .item { + clear: left; + + &.open > .indicator img { + transform: rotate(90deg); + } + &.unknown > .indicator { + opacity: 0.3; + } + &.none > .indicator { + opacity: 0; + cursor: inherit; + } + &.unknown > .content, &.none > .content, &.closed > .content { + display: none; + } + } + + .icon { + position: relative; + top: -2px; + + img { + width: 20px; + height: 20px; + } + } + + .label { + margin: 0 0 0 4px; + } + + .content { + margin: 0; + padding: 0 0 0 20px; + } + + .summary { + color: @col-text-disabled-black; + padding: 0 0 0 8px; + } +} diff --git a/src/_h5ai/public/css/lib/fonts.less b/src/_h5ai/public/css/lib/fonts.less new file mode 100644 index 0000000..eaff1b2 --- /dev/null +++ b/src/_h5ai/public/css/lib/fonts.less @@ -0,0 +1,5 @@ +@font-family: "Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"; +@font-weight: normal; +@font-size: 13px; +@font-family-mono: "Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"; +@font-size-mono: 15px; diff --git a/src/_h5ai/public/css/lib/main/info.less b/src/_h5ai/public/css/lib/main/info.less new file mode 100644 index 0000000..4b5cf7c --- /dev/null +++ b/src/_h5ai/public/css/lib/main/info.less @@ -0,0 +1,108 @@ +#root.info { + + #content { + flex: 1 1 auto; + order: 50; + color: @col-text; + text-align: center; + } + + code { + margin: 0 0.2em; + padding: 2px 4px; + border-radius: 4px; + letter-spacing: 0.05em; + background: @col-back-panel; + border: 1px solid @col-border; + font-size: 0.9em; + } + + #header a { + .eased-transition; + font-size: 4em; + font-weight: 300; + margin: 0.8em 0 0 0; + color: @col-text; + text-decoration: none; + + &:hover { + color: @col-text-hover; + } + } + + #support { + margin: 24px auto; + padding: 18px 0 6px 0; + width: 292px; + background: @col-back-panel; + border: 1px solid @col-border; + border-radius: 4px; + + input[type="image"] { + border: 0; + width: 100px; + padding: 12px 48px; + } + } + + #pass { + .el-input; + display: inline-block; + margin: 8px; + padding: 0 12px; + line-height: 28px; + width: 200px; + vertical-align: top; + } + + #login, #logout { + .el-button; + display: inline-block; + margin: 8px; + padding: 0 12px; + line-height: 28px; + vertical-align: top; + } + + #hint { + margin: 12px auto; + width: 320px; + } + + #tests { + display: inline-block; + text-align: left; + list-style-type: none; + margin: 48px 0; + padding: 0; + + .test { + background: @col-back-paper; + margin: 12px 0 0 0; + padding: 8px 12px 12px 12px; + border-bottom: 1px solid @col-border; + } + .label { + display: inline-block; + width: 250px; + font-size: 1.4em; + } + .result { + display: inline-block; + width: 250px; + text-align: right; + font-size: 1.4em; + font-weight: bold; + + &.passed { + color: @col-okay; + } + &.failed { + color: @col-error; + } + } + .info { + margin: 4px 0 0 0; + } + } +} diff --git a/src/_h5ai/public/css/lib/misc.less b/src/_h5ai/public/css/lib/misc.less new file mode 100644 index 0000000..87d440a --- /dev/null +++ b/src/_h5ai/public/css/lib/misc.less @@ -0,0 +1,29 @@ +::-moz-selection { + color: @col-text-native-selection; + background: @col-back-native-selection; + text-shadow: none; +} +::selection { + color: @col-text-native-selection; + background: @col-back-native-selection; + text-shadow: none; +} + +*:focus { + outline: none; +} + +code, pre { + font-family: @font-family-mono; + font-size: @font-size-mono; + font-weight: @font-weight; + color: @col-text; +} + +audio, canvas, iframe, img, svg, video { + vertical-align: middle; +} + +textarea { + resize: vertical; +} diff --git a/src/_h5ai/public/css/lib/mixins.less b/src/_h5ai/public/css/lib/mixins.less new file mode 100644 index 0000000..0b9ffc9 --- /dev/null +++ b/src/_h5ai/public/css/lib/mixins.less @@ -0,0 +1,79 @@ +.hidden { + display: none !important; +} + +.invisible { + visibility: hidden; +} + +.clearfix:before, +.clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} + +.raised { + box-shadow: 0 1px 10px 0 rgba(0,0,0,0.5); +} + +.popup { + box-shadow: 0 1px 20px 0 rgba(0,0,0,0.5); +} + +.rounded { + border-radius: 2px; +} + +.clear-appearance { + -moz-appearance: none; + -ms-appearance: none; + -webkit-appearance: none; +} + +.eased-transition { + transition: all 0.2s ease-in-out; +} + +.flex-base { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + align-content: flex-start; + align-items: stretch; +} + +.flex-column { + .flex-base; + flex-direction: column; +} + +.flex-row { + .flex-base; + flex-direction: row; +} + +.el-button { + .rounded; + .eased-transition; + color: @col-text-primary-white; + background: @col-blue-400; + cursor: pointer; + text-decoration: none; + + &:hover { + .raised; + } +} + +.el-input { + .rounded; + .clear-appearance; + background: @col-back-paper; + border: none; + outline: none; + background: @col-back-panel; + border: 1px solid @col-border; +} diff --git a/src/_h5ai/public/css/lib/responsive.less b/src/_h5ai/public/css/lib/responsive.less new file mode 100644 index 0000000..0396df5 --- /dev/null +++ b/src/_h5ai/public/css/lib/responsive.less @@ -0,0 +1,37 @@ +@media only screen and (max-width: 700px) { + #crumbbar { + .crumb:not(.active) { + display: none; + } + .crumb.active .sep { + width: 0; + } + } + #view.view-details { + // .header .label, .item .label { + // margin-right: 80px !important; + // } + // .header .date, .item .date { + // display: none; + // } + } + #tree, #info { + display: none !important; + } +} + +@media print { + *, + *:before, + *:after, + *:first-letter, + *:first-line { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + #toolbar, #sidebar, #tree, #info { + display: none !important; + } +} diff --git a/src/_h5ai/public/css/lib/view/content.less b/src/_h5ai/public/css/lib/view/content.less new file mode 100644 index 0000000..f4017ea --- /dev/null +++ b/src/_h5ai/public/css/lib/view/content.less @@ -0,0 +1,6 @@ +#content { + overflow: auto; + flex: 1 1 auto; + order: 50; + position: relative; +} diff --git a/src/_h5ai/public/css/lib/view/fallback.less b/src/_h5ai/public/css/lib/view/fallback.less new file mode 100644 index 0000000..38b4324 --- /dev/null +++ b/src/_h5ai/public/css/lib/view/fallback.less @@ -0,0 +1,115 @@ +#fallback { + display: none; + max-width: 960px; + margin: 16px auto; + padding: 32px 16px; + + table { + display: block; + width: 100%; + border-collapse: collapse; + background: @col-back-paper; + } + th, td { + padding: 6px; + text-align: left; + border: none; + border-bottom: 1px solid #f0f0f0; + } + th { + color: #aaa; + font-weight: normal; + line-height: 36px; + } + td { + overflow: hidden; + white-space: nowrap; + } + a, a:active, a:visited { + display: block; + color: inherit; + text-decoration: none; + cursor: pointer; + + &:hover { + color: @col-text-hover; + } + } + .fb-i { + width: 20px; + padding-left: 12px; + + img { + width: 20px; + height: 20px; + position: relative; + top: -1px; + } + } + .fb-n { + width: 682px; + max-width: 682px; + } + .fb-d { + text-align: right; + width: 160px; + min-width: 160px; + } + .fb-s { + text-align: right; + width: 70px; + min-width: 70px; + padding-right: 12px; + } +} + +#fallback-hints { + display: none; + overflow: hidden; + text-align: right; + background: @col-back-panel; + border-bottom: 1px solid @col-border; + + a, a:active, a:visited { + .eased-transition; + display: inline-block; + line-height: 48px; + color: @col-text-secondary-black; + text-decoration: none; + outline: 0; + + &:hover { + color: @col-text-hover; + } + } + + .backlink { + margin: 0 16px; + } + + .noJsMsg, .noBrowserMsg { + display: none; + margin: 0 16px; + color: @col-error; + } +} + +html.no-js, html.no-browser { + + #root { + position: static; + overflow: auto; + } + + #fallback, #fallback-hints { + display: block; + } +} + +html.no-js .noJsMsg { + display: inline !important; +} + +html.no-browser .noBrowserMsg { + display: inline !important; +} diff --git a/src/_h5ai/public/css/lib/view/mainrow.less b/src/_h5ai/public/css/lib/view/mainrow.less new file mode 100644 index 0000000..454b1c8 --- /dev/null +++ b/src/_h5ai/public/css/lib/view/mainrow.less @@ -0,0 +1,7 @@ +#mainrow { + .flex-row; + flex: 1 1 auto; + order: 50; + + height: 0; // non-webkit fix; +} diff --git a/src/_h5ai/public/css/lib/view/notification.less b/src/_h5ai/public/css/lib/view/notification.less new file mode 100644 index 0000000..fc4f417 --- /dev/null +++ b/src/_h5ai/public/css/lib/view/notification.less @@ -0,0 +1,13 @@ +#notification { + position: fixed; + left: 50%; + width: 200px; + margin-left: -100px; + z-index: 100; + padding: 3px 6px 6px 6px; + color: @col-text-primary-white; + background: rgba(0,0,0,0.2); + border-radius: 0 0 4px 4px; + text-align: center; + overflow: hidden; +} diff --git a/src/_h5ai/public/css/lib/view/root.less b/src/_h5ai/public/css/lib/view/root.less new file mode 100644 index 0000000..d15a67b --- /dev/null +++ b/src/_h5ai/public/css/lib/view/root.less @@ -0,0 +1,18 @@ +#root { + .flex-column; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; + background: @col-back; + line-height: 1.4; +} + +#root, input, select { + font-family: @font-family; + font-size: @font-size; + font-weight: @font-weight; + color: @col-text; +} diff --git a/src/_h5ai/public/css/lib/view/sidebar.less b/src/_h5ai/public/css/lib/view/sidebar.less new file mode 100644 index 0000000..0606696 --- /dev/null +++ b/src/_h5ai/public/css/lib/view/sidebar.less @@ -0,0 +1,120 @@ +#sidebar { + overflow-x: hidden; + overflow-y: auto; + flex: 0 0 auto; + order: 0; + background: @col-back-panel; + border-right: 1px solid @col-border; + padding: 16px; + + position: absolute; + top: 48px; + min-height: 100%; + z-index: 1; + + .block { + display: block; + margin: 0 0 24px 0; + width: 168px; + + h1 { + font-size: 1em; + margin: 2px 0 6px 0; + } + } + + .button { + .rounded; + .eased-transition; + display: inline-block; + margin: 4px; + color: @col-text; + cursor: pointer; + + &:hover { + background: @col-back-hover; + } + + &.active { + background: rgba(0,0,0,0.03); + box-shadow: inset 0 0 4px 0 rgba(0,0,0,0.4); + } + + img { + width: 24px; + height: 24px; + padding: 12px; + } + } + + .select { + .rounded; + background: transparent; + overflow: hidden; + outline: 0; + width: 160px; + margin: 4px; + line-height: 48px; + } + + input, select { + .clear-appearance; + background: transparent; + width: 100%; + border: 0 solid #000; + cursor: pointer; + outline: 0; + + &:hover { + background: @col-back-hover; + } + } + + select { + width: 187px; + padding: 0 8px; + height: 48px; + line-height: 48px; + } + + input[type='range'] { + .rounded; + width: 144px; + margin: 4px; + padding: 8px; + vertical-align: middle; + height: 32px; + line-height: 32px; + } + + .range-track { + .clear-appearance; + border-width: 0; + border-radius: 20px; + background: @col-range-back; + height: 6px; + } + + .range-thumb { + .clear-appearance; + border-width: 0; + border-radius: 20px; + background: @col-range-thumb; + width: 16px; + height: 16px; + } + + input[type='range']::-webkit-slider-runnable-track { .range-track; } + input[type='range']::-moz-range-track { .range-track; } + input[type='range']::-ms-track { .range-track; } + input[type='range']::-ms-fill-lower { .range-track; } + input[type='range']::-ms-fill-upper { .range-track; } + + input[type='range']::-webkit-slider-thumb { .range-thumb; margin-top: -5px; } + input[type='range']::-moz-range-thumb { .range-thumb; } + input[type='range']::-ms-thumb { .range-thumb; } + + #view-size { + display: block; + } +} diff --git a/src/_h5ai/public/css/lib/view/topbar.less b/src/_h5ai/public/css/lib/view/topbar.less new file mode 100644 index 0000000..65d6a99 --- /dev/null +++ b/src/_h5ai/public/css/lib/view/topbar.less @@ -0,0 +1,71 @@ +#topbar { + .flex-row; + overflow: hidden; + flex: 0 0 auto; + order: 1; + + background: @col-back-panel; + border-bottom: 1px solid @col-border; + z-index: 1; +} + +#toolbar { + overflow: hidden; + flex: 0 0 auto; + order: 1; + height: 48px; + + .tool { + .eased-transition; + display: inline-block; + cursor: pointer; + + img { + display: inline-block; + width: 24px; + height: 24px; + padding: 12px; + } + + &:hover { + background: @col-back-hover; + } + } +} + +#flowbar { + overflow: hidden; + flex: 1 1 auto; + order: 2; + height: 48px; +} + +#backlink { + .eased-transition; + display: block; + overflow: hidden; + flex: 0 0 auto; + order: 99; + text-align: center; + padding: 6px 12px; + overflow: hidden; + height: 36px; + + &, &:active, &:visited { + color: @col-text-disabled-black; + cursor: pointer; + text-decoration: none; + } + &:hover { + color: @col-text-hover; + background: @col-back-hover; + } + &:focus { + outline: 0; + } + + div { + line-height: 18px; + white-space: nowrap; + } +} diff --git a/src/_h5ai/public/css/lib/view/view-details.less b/src/_h5ai/public/css/lib/view/view-details.less new file mode 100644 index 0000000..2e9475c --- /dev/null +++ b/src/_h5ai/public/css/lib/view/view-details.less @@ -0,0 +1,135 @@ +#view.view-details { + + .view-details-sized(@size) { + + .item { + .label, .date, .size { + line-height: @size + 14px; + } + } + + .square { + width: @size; + height: @size; + + img { + width: @size; + height: @size; + } + } + + .label { + margin: 0 246px 0 (@size + 32px); + } + } + + margin: 32px; + + .header { + position: relative; + white-space: nowrap; + display: list-item; + border-bottom: 1px solid rgba(0,0,0,0.07); + border-radius: 2px 2px 0 0; + + .label, .date, .size { + .eased-transition; + line-height: 24px; + padding: 0px 8px 16px 8px; + opacity: 0.4; + outline: 0; + + &:hover { + opacity: 1; + color: @col-text-hover; + } + } + + .sort { + display: none; + position: relative; + top: -2px; + width: 20px; + height: 20px; + padding: 0 4px; + } + + .ascending .sort { + display: inline; + } + + .descending .sort { + display: inline; + transform: rotate(180deg); + zoom: 1; + } + } + + .item { + overflow: hidden; + border-bottom: 1px solid rgba(0,0,0,0.07); + + &:hover { + .raised; + z-index: 1; + } + + &:last-child { + border-radius: 0 0 2px 2px; + } + } + + .square { + display: inline-block; + position: absolute; + left: 16px; + top: -1px; + padding: 8px; + + .thumb { + .rounded; + box-shadow: 0 0 1px 0 rgba(0,0,0,0.2); + } + } + + .label, .date, .size { + padding: 0 8px; + } + + .date { + position: absolute; + right: 116px; + top: 0; + } + + .size { + position: absolute; + right: 16px; + top: 0; + } + + .view-details-sized(16px) +} + +#view.view-details { + &.width-0 { + .label { + margin-right: 4px; + } + .date { + display: none; + } + .size { + display: none; + } + } + + &.width-1 { + .label { + margin-right: 64px; + } + .date { + display: none; + } + } +} diff --git a/src/_h5ai/public/css/lib/view/view-grid.less b/src/_h5ai/public/css/lib/view/view-grid.less new file mode 100644 index 0000000..ad5422a --- /dev/null +++ b/src/_h5ai/public/css/lib/view/view-grid.less @@ -0,0 +1,50 @@ +#view.view-grid { + + .view-grid-sized(@size) { + + .label { + line-height: @size; + } + + .square { + width: @size; + height: @size; + + img { + width: @size; + height: @size; + } + } + } + + margin: 28px; + + .item { + .rounded; + overflow: hidden; + float: left; + margin: 8px; + + &:hover { + .raised; + } + } + + .square { + display: inline-block; + vertical-align: top; + } + + .label { + display: inline-block; + vertical-align: top; + width: 180px; + padding: 0 8px; + } + + .date, .size { + display: none; + } + + .view-grid-sized(48px); +} diff --git a/src/_h5ai/public/css/lib/view/view-icons.less b/src/_h5ai/public/css/lib/view/view-icons.less new file mode 100644 index 0000000..77ebe8e --- /dev/null +++ b/src/_h5ai/public/css/lib/view/view-icons.less @@ -0,0 +1,53 @@ +#view.view-icons { + + .view-icons-sized(@size) { + + .item { + width: @size * 4/3; + } + + .landscape { + width: @size * 4/3; + height: @size; + + img { + width: @size; + height: @size; + } + + .thumb { + width: @size * 4/3; + } + } + } + + margin: 28px; + + .item { + .rounded; + overflow: hidden; + float: left; + margin: 8px; + + &:hover { + .raised; + } + } + + .landscape { + display: block; + background: @col-back-panel; + } + + .label { + padding: 0 6px; + line-height: 24px; + text-align: center; + } + + .date, .size { + display: none; + } + + .view-icons-sized(96px); +} diff --git a/src/_h5ai/public/css/lib/view/view.less b/src/_h5ai/public/css/lib/view/view.less new file mode 100644 index 0000000..aef93ec --- /dev/null +++ b/src/_h5ai/public/css/lib/view/view.less @@ -0,0 +1,79 @@ +#view { + + a, a:active, a:visited { + display: block; + color: inherit; + cursor: pointer; + text-decoration: none; + } + + ul { + margin: 0; + padding: 0; + list-style: none; + } + + .header { + display: none; + } + + .item { + position: relative; + white-space: nowrap; + background: @col-back-paper; + + &:hover { + color: @col-text-hover; + background: @col-back-panel; + } + } + + .folder-parent { + + .date, .size { + display: none; + } + } + + .icon { + display: none; + text-align: center; + + img { + position: relative; + top: 50%; + transform: translateY(-50%); + } + + .thumb { + max-width: none; + max-height: none; + } + } + + .label { + display: block; + overflow: hidden; + text-align: left; + text-overflow: ellipsis; + } + + .date { + text-align: right; + width: 130px; + } + + .size { + text-align: right; + width: 80px; + } + + #view-hint { + display: block; + margin-top: 36px; + text-align: center; + color: @col-border; + font-size: 5em; + font-weight: bold; + } +} diff --git a/src/_h5ai/public/css/styles.less b/src/_h5ai/public/css/styles.less new file mode 100644 index 0000000..345a853 --- /dev/null +++ b/src/_h5ai/public/css/styles.less @@ -0,0 +1,12 @@ +@charset "utf-8"; + +// @include "../../../../node_modules/normalize.css/normalize.css" + +// @include "lib/colors.less" +// @include "lib/fonts.less" +// @include "lib/misc.less" +// @include "lib/mixins.less" + +// @include "lib/*/*.less" + +// @include "lib/responsive.less" diff --git a/src/_h5ai/public/ext/README.md b/src/_h5ai/public/ext/README.md new file mode 100644 index 0000000..7f9460c --- /dev/null +++ b/src/_h5ai/public/ext/README.md @@ -0,0 +1,4 @@ +# Extensions + +This directory is used for additional script and style files. You have to add +them manualy to the `resources` section in `_h5ai/private/conf/options.json`. diff --git a/src/_h5ai/public/images/fallback/file.png b/src/_h5ai/public/images/fallback/file.png new file mode 100644 index 0000000..c796a82 Binary files /dev/null and b/src/_h5ai/public/images/fallback/file.png differ diff --git a/src/_h5ai/public/images/fallback/folder-parent.png b/src/_h5ai/public/images/fallback/folder-parent.png new file mode 100644 index 0000000..38da20d Binary files /dev/null and b/src/_h5ai/public/images/fallback/folder-parent.png differ diff --git a/src/_h5ai/public/images/fallback/folder.png b/src/_h5ai/public/images/fallback/folder.png new file mode 100644 index 0000000..d4722e7 Binary files /dev/null and b/src/_h5ai/public/images/fallback/folder.png differ diff --git a/src/_h5ai/public/images/favicon/favicon-152.png b/src/_h5ai/public/images/favicon/favicon-152.png new file mode 100644 index 0000000..3666dfc Binary files /dev/null and b/src/_h5ai/public/images/favicon/favicon-152.png differ diff --git a/src/_h5ai/public/images/favicon/favicon-16-32.ico b/src/_h5ai/public/images/favicon/favicon-16-32.ico new file mode 100644 index 0000000..be17223 Binary files /dev/null and b/src/_h5ai/public/images/favicon/favicon-16-32.ico differ diff --git a/src/_h5ai/public/images/favicon/favicon-16.png b/src/_h5ai/public/images/favicon/favicon-16.png new file mode 100644 index 0000000..d7dd0f9 Binary files /dev/null and b/src/_h5ai/public/images/favicon/favicon-16.png differ diff --git a/src/_h5ai/public/images/favicon/favicon-32.png b/src/_h5ai/public/images/favicon/favicon-32.png new file mode 100644 index 0000000..2f97d12 Binary files /dev/null and b/src/_h5ai/public/images/favicon/favicon-32.png differ diff --git a/src/_h5ai/public/images/favicon/favicon.svg b/src/_h5ai/public/images/favicon/favicon.svg new file mode 100644 index 0000000..489efbe --- /dev/null +++ b/src/_h5ai/public/images/favicon/favicon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/README.md b/src/_h5ai/public/images/themes/README.md new file mode 100644 index 0000000..650e0f7 --- /dev/null +++ b/src/_h5ai/public/images/themes/README.md @@ -0,0 +1,9 @@ +# Themes + +This directory will contain any themes you add. At the moment there are only +icon themes supported. The folder structure is: `/.`, +with `` one of `svg`, `png` or `jpg`. + +To select a theme use the option `view > theme` in file `conf/options.json`. + +You will find the previously included icon themes [here](https://github.com/lrsjng/h5ai-themes). diff --git a/src/_h5ai/public/images/themes/comity/ar-apk.svg b/src/_h5ai/public/images/themes/comity/ar-apk.svg new file mode 100644 index 0000000..a7cc5cd --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/ar-apk.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/ar-deb.svg b/src/_h5ai/public/images/themes/comity/ar-deb.svg new file mode 100644 index 0000000..f1efae9 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/ar-deb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/ar-rpm.svg b/src/_h5ai/public/images/themes/comity/ar-rpm.svg new file mode 100644 index 0000000..4146098 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/ar-rpm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-css.svg b/src/_h5ai/public/images/themes/comity/txt-css.svg new file mode 100644 index 0000000..487a535 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-css.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-go.svg b/src/_h5ai/public/images/themes/comity/txt-go.svg new file mode 100644 index 0000000..0d21bb0 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-go.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-html.svg b/src/_h5ai/public/images/themes/comity/txt-html.svg new file mode 100644 index 0000000..356e855 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-html.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-js.svg b/src/_h5ai/public/images/themes/comity/txt-js.svg new file mode 100644 index 0000000..91a3279 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-js.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-less.svg b/src/_h5ai/public/images/themes/comity/txt-less.svg new file mode 100644 index 0000000..fd15b02 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-less.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-md.svg b/src/_h5ai/public/images/themes/comity/txt-md.svg new file mode 100644 index 0000000..a2fba14 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-md.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-php.svg b/src/_h5ai/public/images/themes/comity/txt-php.svg new file mode 100644 index 0000000..84e1e22 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-php.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-py.svg b/src/_h5ai/public/images/themes/comity/txt-py.svg new file mode 100644 index 0000000..d5dc003 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-py.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-rb.svg b/src/_h5ai/public/images/themes/comity/txt-rb.svg new file mode 100644 index 0000000..a642dc2 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-rb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-rust.svg b/src/_h5ai/public/images/themes/comity/txt-rust.svg new file mode 100644 index 0000000..0a71e77 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-rust.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/txt-script.svg b/src/_h5ai/public/images/themes/comity/txt-script.svg new file mode 100644 index 0000000..f8704e8 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/txt-script.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/comity/x-pdf.svg b/src/_h5ai/public/images/themes/comity/x-pdf.svg new file mode 100644 index 0000000..5266630 --- /dev/null +++ b/src/_h5ai/public/images/themes/comity/x-pdf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/ar.svg b/src/_h5ai/public/images/themes/default/ar.svg new file mode 100644 index 0000000..e25cded --- /dev/null +++ b/src/_h5ai/public/images/themes/default/ar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/aud.svg b/src/_h5ai/public/images/themes/default/aud.svg new file mode 100644 index 0000000..dd955fc --- /dev/null +++ b/src/_h5ai/public/images/themes/default/aud.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/bin.svg b/src/_h5ai/public/images/themes/default/bin.svg new file mode 100644 index 0000000..34f1f45 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/bin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/file.svg b/src/_h5ai/public/images/themes/default/file.svg new file mode 100644 index 0000000..66bcac7 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/file.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/folder-page.svg b/src/_h5ai/public/images/themes/default/folder-page.svg new file mode 100644 index 0000000..4ca3ec2 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/folder-page.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/folder-parent.svg b/src/_h5ai/public/images/themes/default/folder-parent.svg new file mode 100644 index 0000000..e114689 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/folder-parent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/folder.svg b/src/_h5ai/public/images/themes/default/folder.svg new file mode 100644 index 0000000..3e971cf --- /dev/null +++ b/src/_h5ai/public/images/themes/default/folder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/img.svg b/src/_h5ai/public/images/themes/default/img.svg new file mode 100644 index 0000000..e754e82 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/img.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/txt.svg b/src/_h5ai/public/images/themes/default/txt.svg new file mode 100644 index 0000000..d5c0dc9 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/txt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/vid.svg b/src/_h5ai/public/images/themes/default/vid.svg new file mode 100644 index 0000000..dd955fc --- /dev/null +++ b/src/_h5ai/public/images/themes/default/vid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/themes/default/x.svg b/src/_h5ai/public/images/themes/default/x.svg new file mode 100644 index 0000000..66bcac7 --- /dev/null +++ b/src/_h5ai/public/images/themes/default/x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/back.svg b/src/_h5ai/public/images/ui/back.svg new file mode 100644 index 0000000..3275e21 --- /dev/null +++ b/src/_h5ai/public/images/ui/back.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/crumb.svg b/src/_h5ai/public/images/ui/crumb.svg new file mode 100644 index 0000000..8dfd404 --- /dev/null +++ b/src/_h5ai/public/images/ui/crumb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/download.svg b/src/_h5ai/public/images/ui/download.svg new file mode 100644 index 0000000..5721c4e --- /dev/null +++ b/src/_h5ai/public/images/ui/download.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/filter.svg b/src/_h5ai/public/images/ui/filter.svg new file mode 100644 index 0000000..3e5f19a --- /dev/null +++ b/src/_h5ai/public/images/ui/filter.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/_h5ai/public/images/ui/info-toggle.svg b/src/_h5ai/public/images/ui/info-toggle.svg new file mode 100644 index 0000000..ebc0e5c --- /dev/null +++ b/src/_h5ai/public/images/ui/info-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/paypal.svg b/src/_h5ai/public/images/ui/paypal.svg new file mode 100644 index 0000000..a17415e --- /dev/null +++ b/src/_h5ai/public/images/ui/paypal.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/preview-close.svg b/src/_h5ai/public/images/ui/preview-close.svg new file mode 100644 index 0000000..ef5f8a0 --- /dev/null +++ b/src/_h5ai/public/images/ui/preview-close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/preview-fullscreen.svg b/src/_h5ai/public/images/ui/preview-fullscreen.svg new file mode 100644 index 0000000..bf04ad7 --- /dev/null +++ b/src/_h5ai/public/images/ui/preview-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/preview-next.svg b/src/_h5ai/public/images/ui/preview-next.svg new file mode 100644 index 0000000..1b72100 --- /dev/null +++ b/src/_h5ai/public/images/ui/preview-next.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/preview-no-fullscreen.svg b/src/_h5ai/public/images/ui/preview-no-fullscreen.svg new file mode 100644 index 0000000..d2a3efb --- /dev/null +++ b/src/_h5ai/public/images/ui/preview-no-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/preview-prev.svg b/src/_h5ai/public/images/ui/preview-prev.svg new file mode 100644 index 0000000..a592b22 --- /dev/null +++ b/src/_h5ai/public/images/ui/preview-prev.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/preview-raw.svg b/src/_h5ai/public/images/ui/preview-raw.svg new file mode 100644 index 0000000..7a8a69d --- /dev/null +++ b/src/_h5ai/public/images/ui/preview-raw.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/search.svg b/src/_h5ai/public/images/ui/search.svg new file mode 100644 index 0000000..d6d4c78 --- /dev/null +++ b/src/_h5ai/public/images/ui/search.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/selected.svg b/src/_h5ai/public/images/ui/selected.svg new file mode 100644 index 0000000..50ac249 --- /dev/null +++ b/src/_h5ai/public/images/ui/selected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/sidebar.svg b/src/_h5ai/public/images/ui/sidebar.svg new file mode 100644 index 0000000..4e38c05 --- /dev/null +++ b/src/_h5ai/public/images/ui/sidebar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/sort.svg b/src/_h5ai/public/images/ui/sort.svg new file mode 100644 index 0000000..5b0ed8d --- /dev/null +++ b/src/_h5ai/public/images/ui/sort.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/spinner.svg b/src/_h5ai/public/images/ui/spinner.svg new file mode 100644 index 0000000..a5f7a7b --- /dev/null +++ b/src/_h5ai/public/images/ui/spinner.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/_h5ai/public/images/ui/tree-indicator.svg b/src/_h5ai/public/images/ui/tree-indicator.svg new file mode 100644 index 0000000..8dfd404 --- /dev/null +++ b/src/_h5ai/public/images/ui/tree-indicator.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/tree-toggle.svg b/src/_h5ai/public/images/ui/tree-toggle.svg new file mode 100644 index 0000000..9914792 --- /dev/null +++ b/src/_h5ai/public/images/ui/tree-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/view-details.svg b/src/_h5ai/public/images/ui/view-details.svg new file mode 100644 index 0000000..5e756e0 --- /dev/null +++ b/src/_h5ai/public/images/ui/view-details.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/view-grid.svg b/src/_h5ai/public/images/ui/view-grid.svg new file mode 100644 index 0000000..8f4c48c --- /dev/null +++ b/src/_h5ai/public/images/ui/view-grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/images/ui/view-icons.svg b/src/_h5ai/public/images/ui/view-icons.svg new file mode 100644 index 0000000..8601293 --- /dev/null +++ b/src/_h5ai/public/images/ui/view-icons.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/_h5ai/public/index.php b/src/_h5ai/public/index.php new file mode 100644 index 0000000..e655290 --- /dev/null +++ b/src/_h5ai/public/index.php @@ -0,0 +1,17 @@ + request(query).then(resp => Object.assign(config, resp)) +}; diff --git a/src/_h5ai/public/js/lib/core/event.js b/src/_h5ai/public/js/lib/core/event.js new file mode 100644 index 0000000..1dd87b6 --- /dev/null +++ b/src/_h5ai/public/js/lib/core/event.js @@ -0,0 +1,28 @@ +const {isStr, isFn, dom} = require('../util'); + +const subscriptions = {}; + +const sub = (topic, listener) => { + if (isStr(topic) && isFn(listener)) { + if (!subscriptions[topic]) { + subscriptions[topic] = []; + } + subscriptions[topic].push(listener); + } +}; + +const pub = (topic, ...args) => { + // console.log(topic, args); + if (isStr(topic) && subscriptions[topic]) { + subscriptions[topic].forEach(listener => { + listener.apply(topic, args); + }); + } +}; + +dom(global.window).on('resize', () => pub('resize')); + +module.exports = { + sub, + pub +}; diff --git a/src/_h5ai/public/js/lib/core/format.js b/src/_h5ai/public/js/lib/core/format.js new file mode 100644 index 0000000..91c7dad --- /dev/null +++ b/src/_h5ai/public/js/lib/core/format.js @@ -0,0 +1,96 @@ +const {isNum} = require('../util'); + +const decimalMetric = { + t: 1000.0, + k: 1000.0, + u: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] +}; +const binaryMetric = { + t: 1024.0, + k: 1024.0, + u: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] +}; +let defaultMetric = decimalMetric; + +const datePatterns = [ + [/YYYY/, 'Y', 4], + [/YY/, 'Y', 2], + [/Y/, 'Y', 0], + [/MM/, 'M', 2], + [/M/, 'M', 0], + [/DD/, 'D', 2], + [/D/, 'D', 0], + [/HH/, 'H', 2], + [/H/, 'H', 0], + [/mm/, 'm', 2], + [/m/, 'm', 0], + [/ss/, 's', 2], + [/s/, 's', 0] +]; +let defaultDateFormat = 'YYYY-MM-DD HH:mm'; + + +const setDefaultMetric = useBinaryMetric => { + defaultMetric = useBinaryMetric ? binaryMetric : decimalMetric; +}; + +const formatSize = (size, metric) => { + metric = metric || defaultMetric; + + if (!isNum(size) || size < 0) { + return ''; + } + + let i = 0; + const maxI = metric.u.length - 1; + + while (size >= metric.t && i < maxI) { + size /= metric.k; + i += 1; + } + return (i <= 1 ? Math.round(size) : size.toFixed(1)).toString() + ' ' + metric.u[i]; +}; + +const setDefaultDateFormat = dateFormat => { + defaultDateFormat = dateFormat; +}; + +const formatNumber = (number, padding) => { + let str = String(number); + if (padding) { + str = ('000' + str).substr(-padding); + } + return str; +}; + +const formatDate = (millis, format) => { + if (!millis || !isNum(millis)) { + return ''; + } + + format = format || defaultDateFormat; + + const date = new Date(millis); + const d = { + Y: date.getFullYear(), + M: date.getMonth() + 1, + D: date.getDate(), + H: date.getHours(), + m: date.getMinutes(), + s: date.getSeconds() + }; + + datePatterns.forEach(pattern => { + format = format.replace(pattern[0], formatNumber(d[pattern[1]], pattern[2])); + }); + + return format; +}; + + +module.exports = { + setDefaultMetric, + formatSize, + setDefaultDateFormat, + formatDate +}; diff --git a/src/_h5ai/public/js/lib/core/langs.js b/src/_h5ai/public/js/lib/core/langs.js new file mode 100644 index 0000000..1a2f843 --- /dev/null +++ b/src/_h5ai/public/js/lib/core/langs.js @@ -0,0 +1,2 @@ +const {langs} = require('../config'); +module.exports = Object.assign({}, langs); diff --git a/src/_h5ai/public/js/lib/core/location.js b/src/_h5ai/public/js/lib/core/location.js new file mode 100644 index 0000000..4cc7e8f --- /dev/null +++ b/src/_h5ai/public/js/lib/core/location.js @@ -0,0 +1,181 @@ +const {each, values, difference} = require('../util'); +const {request} = require('../server'); +const allsettings = require('./settings'); +const event = require('./event'); +const notification = require('../view/notification'); + +const win = global.window; +const doc = win.document; +const settings = Object.assign({ + fastBrowsing: true, + unmanagedInNewWindow: true +}, allsettings.view); +const history = settings.fastBrowsing ? win.history : null; +const reUriToPathname = /^.*:\/\/[^\/]*|[^\/]*$/g; +const reForceEncoding = [ + [/\/+/g, '/'], + [/ /g, '%20'], + [/!/g, '%21'], + [/#/g, '%23'], + [/\$/g, '%24'], + [/&/g, '%26'], + [/'/g, '%27'], + [/\(/g, '%28'], + [/\)/g, '%29'], + [/\*/g, '%2A'], + [/\+/g, '%2B'], + [/\,/g, '%2C'], + [/:/g, '%3A'], + [/;/g, '%3B'], + [/\=/g, '%3D'], + [/\?/g, '%3F'], + [/@/g, '%40'], + [/\[/g, '%5B'], + [/\]/g, '%5D'] +]; + + +let absHref = null; + + +const forceEncoding = href => { + return reForceEncoding.reduce((nuHref, data) => { + return nuHref.replace(data[0], data[1]); + }, href); +}; + +const uriToPathname = uri => { + return uri.replace(reUriToPathname, ''); +}; + +const hrefsAreDecoded = (() => { + const testpathname = '/a b'; + const a = doc.createElement('a'); + + a.href = testpathname; + return uriToPathname(a.href) === testpathname; +})(); + +const encodedHref = href => { + const a = doc.createElement('a'); + let location; + + a.href = href; + location = uriToPathname(a.href); + + if (hrefsAreDecoded) { + location = encodeURIComponent(location).replace(/%2F/ig, '/'); + } + + return forceEncoding(location); +}; + +const getDomain = () => doc.domain; +const getAbsHref = () => absHref; +const getItem = () => require('../model/item').get(absHref); + +const load = () => { + return request({action: 'get', items: {href: absHref, what: 1}}).then(json => { + const Item = require('../model/item'); + const item = Item.get(absHref); + + if (json) { + const found = {}; + + each(json.items, jsonItem => { + const e = Item.get(jsonItem); + found[e.absHref] = true; + }); + + each(item.content, e => { + if (!found[e.absHref]) { + Item.remove(e.absHref); + } + }); + } + + return item; + }); +}; + +const refresh = () => { + const item = getItem(); + const oldItems = values(item.content); + + event.pub('location.beforeRefresh'); + + load().then(() => { + const newItems = values(item.content); + const added = difference(newItems, oldItems); + const removed = difference(oldItems, newItems); + + event.pub('location.refreshed', item, added, removed); + }); +}; + +const setLocation = (newAbsHref, keepBrowserUrl) => { + event.pub('location.beforeChange'); + + newAbsHref = encodedHref(newAbsHref); + + if (absHref !== newAbsHref) { + absHref = newAbsHref; + + if (history) { + if (keepBrowserUrl) { + history.replaceState({absHref}, '', absHref); + } else { + history.pushState({absHref}, '', absHref); + } + } + } + + const item = getItem(); + if (item.isLoaded) { + event.pub('location.changed', item); + refresh(); + } else { + notification.set('loading...'); + load().then(() => { + item.isLoaded = true; + notification.set(); + event.pub('location.changed', item); + }); + } +}; + +const setLink = ($el, item) => { + $el.attr('href', item.absHref); + + if (history && item.isFolder() && item.isManaged) { + $el.on('click', ev => { + setLocation(item.absHref); + ev.preventDefault(); + return false; + }); + } + + if (settings.unmanagedInNewWindow && !item.isManaged) { + $el.attr('target', '_blank'); + } +}; + +const onPopState = ev => { + if (ev.state && ev.state.absHref) { + setLocation(ev.state.absHref, true); + } +}; + + +win.onpopstate = history ? onPopState : null; + + +module.exports = { + forceEncoding, + getDomain, + getAbsHref, + getItem, + setLocation, + refresh, + setLink +}; diff --git a/src/_h5ai/public/js/lib/core/resource.js b/src/_h5ai/public/js/lib/core/resource.js new file mode 100644 index 0000000..6b5a7ad --- /dev/null +++ b/src/_h5ai/public/js/lib/core/resource.js @@ -0,0 +1,37 @@ +const {includes} = require('../util'); +const config = require('../config'); +const settings = require('./settings'); + +const imagesHref = settings.publicHref + 'images/'; +const uiHref = imagesHref + 'ui/'; +const themesHref = imagesHref + 'themes/'; +const defaultThemeHref = themesHref + 'default/'; +const defaultIcons = ['file', 'folder', 'folder-page', 'folder-parent', 'ar', 'aud', 'bin', 'img', 'txt', 'vid', 'x']; + + +const image = id => uiHref + id + '.svg'; + +const icon = id => { + const baseId = (id || '').split('-')[0]; + const href = config.theme[id] || config.theme[baseId]; + + if (href) { + return themesHref + href; + } + + if (includes(defaultIcons, id)) { + return defaultThemeHref + id + '.svg'; + } + + if (includes(defaultIcons, baseId)) { + return defaultThemeHref + baseId + '.svg'; + } + + return defaultThemeHref + 'file.svg'; +}; + + +module.exports = { + image, + icon +}; diff --git a/src/_h5ai/public/js/lib/core/settings.js b/src/_h5ai/public/js/lib/core/settings.js new file mode 100644 index 0000000..f7f4cd2 --- /dev/null +++ b/src/_h5ai/public/js/lib/core/settings.js @@ -0,0 +1,6 @@ +const config = require('../config'); + +module.exports = Object.assign({}, config.options, { + publicHref: config.setup.PUBLIC_HREF, + rootHref: config.setup.ROOT_HREF +}); diff --git a/src/_h5ai/public/js/lib/core/store.js b/src/_h5ai/public/js/lib/core/store.js new file mode 100644 index 0000000..92d9593 --- /dev/null +++ b/src/_h5ai/public/js/lib/core/store.js @@ -0,0 +1,28 @@ +const store = global.window.localStorage; +const storekey = '_h5ai'; + + +const load = () => { + try { + return JSON.parse(store[storekey]); + } catch (e) {/* skip */} + return {}; +}; + +const save = obj => { + store[storekey] = JSON.stringify(obj); +}; + +const put = (key, value) => { + const obj = load(); + obj[key] = value; + save(obj); +}; + +const get = key => load()[key]; + + +module.exports = { + put, + get +}; diff --git a/src/_h5ai/public/js/lib/core/types.js b/src/_h5ai/public/js/lib/core/types.js new file mode 100644 index 0000000..5026789 --- /dev/null +++ b/src/_h5ai/public/js/lib/core/types.js @@ -0,0 +1,43 @@ +const {each, map} = require('../util'); +const config = require('../config'); + +const reEndsWithSlash = /\/$/; +const regexps = {}; + + +const escapeRegExp = sequence => { + return sequence.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$]/g, '\\$&'); + // return sequence.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); +}; + +const parse = types => { + each(types, (patterns, type) => { + const pattern = '^(' + map(patterns, p => '(' + escapeRegExp(p).replace(/\*/g, '.*') + ')').join('|') + ')$'; + regexps[type] = new RegExp(pattern, 'i'); + }); +}; + +const getType = sequence => { + if (reEndsWithSlash.test(sequence)) { + return 'folder'; + } + + const slashidx = sequence.lastIndexOf('/'); + const name = slashidx >= 0 ? sequence.substr(slashidx + 1) : sequence; + let result; + + each(regexps, (regexp, type) => { + if (regexps[type].test(name)) { + result = type; + } + }); + + return result ? result : 'file'; +}; + + +parse(Object.assign({}, config.types)); + +module.exports = { + getType +}; diff --git a/src/_h5ai/public/js/lib/ext/autorefresh.js b/src/_h5ai/public/js/lib/ext/autorefresh.js new file mode 100644 index 0000000..81a3c8c --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/autorefresh.js @@ -0,0 +1,40 @@ +const event = require('../core/event'); +const location = require('../core/location'); +const allsettings = require('../core/settings'); + +const win = global.window; +const settings = Object.assign({ + enabled: false, + interval: 5000 +}, allsettings.autorefresh); +let timeoutId = null; + + +const heartbeat = () => { + location.refresh(); +}; + +const before = () => { + win.clearTimeout(timeoutId); +}; + +const after = () => { + win.clearTimeout(timeoutId); + timeoutId = win.setTimeout(heartbeat, settings.interval); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + settings.interval = Math.max(1000, settings.interval); + + event.sub('location.beforeChange', before); + event.sub('location.beforeRefresh', before); + event.sub('location.changed', after); + event.sub('location.refreshed', after); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/contextmenu.js b/src/_h5ai/public/js/lib/ext/contextmenu.js new file mode 100644 index 0000000..1326473 --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/contextmenu.js @@ -0,0 +1,157 @@ +const {each, dom} = require('../util'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); + +const settings = Object.assign({ + enabled: false +}, allsettings.contextmenu); +const overlayTpl = '
'; +const panelTpl = '
    '; +const sepTpl = '
  • '; +const entryTpl = '
  • '; +const labelTpl = '
  • '; + + +const closestId = el => { + while (!el._cmId && el.parentNode) { + el = el.parentNode; + } + return el._cmId; +}; + +const createOverlay = callback => { + const $overlay = dom(overlayTpl); + + const handle = ev => { + ev.stopPropagation(); + ev.preventDefault(); + + const cmId = closestId(ev.target); + + if (ev.target === $overlay[0] || cmId !== undefined) { + $overlay.rm(); + callback(cmId); + } + }; + + return $overlay + .on('contextmenu', handle) + .on('click', handle); +}; + +const createPanel = menu => { + const $panel = dom(panelTpl); + const $ul = $panel.find('ul'); + let $li; + + each(menu, entry => { + if (entry.type === '-') { + dom(sepTpl).appTo($ul); + } else if (entry.type === 'l') { + dom(labelTpl).appTo($ul) + .find('.cm-text').text(entry.text); + } else if (entry.type === 'e') { + $li = dom(entryTpl).appTo($ul); + $li[0]._cmId = entry.id; + $li.find('.cm-text').text(entry.text); + if (entry.icon) { + $li.find('.cm-icon img').attr('src', resource.icon(entry.icon)); + } else { + $li.find('.cm-icon').addCls('no-icon'); + } + } + }); + + return $panel; +}; + +const positionPanel = ($overlay, $panel, x, y) => { + const margin = 4; + + $panel.css({ + left: 0, + top: 0, + opacity: 0 + }); + $overlay.show(); + + const or = $overlay[0].getBoundingClientRect(); + const pr = $panel[0].getBoundingClientRect(); + + const overlayLeft = or.left; + const overlayTop = or.top; + const overlayWidth = or.width; + const overlayHeight = or.height; + + let panelWidth = pr.width; + let panelHeight = pr.height; + + let posLeft = x; + let posTop = y; + + if (panelWidth > overlayWidth - 2 * margin) { + posLeft = margin; + panelWidth = overlayWidth - 2 * margin; + } + + if (panelHeight > overlayHeight - 2 * margin) { + posTop = margin; + panelHeight = overlayHeight - 2 * margin; + } + + if (posLeft < overlayLeft + margin) { + posLeft = overlayLeft + margin; + } + + if (posLeft + panelWidth > overlayLeft + overlayWidth - margin) { + posLeft = overlayLeft + overlayWidth - margin - panelWidth; + } + + if (posTop < overlayTop + margin) { + posTop = overlayTop + margin; + } + + if (posTop + panelHeight > overlayTop + overlayHeight - margin) { + posTop = overlayTop + overlayHeight - margin - panelHeight; + } + + $panel.css({ + left: posLeft + 'px', + top: posTop + 'px', + width: panelWidth + 'px', + height: panelHeight + 'px', + opacity: 1 + }); +}; + +const showMenuAt = (x, y, menu, callback) => { + const $overlay = createOverlay(callback); + const $panel = createPanel(menu); + $overlay.hide().app($panel).appTo('body'); + positionPanel($overlay, $panel, x, y); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + const menu = [ + {type: 'e', id: 'e1', text: 'testing context menus'}, + {type: 'e', id: 'e2', text: 'another entry'}, + {type: 'e', id: 'e3', text: 'one with icon', icon: 'folder'}, + {type: '-'}, + {type: 'e', id: 'e4', text: 'one with icon', icon: 'x'}, + {type: 'e', id: 'e5', text: 'one with icon', icon: 'img'} + ]; + + + dom('#view').on('contextmenu', ev => { + ev.preventDefault(); + // showMenuAt(ev.pageX, ev.pageY, menu, res => console.log('>> CB-RESULT >> ' + res)); + showMenuAt(ev.pageX, ev.pageY, menu); + }); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/crumb.js b/src/_h5ai/public/js/lib/ext/crumb.js new file mode 100644 index 0000000..eb565bf --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/crumb.js @@ -0,0 +1,68 @@ +const {each, dom} = require('../util'); +const event = require('../core/event'); +const location = require('../core/location'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const base = require('../view/base'); + + +const settings = Object.assign({ + enabled: false +}, allsettings.crumb); +const crumbbarTpl = '
    '; +const crumbTpl = + ` + > + + `; +const pageHintTpl = + `has index page`; + + +const createHtml = item => { + const $html = dom(crumbTpl); + location.setLink($html, item); + + $html.find('.label').text(item.label); + + if (item.isCurrentFolder()) { + $html.addCls('active'); + } + + if (!item.isManaged) { + $html.app(dom(pageHintTpl)); + } + + item._$crumb = $html; + $html[0]._item = item; + + return $html; +}; + +const onLocationChanged = item => { + const $crumb = item._$crumb; + const $crumbbar = dom('#crumbbar'); + + if ($crumb && $crumb.parent()[0] === $crumbbar[0]) { + $crumbbar.children().rmCls('active'); + $crumb.addCls('active'); + } else { + $crumbbar.clr(); + each(item.getCrumb(), crumbItem => { + $crumbbar.app(createHtml(crumbItem)); + }); + } +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + dom(crumbbarTpl).appTo(base.$flowbar); + + event.sub('location.changed', onLocationChanged); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/custom.js b/src/_h5ai/public/js/lib/ext/custom.js new file mode 100644 index 0000000..2e86fba --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/custom.js @@ -0,0 +1,45 @@ +const marked = require('marked'); +const {each, dom} = require('../util'); +const server = require('../server'); +const event = require('../core/event'); +const allsettings = require('../core/settings'); + + +const settings = Object.assign({ + enabled: false +}, allsettings.custom); + +const update = (data, key) => { + const $el = dom(`#content-${key}`); + + if (data && data[key].content) { + let content = data[key].content; + if (data[key].type === 'md') { + content = marked(content); + } + $el.html(content).show(); + } else { + $el.hide(); + } +}; + +const onLocationChanged = item => { + server.request({action: 'get', custom: item.absHref}).then(response => { + const data = response && response.custom; + each(['header', 'footer'], key => update(data, key)); + }); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + dom('
    ').hide().preTo('#content'); + dom('').hide().appTo('#content'); + + event.sub('location.changed', onLocationChanged); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/download.js b/src/_h5ai/public/js/lib/ext/download.js new file mode 100644 index 0000000..c9f1a8b --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/download.js @@ -0,0 +1,77 @@ +const {each, dom} = require('../util'); +const server = require('../server'); +const event = require('../core/event'); +const location = require('../core/location'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); + +const settings = Object.assign({ + enabled: false, + type: 'php-tar', + packageName: 'package', + alwaysVisible: false +}, allsettings.download); +const tpl = + `
    + download +
    `; +let selectedItems = []; +let $download; + + +const onSelection = items => { + selectedItems = items.slice(0); + if (selectedItems.length) { + $download.show(); + } else if (!settings.alwaysVisible) { + $download.hide(); + } +}; + +const onClick = () => { + const type = settings.type; + let name = settings.packageName; + const extension = type === 'shell-zip' ? 'zip' : 'tar'; + + if (!name) { + if (selectedItems.length === 1) { + name = selectedItems[0].label; + } else { + name = location.getItem().label; + } + } + + const query = { + action: 'download', + as: name + '.' + extension, + type, + baseHref: location.getAbsHref(), + hrefs: '' + }; + + each(selectedItems, (item, idx) => { + query[`hrefs[${idx}]`] = item.absHref; + }); + + server.formRequest(query); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + $download = dom(tpl) + .hide() + .appTo('#toolbar') + .on('click', onClick); + + if (settings.alwaysVisible) { + $download.show(); + } + + event.sub('selection', onSelection); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/filter.js b/src/_h5ai/public/js/lib/ext/filter.js new file mode 100644 index 0000000..dc06959 --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/filter.js @@ -0,0 +1,83 @@ +const {filter, debounce, parsePattern, dom} = require('../util'); +const event = require('../core/event'); +const location = require('../core/location'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const view = require('../view/view'); + + +const settings = Object.assign({ + enabled: false, + advanced: false, + debounceTime: 100, + ignorecase: true +}, allsettings.filter); +const tpl = + `
    + filter + +
    `; +let inputIsVisible = false; +let prevPattern = ''; +let $filter; +let $input; + + +const filterItems = (pattern = '') => { + if (pattern === prevPattern) { + return; + } + prevPattern = pattern; + + if (!pattern) { + view.setLocation(); + return; + } + + $filter.addCls('pending'); + + const re = new RegExp(pattern, settings.ignorecase ? 'i' : ''); + const items = filter(location.getItem().content, item => re.test(item.label)); + + $filter.rmCls('pending'); + view.setHint('noMatch'); + view.setItems(items); +}; + +const update = () => { + if (inputIsVisible) { + $filter.addCls('active'); + $input[0].focus(); + filterItems(parsePattern($input.val(), settings.advanced)); + } else { + filterItems(); + $filter.rmCls('active'); + } +}; + +const toggle = () => { + inputIsVisible = !inputIsVisible; + update(); +}; + +const reset = () => { + inputIsVisible = false; + $input.val(''); + update(); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + $filter = dom(tpl).appTo('#toolbar'); + $input = $filter.find('input'); + + $filter.find('img').on('click', toggle); + $input.on('keyup', debounce(update, settings.debounceTime)); + event.sub('location.changed', reset); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/google-analytics.js b/src/_h5ai/public/js/lib/ext/google-analytics.js new file mode 100644 index 0000000..d6be8bf --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/google-analytics.js @@ -0,0 +1,38 @@ +const {map} = require('../util'); +const event = require('../core/event'); +const allsettings = require('../core/settings'); + +const win = global.window; +const settings = Object.assign({ + enabled: false, + id: 'UA-000000-0' +}, allsettings['google-analytics-ua']); + +const snippet = () => { + /* eslint-disable */ + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + /* eslint-enable */ +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + snippet(); + + win.ga('create', settings.id, 'auto'); + + event.sub('location.changed', item => { + const loc = win.location; + win.ga('send', 'pageview', { + location: loc.protocol + '//' + loc.host + item.absHref, + title: map(item.getCrumb(), i => i.label).join(' > ') + }); + }); +}; + +init(); diff --git a/src/_h5ai/public/js/lib/ext/info.js b/src/_h5ai/public/js/lib/ext/info.js new file mode 100644 index 0000000..85f9b0f --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/info.js @@ -0,0 +1,165 @@ +const kjua = require('kjua'); +const {isNum, dom} = require('../util'); +const event = require('../core/event'); +const format = require('../core/format'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const store = require('../core/store'); + + +const settings = Object.assign({ + enabled: false, + show: false, + qrcode: true, + qrColor: '#999' +}, allsettings.info); +const tpl = + `
    +
    +
    +
    +
    +
    +
    + , + +
    +
    +
    +
    `; +const settingsTpl = + `
    +

    Info

    +
    + view-info +
    +
    `; +const storekey = 'ext/info'; +let $img; +let $label; +let $time; +let $size; +let $content; +let $folders; +let $files; +let $qrcode; +let currentFolder; + + +const updateSettings = () => { + if (store.get(storekey)) { + dom('#view-info').addCls('active'); + dom('#info').show(); + } else { + dom('#view-info').rmCls('active'); + dom('#info').hide(); + } +}; + +const update = item => { + let src = item.thumbRational || item.icon; + const isThumb = !!item.thumbRational; + + if (item.isCurrentFolder() || !src) { + src = resource.icon('folder'); + } + + $img.attr('src', src); + if (isThumb) { + $img.addCls('thumb'); + } else { + $img.rmCls('thumb'); + } + + $label.text(item.label); + if (isNum(item.time)) { + $time.text(format.formatDate(item.time)); + } else { + $time.text('.'); + } + + if (isNum(item.size)) { + $size.text(format.formatSize(item.size)); + $size.show(); + } else { + $size.hide(); + } + + if (item.isContentFetched) { + const stats = item.getStats(); + $folders.text(stats.folders); + $files.text(stats.files); + $content.show(); + } else { + $content.hide(); + } + + if (settings.qrcode) { + const loc = global.window.location; + $qrcode.clr().app(kjua({ + render: 'image', + size: 200, + fill: settings.qrFill, + back: settings.qrBack, + text: loc.protocol + '//' + loc.host + item.absHref, + crisp: true, + quiet: 1 + })); + } +}; + +const onMouseenter = item => { + update(item); +}; + +const onMouseleave = () => { + update(currentFolder); +}; + +const onLocationChanged = item => { + currentFolder = item; + update(currentFolder); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + const $info = dom(tpl).hide().appTo('#mainrow'); + $img = $info.find('.icon img'); + $label = $info.find('.label'); + $time = $info.find('.time'); + $size = $info.find('.size'); + $content = $info.find('.content'); + $folders = $info.find('.folders'); + $files = $info.find('.files'); + $qrcode = $info.find('.qrcode'); + + if (!settings.qrcode) { + $qrcode.rm(); + } + + dom(settingsTpl) + .appTo('#sidebar') + .find('#view-info') + .on('click', ev => { + store.put(storekey, !store.get(storekey)); + updateSettings(); + event.pub('resize'); + ev.preventDefault(); + }); + + // ensure stored value is boolean, otherwise set default + if (typeof store.get(storekey) !== 'boolean') { + store.put(storekey, settings.show); + } + updateSettings(); + + event.sub('location.changed', onLocationChanged); + event.sub('item.mouseenter', onMouseenter); + event.sub('item.mouseleave', onMouseleave); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/l10n.js b/src/_h5ai/public/js/lib/ext/l10n.js new file mode 100644 index 0000000..0d74dce --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/l10n.js @@ -0,0 +1,142 @@ +const {each, isStr, dom} = require('../util'); +const server = require('../server'); +const event = require('../core/event'); +const format = require('../core/format'); +const langs = require('../core/langs'); +const allsettings = require('../core/settings'); +const store = require('../core/store'); + +const win = global.window; +const settings = Object.assign({ + enabled: false, + lang: 'en', + useBrowserLang: true +}, allsettings.l10n); +const defaultTranslations = { + isoCode: 'en', + lang: 'english', + + dateFormat: 'YYYY-MM-DD HH:mm', + details: 'details', + download: 'download', + empty: 'empty', + files: 'files', + filter: 'filter', + folders: 'folders', + grid: 'grid', + icons: 'icons', + language: 'Language', + lastModified: 'Last modified', + name: 'Name', + noMatch: 'no match', + parentDirectory: 'Parent Directory', + search: 'search', + size: 'Size', + tree: 'Tree', + view: 'View' +}; +const blockTpl = + `
    +

    Language

    +
    + +
    `; +let inputIsVisible = false; +let prevPattern = ''; +let $search; +let $input; + + +const search = (pattern = '') => { + if (pattern === prevPattern) { + return; + } + prevPattern = pattern; + + if (!pattern) { + view.setLocation(); + return; + } + + $search.addCls('pending'); + + server.request({ + action: 'get', + search: { + href: location.getAbsHref(), + pattern, + ignorecase: settings.ignorecase + } + }).then(response => { + $search.rmCls('pending'); + view.setHint('noMatch'); + view.setItems(map(response.search, item => Item.get(item))); + }); +}; + +const update = () => { + if (inputIsVisible) { + $search.addCls('active'); + $input[0].focus(); + search(parsePattern($input.val(), settings.advanced)); + } else { + search(); + $search.rmCls('active'); + } +}; + +const toggle = () => { + inputIsVisible = !inputIsVisible; + update(); +}; + +const reset = () => { + inputIsVisible = false; + $input.val(''); + update(); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + $search = dom(tpl).appTo('#toolbar'); + $input = $search.find('input'); + + $search.find('img').on('click', toggle); + $input.on('keyup', debounce(update, settings.debounceTime)); + event.sub('location.changed', reset); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/select.js b/src/_h5ai/public/js/lib/ext/select.js new file mode 100644 index 0000000..ab7d633 --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/select.js @@ -0,0 +1,204 @@ +const {each, dom} = require('../util'); +const event = require('../core/event'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); + +const doc = global.window.document; +const settings = Object.assign({ + enabled: false, + clickndrag: false, + checkboxes: false +}, allsettings.select); +const selectorTpl = + ` + selected + `; +const $document = dom(doc); +const $html = dom('html'); +const $selectionRect = dom('
    '); +const mmax = Math.max; +const mmin = Math.min; +const mabs = Math.abs; + +let dragStartX = 0; +let dragStartY = 0; + + +const publish = () => { + const items = dom('#items .item.selected').map(el => el._item); + event.pub('selection', items); +}; + +const elRect = el => { + const $el = dom(el); + if (!$el.length || $el.isHidden()) { + return null; + } + const rect = $el[0].getBoundingClientRect(); + return {l: rect.left, t: rect.top, r: rect.right, b: rect.bottom}; +}; + +const rectsAreEqual = (r1, r2) => { + return !!r1 && !!r2 && + r1.l === r2.l && + r1.t === r2.t && + r1.r === r2.r && + r1.b === r2.b; +}; + +const updateRects = $items => { + const el0 = $items[0]; + if (!rectsAreEqual(elRect(el0), el0 && el0._rect)) { + $items.each(el => { + el._rect = elRect(el); + }); + } +}; + +const rectsDoOverlap = (rect1, rect2) => { + if (!rect1 || !rect2) { + return false; + } + + const maxLeft = mmax(rect1.l, rect2.l); + const minRight = mmin(rect1.r, rect2.r); + const maxTop = mmax(rect1.t, rect2.t); + const minBottom = mmin(rect1.b, rect2.b); + + return maxLeft <= minRight && maxTop <= minBottom; +}; + +const getPointer = ev => { + const content = dom('#content')[0]; + const r = elRect(content); + const x = ev.pageX - r.l + content.scrollLeft; + const y = ev.pageY - r.t + content.scrollTop; + return {x, y}; +}; + +const selectionUpdate = ev => { + const {x, y} = getPointer(ev); + const left = mmin(dragStartX, x); + const top = mmin(dragStartY, y); + const width = mabs(dragStartX - x); + const height = mabs(dragStartY - y); + const isCtrlPressed = ev.ctrlKey || ev.metaKey; + + if (!isCtrlPressed && width < 4 && height < 4) { + return; + } + + if (!isCtrlPressed) { + dom('#items .item').rmCls('selected'); + } + + $html.addCls('drag-select'); + + $selectionRect.show().css({ + left: left + 'px', + top: top + 'px', + width: width + 'px', + height: height + 'px' + }); + + const selRect = elRect($selectionRect); + const $items = dom('#items .item:not(.folder-parent)'); + updateRects($items); + + $items.rmCls('selecting').each(el => { + if (rectsDoOverlap(selRect, el._rect)) { + dom(el).addCls('selecting'); + } + }); +}; + +const selectionEnd = ev => { + $document + .off('mousemove', selectionUpdate) + .off('mouseup', selectionEnd); + + selectionUpdate(ev); + dom('#items .item.selecting.selected').rmCls('selecting').rmCls('selected'); + dom('#items .item.selecting').rmCls('selecting').addCls('selected'); + publish(); + + $html.rmCls('drag-select'); + $selectionRect.hide(); + + ev.stopPropagation(); + ev.preventDefault(); +}; + +const selectionStart = ev => { + // only start on left button, don't block scrollbar + if (ev.button !== 0 || ev.offsetX >= dom('#content')[0].offsetWidth - 16) { + return; + } + + const {x, y} = getPointer(ev); + dragStartX = x; + dragStartY = y; + + $document + .on('mousemove', selectionUpdate) + .on('mouseup', selectionEnd); + + selectionUpdate(ev); + ev.preventDefault(); +}; + +const closestItem = el => { + while (!el._item && el.parentNode) { + el = el.parentNode; + } + return el._item; +}; + +const onSelectorClick = ev => { + closestItem(ev.target).$view.tglCls('selected'); + publish(); + ev.stopPropagation(); + ev.preventDefault(); +}; + +const addCheckbox = item => { + if (item.$view && !item.isCurrentParentFolder()) { + dom(selectorTpl) + .on('click', onSelectorClick) + .appTo(item.$view.find('a')); + } +}; + +const onViewChanged = (added, removed) => { + if (settings.checkboxes) { + each(added, addCheckbox); + } + + each(removed, item => { + if (item.$view) { + item.$view.rmCls('selected'); + } + }); + + publish(); +}; + +const init = () => { + if (!settings.enabled || !settings.clickndrag && !settings.checkboxes) { + return; + } + + event.sub('view.changed', onViewChanged); + + if (settings.clickndrag) { + $selectionRect.hide().appTo('#content'); + + dom('#content') + .on('mousedown', selectionStart) + .on('drag', ev => ev.preventDefault()) + .on('dragstart', ev => ev.preventDefault()); + } +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/sort.js b/src/_h5ai/public/js/lib/ext/sort.js new file mode 100644 index 0000000..a1eaa9d --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/sort.js @@ -0,0 +1,96 @@ +const {each, toArray, dom, cmp, naturalCmp} = require('../util'); +const event = require('../core/event'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const store = require('../core/store'); + +const settings = Object.assign({ + enabled: false, + column: 0, + reverse: false, + ignorecase: true, + natural: false, + folders: 0 +}, allsettings.sort); +const storekey = 'ext/sort'; +const tpl = `sort order`; + +const getTypeOrder = item => item.isFolder() ? settings.folders : 1; +const columnProps = {0: 'label', 1: 'time', 2: 'size'}; +const columnClasses = {0: 'label', 1: 'date', 2: 'size'}; + + +const cmpFn = (prop, reverse, ignorecase, natural) => { + return (el1, el2) => { + const item1 = el1._item; + const item2 = el2._item; + + let res = getTypeOrder(item1) - getTypeOrder(item2); + if (res !== 0) { + return res; + } + + let val1 = item1[prop]; + let val2 = item2[prop]; + + if (isNaN(val1) || isNaN(val2)) { + val1 = String(val1); + val2 = String(val2); + + if (ignorecase) { + val1 = val1.toLowerCase(); + val2 = val2.toLowerCase(); + } + } + + res = natural ? naturalCmp(val1, val2) : cmp(val1, val2); + return reverse ? -res : res; + }; +}; + +const sortItems = (column, reverse) => { + const $headers = dom('#items li.header a'); + const $header = dom('#items li.header a.' + columnClasses[column]); + const fn = cmpFn(columnProps[column], reverse, settings.ignorecase, settings.natural); + + store.put(storekey, {column, reverse}); + + $headers.rmCls('ascending').rmCls('descending'); + $header.addCls(reverse ? 'descending' : 'ascending'); + + dom(toArray(dom('#items .item:not(.folder-parent)')).sort(fn)).appTo('#items'); +}; + +const onContentChanged = () => { + const order = store.get(storekey); + const column = order && order.column || settings.column; + const reverse = order && order.reverse || settings.reverse; + + sortItems(column, reverse); +}; + +const addToggles = () => { + const $header = dom('#items li.header'); + + each(columnClasses, (cls, idx) => { + const pos = idx === '0' ? 'app' : 'pre'; + $header + .find('a.' + cls)[pos](tpl) + .on('click', ev => { + sortItems(idx, dom(ev.currentTarget).hasCls('ascending')); + ev.preventDefault(); + }); + }); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + addToggles(); + event.sub('view.changed', onContentChanged); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/thumbnails.js b/src/_h5ai/public/js/lib/ext/thumbnails.js new file mode 100644 index 0000000..d71898c --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/thumbnails.js @@ -0,0 +1,113 @@ +const {each, map, includes} = require('../util'); +const server = require('../server'); +const event = require('../core/event'); +const allsettings = require('../core/settings'); + +const settings = Object.assign({ + enabled: false, + img: ['img-bmp', 'img-gif', 'img-ico', 'img-jpg', 'img-png'], + mov: ['vid-avi', 'vid-flv', 'vid-mkv', 'vid-mov', 'vid-mp4', 'vid-mpg', 'vid-webm'], + doc: ['x-pdf', 'x-ps'], + delay: 1, + size: 100, + exif: false, + chunksize: 20 +}, allsettings.thumbnails); +const landscapeRatio = 4 / 3; + + +const queueItem = (queue, item) => { + let type = null; + + if (includes(settings.img, item.type)) { + type = 'img'; + } else if (includes(settings.mov, item.type)) { + type = 'mov'; + } else if (includes(settings.doc, item.type)) { + type = 'doc'; + } else { + return; + } + + if (item.thumbSquare) { + item.$view.find('.icon.square img').addCls('thumb').attr('src', item.thumbSquare); + } else { + queue.push({ + type, + href: item.absHref, + ratio: 1, + callback: src => { + if (src && item.$view) { + item.thumbSquare = src; + item.$view.find('.icon.square img').addCls('thumb').attr('src', src); + } + } + }); + } + + if (item.thumbRational) { + item.$view.find('.icon.landscape img').addCls('thumb').attr('src', item.thumbRational); + } else { + queue.push({ + type, + href: item.absHref, + ratio: landscapeRatio, + callback: src => { + if (src && item.$view) { + item.thumbRational = src; + item.$view.find('.icon.landscape img').addCls('thumb').attr('src', src); + } + } + }); + } +}; + +const requestQueue = queue => { + const thumbs = map(queue, req => { + return { + type: req.type, + href: req.href, + width: Math.round(settings.size * req.ratio), + height: settings.size + }; + }); + + return server.request({ + action: 'get', + thumbs + }).then(json => { + each(queue, (req, idx) => { + req.callback(json && json.thumbs ? json.thumbs[idx] : null); + }); + }); +}; + +const breakAndRequestQueue = queue => { + const len = queue.length; + const chunksize = settings.chunksize; + let p = Promise.resolve(); + for (let i = 0; i < len; i += chunksize) { + p = p.then(() => requestQueue(queue.slice(i, i + chunksize))); + } +}; + +const handleItems = items => { + const queue = []; + each(items, item => queueItem(queue, item)); + breakAndRequestQueue(queue); +}; + +const onViewChanged = added => { + setTimeout(() => handleItems(added), settings.delay); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + event.sub('view.changed', onViewChanged); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/ext/title.js b/src/_h5ai/public/js/lib/ext/title.js new file mode 100644 index 0000000..f2d1b33 --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/title.js @@ -0,0 +1,28 @@ +const event = require('../core/event'); +const allsettings = require('../core/settings'); + +const doc = global.window.document; +const settings = Object.assign({ + enabled: false +}, allsettings.title); + +const onLocationChanged = item => { + const labels = item.getCrumb().map(i => i.label); + let title = labels.join(' > '); + + if (labels.length > 1) { + title = labels[labels.length - 1] + ' - ' + title; + } + + doc.title = title; +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + event.sub('location.changed', onLocationChanged); +}; + +init(); diff --git a/src/_h5ai/public/js/lib/ext/tree.js b/src/_h5ai/public/js/lib/ext/tree.js new file mode 100644 index 0000000..c8a4a58 --- /dev/null +++ b/src/_h5ai/public/js/lib/ext/tree.js @@ -0,0 +1,172 @@ +const {each, dom, cmp, naturalCmp} = require('../util'); +const event = require('../core/event'); +const location = require('../core/location'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const store = require('../core/store'); + + +const settings = Object.assign({ + enabled: false, + show: true, + maxSubfolders: 50, + naturalSort: false, + ignorecase: true +}, allsettings.tree); +const itemTpl = + `
    + + + + + + + + `; +const settingsTpl = + `
    +

    Tree

    +
    + view-tree +
    +
    `; +const storekey = 'ext/tree'; + + +const closestItem = el => { + while (!el._item && el.parentNode) { + el = el.parentNode; + } + return el._item; +}; + +const onIndicatorClick = ev => { + const item = closestItem(ev.target); + + if (item._treeState === 'unknown') { + item.fetchContent().then(() => { + item._treeState = 'open'; + update(item); // eslint-disable-line no-use-before-define + }); + } else if (item._treeState === 'open') { + item._treeState = 'closed'; + item._$tree.rmCls('open').addCls('closed'); + } else if (item._treeState === 'closed') { + item._treeState = 'open'; + item._$tree.rmCls('closed').addCls('open'); + } +}; + +const cmpItems = (item1, item2) => { + let val1 = item1.label; + let val2 = item2.label; + + if (settings.ignorecase) { + val1 = val1.toLowerCase(); + val2 = val2.toLowerCase(); + } + + return settings.naturalSort ? naturalCmp(val1, val2) : cmp(val1, val2); +}; + +const update = item => { + const subfolders = item.getSubfolders(); + const subLen = subfolders.length; + const subMax = settings.maxSubfolders; + const $html = dom(itemTpl); + + $html.find('.indicator').on('click', onIndicatorClick); + $html.find('.label').text(item.label); + location.setLink($html.find('a'), item); + + if (item.isCurrentFolder()) { + $html.addCls('active'); + } + + if (!item.isManaged) { + $html.find('.icon img').attr('src', resource.icon('folder-page')); + } + + // indicator + item._treeState = item._treeState || 'none'; + if (item.isManaged && !item.isContentFetched) { + item._treeState = 'unknown'; + } else if (!subLen) { + item._treeState = 'none'; + } + $html.addCls(item._treeState); + + // subfolders + if (subLen) { + const $ul = dom('
    ').appTo($html); + subfolders.sort(cmpItems); + each(subfolders.slice(0, subMax), e => $ul.app(update(e))); + if (subLen > subMax) { + $ul.app(`
    … ${subLen - subMax} more subfolders
    `); + } + } + + if (item._$tree) { + item._$tree.rpl($html); + } + + item._$tree = $html; + $html[0]._item = item; + + return $html; +}; + +const fetchTree = item => { + item._treeState = 'open'; + return item.fetchContent().then(() => { + if (item.parent) { + return fetchTree(item.parent); + } + return item; + }); +}; + +const updateSettings = () => { + if (store.get(storekey)) { + dom('#view-tree').addCls('active'); + dom('#tree').show(); + } else { + dom('#view-tree').rmCls('active'); + dom('#tree').hide(); + } +}; + +const onLocationChanged = item => { + fetchTree(item).then(root => { + dom('#tree').clr().app(update(root)); + updateSettings(); + }); +}; + +const init = () => { + if (!settings.enabled) { + return; + } + + dom('
    ').hide().appTo('#mainrow'); + + dom(settingsTpl) + .appTo('#sidebar') + .find('#view-tree') + .on('click', ev => { + store.put(storekey, !store.get(storekey)); + updateSettings(); + event.pub('resize'); + ev.preventDefault(); + }); + + // ensure stored value is boolean, otherwise set default + if (typeof store.get(storekey) !== 'boolean') { + store.put(storekey, settings.show); + } + updateSettings(); + + event.sub('location.changed', onLocationChanged); +}; + +init(); diff --git a/src/_h5ai/public/js/lib/init.js b/src/_h5ai/public/js/lib/init.js new file mode 100644 index 0000000..772f996 --- /dev/null +++ b/src/_h5ai/public/js/lib/init.js @@ -0,0 +1,23 @@ +const {dom, awaitReady} = require('./util'); +const config = require('./config'); + +const name = dom('script[data-module]').attr('data-module'); +const query = { + action: 'get', + setup: true, + options: true, + types: true +}; + +if (name === 'index') { + query.theme = true; + query.langs = true; +} else if (name === 'info') { + query.refresh = true; +} else { + throw new Error(`no-main-module: '${name}'`); +} + +config._update(query) + .then(() => awaitReady()) + .then(() => require(`./main/${name}`)); diff --git a/src/_h5ai/public/js/lib/main/index.js b/src/_h5ai/public/js/lib/main/index.js new file mode 100644 index 0000000..fd6d9f6 --- /dev/null +++ b/src/_h5ai/public/js/lib/main/index.js @@ -0,0 +1,22 @@ +require('../view/viewmode'); + +require('../ext/autorefresh'); +require('../ext/contextmenu'); +require('../ext/crumb'); +require('../ext/custom'); +require('../ext/download'); +require('../ext/filter'); +require('../ext/google-analytics'); +require('../ext/info'); +require('../ext/l10n'); +require('../ext/piwik-analytics'); +require('../ext/preview'); +require('../ext/search'); +require('../ext/select'); +require('../ext/sort'); +require('../ext/thumbnails'); +require('../ext/title'); +require('../ext/tree'); + +const href = global.window.document.location.href; +require('../core/location').setLocation(href, true); diff --git a/src/_h5ai/public/js/lib/main/info.js b/src/_h5ai/public/js/lib/main/info.js new file mode 100644 index 0000000..7fcd1d8 --- /dev/null +++ b/src/_h5ai/public/js/lib/main/info.js @@ -0,0 +1,187 @@ +const {dom} = require('../util'); +const config = require('../config'); +const server = require('../server'); +const resource = require('../core/resource'); + + +const testsTpl = + '
      '; +const testTpl = + `
    • + + +
      +
    • `; +const loginTpl = + `
      + + login + logout +
      + The preset password is the empty string, just click login. + Change it in '_h5ai/private/conf/options.json'. +
      +
      `; +const supportTpl = + `
      + Show your support with a donation! +
      +
      + + + +
      +
      +
      `; +const setup = config.setup; + + +const addTest = (label, info, passed, result) => { + const $test = dom(testTpl).appTo('#tests'); + $test.find('.label').text(label); + $test.find('.result') + .addCls(passed ? 'passed' : 'failed') + .text(result ? result : passed ? 'yes' : 'no'); + $test.find('.info').html(info); +}; + +const addTests = () => { + if (!setup.AS_ADMIN) { + return; + } + + dom(testsTpl).appTo('#content'); + + addTest( + 'h5ai version', 'Only green if this is an official h5ai release', + (/^\d+\.\d+\.\d+$/).test(setup.VERSION), setup.VERSION + ); + + addTest( + 'Index file found', 'Add ' + setup.INDEX_HREF + ' to your index file list', + setup.INDEX_HREF + ); + + addTest( + 'Options parsable', 'File options.json is readable and syntax is correct', + config.options !== null + ); + + addTest( + 'Types parsable', 'File types.json is readable and syntax is correct', + config.types !== null + ); + + addTest( + 'Server software', 'Server is one of apache, lighttpd, nginx or cherokee', + setup.HAS_SERVER, setup.SERVER_NAME + ' ' + setup.SERVER_VERSION + ); + + addTest( + 'PHP version', 'PHP version >= ' + setup.MIN_PHP_VERSION, + true, setup.PHP_VERSION + ); + + addTest( + 'PHP arch', '64-bit required to correctly display file/folder sizes > ~2GB', + setup.PHP_ARCH === '64-bit', setup.PHP_ARCH + ); + + addTest( + 'Public Cache directory', 'Web server has write access', + setup.HAS_WRITABLE_CACHE_PUB + ); + + addTest( + 'Private Cache directory', 'Web server has write access', + setup.HAS_WRITABLE_CACHE_PRV + ); + + addTest( + 'Image thumbs', 'PHP GD extension with JPEG support available', + setup.HAS_PHP_JPEG + ); + + addTest( + 'Use EXIF thumbs', 'PHP EXIF extension available', + setup.HAS_PHP_EXIF + ); + + addTest( + 'Movie thumbs', 'Command line program avconv or ffmpeg available', + setup.HAS_CMD_AVCONV || setup.HAS_CMD_FFMPEG + ); + + addTest( + 'PDF thumbs', 'Command line program convert or gm available', + setup.HAS_CMD_CONVERT || setup.HAS_CMD_GM + ); + + addTest( + 'Shell tar', 'Command line program tar available', + setup.HAS_CMD_TAR + ); + + addTest( + 'Shell zip', 'Command line program zip available', + setup.HAS_CMD_ZIP + ); + + addTest( + 'Shell du', 'Command line program du available', + setup.HAS_CMD_DU + ); +}; + +const reload = () => { + global.window.location.reload(); +}; + +const onLogin = () => { + server.request({ + action: 'login', + pass: dom('#pass').val() + }).then(reload); +}; + +const onLogout = () => { + server.request({ + action: 'logout' + }).then(reload); +}; + +const onKeydown = ev => { + if (ev.which === 13) { + onLogin(); + } +}; + +const addSupport = () => { + dom(supportTpl).appTo('#content'); +}; + +const addLogin = () => { + dom(loginTpl).appTo('#content'); + + if (setup.AS_ADMIN) { + dom('#pass').rm(); + dom('#login').rm(); + dom('#logout').on('click', onLogout); + } else { + dom('#pass').on('keydown', onKeydown)[0].focus(); + dom('#login').on('click', onLogin); + dom('#logout').rm(); + } + if (config.options.hasCustomPasshash) { + dom('#hint').rm(); + } +}; + +const init = () => { + addSupport(); + addLogin(); + addTests(); +}; + + +init(); diff --git a/src/_h5ai/public/js/lib/model/item.js b/src/_h5ai/public/js/lib/model/item.js new file mode 100644 index 0000000..3d725b1 --- /dev/null +++ b/src/_h5ai/public/js/lib/model/item.js @@ -0,0 +1,229 @@ +const {keys, each, filter, sortBy, isStr, isNum} = require('../util'); +const server = require('../server'); +const location = require('../core/location'); +const settings = require('../core/settings'); +const types = require('../core/types'); + +const reEndsWithSlash = /\/$/; +const reSplitPath = /^(.*\/)([^\/]+\/?)$/; +const cache = {}; + + +const startsWith = (sequence, part) => isStr(sequence) && sequence.startsWith(part); + +const createLabel = sequence => { + sequence = sequence.replace(reEndsWithSlash, ''); + try { + sequence = decodeURIComponent(sequence); + } catch (e) {/* skip */} + return sequence; +}; + +const splitPath = sequence => { + if (sequence === '/') { + return { + parent: null, + name: '/' + }; + } + + const match = reSplitPath.exec(sequence); + if (!match) { + return null; + } + + const split = { + parent: match[1], + name: match[2] + }; + + if (split.parent && !startsWith(split.parent, settings.rootHref)) { + split.parent = null; + } + return split; +}; + +const getItem = options => { + if (isStr(options)) { + options = {href: options}; + } else if (!options || !isStr(options.href)) { + return null; + } + + const href = location.forceEncoding(options.href); + + if (!startsWith(href, settings.rootHref)) { + return null; + } + + const item = cache[href] || Item(href); // eslint-disable-line no-use-before-define + + if (isNum(options.time)) { + item.time = options.time; + } + if (isNum(options.size)) { + item.size = options.size; + } + if (options.managed) { + item.isManaged = true; + } + if (options.fetched) { + item.isContentFetched = true; + } + + return item; +}; + +const removeItem = absHref => { + absHref = location.forceEncoding(absHref); + + const item = cache[absHref]; + + if (item) { + delete cache[absHref]; + if (item.parent) { + delete item.parent.content[item.absHref]; + } + each(item.content, child => { + removeItem(child.absHref); + }); + } +}; + +const fetchContent = absHref => { + return new Promise(resolve => { + const item = getItem(absHref); + + if (item.isContentFetched) { + resolve(item); + } else { + server.request({action: 'get', items: {href: item.absHref, what: 1}}).then(response => { + if (response.items) { + each(response.items, jsonItem => { + getItem(jsonItem); + }); + } + + resolve(item); + }); + } + }); +}; + + +const Item = absHref => { + const split = splitPath(absHref); + + const inst = Object.assign(Object.create(Item.prototype), { + absHref, + type: types.getType(absHref), + label: createLabel(absHref === '/' ? location.getDomain() : split.name), + time: null, + size: null, + parent: null, + isManaged: null, + content: {} + }); + + cache[absHref] = inst; + + if (split.parent) { + inst.parent = getItem(split.parent); + inst.parent.content[inst.absHref] = inst; + if (keys(inst.parent.content).length > 1) { + inst.parent.isContentFetched = true; + } + } + + return inst; +}; + +Item.prototype = { + constructor: Item, + + isFolder() { + return reEndsWithSlash.test(this.absHref); + }, + + isCurrentFolder() { + return this.absHref === location.getAbsHref(); + }, + + isInCurrentFolder() { + return !!this.parent && this.parent.isCurrentFolder(); + }, + + isCurrentParentFolder() { + const item = getItem(location.getAbsHref()); + return !!item && this === item.parent; + }, + + isDomain() { + return this.absHref === '/'; + }, + + isRoot() { + return this.absHref === settings.rootHref; + }, + + isEmpty() { + return keys(this.content).length === 0; + }, + + fetchContent() { + return fetchContent(this.absHref); + }, + + getCrumb() { + let item = this; // eslint-disable-line consistent-this + const crumb = [item]; + + while (item.parent) { + item = item.parent; + crumb.unshift(item); + } + + return crumb; + }, + + getSubfolders() { + return sortBy(filter(this.content, item => { + return item.isFolder(); + }), item => { + return item.label.toLowerCase(); + }); + }, + + getStats() { + let folders = 0; + let files = 0; + + each(this.content, item => { + if (item.isFolder()) { + folders += 1; + } else { + files += 1; + } + }); + + let depth = 0; + let item = this; // eslint-disable-line consistent-this + + while (item.parent) { + depth += 1; + item = item.parent; + } + + return { + folders, + files, + depth + }; + } +}; + + +module.exports = { + get: getItem, + remove: removeItem +}; diff --git a/src/_h5ai/public/js/lib/server.js b/src/_h5ai/public/js/lib/server.js new file mode 100644 index 0000000..135fc91 --- /dev/null +++ b/src/_h5ai/public/js/lib/server.js @@ -0,0 +1,42 @@ +const {each, dom} = require('./util'); +const XHR = global.window.XMLHttpRequest; + +const request = data => { + return new Promise(resolve => { + const xhr = new XHR(); + const on_ready_state_change = () => { + if (xhr.readyState === XHR.DONE) { + try { + resolve(JSON.parse(xhr.responseText)); + } catch (err) { + resolve({err, txt: xhr.responseText}); + } + } + }; + + xhr.open('POST', '?', true); + xhr.onreadystatechange = on_ready_state_change; + xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8'); + xhr.send(JSON.stringify(data)); + }); +}; + +const formRequest = data => { + const $form = dom('
      '); + + each(data, (val, key) => { + dom('') + .attr('name', key) + .attr('value', val) + .appTo($form); + }); + + $form.appTo('body'); + $form[0].submit(); + $form.rm(); +}; + +module.exports = { + request, + formRequest +}; diff --git a/src/_h5ai/public/js/lib/util/dom.js b/src/_h5ai/public/js/lib/util/dom.js new file mode 100644 index 0000000..2b8f3ad --- /dev/null +++ b/src/_h5ai/public/js/lib/util/dom.js @@ -0,0 +1,277 @@ +const {each, filter, hasLength, is, isStr, map, isInstanceOf, toArray} = require('./lo'); + +const win = global.window; +const doc = win.document; + +const parse_html = (() => { + const create = name => doc.createElement(name); + const rules = [ + [/^ { + for (const [re, el] of rules) { + if (re.test(str)) { + return el; + } + } + return div; + }; + + return str => { + const container = findContainer(str); + container.innerHTML = str; + const res = toArray(container.childNodes); + each(res, el => container.removeChild(el)); + container.innerHTML = ''; + return res; + }; +})(); + +const query_all = (selector, context = doc) => { + try { + return toArray(context.querySelectorAll(selector)); + } catch (err) { + return []; + } +}; + +const is_el = x => isInstanceOf(x, win.Element); +const is_doc = x => isInstanceOf(x, win.Document); +const is_win = x => is(x) && x.window === x && is_doc(x.document); +const is_el_doc_win = x => is_el(x) || is_doc(x) || is_win(x); + +const add_listener = (el, type, fn) => el.addEventListener(type, fn); +const remove_listener = (el, type, fn) => el.removeEventListener(type, fn); + +const ready_promise = new Promise(resolve => { + if ((/^(i|c|loade)/).test(doc.readyState)) { + resolve(); + } else { + add_listener(doc, 'DOMContentLoaded', () => resolve()); + } +}); +const await_ready = () => ready_promise; + +const load_promise = new Promise(resolve => { + add_listener(win, 'load', () => resolve()); +}); +const await_load = () => load_promise; + +const dom = arg => { + if (isInstanceOf(arg, dom)) { + return arg; + } + + let els; + if (isStr(arg)) { + arg = arg.trim(); + els = arg[0] === '<' ? parse_html(arg) : query_all(arg); + } else if (is_el_doc_win(arg)) { + els = [arg]; + } else { + els = hasLength(arg) ? arg : [arg]; + } + els = filter(els, is_el_doc_win); + + return Object.assign(Object.create(dom.prototype), els, {length: els.length}); +}; + +dom.prototype = { + constructor: dom, + + each(fn) { + each(this, fn); + return this; + }, + + map(fn) { + return map(this, fn); + }, + + find(selector) { + return dom([].concat(...this.map(el => query_all(selector, el)))); + }, + + on(type, fn) { + return this.each(el => add_listener(el, type, fn)); + }, + + off(type, fn) { + return this.each(el => remove_listener(el, type, fn)); + }, + + attr(key, value) { + if (value === undefined) { + return this.length ? this[0].getAttribute(key) : undefined; + } + return this.each(el => el.setAttribute(key, value)); + }, + + rmAttr(key) { + return this.each(el => el.removeAttribute(key)); + }, + + prop(key, value) { + if (value === undefined) { + return this.length ? this[0][key] : undefined; + } + return this.each(el => {el[key] = value;}); + }, + + rmProp(key) { + return this.each(el => delete el[key]); + }, + + val(value) { + if (value === undefined) { + return this.length ? this[0].value : undefined; + } + return this.each(el => { + el.value = value; + }); + }, + + html(str) { + if (str === undefined) { + return this.map(el => el.innerHTML).join(''); + } + return this.each(el => { + el.innerHTML = str; + }); + }, + + text(str) { + if (str === undefined) { + return this.map(el => el.textContent).join(''); + } + return this.each(el => { + el.textContent = str; + }); + }, + + clr() { + return this.html(''); + }, + + rm() { + return this.each(el => { + const parent = el.parentNode; + if (parent) { + parent.removeChild(el); + } + }); + }, + + rpl(arg) { + return this.each(el => { + const parent = el.parentNode; + if (parent) { + parent.replaceChild(dom(arg)[0], el); + } + }); + }, + + app(arg) { + return this.each(el => { + dom(arg).each(child => el.appendChild(child)); + }); + }, + + appTo(arg) { + dom(arg).app(this); + return this; + }, + + pre(arg) { + return this.each(el => { + dom(arg).each(child => { + const firstChild = el.firstChild; + if (!firstChild) { + el.appendChild(child); + } else { + el.insertBefore(child, firstChild); + } + }); + }); + }, + + preTo(arg) { + dom(arg).pre(this); + return this; + }, + + cls(...names) { + if (!names.length) { + return this.length ? toArray(this[0].classList) : []; + } + this.each(el => {el.className = '';}); + return this.addCls(...names); + }, + + hasCls(name) { + return toArray(this).every(el => el.classList.contains(name)); + }, + + addCls(...names) { + return this.each(el => { + for (const name of names) { + el.classList.add(name); + } + }); + }, + + rmCls(...names) { + return this.each(el => { + for (const name of names) { + el.classList.remove(name); + } + }); + }, + + tglCls(...names) { + return this.each(el => { + for (const name of names) { + if (el.classList.contains(name)) { + el.classList.remove(name); + } else { + el.classList.add(name); + } + } + }); + }, + + parent() { + return dom(this.map(el => el.parentNode)); + }, + + children() { + return dom([].concat(...this.map(el => toArray(el.children)))); + }, + + hide() { + return this.addCls('hidden'); + }, + + show() { + return this.rmCls('hidden'); + }, + + isHidden() { + return this.hasCls('hidden'); + }, + + css(styles) { + return this.each(el => Object.assign(el.style, styles)); + } +}; + +module.exports = { + awaitReady: await_ready, + awaitLoad: await_load, + dom +}; diff --git a/src/_h5ai/public/js/lib/util/index.js b/src/_h5ai/public/js/lib/util/index.js new file mode 100644 index 0000000..ed1d446 --- /dev/null +++ b/src/_h5ai/public/js/lib/util/index.js @@ -0,0 +1,6 @@ +module.exports = Object.assign({}, + require('./lo'), + require('./dom'), + require('./natural_cmp'), + require('./misc') +); diff --git a/src/_h5ai/public/js/lib/util/lo.js b/src/_h5ai/public/js/lib/util/lo.js new file mode 100644 index 0000000..641d719 --- /dev/null +++ b/src/_h5ai/public/js/lib/util/lo.js @@ -0,0 +1,68 @@ +const is = x => x !== undefined && x !== null; +const tof = (x, str) => typeof x === str; +const isStr = x => tof(x, 'string'); +const isFn = x => tof(x, 'function'); +const isNum = x => tof(x, 'number'); +const hasLength = x => x && x.hasOwnProperty('length'); +const keys = obj => { + if (!obj || isStr(obj)) { + return []; + } + if (hasLength(obj)) { + obj = Array.from(obj); + } + return Object.keys(obj); +}; +const values = obj => keys(obj).map(key => obj[key]); +const each = (obj, fn) => keys(obj).forEach(key => fn(obj[key], key)); +const filter = (obj, fn) => values(obj).filter(fn); +const map = (obj, fn) => values(obj).map(fn); +const includes = (obj, x) => values(obj).indexOf(x) >= 0; +const compact = obj => filter(obj, x => !!x); + +const isInstanceOf = (x, constructor) => x ? x instanceof constructor : false; +const toArray = x => Array.from(x); + +const difference = (obj1, obj2) => { + obj2 = values(obj2); + return filter(obj1, x => obj2.indexOf(x) < 0); +}; +const intersection = (obj1, obj2) => { + obj2 = values(obj2); + return filter(obj1, x => obj2.indexOf(x) >= 0); +}; +const cmp = (x, y) => x < y ? -1 : x > y ? 1 : 0; +const sortBy = (obj, sel) => { + const selFn = isFn(sel) ? sel : x => x[sel]; + const cmpFn = (x, y) => cmp(selFn(x), selFn(y)); + return values(obj).sort(cmpFn); +}; +const debounce = (fn, delay) => { + let id = null; + return () => { + clearTimeout(id); + id = setTimeout(fn, delay); + }; +}; + +module.exports = { + is, + isStr, + isFn, + isNum, + hasLength, + keys, + values, + each, + filter, + map, + includes, + compact, + isInstanceOf, + toArray, + difference, + intersection, + cmp, + sortBy, + debounce +}; diff --git a/src/_h5ai/public/js/lib/util/misc.js b/src/_h5ai/public/js/lib/util/misc.js new file mode 100644 index 0000000..b63b341 --- /dev/null +++ b/src/_h5ai/public/js/lib/util/misc.js @@ -0,0 +1,21 @@ +const esc_pattern = sequence => { + return sequence.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g, '\\$&'); +}; + +const parse_pattern = (sequence, advanced) => { + if (!advanced) { + return esc_pattern(sequence); + } + + if (sequence.substr(0, 3) === 're:') { + return sequence.substr(3); + } + + return sequence.trim().split(/\s+/).map(part => { + return part.split('').map(char => esc_pattern(char)).join('.*?'); + }).join('|'); +}; + +module.exports = { + parsePattern: parse_pattern +}; diff --git a/src/_h5ai/public/js/lib/util/natural_cmp.js b/src/_h5ai/public/js/lib/util/natural_cmp.js new file mode 100644 index 0000000..d656f70 --- /dev/null +++ b/src/_h5ai/public/js/lib/util/natural_cmp.js @@ -0,0 +1,63 @@ +// Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license +// Author: Jim Palmer (based on chunking idea from Dave Koelle) + +// Modified to make it work with h5ai + +const RE_TOKEN = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi; +const RE_DATE = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/; +const RE_HEX = /^0x[0-9a-f]+$/i; +const RE_LEADING_ZERO = /^0/; + +/* eslint-disable complexity */ +const natural_cmp = (a, b) => { + // convert all to strings strip whitespace + const x = String(a).trim(); + const y = String(b).trim(); + + // chunk/tokenize + const x_toks = x.replace(RE_TOKEN, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0'); + const y_toks = y.replace(RE_TOKEN, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0'); + + // first try and sort Hex codes or Dates + const x_date = parseInt(x.match(RE_HEX), 16) || x_toks.length !== 1 && x.match(RE_DATE) && Date.parse(x); + const y_date = parseInt(y.match(RE_HEX), 16) || x_date && y.match(RE_DATE) && Date.parse(y) || null; + if (y_date) { + if (x_date < y_date) { + return -1; + } + if (x_date > y_date) { + return 1; + } + } + + // natural sorting through split numeric strings and default strings + for (let idx = 0, len = Math.max(x_toks.length, y_toks.length); idx < len; idx += 1) { + // find floats not starting with '0', string or 0 if not defined (Clint Priest) + let x_tok = !(x_toks[idx] || '').match(RE_LEADING_ZERO) && parseFloat(x_toks[idx]) || x_toks[idx] || 0; + let y_tok = !(y_toks[idx] || '').match(RE_LEADING_ZERO) && parseFloat(y_toks[idx]) || y_toks[idx] || 0; + + // handle numeric vs string comparison - number < string - (Kyle Adams) + if (isNaN(x_tok) !== isNaN(y_tok)) { + return isNaN(x_tok) ? 1 : -1; + } + + // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' + if (typeof x_tok !== typeof y_tok) { + x_tok = String(x_tok); + y_tok = String(y_tok); + } + + if (x_tok < y_tok) { + return -1; + } + if (x_tok > y_tok) { + return 1; + } + } + return 0; +}; +/* eslint-enable */ + +module.exports = { + naturalCmp: natural_cmp +}; diff --git a/src/_h5ai/public/js/lib/view/base.js b/src/_h5ai/public/js/lib/view/base.js new file mode 100644 index 0000000..ffabe58 --- /dev/null +++ b/src/_h5ai/public/js/lib/view/base.js @@ -0,0 +1,35 @@ +const {dom} = require('../util'); + +const SEL_ROOT = 'body'; +const TPL_TOPBAR = + ``; +const TPL_MAINROW = + `
      +
      +
      `; + +const init = () => { + const $root = dom(SEL_ROOT) + .attr('id', 'root') + .clr() + .app(TPL_TOPBAR) + .app(TPL_MAINROW); + + return { + $root, + $topbar: $root.find('#topbar'), + $toolbar: $root.find('#toolbar'), + $flowbar: $root.find('#flowbar'), + $mainrow: $root.find('#mainrow'), + $content: $root.find('#content') + }; +}; + +module.exports = init(); diff --git a/src/_h5ai/public/js/lib/view/notification.js b/src/_h5ai/public/js/lib/view/notification.js new file mode 100644 index 0000000..52e4ecf --- /dev/null +++ b/src/_h5ai/public/js/lib/view/notification.js @@ -0,0 +1,20 @@ +const {dom} = require('../util'); +const base = require('./base'); + +const init = () => { + const $el = dom('
      ').hide().appTo(base.$root); + + const set = content => { + if (content) { + $el.html(content).show(); + } else { + $el.hide(); + } + }; + + return { + set + }; +}; + +module.exports = init(); diff --git a/src/_h5ai/public/js/lib/view/sidebar.js b/src/_h5ai/public/js/lib/view/sidebar.js new file mode 100644 index 0000000..cfff665 --- /dev/null +++ b/src/_h5ai/public/js/lib/view/sidebar.js @@ -0,0 +1,54 @@ +const {dom} = require('../util'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const store = require('../core/store'); +const base = require('./base'); + + +const settings = Object.assign({ + disableSidebar: false +}, allsettings.view); +const storekey = 'sidebarIsVisible'; +const sidebarTpl = ''; +const toggleTpl = + ``; + + +const init = () => { + const $sidebar = dom(sidebarTpl).hide(); + const $toggle = dom(toggleTpl); + const $img = $toggle.find('img'); + + const update = toggle => { + let isVisible = store.get(storekey); + + if (toggle) { + isVisible = !isVisible; + store.put(storekey, isVisible); + } + + if (isVisible) { + $toggle.addCls('active'); + $img.attr('src', resource.image('back')); + $sidebar.show(); + } else { + $toggle.rmCls('active'); + $img.attr('src', resource.image('sidebar')); + $sidebar.hide(); + } + }; + + if (!settings.disableSidebar) { + $sidebar.appTo(base.$mainrow); + $toggle.appTo(base.$toolbar).on('click', () => update(true)); + update(); + } + + return { + $el: $sidebar + }; +}; + +module.exports = init(); diff --git a/src/_h5ai/public/js/lib/view/view.js b/src/_h5ai/public/js/lib/view/view.js new file mode 100644 index 0000000..aff35ef --- /dev/null +++ b/src/_h5ai/public/js/lib/view/view.js @@ -0,0 +1,290 @@ +const {each, map, includes, intersection, dom} = require('../util'); +const event = require('../core/event'); +const format = require('../core/format'); +const location = require('../core/location'); +const resource = require('../core/resource'); +const store = require('../core/store'); +const allsettings = require('../core/settings'); +const base = require('./base'); + +const modes = ['details', 'grid', 'icons']; +const sizes = [20, 40, 60, 80, 100, 150, 200, 250, 300, 350, 400]; +const settings = Object.assign({ + binaryPrefix: false, + hideFolders: false, + hideParentFolder: false, + maxIconSize: 40, + modes, + setParentFolderLabels: false, + sizes +}, allsettings.view); +const sortedSizes = settings.sizes.sort((a, b) => a - b); +const checkedModes = intersection(settings.modes, modes); +const storekey = 'view'; +const viewTpl = + `
      +
        +
      • + + + + +
      • +
      +
      +
      `; +const itemTpl = + `
    • + + + + + + + +
    • `; +const $view = dom(viewTpl); +const $items = $view.find('#items'); +const $hint = $view.find('#view-hint'); + + +const cropSize = (size, min, max) => Math.min(max, Math.max(min, size)); + +const createStyles = size => { + const dsize = cropSize(size, 20, 80); + const gsize = cropSize(size, 40, 160); + const isize = cropSize(size, 80, 1000); + const ilsize = Math.round(isize * 4 / 3); + const important = '!important;'; + const detailsPrefix = `#view.view-details.view-size-${size}`; + const gridPrefix = `#view.view-grid.view-size-${size}`; + const iconsPrefix = `#view.view-icons.view-size-${size}`; + const rules = [ + `${detailsPrefix} .item .label {line-height: ${dsize + 14}px ${important}}`, + `${detailsPrefix} .item .date {line-height: ${dsize + 14}px ${important}}`, + `${detailsPrefix} .item .size {line-height: ${dsize + 14}px ${important}}`, + `${detailsPrefix} .square {width: ${dsize}px ${important} height: ${dsize}px ${important}}`, + `${detailsPrefix} .square img {width: ${dsize}px ${important} height: ${dsize}px ${important}}`, + `${detailsPrefix} .label {margin-left: ${dsize + 32}px ${important}}`, + + `${gridPrefix} .item .label {line-height: ${gsize}px ${important}}`, + `${gridPrefix} .square {width: ${gsize}px ${important} height: ${gsize}px ${important}}`, + `${gridPrefix} .square img {width: ${gsize}px ${important} height: ${gsize}px ${important}}`, + + `${iconsPrefix} .item {width: ${ilsize}px ${important}}`, + `${iconsPrefix} .landscape {width: ${ilsize}px ${important} height: ${isize}px ${important}}`, + `${iconsPrefix} .landscape img {width: ${isize}px ${important} height: ${isize}px ${important}}`, + `${iconsPrefix} .landscape .thumb {width: ${ilsize}px ${important}}` + ]; + + return rules.join('\n'); +}; + +const addCssStyles = () => { + const styles = map(sortedSizes, size => createStyles(size)); + styles.push(`#view .icon img {max-width: ${settings.maxIconSize}px; max-height: ${settings.maxIconSize}px;}`); + dom('').text(styles.join('\n')).appTo('head'); +}; + +const set = (mode, size) => { + const stored = store.get(storekey); + + mode = mode || stored && stored.mode; + size = size || stored && stored.size; + mode = includes(settings.modes, mode) ? mode : settings.modes[0]; + size = includes(settings.sizes, size) ? size : settings.sizes[0]; + store.put(storekey, {mode, size}); + + each(checkedModes, m => { + if (m === mode) { + $view.addCls('view-' + m); + } else { + $view.rmCls('view-' + m); + } + }); + + each(sortedSizes, s => { + if (s === size) { + $view.addCls('view-size-' + s); + } else { + $view.rmCls('view-size-' + s); + } + }); + + event.pub('view.mode.changed', mode, size); +}; + +const getModes = () => checkedModes; +const getMode = () => store.get(storekey).mode; +const setMode = mode => set(mode, null); + +const getSizes = () => sortedSizes; +const getSize = () => store.get(storekey).size; +const setSize = size => set(null, size); + +const onMouseenter = ev => { + const item = ev.target._item; + event.pub('item.mouseenter', item); +}; + +const onMouseleave = ev => { + const item = ev.target._item; + event.pub('item.mouseleave', item); +}; + +const createHtml = item => { + const $html = dom(itemTpl); + const $a = $html.find('a'); + const $iconImg = $html.find('.icon img'); + const $label = $html.find('.label'); + const $date = $html.find('.date'); + const $size = $html.find('.size'); + + $html + .addCls(item.isFolder() ? 'folder' : 'file') + .on('mouseenter', onMouseenter) + .on('mouseleave', onMouseleave); + + location.setLink($a, item); + + $label.text(item.label).attr('title', item.label); + $date.attr('data-time', item.time).text(format.formatDate(item.time)); + $size.attr('data-bytes', item.size).text(format.formatSize(item.size)); + item.icon = resource.icon(item.type); + + if (item.isFolder() && !item.isManaged) { + $html.addCls('page'); + item.icon = resource.icon('folder-page'); + } + + if (item.isCurrentParentFolder()) { + item.icon = resource.icon('folder-parent'); + if (!settings.setParentFolderLabels) { + $label.addCls('l10n-parentDirectory'); + } + $html.addCls('folder-parent'); + } + $iconImg.attr('src', item.icon).attr('alt', item.type); + + item.$view = $html; + $html[0]._item = item; + + return $html; +}; + +const checkHint = () => { + const hasNoItems = $items.find('.item').length === $items.find('.folder-parent').length; + + if (hasNoItems) { + $hint.show(); + } else { + $hint.hide(); + } +}; + +const setItems = items => { + const removed = map($items.find('.item'), el => el._item); + + $items.find('.item').rm(); + + each(items, item => $items.app(createHtml(item))); + + base.$content[0].scrollLeft = 0; + base.$content[0].scrollTop = 0; + checkHint(); + event.pub('view.changed', items, removed); +}; + +const changeItems = (add, remove) => { + each(add, item => { + createHtml(item).hide().appTo($items).show(); + }); + + each(remove, item => { + item.$view.hide().rm(); + }); + + checkHint(); + event.pub('view.changed', add, remove); +}; + +const setHint = l10nKey => { + $hint.rmCls().addCls('l10n-' + l10nKey); + checkHint(); +}; + +const onLocationChanged = item => { + if (!item) { + item = location.getItem(); + } + + const items = []; + + if (item.parent && !settings.hideParentFolder) { + items.push(item.parent); + } + + each(item.content, child => { + if (!(child.isFolder() && settings.hideFolders)) { + items.push(child); + } + }); + + setHint('empty'); + setItems(items); +}; + +const onLocationRefreshed = (item, added, removed) => { + const add = []; + + each(added, child => { + if (!(child.isFolder() && settings.hideFolders)) { + add.push(child); + } + }); + + setHint('empty'); + changeItems(add, removed); +}; + +const onResize = () => { + const width = $view[0].offsetWidth; + + $view.rmCls('width-0').rmCls('width-1'); + if (width < 320) { + $view.addCls('width-0'); + } else if (width < 480) { + $view.addCls('width-1'); + } +}; + +const init = () => { + addCssStyles(); + set(); + + $view.appTo(base.$content); + $hint.hide(); + + format.setDefaultMetric(settings.binaryPrefix); + + event.sub('location.changed', onLocationChanged); + event.sub('location.refreshed', onLocationRefreshed); + event.sub('resize', onResize); + onResize(); +}; + +init(); + +module.exports = { + $el: $view, + setItems, + changeItems, + setLocation: onLocationChanged, + setHint, + getModes, + getMode, + setMode, + getSizes, + getSize, + setSize +}; diff --git a/src/_h5ai/public/js/lib/view/viewmode.js b/src/_h5ai/public/js/lib/view/viewmode.js new file mode 100644 index 0000000..75b6481 --- /dev/null +++ b/src/_h5ai/public/js/lib/view/viewmode.js @@ -0,0 +1,97 @@ +const {each, dom} = require('../util'); +const event = require('../core/event'); +const resource = require('../core/resource'); +const allsettings = require('../core/settings'); +const sidebar = require('./sidebar'); +const base = require('./base'); +const view = require('./view'); + + +const settings = Object.assign({ + modeToggle: false +}, allsettings.view); +const settingsTpl = + '

      View

      '; +const modeTpl = + `
      + viewmode-[MODE] +
      `; +const sizeTpl = + ''; +const toggleTpl = + `
      + viewmode +
      `; +let modes; +let sizes; + + +const onChanged = (mode, size) => { + dom('#viewmode-settings .mode').rmCls('active'); + dom('#viewmode-' + mode).addCls('active'); + dom('#viewmode-size').val(sizes.indexOf(size)); + + if (settings.modeToggle === 'next') { + mode = modes[(modes.indexOf(mode) + 1) % modes.length]; + } + dom('#viewmode-toggle img').attr('src', resource.image('view-' + mode)); +}; + +const addSettings = () => { + if (modes.length < 2 && sizes.length < 2) { + return; + } + + const $viewBlock = dom(settingsTpl); + + if (modes.length > 1) { + each(modes, mode => { + dom(modeTpl.replace(/\[MODE\]/g, mode)) + .on('click', () => { + view.setMode(mode); + }) + .appTo($viewBlock); + }); + } + + if (sizes.length > 1) { + const max = sizes.length - 1; + dom(sizeTpl) + .attr('max', max) + .on('input', ev => view.setSize(sizes[ev.target.valueAsNumber])) + .on('change', ev => view.setSize(sizes[ev.target.valueAsNumber])) + .appTo($viewBlock); + } + + $viewBlock.appTo(sidebar.$el); +}; + +const onToggle = () => { + const mode = view.getMode(); + const nextIdx = (modes.indexOf(mode) + 1) % modes.length; + const nextMode = modes[nextIdx]; + + view.setMode(nextMode); +}; + +const addToggle = () => { + if (settings.modeToggle && modes.length > 1) { + dom(toggleTpl) + .on('click', onToggle) + .appTo(base.$toolbar); + } +}; + +const init = () => { + modes = view.getModes(); + sizes = view.getSizes(); + + addSettings(); + addToggle(); + onChanged(view.getMode(), view.getSize()); + + event.sub('view.mode.changed', onChanged); +}; + + +init(); diff --git a/src/_h5ai/public/js/pre.js b/src/_h5ai/public/js/pre.js new file mode 100644 index 0000000..46defb0 --- /dev/null +++ b/src/_h5ai/public/js/pre.js @@ -0,0 +1,28 @@ +/* eslint-disable func-names,no-var */ +(function (win) { + if (!win || win.window !== win || !win.document) { + throw new Error('no-window'); + } + + var no_browser = 'no-browser'; + var doc_el = win.document.documentElement; + doc_el.className = ''; + + function assert(msg, expr) { + if (!expr) { + doc_el.className = no_browser; + throw new Error(no_browser + ': ' + msg); + } + } + + function is_fn(x) { + return typeof x === 'function'; + } + + assert('console', win.console && is_fn(win.console.log)); + assert('assign', win.Object && is_fn(win.Object.assign)); + assert('promise', is_fn(win.Promise)); + // assert('xhr', is_fn(win.XMLHttpRequest)); // is object in safari + assert('xhr', win.XMLHttpRequest); +}(this)); +/* eslint-enable */ diff --git a/src/_h5ai/public/js/scripts.js b/src/_h5ai/public/js/scripts.js new file mode 100644 index 0000000..e84f679 --- /dev/null +++ b/src/_h5ai/public/js/scripts.js @@ -0,0 +1 @@ +require('./lib/init'); diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..f51c817 --- /dev/null +++ b/test/index.html @@ -0,0 +1,11 @@ + + + + + h5ai test suite + + + + + + diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..7c05e22 --- /dev/null +++ b/test/index.js @@ -0,0 +1,17 @@ +if (!global.window) { + const JSDOM = require('jsdom').JSDOM; + global.window = new JSDOM('').window; +} + +const {test} = require('scar'); +const {pin_html} = require('./util/pin'); + +require('./tests/premisses'); +require('./tests/unit/core/event'); +require('./tests/unit/core/format'); +require('./tests/unit/util/naturalCmp'); +require('./tests/unit/util/parsePatten'); + +pin_html(); + +test.cli({sync: true}); diff --git a/test/tests/premisses.js b/test/tests/premisses.js new file mode 100644 index 0000000..92585c8 --- /dev/null +++ b/test/tests/premisses.js @@ -0,0 +1,7 @@ +const {test, assert} = require('scar'); + +test('window is global object', () => { + assert.ok(global.window); + assert.equal(global.window, global.window.window); + assert.ok(global.window.document); +}); diff --git a/test/tests/unit/core/event.js b/test/tests/unit/core/event.js new file mode 100644 index 0000000..19318d4 --- /dev/null +++ b/test/tests/unit/core/event.js @@ -0,0 +1,10 @@ +const {test, assert} = require('scar'); +const reqlib = require('../../../util/reqlib'); +const event = reqlib('core/event'); + +test('core.event', () => { + assert.equal(typeof event, 'object', 'is object'); + assert.deepEqual(Object.keys(event).sort(), ['sub', 'pub'].sort()); + assert.equal(typeof event.sub, 'function'); + assert.equal(typeof event.pub, 'function'); +}); diff --git a/test/tests/unit/core/format.js b/test/tests/unit/core/format.js new file mode 100644 index 0000000..b3ef8f0 --- /dev/null +++ b/test/tests/unit/core/format.js @@ -0,0 +1,12 @@ +const {test, assert} = require('scar'); +const reqlib = require('../../../util/reqlib'); +const format = reqlib('core/format'); + +test('core.format', () => { + assert.equal(typeof format, 'object'); + assert.deepEqual(Object.keys(format).sort(), ['setDefaultMetric', 'formatSize', 'setDefaultDateFormat', 'formatDate'].sort()); + assert.equal(typeof format.setDefaultMetric, 'function'); + assert.equal(typeof format.formatSize, 'function'); + assert.equal(typeof format.setDefaultDateFormat, 'function'); + assert.equal(typeof format.formatDate, 'function'); +}); diff --git a/test/tests/unit/util/naturalCmp.js b/test/tests/unit/util/naturalCmp.js new file mode 100644 index 0000000..f392ce1 --- /dev/null +++ b/test/tests/unit/util/naturalCmp.js @@ -0,0 +1,42 @@ +const {test, assert, insp} = require('scar'); +const reqlib = require('../../../util/reqlib'); +const {naturalCmp} = reqlib('util'); + +test('util.naturalCmp()', () => { + assert.equal(typeof naturalCmp, 'function', 'is function'); + + [ + '-1', + '0', + '00', + '000', + '001', + '01', + '02', + '1', + '3', + 'a0', + 'a00', + 'a1', + 'a2', + 'a 0', + 'a 00', + 'a 000', + 'a 01', + 'a 1', + 'a 2', + 'a 3', + 'a.1', + 'a.1.0', + 'a.1.1', + 'a.1.1.0', + 'a.1.10', + 'z' + ].forEach((b, idx, arr) => { + if (idx === 0) { + return; + } + const a = arr[idx - 1]; + assert.equal(naturalCmp(a, b), -1, `fix#${idx} - ${insp(a)} < ${insp(b)}`); + }); +}); diff --git a/test/tests/unit/util/parsePatten.js b/test/tests/unit/util/parsePatten.js new file mode 100644 index 0000000..506cf3d --- /dev/null +++ b/test/tests/unit/util/parsePatten.js @@ -0,0 +1,41 @@ +const {test, assert, insp} = require('scar'); +const reqlib = require('../../../util/reqlib'); +const {parsePattern} = reqlib('util'); + +test('util.parsePattern()', () => { + assert.equal(typeof parsePattern, 'function', 'is function'); + + [ + ['', false, ''], + [' ', false, '\\ '], + ['a', false, 'a'], + ['ä', false, 'ä'], + ['á', false, 'á'], + ['*', false, '\\*'], + ['ab', false, 'ab'], + ['rea', false, 'rea'], + ['re:', false, 're:'], + ['re:a', false, 're:a'], + ['a b', false, 'a\\ b'], + ['ab c', false, 'ab\\ c'], + [' a ', false, '\\ a\\ '], + + ['', true, ''], + [' ', true, ''], + ['a', true, 'a'], + ['ä', true, 'ä'], + ['á', true, 'á'], + ['*', true, '\\*'], + ['ab', true, 'a.*?b'], + ['rea', true, 'r.*?e.*?a'], + [' re:', true, 'r.*?e.*?:'], + ['are:', true, 'a.*?r.*?e.*?:'], + ['re:', true, ''], + ['re:a', true, 'a'], + ['a b', true, 'a|b'], + ['ab c', true, 'a.*?b|c'], + [' a ', true, 'a'] + ].forEach(([pattern, advanced, exp], idx) => { + assert.equal(parsePattern(pattern, advanced), exp, `fix#${idx} - (${insp(pattern)}, ${insp(advanced)}) -> ${insp(exp)}`); + }); +}); diff --git a/test/util/pin.js b/test/util/pin.js new file mode 100644 index 0000000..9034947 --- /dev/null +++ b/test/util/pin.js @@ -0,0 +1,53 @@ +const win = global.window; +const doc = win.document; + +const pinned = {}; + +const attr = (el, name, value) => { + if (typeof el === 'string') { + el = doc.querySelector(el); + } + if (value === undefined) { + return el.getAttribute(name); + } + if (value === null) { + return el.removeAttribute(name); + } + return el.setAttribute(name, value); +}; + +const root_children = () => { + return [ + ...doc.querySelector('head').childNodes, + ...doc.querySelector('body').childNodes + ]; +}; + +const pin_html = () => { + pinned.title = doc.title; + pinned.htmlId = attr('html', 'id'); + pinned.htmlClasses = attr('html', 'class'); + pinned.bodyId = attr('body', 'id'); + pinned.bodyClasses = attr('body', 'class'); + pinned.els = root_children(); + // console.log('pinned', pinned); +}; + +const restore_html = () => { + doc.title = pinned.title; + attr('html', 'id', pinned.htmlId); + attr('html', 'class', pinned.htmlClasses); + attr('body', 'id', pinned.bodyId); + attr('body', 'class', pinned.bodyClasses); + root_children().forEach(el => { + if (pinned.els.indexOf(el) < 0) { + el.remove(); + } + }); + // win.localStorage.clear(); +}; + +module.exports = { + pin_html, + restore_html +}; diff --git a/test/util/reqlib.js b/test/util/reqlib.js new file mode 100644 index 0000000..8c55112 --- /dev/null +++ b/test/util/reqlib.js @@ -0,0 +1,3 @@ +const reqlib = x => require(`../../src/_h5ai/public/js/lib/${x}`); + +module.exports = reqlib;