diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index 69fad3580..000000000 --- a/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "bower_components" -} diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..3c3629e64 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules diff --git a/.eslintrc b/.eslintrc index 5a33f9f63..7717faed0 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,12 +1,22 @@ { - "extends": "eslint:recommended", - "plugins": ["angular"], + "parser": "babel-eslint", + "plugins": [ + "react" + ], + "extends": [ + "eslint:recommended", + "plugin:react/recommended" + ], + "rules": { + "indent": [ "error", 2 ], + "react/prop-types": [ 2 ], + "no-console": [ "off" ] + }, "env": { "browser": true, "jasmine": true }, "globals": { - "angular": true, "module": true, "inject": true } diff --git a/.gitignore b/.gitignore index ca381b147..e724aca69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -bower_components/ node_modules/ dist/ .tmp/ @@ -8,3 +7,4 @@ coverage/ .sass-cache/ npm-debug.log src/app/index.version.js +.vs/ diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..5816526f9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +8.15.1 diff --git a/.travis.yml b/.travis.yml index 5c1a1612c..82c059ef1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,14 @@ language: node_js node_js: - - "4.7.2" -before_script: - - npm install -g gulp - - npm install -g bower - - npm install - - bower install -script: make build + - "8.11.3" +script: + - npm run test + - npm run build +after_script: + - ./scripts/pushToDockerhub.sh services: - docker env: global: - secure: "VBGA/BGX7MPQ+h0OyAssRvIpyMN4rWk8CyBxvL1mgw43iLZYEo6PYEGtXWnMBxgh9NMT5oymkU6PsvRfVbCbpAIdJHGe7fbM1xK7wRd8OS6VpRJWFcwVeyE56qat+I/KSnYrQ4eJTZ6Ii3h3otoDRfW5RLrw2VHRZ+//Hr6sgVY=" - - secure: "FDsSnzJEwnYJ6OQEA8MuxFuWMAcAI6pR6hRCWIpSzDK1gk2xx3tG0m39WijAUiLmUF8GxrpB1h0dmXpvbG1OHNLC97m273Qr8jAXIzHU3HqJ0BhL4sT+gPIDYf2stbYTZMieGQM8yC/OQWIckpJThEqtoGWHSJAzmQyEJmNbidg=" \ No newline at end of file + - secure: "FDsSnzJEwnYJ6OQEA8MuxFuWMAcAI6pR6hRCWIpSzDK1gk2xx3tG0m39WijAUiLmUF8GxrpB1h0dmXpvbG1OHNLC97m273Qr8jAXIzHU3HqJ0BhL4sT+gPIDYf2stbYTZMieGQM8yC/OQWIckpJThEqtoGWHSJAzmQyEJmNbidg=" diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d373f193..bd24ca284 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,20 +3,16 @@ All notable changes to this project will be documented in this file. ## [Unreleased][unreleased] -## [1.0.1] - 2015-04-27 -### Changed -- Completely refactored project structure -- Broken down data models, metrics, charts and services into multiple files -- More features included in the Gulpfile -- Clean eslint -- Todd Motto's AngularJS styleguide -- Improved filters -- Batch _indom requests -- Improved paint time +## [1.2] - 2018-02-07 -### Fixed -- Fix typos in recent README changes. -- Update outdated unreleased diff link. +### Features -[unreleased]: https://github.com/Netflix/vector/compare/v1.0.1...HEAD -[1.0.1]: https://github.com/Netflix/vector/compare/v1.0.0...v1.0.1 +- Ad-Hoc Metric Widget +- New Flame Graph Widgets + +### Fixes + +- Container widget name filter bug + +[unreleased]: https://github.com/Netflix/vector/compare/v1.2.0...HEAD +[1.2]: https://github.com/Netflix/vector/compare/v1.1.2...v1.2.0 diff --git a/Dockerfile b/Dockerfile index 08eea0882..4019f08a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,22 +12,32 @@ # See the License for the specific language governing permissions and # limitations under the License. +FROM node:8-alpine as nodebuilder + +RUN apk add --update git + +COPY . src/ +WORKDIR /src +RUN npm install +RUN npm run build-prod + +######################### + FROM alpine:latest -MAINTAINER Martin Spier RUN mkdir -p /usr/share/nginx/html -COPY /dist /usr/share/nginx/html +COPY --from=nodebuilder /src/dist /usr/share/nginx/html RUN apk add --update curl && \ curl --silent --show-error --fail --location \ --header "Accept: application/tar+gzip, application/x-gzip, application/octet-stream" -o - \ - "https://caddyserver.com/download/build?os=linux&arch=amd64" \ + "https://caddyserver.com/download/linux/amd64?license=personal" \ | tar --no-same-owner -C /usr/bin/ -xz caddy && \ chmod 0755 /usr/bin/caddy && \ /usr/bin/caddy -version && \ - apk del curl && \ + apk del curl && \ rm -rf /root/.cache /root/.config /root/.local /root/.ash_history \ - /usr/share/man /var/cache/apk/* - + /usr/share/man /var/cache/apk/* + EXPOSE 80 CMD ["/usr/bin/caddy", "-root", "/usr/share/nginx/html", "-port", "80"] VOLUME ["/usr/share/nginx/html"] diff --git a/Makefile b/Makefile deleted file mode 100644 index 9a3e5e33e..000000000 --- a/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -build: - gulp clean - gulp build -ifeq ($(TRAVIS), true) - ./buildWithTravis.sh -endif \ No newline at end of file diff --git a/README.md b/README.md index 4c965b531..b2bcbedb4 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,56 @@ ![Vector](vector.png) -[![TravisCI](https://img.shields.io/travis/Netflix/vector.svg)](https://travis-ci.org/Netflix/vector) -[![Slack Status](https://vectoross.test.netflix.net/badge.svg)](https://vectoross.test.netflix.net/) -[![NetflixOSS Lifecycle](https://img.shields.io/osslifecycle/Netflix/vector.svg)]() -[![License](https://img.shields.io/github/license/Netflix/vector.svg)](http://www.apache.org/licenses/LICENSE-2.0) -[![Docker Pulls](https://img.shields.io/docker/pulls/netflixoss/vector.svg)](https://hub.docker.com/r/netflixoss/vector/) +## Project Status +https://groups.google.com/d/msg/vector-users/MWF8nnj1WHw/1EelNPOBAwAJ -Vector is an open source on-host performance monitoring framework which exposes hand picked high resolution system and application metrics to every engineer’s browser. Having the right metrics available on-demand and at a high resolution is key to understand how a system behaves and correctly troubleshoot performance issues. +> Today we are sharing with the community that we have contributed our latest developments in this space to the PCP project and are retiring Vector as a standalone web application. Specifically, we have contributed a data source for Grafana as well as some template dashboards that we use internally. This has been picked up by the PCP team and wrapped into a formal product. This splits what Vector is and how it is used into two pieces. The bulk of the monitoring moves into a more familiar stack with Grafana, which also includes the components to collect and display performance data including BCC-based flame graphs. Additional Netflix-specific flame-graphs and related functionality has been pulled into a new internal tool called FlameCommander. +> +> We have decided to lean into the Grafana stack. Grafana is widely used, well supported, and has an extensible framework for developing visualisations and including new sources of data for processing. +> +> +> Specifically in terms of the community around Vector, we will transition it as follows: +> +> - Code will remain up and online in Github. Issues and support will be best effort. +> - The vector slack and mailing lists will disappear over time. We encourage users to move across to the PCP support channels listed at https://pcp.io/community.html. +> - For slack, you’ll want to be sure to hop in to the #grafana channel on the PCP slack. +> - Vector.io will stay up for a period and then be decommissioned. -## Disclaimer -Vector is under development and new features are added constantly. Bugs and issues are expected. We count on your support to find and report them! **Use releases for stable code.** + +[![License](https://img.shields.io/github/license/Netflix/vector.svg)](http://www.apache.org/licenses/LICENSE-2.0) + + +Vector is an open source on-host performance monitoring framework which exposes hand picked high resolution system and application metrics to every engineer’s browser. Having the right metrics available on-demand and at a high resolution is key to understand how a system behaves and correctly troubleshoot performance issues. ## Getting Started -See the [Getting Started Guide](http://vectoross.io/docs/getting-started.html) for documentation on how to get started. +See the [Getting Started Guide](http://getvector.io/docs/getting-started.html) for documentation on how to get started. + +## Developing + +Specific configuration for your environment can be set up at the following locations: +``` +src/config.js # app-wide configuration +src/charts/* # set up chart widgets +src/bundles/* # configure the high level groups +help/* # and the help panels for the charts +``` + +After you are set up, standard npm package.json commands can be used: +``` +nvm use +npm install +npm run build +npm run serve +``` + +At a high level, the remaining directories contain: +``` +src/components/* # all of the React components that compose the page +src/components/Pollers/* # the React components that talk to the PCP backend +processors/* # pcp to graph data fetch and transform components +``` ## Issues @@ -23,7 +58,7 @@ For bugs, questions and discussions please use the [GitHub Issues](https://githu ## Questions -Join Vector on [Slack](https://vectoross.slack.com/) for support and discussion. If you don't have an invite yet, [request one](http://slack.vectoross.io/) now! +Join Vector on [Slack](https://vectoross.slack.com/) for support and discussion. If you don't have an invite yet, [request one](http://slack.getvector.io/) now! You can also ask questions to other Vector users and contributors on [Google Groups](https://groups.google.com/forum/#!forum/vector-users) or [Stack Overflow](http://stackoverflow.com/questions/tagged/vectoross). diff --git a/bower.json b/bower.json deleted file mode 100644 index 19003e9d6..000000000 --- a/bower.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "vector", - "version": "1.1.0", - "authors": [ - "Martin Spier " - ], - "main": "index.html", - "license": "Apache License, v2.0", - "homepage": "https://github.com/Netflix/Vector", - "private": false, - "dependencies": { - "jquery": "~2.1.4", - "angular-route": "~1.4.10", - "bootstrap": "~3.3.6", - "angular-bootstrap": "~1.3.2", - "lodash": "~4.5.1", - "angular-toastr": "~1.5.0", - "moment": "~2.10.6", - "animate.css": "~3.4.0", - "malhar-angular-dashboard": "2.0.0", - "d3": "3.5.16", - "nvd3": "1.8.2", - "font-awesome": "4.6.1", - "angular": "~1.4.10" - }, - "devDependencies": { - "angular-mocks": "~1.4.10" - }, - "overrides": { - "bootstrap": { - "main": [ - "dist/css/bootstrap.css", - "dist/js/bootstrap.js", - "dist/fonts/glyphicons-halflings-regular.eot", - "dist/fonts/glyphicons-halflings-regular.svg", - "dist/fonts/glyphicons-halflings-regular.ttf", - "dist/fonts/glyphicons-halflings-regular.woff", - "dist/fonts/glyphicons-halflings-regular.woff2" - ] - }, - "font-awesome": { - "main": [ - "css/font-awesome.css", - "fonts/fontawesome-webfont.eot", - "fonts/fontawesome-webfont.svg", - "fonts/fontawesome-webfont.ttf", - "fonts/fontawesome-webfont.woff", - "fonts/fontawesome-webfont.woff2", - "fonts/FontAwesome.otf" - ] - } - }, - "resolutions": { - "jquery": "~2.1.4", - "angular": "~1.4.10" - } -} diff --git a/bs-config.json b/bs-config.json new file mode 100644 index 000000000..d36ebf02f --- /dev/null +++ b/bs-config.json @@ -0,0 +1,11 @@ +{ + "server": { + "baseDir": "./dist" + }, + "watchOptions": { + "ignored": [ + "node_modules", + "src" + ] + } +} diff --git a/e2e/main.spec.js b/e2e/main.spec.js deleted file mode 100644 index ef2e5c182..000000000 --- a/e2e/main.spec.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -describe('The main view', function () { - var page; - - beforeEach(function () { - browser.get('/index.html'); - page = require('./main.po'); - }); - - it('should include jumbotron with correct data', function() { - expect(page.h1El.getText()).toBe('\'Allo, \'Allo!'); - expect(page.imgEl.getAttribute('src')).toMatch(/assets\/images\/yeoman.png$/); - expect(page.imgEl.getAttribute('alt')).toBe('I\'m Yeoman'); - }); - - it('should list more than 5 awesome things', function () { - expect(page.thumbnailEls.count()).toBeGreaterThan(5); - }); - -}); diff --git a/gulp/.eslintrc b/gulp/.eslintrc deleted file mode 100644 index 10d223883..000000000 --- a/gulp/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "env": { - "node": true - } -} diff --git a/gulp/build.js b/gulp/build.js deleted file mode 100644 index 9509682c3..000000000 --- a/gulp/build.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); - -var $ = require('gulp-load-plugins')({ - pattern: ['gulp-*', 'main-bower-files', 'uglify-save-license', 'del'] -}); - -gulp.task('partials', function () { - return gulp.src([ - path.join(conf.paths.src, '/app/**/*.html'), - path.join(conf.paths.tmp, '/serve/app/**/*.html') - ]) - .pipe($.htmlmin({ - removeEmptyAttributes: true, - removeAttributeQuotes: true, - collapseBooleanAttributes: true, - collapseWhitespace: true - })) - .pipe($.angularTemplatecache('templateCacheHtml.js', { - module: 'vector', - root: 'app' - })) - .pipe(gulp.dest(conf.paths.tmp + '/partials/')); -}); - -gulp.task('html', ['inject', 'partials'], function () { - var partialsInjectFile = gulp.src(path.join(conf.paths.tmp, '/partials/templateCacheHtml.js'), { read: false }); - var partialsInjectOptions = { - starttag: '', - ignorePath: path.join(conf.paths.tmp, '/partials'), - addRootSlash: false - }; - - var htmlFilter = $.filter('*.html', { restore: true }); - var jsFilter = $.filter('**/*.js', { restore: true }); - var cssFilter = $.filter('**/*.css', { restore: true }); - - return gulp.src(path.join(conf.paths.tmp, '/serve/*.html')) - .pipe($.inject(partialsInjectFile, partialsInjectOptions)) - .pipe($.useref()) - .pipe(jsFilter) - .pipe($.sourcemaps.init()) - .pipe($.ngAnnotate()) - .pipe($.uglify({ preserveComments: $.uglifySaveLicense })).on('error', conf.errorHandler('Uglify')) - .pipe($.rev()) - .pipe($.sourcemaps.write('maps')) - .pipe(jsFilter.restore) - .pipe(cssFilter) - // .pipe($.sourcemaps.init()) - .pipe($.cssnano()) - .pipe($.rev()) - // .pipe($.sourcemaps.write('maps')) - .pipe(cssFilter.restore) - .pipe($.revReplace()) - .pipe(htmlFilter) - .pipe($.htmlmin({ - removeEmptyAttributes: true, - removeAttributeQuotes: true, - collapseBooleanAttributes: true, - collapseWhitespace: true - })) - .pipe(htmlFilter.restore) - .pipe(gulp.dest(path.join(conf.paths.dist, '/'))) - .pipe($.size({ title: path.join(conf.paths.dist, '/'), showFiles: true })); - }); - -// Only applies for fonts from bower dependencies -// Custom fonts are handled by the "other" task -gulp.task('fonts', function () { - return gulp.src($.mainBowerFiles()) - .pipe($.filter('**/*.{eot,otf,svg,ttf,woff,woff2}')) - .pipe($.flatten()) - .pipe(gulp.dest(path.join(conf.paths.dist, '/fonts/'))); -}); - -gulp.task('other', function () { - var fileFilter = $.filter(function (file) { - return file.stat.isFile(); - }); - - return gulp.src([ - path.join(conf.paths.src, '/**/*'), - path.join('!' + conf.paths.src, '/**/*.{html,css,js}') - ]) - .pipe(fileFilter) - .pipe(gulp.dest(path.join(conf.paths.dist, '/'))); -}); - -gulp.task('clean', function () { - return $.del([path.join(conf.paths.dist, '/'), path.join(conf.paths.tmp, '/')]); -}); - -gulp.task('build', ['html', 'fonts', 'other']); diff --git a/gulp/conf.js b/gulp/conf.js deleted file mode 100644 index 34397b61b..000000000 --- a/gulp/conf.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * This file contains the variables used in other gulp files - * which defines tasks - * By design, we only put there very generic config values - * which are used in several places to keep good readability - * of the tasks - */ - -var gutil = require('gulp-util'); - -/** - * The main paths of your project handle these with care - */ -exports.paths = { - src: 'src', - dist: 'dist', - tmp: '.tmp', - e2e: 'e2e' -}; - -/** - * Wiredep is the lib which inject bower dependencies in your project - * Mainly used to inject script tags in the index.html but also used - * to inject css preprocessor deps and js files in karma - */ -exports.wiredep = { - exclude: [], - directory: 'bower_components' -}; - -/** - * Common implementation for an error handler of a Gulp plugin - */ -exports.errorHandler = function(title) { - 'use strict'; - - return function(err) { - gutil.log(gutil.colors.red('[' + title + ']'), err.toString()); - this.emit('end'); - }; -}; diff --git a/gulp/e2e-tests.js b/gulp/e2e-tests.js deleted file mode 100644 index 3a66702a4..000000000 --- a/gulp/e2e-tests.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); - -var browserSync = require('browser-sync'); - -var $ = require('gulp-load-plugins')(); - -// Downloads the selenium webdriver -gulp.task('webdriver-update', $.protractor.webdriver_update); - -gulp.task('webdriver-standalone', $.protractor.webdriver_standalone); - -function runProtractor (done) { - var params = process.argv; - var args = params.length > 3 ? [params[3], params[4]] : []; - - gulp.src(path.join(conf.paths.e2e, '/**/*.js')) - .pipe($.protractor.protractor({ - configFile: 'protractor.conf.js', - args: args - })) - .on('error', function (err) { - // Make sure failed tests cause gulp to exit non-zero - throw err; - }) - .on('end', function () { - // Close browser sync server - browserSync.exit(); - done(); - }); -} - -gulp.task('protractor', ['protractor:src']); -gulp.task('protractor:src', ['serve:e2e', 'webdriver-update'], runProtractor); -gulp.task('protractor:dist', ['serve:e2e-dist', 'webdriver-update'], runProtractor); diff --git a/gulp/inject.js b/gulp/inject.js deleted file mode 100644 index c690e966d..000000000 --- a/gulp/inject.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); - -var $ = require('gulp-load-plugins')(); - -var wiredep = require('wiredep').stream; -var _ = require('lodash'); - -var browserSync = require('browser-sync'); - -gulp.task('inject-reload', ['inject'], function() { - browserSync.reload(); -}); - -gulp.task('inject', ['scripts'], function () { - var injectStyles = gulp.src([ - path.join(conf.paths.src, '/app/**/*.css') - ], { read: false }); - - var injectScripts = gulp.src([ - path.join(conf.paths.src, '/app/**/*.module.js'), - path.join(conf.paths.src, '/app/**/*.js'), - path.join('!' + conf.paths.src, '/app/**/*.spec.js'), - path.join('!' + conf.paths.src, '/app/**/*.mock.js'), - ]) - .pipe($.angularFilesort()).on('error', conf.errorHandler('AngularFilesort')); - - var injectOptions = { - ignorePath: [conf.paths.src, path.join(conf.paths.tmp, '/serve')], - addRootSlash: false - }; - - return gulp.src(path.join(conf.paths.src, '/*.html')) - .pipe($.inject(injectStyles, injectOptions)) - .pipe($.inject(injectScripts, injectOptions)) - .pipe(wiredep(_.extend({}, conf.wiredep))) - .pipe(gulp.dest(path.join(conf.paths.tmp, '/serve'))); -}); diff --git a/gulp/scripts.js b/gulp/scripts.js deleted file mode 100644 index df60d7b37..000000000 --- a/gulp/scripts.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); -var lintspaces = require('gulp-lintspaces'); -var git = require('gulp-git'); -var fs = require('fs'); - -var browserSync = require('browser-sync'); - -var $ = require('gulp-load-plugins')(); - - -gulp.task('scripts-reload', function() { - return buildScripts() - .pipe(browserSync.stream()); -}); - -gulp.task('version', function () { - git.exec({args : 'describe'}, function (err, stdout) { - if (err) throw err; - fs.writeFile('src/app/index.version.js','(function () { \'use strict\'; angular.module(\'vector\').constant(\'version\', { \'id\': \'{version}\' }); })();'.replace('{version}', stdout.substring(0, stdout.length - 1))); - }); -}); - -gulp.task('lintspaces', function() { - return gulp.src(['src/**/*.js']) - .pipe(lintspaces({ - editorconfig: '.editorconfig', - ignores: [ - 'js-comments' - ] - })) - .pipe(lintspaces.reporter()); -}); - -gulp.task('scripts', ['version'], function() { - return buildScripts(); -}); - -function buildScripts() { - return gulp.src(path.join(conf.paths.src, '/app/**/*.js')) - .pipe($.eslint()) - .pipe($.eslint.format()) - .pipe($.size()) -}; diff --git a/gulp/server.js b/gulp/server.js deleted file mode 100644 index 500b0c0d0..000000000 --- a/gulp/server.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); - -var browserSync = require('browser-sync'); -var browserSyncSpa = require('browser-sync-spa'); - -var util = require('util'); - -var proxyMiddleware = require('http-proxy-middleware'); - -function browserSyncInit(baseDir, browser) { - browser = browser === undefined ? 'default' : browser; - - var routes = null; - if(baseDir === conf.paths.src || (util.isArray(baseDir) && baseDir.indexOf(conf.paths.src) !== -1)) { - routes = { - '/bower_components': 'bower_components' - }; - } - - var server = { - baseDir: baseDir, - routes: routes - }; - - /* - * You can add a proxy to your backend by uncommenting the line below. - * You just have to configure a context which will we redirected and the target url. - * Example: $http.get('/users') requests will be automatically proxified. - * - * For more details and option, https://github.com/chimurai/http-proxy-middleware/blob/v0.9.0/README.md - */ - // server.middleware = proxyMiddleware('/users', {target: 'http://jsonplaceholder.typicode.com', changeOrigin: true}); - - browserSync.instance = browserSync.init({ - startPath: '/', - server: server, - browser: browser - }); -} - -browserSync.use(browserSyncSpa({ - selector: '[ng-app]'// Only needed for angular apps -})); - -gulp.task('serve', ['watch'], function () { - browserSyncInit([path.join(conf.paths.tmp, '/serve'), conf.paths.src]); -}); - -gulp.task('serve:dist', ['build'], function () { - browserSyncInit(conf.paths.dist); -}); - -gulp.task('serve:e2e', ['inject'], function () { - browserSyncInit([conf.paths.tmp + '/serve', conf.paths.src], []); -}); - -gulp.task('serve:e2e-dist', ['build'], function () { - browserSyncInit(conf.paths.dist, []); -}); diff --git a/gulp/unit-tests.js b/gulp/unit-tests.js deleted file mode 100644 index 576887aef..000000000 --- a/gulp/unit-tests.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); - -var karma = require('karma'); - -var pathSrcHtml = [ - path.join(conf.paths.src, '/**/*.html') -]; - -var pathSrcJs = [ - path.join(conf.paths.src, '/**/!(*.spec).js') -]; - -function runTests (singleRun, done) { - var reporters = ['progress']; - var preprocessors = {}; - - pathSrcHtml.forEach(function(path) { - preprocessors[path] = ['ng-html2js']; - }); - - if (singleRun) { - pathSrcJs.forEach(function(path) { - preprocessors[path] = ['coverage']; - }); - reporters.push('coverage') - } - - var localConfig = { - configFile: path.join(__dirname, '/../karma.conf.js'), - singleRun: singleRun, - autoWatch: !singleRun, - reporters: reporters, - preprocessors: preprocessors - }; - - var server = new karma.Server(localConfig, function(failCount) { - done(failCount ? new Error("Failed " + failCount + " tests.") : null); - }) - server.start(); -} - -gulp.task('test', ['scripts'], function(done) { - runTests(true, done); -}); - -gulp.task('test:auto', ['watch'], function(done) { - runTests(false, done); -}); diff --git a/gulp/watch.js b/gulp/watch.js deleted file mode 100644 index fba2f86f5..000000000 --- a/gulp/watch.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -var path = require('path'); -var gulp = require('gulp'); -var conf = require('./conf'); - -var browserSync = require('browser-sync'); - -function isOnlyChange(event) { - return event.type === 'changed'; -} - -gulp.task('watch', ['inject'], function () { - - gulp.watch([path.join(conf.paths.src, '/*.html'), 'bower.json'], ['inject-reload']); - - gulp.watch(path.join(conf.paths.src, '/app/**/*.css'), function(event) { - if(isOnlyChange(event)) { - browserSync.reload(event.path); - } else { - gulp.start('inject-reload'); - } - }); - - gulp.watch(path.join(conf.paths.src, '/app/**/*.js'), function(event) { - if(isOnlyChange(event)) { - gulp.start('scripts-reload'); - } else { - gulp.start('inject-reload'); - } - }); - - gulp.watch(path.join(conf.paths.src, '/app/**/*.html'), function(event) { - browserSync.reload(event.path); - }); -}); diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index e0f2ebec2..000000000 --- a/gulpfile.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Welcome to your gulpfile! - * The gulp tasks are split into several files in the gulp directory - * because putting it all here was too long - */ - -'use strict'; - -var gulp = require('gulp'); -var wrench = require('wrench'); - -/** - * This will load all js or coffee files in the gulp directory - * in order to load all gulp tasks - */ -wrench.readdirSyncRecursive('./gulp').filter(function(file) { - return (/\.(js|coffee)$/i).test(file); -}).map(function(file) { - require('./gulp/' + file); -}); - -/** - * Default task clean temporaries directories and launch the - * main optimization build task - */ -gulp.task('default', ['clean'], function () { - gulp.start('build'); -}); diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 3236b5f3f..000000000 --- a/karma.conf.js +++ /dev/null @@ -1,111 +0,0 @@ -'use strict'; - -var path = require('path'); -var conf = require('./gulp/conf'); - -var _ = require('lodash'); -var wiredep = require('wiredep'); - -var pathSrcHtml = [ - path.join(conf.paths.src, '/**/*.html') -]; - -function listFiles() { - var wiredepOptions = _.extend({}, conf.wiredep, { - dependencies: true, - devDependencies: true - }); - - var patterns = wiredep(wiredepOptions).js - .concat([ - path.join(conf.paths.src, '/app/**/*.module.js'), - path.join(conf.paths.src, '/app/**/*.js'), - path.join(conf.paths.src, '/**/*.spec.js'), - path.join(conf.paths.src, '/**/*.mock.js'), - ]) - .concat(pathSrcHtml); - - var files = patterns.map(function(pattern) { - return { - pattern: pattern - }; - }); - files.push({ - pattern: path.join(conf.paths.src, '/assets/**/*'), - included: false, - served: true, - watched: false - }); - return files; -} - -module.exports = function(config) { - - var configuration = { - files: listFiles(), - - singleRun: true, - - autoWatch: false, - - ngHtml2JsPreprocessor: { - stripPrefix: conf.paths.src + '/', - moduleName: 'vector' - }, - - logLevel: 'WARN', - - frameworks: ['phantomjs-shim', 'jasmine', 'angular-filesort'], - - angularFilesort: { - whitelist: [path.join(conf.paths.src, '/**/!(*.html|*.spec|*.mock).js')] - }, - - browsers : ['PhantomJS'], - - plugins : [ - 'karma-phantomjs-launcher', - 'karma-angular-filesort', - 'karma-phantomjs-shim', - 'karma-coverage', - 'karma-jasmine', - 'karma-ng-html2js-preprocessor' - ], - - coverageReporter: { - type : 'html', - dir : 'coverage/' - }, - - reporters: ['progress'], - - proxies: { - '/assets/': path.join('/base/', conf.paths.src, '/assets/') - } - }; - - // This is the default preprocessors configuration for a usage with Karma cli - // The coverage preprocessor is added in gulp/unit-test.js only for single tests - // It was not possible to do it there because karma doesn't let us now if we are - // running a single test or not - configuration.preprocessors = {}; - pathSrcHtml.forEach(function(path) { - configuration.preprocessors[path] = ['ng-html2js']; - }); - - // This block is needed to execute Chrome on Travis - // If you ever plan to use Chrome and Travis, you can keep it - // If not, you can safely remove it - // https://github.com/karma-runner/karma/issues/1144#issuecomment-53633076 - if(configuration.browsers[0] === 'Chrome' && process.env.TRAVIS) { - configuration.customLaunchers = { - 'chrome-travis-ci': { - base: 'Chrome', - flags: ['--no-sandbox'] - } - }; - configuration.browsers = ['chrome-travis-ci']; - } - - config.set(configuration); -}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..1dc270d20 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15525 @@ +{ + "name": "vector", + "version": "2.0.0-beta1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.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==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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=" + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", + "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0", + "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.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==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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=" + } + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", + "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", + "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", + "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", + "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/polyfill": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.4.tgz", + "integrity": "sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==", + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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" + } + } + } + }, + "@jest/core": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", + "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.8.0", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "jest-watcher": "^24.8.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", + "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/fake-timers": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", + "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/reporters": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", + "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.1.1", + "jest-haste-map": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + }, + "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" + } + } + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "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 + } + } + }, + "@jest/test-result": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", + "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", + "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0" + } + }, + "@jest/transform": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", + "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.8.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.8.0", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + }, + "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" + } + } + } + }, + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, + "@mapbox/polylabel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/polylabel/-/polylabel-1.0.2.tgz", + "integrity": "sha1-xXFGGbZa3QgmOOoGAn5psUUA76Y=", + "requires": { + "tinyqueue": "^1.1.0" + } + }, + "@types/babel__core": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", + "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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 + } + } + }, + "@types/d3-selection": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.0.10.tgz", + "integrity": "sha1-3PsN3837GtJq6kNRMjdx4a6pboQ=" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "24.0.16", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.16.tgz", + "integrity": "sha512-JrAiyV+PPGKZzw6uxbI761cHZ0G7QMOHXPhtSpcl08rZH6CswXaaejckn3goFKmF7M3nzEoJ0lwYCbqLMmjziQ==", + "dev": true, + "requires": { + "@types/jest-diff": "*" + } + }, + "@types/jest-diff": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", + "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", + "dev": true + }, + "@types/node": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", + "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "^3.2.0" + } + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "acorn-globals": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "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-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "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 + }, + "array.prototype.flat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", + "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "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" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "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-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "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 + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "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.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-eslint": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.5.tgz", + "integrity": "sha512-TcdEGCHHquOPQOlH6Fe6MLwPWWWJLdeKhcGoLfOTShETpoH8XYWhjWJw38KCKaTca7c/EdxLolnbakixKxnXDg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "~3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "babel-jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", + "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "dev": true, + "requires": { + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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" + } + } + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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 + }, + "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" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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 + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + } + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "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, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "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" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + } + } + }, + "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": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "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.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "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" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "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.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30000987", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000987.tgz", + "integrity": "sha512-O3VrjtRMTxoU5Cn5/QSmXeIR1gkVps4j9jqfIm4FLaQ5JzqBlVjMUG1xWnoYFv8N+H3Lp++aa05TekyIbjHL7g==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.206.tgz", + "integrity": "sha512-djq9Ehxs2rwPh7pyY1GMf8vkOWPoK8eoMp913E4t0UaEXvbnOsiSowBBHI8YoN4aKVQJjvxQp5I0LdZkT3Uzmw==", + "dev": true + } + } + }, + "bser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "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": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.x" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "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.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "requires": { + "color-name": "1.1.1" + } + }, + "color-hash": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/color-hash/-/color-hash-1.0.3.tgz", + "integrity": "sha1-wOeVLwbQIuVI5l2iOVEr1n04Ce4=" + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "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.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "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 + }, + "copy-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + } + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-js-compat": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", + "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", + "dev": true, + "requires": { + "browserslist": "^4.6.2", + "core-js-pure": "3.1.4", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", + "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==", + "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=" + }, + "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" + } + }, + "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": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "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" + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "icss-utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", + "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "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" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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 + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "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" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "d3-bboxCollide": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-bboxCollide/-/d3-bboxCollide-1.0.4.tgz", + "integrity": "sha512-Sc8FKGGeejlowLW1g/0WBrVcbd++SBRW4N8OuZhVeRAfwlTL96+75JKlFfHweYdYRui1zPabfNXZrNaphBjS+w==", + "requires": { + "d3-quadtree": "1.0.1" + } + }, + "d3-brush": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", + "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" + }, + "d3-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.0.tgz", + "integrity": "sha512-dmL9Zr/v39aSSMnLOTd58in2RbregCg4UtGyUArvEKTTN6S3HKEy+ziBWVYo9PTzRyVW+pUBHUtRKz0HYX+SQg==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + }, + "d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-ease": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", + "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" + }, + "d3-force": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", + "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.0.tgz", + "integrity": "sha512-ycfLEIzHVZC3rOvuBOKVyQXSiUyCDjeAPIj9n/wugrr+s5AcTQC2Bz6aKkubG7rQaQF0SGW/OV4UEJB9nfioFg==" + }, + "d3-glyphedge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-glyphedge/-/d3-glyphedge-1.2.0.tgz", + "integrity": "sha512-F49fyMXMLYDHvqvxSmuGZrtIWeWLZWxar82WL1CJDBDPk4z6GUGSG4wX7rdv7N7R/YazAyMMnpOL0YQcmTLlOQ==" + }, + "d3-hexbin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", + "integrity": "sha1-nFg32s/UcasFM3qeke8Qv8T5iDE=" + }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + }, + "d3-interpolate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", + "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "d3-quadtree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.1.tgz", + "integrity": "sha1-E74CViTxEEBe1DU2xQaq7Bme1ZE=" + }, + "d3-sankey-circular": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/d3-sankey-circular/-/d3-sankey-circular-0.25.0.tgz", + "integrity": "sha512-maYak22afBAvmybeaopd1cVUNTIroEHhWCmh19gEQ+qgOhBkTav8YeP3Uw4OV/K4OksWaQrhhBOE4Rcxgc2JbQ==", + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0" + } + }, + "d3-scale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.0.tgz", + "integrity": "sha512-Bb2N3ZgzPdKVEoWGkt8lPV6R7YdpSBWI70Xf26NQHOVjs77a6gLUmBOOPt9d9nB8JiQhwXY1RHCa+eSyWCJZIQ==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" + }, + "d3-shape": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", + "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", + "requires": { + "d3-path": "1" + } + }, + "d3-svg-legend": { + "version": "2.25.6", + "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-2.25.6.tgz", + "integrity": "sha1-jY3BvWk8N47ki2+CPook5o8uGtI=", + "requires": { + "@types/d3-selection": "1.0.10", + "d3-array": "1.0.1", + "d3-dispatch": "1.0.1", + "d3-format": "1.0.2", + "d3-scale": "1.0.3", + "d3-selection": "1.0.2", + "d3-transition": "1.0.3" + }, + "dependencies": { + "d3-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.0.1.tgz", + "integrity": "sha1-N1wCh0/NlsFu2fG89bSnvlPzWOc=" + }, + "d3-dispatch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.1.tgz", + "integrity": "sha1-S9ZaQ87P9DGN653yRVKqi/KBqEA=" + }, + "d3-format": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.0.2.tgz", + "integrity": "sha1-E4YYMgtLvrQ7XA/zBRkHn7vXN14=" + }, + "d3-scale": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.3.tgz", + "integrity": "sha1-T56PDMLqDzkl/wSsJ63AkEX6TJA=", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.0.2.tgz", + "integrity": "sha1-rmYq/UcCrJxdoDmyEHoXZPockHA=" + }, + "d3-transition": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.0.3.tgz", + "integrity": "sha1-kdyYa92zCXNjkyCoXbcs5KsaJ7s=", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-timer": "1" + } + } + } + }, + "d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + }, + "d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", + "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + }, + "d3-transition": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.3.tgz", + "integrity": "sha512-tEvo3qOXL6pZ1EzcXxFcPNxC/Ygivu5NoBY6mbzidATAeML86da+JfVIUzon3dNM6UX6zjDx+xbYDmMVtTSjuA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "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-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "dev": true + }, + "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" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "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 + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "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.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "enzyme": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.9.0.tgz", + "integrity": "sha512-JqxI2BRFHbmiP7/UFqvsjxTirWoM1HfeaJrmVSZ9a1EADKkZgdPcAuISPMpoUiHlac9J4dYt81MC5BBIrbJGMg==", + "dev": true, + "requires": { + "array.prototype.flat": "^1.2.1", + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.1.0", + "has": "^1.0.3", + "html-element-map": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.4", + "is-number-object": "^1.0.3", + "is-regex": "^1.0.4", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.6.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3", + "string.prototype.trim": "^1.1.2" + } + }, + "enzyme-adapter-react-16": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", + "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", + "dev": true, + "requires": { + "enzyme-adapter-utils": "^1.3.0", + "lodash": "^4.17.4", + "object.assign": "^4.0.4", + "object.values": "^1.0.4", + "prop-types": "^15.6.0", + "react-reconciler": "^0.7.0", + "react-test-renderer": "^16.0.0-0" + } + }, + "enzyme-adapter-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", + "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", + "dev": true, + "requires": { + "object.assign": "^4.1.0", + "prop-types": "^15.6.0" + } + }, + "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" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "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=" + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "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 + } + } + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "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" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 + }, + "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.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "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" + } + } + } + }, + "eslint-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.0.0.tgz", + "integrity": "sha512-VxxGDI4bXzLk0+/jMt/0EkGMRKS9ox6Czx+yapMb9WJmcS/ZHhlhqcVUNgUjFBNp02j/2pZLdGOrG7EXyjoz/g==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-plugin-react": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.10.0.tgz", + "integrity": "sha512-18rzWn4AtbSUxFKKM7aCVcj5LXOhOKdwBino3KKWy4psxfPW0YtIbE8WNRDUdyHFL50BeLb6qFd4vpvNYyp7hw==", + "dev": true, + "requires": { + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "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.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "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" + } + } + } + }, + "expect": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0" + }, + "dependencies": { + "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" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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" + } + } + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "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=" + }, + "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=" + }, + "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 + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "requires": { + "is-buffer": "~2.0.3" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "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" + } + } + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "font-awesome": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.6.1.tgz", + "integrity": "sha1-VHJl+0xFu+2Qq4vE93qXs3uFKhI=" + }, + "font-awesome-webpack-4": { + "version": "git+https://github.com/tapz/font-awesome-webpack.git#da547ed91064b408500131f837f17f423ce89411", + "from": "git+https://github.com/tapz/font-awesome-webpack.git#da547ed91064b408500131f837f17f423ce89411", + "requires": { + "css-loader": "~1.0.0", + "less-loader": "~4.1.0", + "style-loader": "~0.22.1" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "css-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "style-loader": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.22.1.tgz", + "integrity": "sha512-WXUrLeinPIR1Oat3PfCDro7qTniwNTJqGqv1KcQiL3JR5PzrVLTyNsd9wTsPXG/qNCJ7lzR2NY/QDjFsP7nuSQ==", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "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.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, + "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": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": 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 + }, + "function.prototype.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", + "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "is-callable": "^1.1.3" + } + }, + "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 + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "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" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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" + } + }, + "global-modules-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.1.0.tgz", + "integrity": "sha512-3DrmGj2TP+96cABk9TfMp6f3knH/Y46dqvWznTU3Tf6/bDGLDAn15tFluQ7BcloykOcdY16U0WGq0BQblYOxJQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "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 + } + } + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "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-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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": { + "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-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" + } + } + } + }, + "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.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "history": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", + "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", + "requires": { + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "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" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-element-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.0.1.tgz", + "integrity": "sha512-BZSfdEm6n706/lBfXKWa4frZRZcT5k1cOusw95ijZsHlI+GdgY0v95h6IzO3iIDf2ROwq570YTwqNPqHcNMozw==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "requires": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "html-minifier": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.18.tgz", + "integrity": "sha512-sczoq/9zeXiKZMj8tsQzHJE7EyjrpMHvblTLuh9o8h5923a6Ts5uQ/3YdY+xIqJYRjzHQPlrHjfjh0BtwPJG0g==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.16.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-server-spa": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/http-server-spa/-/http-server-spa-1.3.0.tgz", + "integrity": "sha512-NfXBksDzoiBOo1IrMDtxpKJ8FOHLqy0YdijYjqMoRcS7AWPf6MzhRvKe2KiXxENlqTRqkOH418SvbxC6GzG2TA==", + "requires": { + "mime": "^1.3.4" + } + }, + "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.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "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": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "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 + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "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.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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" + } + }, + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "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" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "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, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "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" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "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-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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "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" + } + }, + "is-number-object": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true + }, + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "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=" + }, + "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 + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "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 + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" + } + }, + "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 + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "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" + } + }, + "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 + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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 + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.8.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "jest-cli": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "dev": true, + "requires": { + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-changed-files": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", + "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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" + } + } + } + }, + "jest-config": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-diff": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-docblock": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", + "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-environment-jsdom": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", + "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", + "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0" + } + }, + "jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true + }, + "jest-haste-map": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", + "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + } + } + }, + "jest-jasmine2": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.8.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.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 + }, + "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 + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "jest-leak-detector": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", + "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "dev": true, + "requires": { + "pretty-format": "^24.8.0" + } + }, + "jest-matcher-utils": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-message-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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" + } + } + } + }, + "jest-mock": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "dev": true + }, + "jest-resolve": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", + "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" + } + }, + "jest-runner": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", + "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-leak-detector": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "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 + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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" + } + } + } + }, + "jest-runtime": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", + "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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" + } + } + } + }, + "jest-serializer": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "dev": true + }, + "jest-snapshot": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", + "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "expect": "^24.8.0", + "jest-diff": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.8.0", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "jest-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + }, + "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" + } + } + } + }, + "jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-watcher": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.8.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + } + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "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==" + }, + "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 + }, + "json2csv": { + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-3.11.5.tgz", + "integrity": "sha512-ORsw84BuRKMLxfI+HFZuvxRDnsJps53D5fIGr6tLn4ZY+ymcG8XU00E+JJ2wfAiHx5w2QRNmOLE8xHiGAeSfuQ==", + "requires": { + "cli-table": "^0.3.1", + "commander": "^2.8.1", + "debug": "^3.1.0", + "flat": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.0", + "lodash.set": "^4.3.0", + "lodash.uniq": "^4.5.0", + "path-is-absolute": "^1.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "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" + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "keyboard-key": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.0.1.tgz", + "integrity": "sha512-OAfjaSI917BOonwfH6LQHMZJRv5035jjZvgElouB/DM4I7l5zEjrA15RD80YwIjhN69xqEfWCZIbhBcGpb85Ig==" + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "labella": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/labella/-/labella-1.1.4.tgz", + "integrity": "sha1-xsxaNA6N80DrM1YzaD6lm4KMMi0=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "less": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.5.3.tgz", + "integrity": "sha512-MMGXfVYMORHyfwWGOP04HNnDxX874A329FMZEiMuho+QvOXJMyjlsmnf3qUxr1KmwM1E8mVo2bOPbT4A8aF61w==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.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, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + } + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "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" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "dev": true + }, + "lodash.every": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", + "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.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": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.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" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memoize-one": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.0.tgz", + "integrity": "sha512-wdpOJ4XBejprGn/xhd1i2XR8Dv1A25FJeIvR7syQhQlz9eXsv+06llcvcmBxlWVGv4C73QBsWA8kxvZozzNwiQ==" + }, + "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-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "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" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "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" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "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": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "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": "^2.0.1", + "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" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "moo": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", + "dev": true + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "dev": true, + "optional": 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" + }, + "dependencies": { + "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 + }, + "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 + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": 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 + }, + "nearley": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.16.0.tgz", + "integrity": "sha512-Tr9XD3Vt/EujXbZBv6UAHYoLUSMQAxSsTnm9K3koXzjzNWY195NqALeyrzLZBKzAkL3gl92BcSogqrHjD8QuUg==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "moo": "^0.4.3", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "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-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "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": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "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.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "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=" + }, + "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" + } + } + } + }, + "object-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==", + "dev": true + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "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" + } + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.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" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "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 + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "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" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "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.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "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" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "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 + }, + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "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==" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "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=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "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.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 + }, + "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-modules-extract-imports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + }, + "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 + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "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.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "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==", + "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 + }, + "prompts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", + "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "dev": true, + "requires": { + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "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 + }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "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" + } + }, + "react": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.4.1.tgz", + "integrity": "sha512-3GEs0giKp6E0Oh/Y9ZC60CmYgUPnp7voH9fbjWsvXtYFb4EWtgQub0ADSq0sJR0BbHc4FThLLtzlcFaFXIorwg==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-annotation": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-annotation/-/react-annotation-1.3.1.tgz", + "integrity": "sha512-jwbl7v5fMvkQrqdFWIIjuziqUzvEwyzhhSJ61bFjxPDEIizRuWf0ym6o6dV034toePs429sG6btGaLWGMC9zEw==", + "requires": { + "prop-types": "15.6.0", + "viz-annotation": "0.0.1-3" + }, + "dependencies": { + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + } + } + }, + "react-dom": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.1.tgz", + "integrity": "sha512-1Gin+wghF/7gl4Cqcvr1DxFX2Osz7ugxSwl6gBqCMpdrxHjIFUS7GYxrFftZ9Ln44FHw0JxCFD9YtZsrbR5/4A==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-draggable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.0.5.tgz", + "integrity": "sha512-qo76q6+pafyGllbmfc+CgWfOkwY9v3UoJa3jp6xG2vdsRY8uJTN1kqNievLj0uVNjEqCvZ0OFiEBxlAJNj3OTg==", + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, + "react-error-boundary": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-1.2.3.tgz", + "integrity": "sha512-3naGugvlzwcYjiqPr8o89oYHe2R5QxK6ysCQj/GvyenBvruVHu2hRsuWvjQcNbNiiOkEPYKfcMm7tV/Tfle5rA==" + }, + "react-grid-layout": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-0.16.6.tgz", + "integrity": "sha512-h2EsYgsqcESLJeevQSJsEKp8hhh+phOlXDJoMhlV2e7T3VWQL+S6iCF3iD/LK19r4oyRyOMDEir0KV+eLXrAyw==", + "requires": { + "classnames": "2.x", + "lodash.isequal": "^4.0.0", + "prop-types": "15.x", + "react-draggable": "3.x", + "react-resizable": "1.x" + } + }, + "react-is": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", + "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", + "dev": true + }, + "react-reconciler": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", + "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-resizable": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-1.7.5.tgz", + "integrity": "sha512-lauPcBsLqmxMHXHpTeOBpYenGalbSikYr8hK+lwtNYMQX1pGd2iYE+pDvZEV97nCnzuCtWM9htp7OpsBIY2Sjw==", + "requires": { + "prop-types": "15.x", + "react-draggable": "^2.2.6 || ^3.0.3" + } + }, + "react-router": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", + "requires": { + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" + } + }, + "react-router-dom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", + "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", + "requires": { + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" + } + }, + "react-test-renderer": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.4.1.tgz", + "integrity": "sha512-wyyiPxRZOTpKnNIgUBOB6xPLTpIzwcQMIURhZvzUqZzezvHjaGNsDPBhMac5fIY3Jf5NuKxoGvV64zDSOECPPQ==", + "dev": true, + "requires": { + "fbjs": "^0.8.16", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0", + "react-is": "^16.4.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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 + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "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" + } + }, + "regexp-tree": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + }, + "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 + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + }, + "dependencies": { + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "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.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.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.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "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-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "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 + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "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" + } + }, + "roughjs-es5": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/roughjs-es5/-/roughjs-es5-0.1.0.tgz", + "integrity": "sha512-NMjzoBgSYk8qEYLSxzxytS20sfdQV7zg119FZjFDjIDwaqodFcf7QwzKbqM64VeAYF61qogaPLk3cs8Gb+TqZA==", + "requires": { + "babel-runtime": "^6.26.0" + } + }, + "rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "requires": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "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" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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==" + }, + "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==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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" + } + } + } + }, + "sass-loader": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.3.tgz", + "integrity": "sha512-iaSFtQcGo4SSgDw5Aes5p4VTrA5jCGSA7sGmhPIcOloBlgI1VktM2MUrk2IHHjbNagckXlPz+HWq1vAAPrcYxA==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semantic-ui-css": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.3.3.tgz", + "integrity": "sha512-/UDs+a07LdxmYgVNqkbW9x5Gil1Dt4HnVq4LrHKKUAD/DUDh0fnwmCxbQFyKKD+YsVDQWFqftyVbYKlClBFLDw==", + "requires": { + "jquery": "x.*" + } + }, + "semantic-ui-react": { + "version": "0.82.0", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.82.0.tgz", + "integrity": "sha512-bYfQ6NNT+1r9G+pPbpFGhj4aysOyVj/2fziJbknwIzwqUXfGjsIonsKNpMmUSxJBKbYMIUlbqxW1EhsG0Ire8w==", + "requires": { + "@babel/runtime": "^7.0.0-beta.49", + "classnames": "^2.2.5", + "keyboard-key": "^1.0.1", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "shallowequal": "^1.0.2" + } + }, + "semiotic": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/semiotic/-/semiotic-1.14.2.tgz", + "integrity": "sha512-k83L7xRy8anlZUFA1A62LiQy2v3YmvlEhQUtG6dYb9z2DUEbHs/PdZN1WRdGIBFDx7haOakhr4jMHgiLTHuEPw==", + "requires": { + "@mapbox/polylabel": "1", + "d3-array": "^1.2.0", + "d3-bboxCollide": "^1.0.3", + "d3-brush": "^1.0.4", + "d3-chord": "^1.0.4", + "d3-collection": "^1.0.1", + "d3-contour": "^1.1.1", + "d3-force": "^1.0.2", + "d3-glyphedge": "^1.2.0", + "d3-hexbin": "^0.2.2", + "d3-hierarchy": "^1.1.3", + "d3-interpolate": "^1.1.5", + "d3-sankey-circular": "0.25.0", + "d3-scale": "^1.0.3", + "d3-selection": "^1.1.0", + "d3-shape": "^1.0.4", + "d3-voronoi": "^1.0.2", + "json2csv": "3.11.5", + "labella": "1.1.4", + "memoize-one": "4.0.0", + "object-assign": "4.1.1", + "promise": "8.0.1", + "prop-types": "15.6.0", + "raf": "3.4.0", + "react-annotation": "1.3.1", + "roughjs-es5": "0.1.0", + "semiotic-mark": "0.3.0", + "svg-path-bounding-box": "1.0.4", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", + "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + } + } + }, + "semiotic-mark": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semiotic-mark/-/semiotic-mark-0.3.0.tgz", + "integrity": "sha512-GxyrIyntvs+TXK8KOJKzs3AnvMM7Cb7ywfAeJKEQ/GKMKwaZvQnuGrz3dSImjfH7xvf4E2AmDIggqgHISt1X4Q==", + "requires": { + "d3-interpolate": "^1.1.5", + "d3-scale": "^1.0.3", + "d3-selection": "^1.1.0", + "d3-shape": "^1.0.3", + "d3-transition": "^1.0.3", + "prop-types": "^15.6.0", + "roughjs-es5": "0.1.0" + }, + "dependencies": { + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "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=" + }, + "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" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "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 + } + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sisteransi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.2.tgz", + "integrity": "sha512-ZcYcZcT69nSLAR2oLN2JwNmLkJEKGooFMCdvOkFrToUt/WfcRWqhIg4P4KwY4dmLbuyXIx4o4YmPsvMRJYJd/w==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "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" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "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 + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "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.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "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": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "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.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + } + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svg-path-bounding-box": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/svg-path-bounding-box/-/svg-path-bounding-box-1.0.4.tgz", + "integrity": "sha1-7XPfODyLR4abZQjwWPV0j4gzwHA=", + "requires": { + "svgpath": "^2.0.0" + } + }, + "svgpath": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.2.1.tgz", + "integrity": "sha1-CDS7Z8iadkcrK9BswQH6e1F7Iiw=" + }, + "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": "5.3.2", + "resolved": "https://registry.npmjs.org/table/-/table-5.3.2.tgz", + "integrity": "sha512-gDBrfla2z1JiBio5BE7nudwkjTjPOTduCzJC94fc1JjnuzI+tUsMiDskxFQCskxAtMB2c/ZwD6R2lg65zCptdQ==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "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" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "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 + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tinyqueue": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz", + "integrity": "sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "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-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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "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, + "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" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", + "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" + }, + "uglify-js": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.4.tgz", + "integrity": "sha512-RiB1kNcC9RMyqwRrjXC+EjgLoXULoDnCaOnEDzUCHkBN0bHwmtF5rzDMiDWU29gu0kXCRRWwtcTAVFWRECmU2Q==", + "dev": true, + "requires": { + "commander": "~2.16.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 + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", + "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "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 + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "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" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "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 + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": 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==", + "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 + } + } + }, + "url-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.0.1.tgz", + "integrity": "sha512-rAonpHy7231fmweBKUFe0bYnlGDty77E+fm53NZdij7j/YOpyGzc7ttqG1nAXl3aRs0k41o0PC3TvGXQiw2Zvw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^0.4.3" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", + "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", + "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" + }, + "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" + } + }, + "viz-annotation": { + "version": "0.0.1-3", + "resolved": "https://registry.npmjs.org/viz-annotation/-/viz-annotation-0.0.1-3.tgz", + "integrity": "sha512-jZSnuAsfu3MKGa2vAShzw3oUG71tfVmk0DQvYG/YbQ1Kpc5AlU0v2lgHekO2nVPvIiM6mWrfIths4IZBYTh0xQ==" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.1.tgz", + "integrity": "sha512-rAVtTNZw+cQPjvGp1ox0XC5Q2IBFyqoqh+QII4J/oguyu83Bax1apbo2eqB8bHRS+fqYUBagys6lqUoVwKSmXQ==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "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" + } + }, + "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": { + "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" + } + }, + "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-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" + } + }, + "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 + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": 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, + "requires": { + "is-extglob": "^2.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-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": "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" + } + }, + "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" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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" + } + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.15.1.tgz", + "integrity": "sha512-UwfFQ2plA5EMhhzwi/hl5xpLk7mNK7p0853Ml04z1Bqw553pY+oS8Xke3funcVy7eG/yMpZPvnlFTUyGKyKoyw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^3.7.1", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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" + } + }, + "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": { + "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" + } + }, + "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-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" + } + }, + "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 + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "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-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": "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" + } + }, + "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" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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" + } + } + } + }, + "webpack-auto-inject-version": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-auto-inject-version/-/webpack-auto-inject-version-1.1.0.tgz", + "integrity": "sha1-K4clHyVN5nOEC/2BH67Y83wP5j4=", + "dev": true + }, + "webpack-cli": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.0.8.tgz", + "integrity": "sha512-KnRLJ0BUaYRqrhAMb9dv3gzdmhmgIMKo0FmdsnmfqbPGtLnnZ6tORZAvmmKfr+A0VgiVpqC60Gv7Ofg0R2CHtQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.0.0", + "global-modules-path": "^2.1.0", + "import-local": "^1.0.0", + "inquirer": "^6.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.4.0", + "v8-compile-cache": "^2.0.0", + "yargs": "^11.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.5.0.tgz", + "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "external-editor": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.0.tgz", + "integrity": "sha512-mpkfj0FEdxrIhOC04zk85X7StNtr0yXnG7zCb+8ikO8OJi2jsHh5YGoknNTyXgsbHOf1WOOcVU3kPFWT2WgCkQ==", + "dev": true, + "requires": { + "chardet": "^0.5.0", + "iconv-lite": "^0.4.22", + "tmp": "^0.0.33" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.0.0.tgz", + "integrity": "sha512-tISQWRwtcAgrz+SHPhTH7d3e73k31gsOy6i1csonLc0u1dVK/wYvuOnFeiWqC5OXFIYbmrIFInef31wbT8MEJg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "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": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "why-did-you-update": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/why-did-you-update/-/why-did-you-update-0.1.1.tgz", + "integrity": "sha512-CCi6k05CJ44wJEuE3D2LXtHO4YX7LjuG5cHrs8UAUWJAEDO/bWF1+/wT0gt4gLd3e69bKJJBbUk86bVdlT4E6A==", + "requires": { + "lodash.every": "^4.6.0", + "lodash.filter": "^4.6.0", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.8", + "lodash.isstring": "^4.0.1", + "lodash.keys": "^4.2.0", + "lodash.pick": "^4.4.0", + "lodash.some": "^4.6.0", + "lodash.union": "^4.6.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "wrench": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz", + "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "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 + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "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": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "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 + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json index 6afe852ee..0abc6714d 100644 --- a/package.json +++ b/package.json @@ -1,62 +1,107 @@ { "name": "vector", - "version": "1.1.0", + "version": "2.0.0-beta1", "description": "Vector is an Instance-Level, On-Demand, High-Resolution Monitoring Framework. It's a web-base UI that leverages Performance Co-Pilot (PCP) in the backend.", - "author": "Martin Spier ", + "author": "Jason Koch ", "main": "src/app/index.html", "repository": "https://github.com/Netflix/vector", "license": "Apache-2.0", - "dependencies": {}, + "dependencies": { + "@babel/core": "^7.5.5", + "@babel/polyfill": "^7.4.4", + "@babel/runtime": "^7.5.5", + "chai": "^4.1.2", + "color-hash": "^1.0.3", + "d3-scale": "^2.1.0", + "d3-selection": "^1.3.2", + "d3-svg-legend": "^2.25.6", + "font-awesome": "4.6.1", + "font-awesome-webpack-4": "git+https://github.com/tapz/font-awesome-webpack#da547ed91064b408500131f837f17f423ce89411", + "http-server-spa": "^1.3.0", + "lodash-es": "^4.17.10", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.isequal": "^4.5.0", + "memoize-one": "^4.0.0", + "moment": "^2.22.2", + "prop-types": "^15.6.2", + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-error-boundary": "^1.2.3", + "react-grid-layout": "^0.16.6", + "react-router-dom": "^4.3.1", + "semantic-ui-css": "^2.3.3", + "semantic-ui-react": "^0.82.0", + "semiotic": "^1.14.2", + "superagent": "^3.8.3", + "webpack-merge": "^4.1.4", + "why-did-you-update": "^0.1.1" + }, "scripts": { - "test": "gulp test" + "build": "webpack --display-error-details --config webpack.dev.js", + "build-prod": "webpack --display-error-details --config webpack.prod.js", + "test": "jest --coverage", + "serve": "http-server-spa dist index.html 3000" }, "devDependencies": { - "browser-sync": "~2.9.11", - "browser-sync-spa": "~1.0.3", - "chalk": "~1.1.1", - "del": "~2.0.2", - "eslint-plugin-angular": "~0.12.0", + "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-runtime": "^7.5.5", + "@babel/preset-env": "^7.5.5", + "@babel/preset-react": "^7.0.0", + "@types/jest": "^24.0.16", + "babel-eslint": "^8.2.5", + "babel-jest": "^24.8.0", + "babel-loader": "^8.0.6", + "copy-webpack-plugin": "^4.5.2", + "css-loader": "^2.1.1", + "enzyme": "^3.9.0", + "enzyme-adapter-react-16": "^1.1.1", + "eslint": "^5.16.0", + "eslint-loader": "^2.0.0", + "eslint-plugin-react": "^7.10.0", "estraverse": "~4.1.0", - "gulp": "~3.9.0", - "gulp-angular-filesort": "~1.1.1", - "gulp-angular-templatecache": "~1.8.0", - "gulp-autoprefixer": "~3.0.2", - "gulp-cssnano": "~2.1.1", - "gulp-eslint": "~1.0.0", - "gulp-filter": "~3.0.1", - "gulp-flatten": "~0.2.0", - "gulp-git": "^1.7.1", - "gulp-htmlmin": "~1.3.0", - "gulp-inject": "~3.0.0", - "gulp-lintspaces": "^0.4.1", - "gulp-load-plugins": "~0.10.0", - "gulp-ng-annotate": "~1.1.0", - "gulp-protractor": "~2.1.0", - "gulp-rename": "~1.2.2", - "gulp-replace": "~0.5.4", - "gulp-rev": "~6.0.1", - "gulp-rev-replace": "~0.4.2", - "gulp-size": "~2.0.0", - "gulp-sourcemaps": "~1.6.0", - "gulp-uglify": "~1.4.1", - "gulp-useref": "~3.0.3", - "gulp-util": "~3.0.6", - "http-proxy-middleware": "~0.9.0", - "karma": "~0.13.10", - "karma-angular-filesort": "~1.0.0", - "karma-coverage": "~0.5.2", - "karma-jasmine": "~0.3.6", - "karma-ng-html2js-preprocessor": "~0.2.0", - "karma-phantomjs-launcher": "~0.2.1", - "karma-phantomjs-shim": "~1.2.0", - "lodash": "~3.10.1", - "main-bower-files": "~2.9.0", - "phantomjs": "~1.9.18", + "file-loader": "^1.1.11", + "html-loader": "^0.5.5", + "html-webpack-plugin": "^3.2.0", + "jest": "^24.8.0", + "less": "^3.0.4", + "query-string": "^4.3.4", + "sass-loader": "^7.0.3", + "style-loader": "^0.21.0", "uglify-save-license": "~0.4.1", - "wiredep": "~2.2.2", + "url-loader": "^1.0.1", + "webpack": "^4.12.2", + "webpack-auto-inject-version": "^1.1.0", + "webpack-cli": "^3.0.8", + "worker-loader": "^2.0.0", "wrench": "~1.5.8" }, - "engines": { - "node": ">=0.10.0" + "jest": { + "moduleNameMapper": { + "\\.(css|less|sass|scss)$": "/test/__mocks__/styleMock.js", + "\\.(gif|ttf|eot|svg)$": "/test/__mocks__/fileMock.js", + "^config$": "/src/config.js" + }, + "transform": { + "^.+\\.jsx$": "babel-jest", + "^.+\\.js$": "babel-jest" + }, + "collectCoverageFrom": [ + "src/**/*.{js,jsx}" + ] + }, + "babel": { + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ], + "plugins": [ + "@babel/plugin-transform-runtime", + "@babel/plugin-transform-async-to-generator", + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-object-rest-spread" + ] } } diff --git a/protractor.conf.js b/protractor.conf.js deleted file mode 100644 index 862d068e4..000000000 --- a/protractor.conf.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -var paths = require('./.yo-rc.json')['generator-gulp-angular'].props.paths; - -// An example configuration file. -exports.config = { - // The address of a running selenium server. - //seleniumAddress: 'http://localhost:4444/wd/hub', - //seleniumServerJar: deprecated, this should be set on node_modules/protractor/config.json - - // Capabilities to be passed to the webdriver instance. - capabilities: { - 'browserName': 'chrome' - }, - - baseUrl: 'http://localhost:3000', - - // Spec patterns are relative to the current working directory when - // protractor is called. - specs: [paths.e2e + '/**/*.js'], - - // Options to be passed to Jasmine-node. - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000 - } -}; diff --git a/buildWithTravis.sh b/scripts/pushToDockerhub.sh similarity index 100% rename from buildWithTravis.sh rename to scripts/pushToDockerhub.sh diff --git a/shell.nix b/shell.nix new file mode 100644 index 000000000..edc9dac3c --- /dev/null +++ b/shell.nix @@ -0,0 +1,11 @@ +{ pkgs ? import {} }: + +with pkgs; + +stdenv.mkDerivation { + name = "grafana-pcp-live"; + + buildInputs = [ + nodejs-8_x + ]; +} diff --git a/src/app/App.jsx b/src/app/App.jsx new file mode 100644 index 000000000..caddd802d --- /dev/null +++ b/src/app/App.jsx @@ -0,0 +1,268 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// TODO plenty more tests +// TODO toast messages when there are issues +// TODO enable vector to browse and collect cluster and container information from external sources +// - needs to be pluggable, eg from k8s/titus/etc + +import React from 'react' +import PropTypes from 'prop-types' + +/* +import process from 'process' +import { whyDidYouUpdate } from 'why-did-you-update' +if (process.env.NODE_ENV !== 'production') { + whyDidYouUpdate(React) +} +*/ + +import { render } from 'react-dom' + +import config from 'config' + +import Navbar from './components/Navbar/Navbar.jsx' +import Footer from './components/Footer/Footer.jsx' +import Dashboard from './components/Dashboard/Dashboard.jsx' +import ConfigPanel from './components/ConfigPanel/ConfigPanel.jsx' +import ContextPoller from './components/Pollers/ContextPoller.jsx' +import DatasetPoller from './components/Pollers/DatasetPoller.jsx' +import DashboardController from './components/ConfigPanel/DashboardController.jsx' + +import { Sidebar } from 'semantic-ui-react' +import isEqual from 'lodash.isequal' +import cloneDeep from 'lodash.clonedeep' + +import 'semantic-ui-css/semantic.min.css' +import { matchesTarget, getChartsFromLocation, pushQueryStringToHistory } from './utils' + +import { BrowserRouter, Switch, Route } from 'react-router-dom' +import charts from './charts' +import bundles from './bundles' + +const initialChartIdlist = getChartsFromLocation(location) +const initialTargets = initialChartIdlist.targets +const initialChartlist = initialChartIdlist.chartlist + .map(c => ({ + context: { target: c.target }, + ...charts.find(ch => c.chartId === ch.chartId) + })) + +class App extends React.Component { + state = { + chartlist: this.props.initialChartlist, + pollIntervalMs: 2000, + windowIntervalMs: 120000, + contextData: [], + contextDatasets: [], + targets: this.props.initialTargets, + configVisible: this.props.initialConfigPanelOpen, + pausedData: null, + } + + // TODO this call block is a big ball of mud + // can it be pushed off to somewhere else + // or should we just switch it across to redux? + + refreshQueryString = () => { + pushQueryStringToHistory(this.state.targets, this.state.chartlist, this.props.history) + } + + // chart handling + onClearChartsFromContext = (ctx) => { + this.setState((oldState) => ({ + chartlist: oldState.chartlist.filter(chart => + !(matchesTarget(chart.context.target, ctx.target))) + }), this.refreshQueryString) + } + + onAddChartToContext = (ctx, chart) => { + this.setState((oldState) => ({ chartlist: oldState.chartlist.concat({ ...chart, context: ctx }) }), this.refreshQueryString) + } + + removeChartByIndex = (idx) => { + this.setState(oldState => + ({ chartlist: [ ...oldState.chartlist.slice(0, idx), ...oldState.chartlist.slice(idx + 1) ] }), this.refreshQueryString) + } + updateChartSettings = (idx, settings) => { + this.setState((oldState) => { + let newChart = { ...oldState.chartlist[idx], ...settings } + return { chartlist: [ ...oldState.chartlist.slice(0, idx), newChart, ...oldState.chartlist.slice(idx + 1) ] } + }) + } + + // context handling + onContextsUpdated = (contexts) => { + this.setState(state => { + if (isEqual(contexts, state.contextData)) return undefined + + // update any charts with the refreshed context from the chart list + let newChartlist = this.state.chartlist.map(c => ({ + ...c, + context: contexts.find(ctx => matchesTarget(ctx.target, c.context.target)) + })) + return { + chartlist: newChartlist, + contextData: [ ...contexts ], + } + }) + } + + onContextDatasetsUpdated = (ctxds) => { + this.setState({ contextDatasets: ctxds }) + } + + onNewContext = (target) => this.setState((state) => ({ targets: state.targets.concat(target) }), this.refreshQueryString) + onRemoveContext = (context) => this.setState((state) => ({ + // remove all targets, and remove all charts + targets: state.targets.filter(target => + !(matchesTarget(target, context.target))), + chartlist: state.chartlist.filter(chart => + !(matchesTarget(chart.context.target, context.target))), + }), this.refreshQueryString) + + // config panel visibility + toggleConfigVisible = () => this.setState((state) => ({ configVisible: !state.configVisible })) + handleRequestClose = () => this.setState({ configVisible: false }) + + // app config settings + onWindowSecondsChange = (sec) => this.setState({ windowIntervalMs: sec * 1000 }) + onPollIntervalSecondsChange = (sec) => this.setState({ pollIntervalMs: sec * 1000 }) + + // to pause, we take a snapshot of the data and use this as our datasource for the dash + // this ensures all other components, pollers etc can keep flowing through their data cleanly + handlePlay = () => this.setState({ pausedData: null }) + handlePause = () => this.setState(state => ({ pausedData: cloneDeep(state.contextDatasets) })) + + render () { + const isConfigPanelOpen = !this.props.embed && this.state.configVisible + + return ( +
+
+ + + + + + + + + + scale down > overlay > slide along > uncover + direction='top' + visible={isConfigPanelOpen} > + + + + + + + + + +
+ + + + +
+
+ ) + } +} + +App.propTypes = { + embed: PropTypes.bool.isRequired, + initialTargets: PropTypes.array.isRequired, + initialChartlist: PropTypes.array.isRequired, + initialConfigPanelOpen: PropTypes.bool.isRequired, + initialAddContext: PropTypes.bool.isRequired, + history: PropTypes.object.isRequired, +} + +class PageRouter extends React.Component { + AppEmbed = (props) => + + + AppNormal = (props) => + + + render () { + return ( + + + + + + + ) + } +} + +PageRouter.propTypes = { +} + +render(, document.getElementById('app')) diff --git a/src/app/_reboot.min.css b/src/app/_reboot.min.css deleted file mode 100644 index 1ce6b1e4e..000000000 --- a/src/app/_reboot.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-family:'Source Sans Pro',sans-serif;font-size:14px;background-color:#f8f8f8;margin:0}main{padding:30px;margin:0}details,main,summary{display:block}audio,canvas,progress,video{vertical-align:baseline}a{color:#478cc8;text-decoration:none;background:0 0}a:hover{text-decoration:underline}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}img{border:0}hr{box-sizing:content-box;height:0;border-width:0 0 1px;border-color:#c4c4c4}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:14px}ol,ul{list-style:none}b,strong{font-weight:600}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:600;margin:0 0 10px}.h1,h1{font-size:32px}.h2,h2{font-size:28px}.h3,h3{font-size:22px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.nf-light{font-weight:300}.nf-normal{font-weight:400}.nf-bold{font-weight:600}.txt-right{text-align:right}.txt-left{text-align:left}.txt-center,.txt-centre{text-align:center}.nf-button,button{margin:5px;font-family:inherit;font-size:100%;padding:.5em 1em;color:#333;background-color:#fff;border:1px solid #c4c4c4;text-decoration:none;text-transform:none;border-radius:4px;overflow:visible;display:inline-block;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}button::-moz-focus-inner{padding:0;border:0}.nf-btn-hover,.nf-button:focus,.nf-button:hover,.nf-group input[type=checkbox]:checked+label,.nf-group input[type=radio]:checked+label,button:focus,button:hover,grouped input[type=checkbox]:checked+label,grouped input[type=radio]:checked+label,grouped label:focus,grouped label:hover,nf-group label:focus,nf-group label:hover{background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.nf-button-active,.nf-button:active,.nf-group input[type=checkbox]:checked+label,.nf-group input[type=radio]:checked+label,button:active,grouped input[type=checkbox]:checked+label,grouped input[type=radio]:checked+label,grouped label:active,nf-group label:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.nf-button:focus,button:focus{outline:0}.is-disabled,.is-disabled:active,.is-disabled:focus,.is-disabled:hover,.nf-button[disabled],button[disabled]{background-image:none;opacity:.4;cursor:default;box-shadow:none;pointer-events:none}.btn-error,.btn-primary,.btn-success{color:#fff!important;border:1px solid rgba(0,0,0,.2)!important;text-shadow:0 1px 1px rgba(0,0,0,.2)!important}.btn-error nf-icon,.btn-primary nf-icon,.btn-success nf-icon{color:#fff!important}.btn-primary{background-color:#478cc8!important}.btn-success{background:#8dac71!important}.btn-classic{background-color:#e6e6e6!important}.btn-error{background:#b6272b!important}.nf-group,grouped{display:inline-block;margin:5px;vertical-align:middle}.nf-group label,grouped label{font-family:inherit;font-size:100%;padding:.5em 1em;color:#333;background-color:transparent;border:1px solid #c4c4c4;text-decoration:none;display:inline-block;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nf-group .nf-buton,.nf-group button,.nf-group label,grouped .nf-buton,grouped button,grouped label{border-radius:0;margin:0;float:left;border-left-width:0}.nf-group .nf-buton:first-child,.nf-group button:first-child,.nf-group label:first-of-type,grouped .nf-buton:first-child,grouped button:first-child,grouped label:first-of-type{border-top-left-radius:4px;border-bottom-left-radius:4px;border-left-width:1px}.nf-group .nf-buton:last-child,.nf-group button:last-child,.nf-group label:last-child,grouped .nf-buton:last-child,grouped button:last-child,grouped label:last-of-type{border-top-right-radius:4px;border-bottom-right-radius:4px}.nf-group input[type=checkbox],.nf-group input[type=radio],grouped input[type=checkbox],grouped input[type=radio]{display:none}.nf-pill,pill{font-family:inherit;font-size:.8em;line-height:.8em;padding:.3em 1em;color:#333;background-color:transparent;border:1px solid #c4c4c4;border-radius:6px;text-transform:uppercase;cursor:default;display:inline-block;white-space:nowrap;vertical-align:baseline;text-align:center;-webkit-transform:translateY(-.15em);transform:translateY(-.15em)}.nf-pill.pill-ok,.nf-pill[ok],pill.pill-ok,pill[ok]{background:#8dac71;color:#fff}.nf-pill.pill-failed,.nf-pill[failed],pill.pill-failed,pill[failed]{background:#b6272b;color:#fff}.nf-pill.pill-marginal,.nf-pill[marginal],pill.pill-marginal,pill[marginal]{background:#d2bc5e;color:#fff}.nf-pill.pill-primary,.nf-pill[primary],pill.pill-primary,pill[primary]{background-color:#478cc8;color:#fff}.nf-badge,badge{background:#fff;color:#333}.nf-badge.badge-ok,.nf-badge[ok],badge.badge-ok,badge[ok]{background:#8dac71;color:#fff}.nf-badge.badge-marginal,.nf-badge[marginal],badge.badge-marginal,badge[marginal]{background:#d2bc5e;color:#fff}.nf-badge.badge-failed,.nf-badge[failed],badge.badge-failed,badge[failed]{background:#b6272b;color:#fff}.nf-badge,badge{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;flex-wrap:wrap;text-align:center;vertical-align:middle;width:120px;height:120px;border:1px solid #c4c4c4;border-radius:6px;word-break:break-all;cursor:default;overflow:hidden}input:not([type]),input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{margin:7px;vertical-align:top;padding:.5em .6em;display:inline-block;border:1px solid #d9d9d9;border-radius:4px;box-sizing:border-box;color:#6a6a6a;font:inherit}input.is-focused,input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select.is-focused,select:focus,textarea.is-focused,textarea:focus{outline:0;border-color:#129fea}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:#129fea auto 1px}input[type=checkbox],input[type=radio]{margin:.5em 0;padding:0;display:inline-block;box-sizing:border-box}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],select[disabled],textarea[disabled]{cursor:default;background-color:#eaeded;color:#cad2d3}input[readonly],select[readonly],textarea[readonly]{background:#eee;color:#777;border-color:#d9d9d9}input:focus:invalid,input:not([type]).is-invalid,input[type=color].is-invalid,input[type=date].is-invalid,input[type=datetime-local].is-invalid,input[type=datetime].is-invalid,input[type=email].is-invalid,input[type=month].is-invalid,input[type=number].is-invalid,input[type=password].is-invalid,input[type=search].is-invalid,input[type=tel].is-invalid,input[type=text].is-invalid,input[type=time].is-invalid,input[type=url].is-invalid,input[type=week].is-invalid,select.is-invalid,select:focus:invalid,textarea.is-invalid,textarea:focus:invalid{color:#b94a48;border-color:#e9322d}input[type=checkbox].is-invalid,input[type=checkbox]:focus:invalid:focus,input[type=file].is-invalid,input[type=file]:focus:invalid:focus,input[type=radio].is-invalid,input[type=radio]:focus:invalid:focus{outline-color:#e9322d}input::-webkit-input-placeholder{color:#c4c4c4;font-weight:300}input::-moz-placeholder{color:#c4c4c4;font-weight:300}input:-ms-input-placeholder{color:#c4c4c4;font-weight:300}input::placeholder{color:#c4c4c4;font-weight:300}textarea::-webkit-input-placeholder{color:#c4c4c4;font-weight:300}textarea::-moz-placeholder{color:#c4c4c4;font-weight:300}textarea:-ms-input-placeholder{color:#c4c4c4;font-weight:300}textarea::placeholder{color:#c4c4c4;font-weight:300}input{line-height:normal}input::-moz-focus-inner{border:0;padding:0}html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}select{text-transform:none;border:1px solid #d9d9d9;background-color:#fff}textarea{overflow:auto}select[multiple]{height:auto}label{margin:.5em;padding-top:2px}fieldset{margin:0;padding:.35em 0 .75em;border:0}legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:none}td,th{border-bottom:1px solid #ccc;border-width:0 0 1px;font-size:inherit;margin:0;overflow:hidden;padding:.8em 1em}th{font-weight:600}td{word-break:break-all}td:first-child,th:first-child{border-left-width:0}tr:last-child td{border-bottom:none}thead{background:0 0;color:#333;font-weight:600;text-align:left;vertical-align:bottom}td{background-color:transparent}.is-odd td,.is-striped tr:nth-child(odd) td{background-color:#f1f1f1}dt{font-weight:700;text-align:right;box-sizing:border-box;width:25%;margin-right:10px;float:left;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}dd{margin-left:calc(25% + 10px)}dd,dt{margin-bottom:10px}nav ul,ul.is-subnav{list-style:none;padding:0;margin:0;font-weight:300}nav li a,ul.is-subnav a{display:block;height:100%;padding:0 20px}nav li a,nav ul a:hover,ul.is-subnav a,ul.is-subnav a:hover{text-decoration:none}nav li,ul.is-subnav li{position:relative;float:left;font-size:17px;text-align:center;line-height:50px;box-sizing:border-box;height:100%;transition:background-color .2s ease;padding:0;cursor:pointer}nav{height:50px;background-color:#5b5b5b}nav ul{display:block;height:100%}nav li{color:#fff}nav li.is-selected::after{content:'';position:absolute;top:0;left:0;right:0;height:4px;background-color:#fff}nav li a{color:#fff}nav .logo{text-transform:uppercase;font-size:23px;letter-spacing:1px;padding:0 20px;margin-left:5px;cursor:default}nav .logo img{width:35px;height:35px;position:relative;top:9px;margin-right:-5px}nav li:hover:not(.logo){background-color:#a6a6a6}ul.is-subnav{display:inline-block;height:50px;color:#477fc5;vertical-align:bottom}ul.is-subnav li{font-size:14px;font-weight:500}ul.is-subnav li.is-selected::after{content:'';position:absolute;bottom:0;left:0;right:0;height:4px;background-color:#477fc5}ul.is-subnav a,ul.is-subnav li{text-transform:uppercase}.nf-header,main>header{border-bottom:1px solid #c4c4c4;text-align:left;margin-bottom:30px}.nf-header h1,main>header h1{margin-right:20px;display:inline-block}.nf-panel,panel{display:block;background-color:#fff;border:1px solid #d9d9d9;border-radius:3px;padding:20px}.nf-panel header,panel header{background-color:#f1f1f1;padding:10px 20px;border-bottom:1px solid #d9d9d9;margin:-20px -20px 20px}.nf-panel header h1,.nf-panel header h2,.nf-panel header h3,.nf-panel header h4,.nf-panel header h5,.nf-panel header h6,panel header h1,panel header h2,panel header h3,panel header h4,panel header h5,panel header h6{margin-bottom:0}.nf-panel footer,panel footer{background-color:#f1f1f1;padding:10px 20px;border-top:1px solid #d9d9d9;margin:20px -20px -20px}.nf-panel table,panel table{border-top:1px solid #ccc;width:calc(100% + 40px);margin-left:-20px;margin-bottom:-20px;margin-top:30px}.nf-panel table[is=nf-table] table,panel table[is=nf-table] table{margin-left:0;margin-top:0;margin-bottom:0}.nf-grid{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap}.nf-1,.nf-10,.nf-11,.nf-12,.nf-13,.nf-14,.nf-15,.nf-16,.nf-2,.nf-3,.nf-4,.nf-5,.nf-6,.nf-7,.nf-8,.nf-9{display:inline-block;box-sizing:border-box}.nf-1{width:6.25%}.nf-2{width:12.5%}.nf-3{width:18.75%}.nf-4{width:25%}.nf-5{width:31.25%}.nf-6{width:37.5%}.nf-7{width:43.75%}.nf-8{width:50%}.nf-9{width:56.25%}.nf-10{width:62.5%}.nf-11{width:68.75%}.nf-12{width:75%}.nf-13{width:81.25%}.nf-14{width:87.5%}.nf-15{width:93.75%}.nf-16{width:100%}.nf-grid-centered{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap}.nf-grid-centered>*{display:-webkit-flex;display:flex}.nf-grid-centered>*>*{text-align:center;margin:auto}.nf-right{float:right}.nf-left{float:left}.nf-inline{display:inline}.nf-clickable{cursor:pointer}.clearfix:after{content:"";display:table;clear:both}.is-hidden,.isHidden,[hidden]{display:none!important} diff --git a/src/app/bundles/index.js b/src/app/bundles/index.js new file mode 100644 index 000000000..36e2a0cfe --- /dev/null +++ b/src/app/bundles/index.js @@ -0,0 +1,113 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +const bundles = [ + { + name: 'Host Utilization', + iconName: 'computer', + description: (
+ Quick overview of host utilization (not container): +
    +
  • CPU utilization
  • +
  • Disk latency
  • +
  • Memory utilization
  • +
  • Network throughput
  • +
+
), + chartTemplates: [ + { chartId: 'cpu-utilization' }, + { chartId: 'disk-latency' }, + { chartId: 'memory-utilization' }, + { chartId: 'network-throughput' }, + ] + }, + { + name: 'Container app', + iconName: 'clone', + description: (
+ A set of metrics for monitoring performance of your container +
    +
  • Container CPU
  • +
  • Container MEM usage (MB & %)
  • +
  • Container Disk IOPS
  • +
  • Container Disk Throughput
  • +
  • Container CPU throttled
  • +
+
), + chartTemplates: [ + { chartId: 'container-percont-cpu' }, + { chartId: 'container-percont-mem' }, + { chartId: 'container-disk-iops' }, + { chartId: 'container-disk-tput' }, + { chartId: 'container-percont-cpu-throttle' }, + { chartId: 'container-percont-mem-util', }, + ], + }, + { + name: 'Disk', + iconName: 'disk', + description: (
+ Key disk metrics +
    +
  • IOPS
  • +
  • Latency
  • +
  • Throughput
  • +
  • Utilization
  • +
+
), + chartTemplates: [ + { chartId: 'disk-iops' }, + { chartId: 'disk-latency' }, + { chartId: 'disk-throughput' }, + { chartId: 'disk-utilization' } + ], + }, + { + name: 'Flamegraphs', + iconName: 'hotjar', + description: 'Flame graphs', + chartTemplates: [ + { chartId: 'fg-cpu' }, + { chartId: 'fg-pname-cpu' }, + { chartId: 'fg-uninlined-cpu' }, + { chartId: 'fg-pagefault' }, + { chartId: 'fg-diskio' }, + { chartId: 'fg-ipc' }, + ] + }, + { + name: 'BCC demo', + iconName: 'microchip', + description: 'A collection showing the default configured BCC PMDA metrics, make sure you have the BCC PMDA installed.', + chartTemplates: [ + { + chartId: 'text-label', + content: 'The default BCC widgets. To enable more widgets, on the target host, check the BCC PMDA configuration file and run ./Install to reload.', + }, + { chartId: 'bcc-tcptop' }, + { chartId: 'bcc-runqlat' }, + { chartId: 'bcc-biolatency' }, + { chartId: 'bcc-tracepoint-hits' }, + { chartId: 'bcc-usdt-hits' }, + ] + } +] + +export default bundles diff --git a/src/app/charts/bcc.js b/src/app/charts/bcc.js new file mode 100644 index 000000000..979375c85 --- /dev/null +++ b/src/app/charts/bcc.js @@ -0,0 +1,375 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { + customTitleAndKeylabel, + divideByOnlyMetric, + renameMetric, + onlyLatestValues, + filterKeepSelectedMetrics, + mapInstanceDomains, + ceiling, + cumulativeTransform, + mathValuesSelective, + filterAboveMaxInstanceValue, +} from '../processors/transforms' +import MultiTable from '../components/Charts/MultiTable.jsx' +import SimpleTable from '../components/Charts/SimpleTable.jsx' +import Heatmap from '../components/Charts/Heatmap.jsx' +import HeatmapSettingsModal from '../components/SettingsModals/HeatmapSettingsModal.jsx' +import { thresholds, colors } from '../components/Charts/cividis.js' + +export default function _charts(config) { + if (!config.enableBcc) return [] + + return [ + { + chartId: 'bcc-biolatency', + group: 'BCC/BPF', + title: 'biolatency', + tooltipText: 'block device I/O latency heatmap', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.disk.all.latency' + ], + transforms: [ + cumulativeTransform(), + ceiling(), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + }, + + { + chartId: 'bcc-runqlat', + group: 'BCC/BPF', + title: 'runqlat', + tooltipText: 'run queue latency heatmap', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.runq.latency' + ], + transforms: [ + cumulativeTransform(), + ceiling(), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + }, + + { + chartId: 'bcc-ext4lat', + group: 'BCC/BPF', + title: 'ext4dist', + tooltipText: 'ext4 operation latencies (open, read, write, fsync)', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.fs.ext4.latency.open', + 'bcc.fs.ext4.latency.read', + 'bcc.fs.ext4.latency.write', + 'bcc.fs.ext4.latency.fsync', + ], + transforms: [ + cumulativeTransform(), + ceiling(), + filterKeepSelectedMetrics('selectedMetrics'), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + selectedMetrics: [ + 'bcc.fs.ext4.latency.open', + 'bcc.fs.ext4.latency.read', + 'bcc.fs.ext4.latency.write', + 'bcc.fs.ext4.latency.fsync', + ], + }, + + { + chartId: 'bcc-xfslat', + group: 'BCC/BPF', + title: 'xfsdist', + tooltipText: 'xfs operation latencies (open, read, write, fsync)', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.fs.xfs.latency.open', + 'bcc.fs.xfs.latency.read', + 'bcc.fs.xfs.latency.write', + 'bcc.fs.xfs.latency.fsync', + ], + transforms: [ + cumulativeTransform(), + ceiling(), + filterKeepSelectedMetrics('selectedMetrics'), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + selectedMetrics: [ + 'bcc.fs.xfs.latency.open', + 'bcc.fs.xfs.latency.read', + 'bcc.fs.xfs.latency.write', + 'bcc.fs.xfs.latency.fsync', + ], + }, + + { + chartId: 'bcc-zfslat', + group: 'BCC/BPF', + title: 'zfsdist', + tooltipText: 'zfs operation latencies (open, read, write, fsync)', + processor: simpleModel, + visualisation: Heatmap, + metricNames: [ + 'bcc.fs.zfs.latency.open', + 'bcc.fs.zfs.latency.read', + 'bcc.fs.zfs.latency.write', + 'bcc.fs.zfs.latency.fsync', + ], + transforms: [ + cumulativeTransform(), + ceiling(), + filterKeepSelectedMetrics('selectedMetrics'), + mapInstanceDomains('yAxisLabels'), + filterAboveMaxInstanceValue(), + ], + settingsComponent: HeatmapSettingsModal, + heatmap: { thresholds, colors }, + selectedMetrics: [ + 'bcc.fs.zfs.latency.open', + 'bcc.fs.zfs.latency.read', + 'bcc.fs.zfs.latency.write', + 'bcc.fs.zfs.latency.fsync', + ], + }, + + { + chartId: 'bcc-tcplife', + group: 'BCC/BPF', + title: 'tcplife', + tooltipText: 'TCP session life and data rates', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.io.net.tcp.pid', + 'bcc.proc.io.net.tcp.comm', + 'bcc.proc.io.net.tcp.laddr', + 'bcc.proc.io.net.tcp.lport', + 'bcc.proc.io.net.tcp.daddr', + 'bcc.proc.io.net.tcp.dport', + 'bcc.proc.io.net.tcp.tx', + 'bcc.proc.io.net.tcp.rx', + 'bcc.proc.io.net.tcp.duration', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.io.net.tcp.pid': 'PID', + 'bcc.proc.io.net.tcp.comm': 'COMM', + 'bcc.proc.io.net.tcp.laddr': 'LADDR', + 'bcc.proc.io.net.tcp.lport': 'LPORT', + 'bcc.proc.io.net.tcp.daddr': 'DADDR', + 'bcc.proc.io.net.tcp.dport': 'DPORT', + 'bcc.proc.io.net.tcp.tx': 'TX_KB', + 'bcc.proc.io.net.tcp.rx': 'RX_KB', + 'bcc.proc.io.net.tcp.duration': 'MS' + }), + divideByOnlyMetric(1024, [ 'TX_KB', 'RX_KB' ]), + divideByOnlyMetric(1000, [ 'MS' ]), + mathValuesSelective(Math.round, mi => ['TX_KB', 'RX_KB', 'MS'].includes(mi.metric)), + ], + }, + + { + chartId: 'bcc-execsnoop', + group: 'BCC/BPF', + title: 'execsnoop', + tooltipText: 'trace new process launches', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.exec.comm', + 'bcc.proc.exec.pid', + 'bcc.proc.exec.ppid', + 'bcc.proc.exec.ret', + 'bcc.proc.exec.args', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.exec.comm': 'COMM', + 'bcc.proc.exec.pid': 'PID', + 'bcc.proc.exec.ppid': 'PPID', + 'bcc.proc.exec.ret': 'RET', + 'bcc.proc.exec.args': 'ARGS', + }), + ], + }, + + { + chartId: 'bcc-tcpretrans', + group: 'BCC/BPF', + title: 'tcpretrans', + tooltipText: 'TCP retransmit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.io.net.tcp.retrans.count', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + + // TODO test biotop (could not get it working on my machine) + { + chartId: 'bcc-biotop', + group: 'BCC/BPF', + title: 'biotop', + tooltipText: 'block device I/O "top"', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.io.perdev.pid', + 'bcc.proc.io.perdev.comm', + 'bcc.proc.io.perdev.direction', + 'bcc.proc.io.perdev.major', + 'bcc.proc.io.perdev.minor', + 'bcc.proc.io.perdev.disk', + 'bcc.proc.io.perdev.io', + 'bcc.proc.io.perdev.bytes', + 'bcc.proc.io.perdev.duration', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.io.perdev.pid': 'PID', + 'bcc.proc.io.perdev.comm': 'COMM', + 'bcc.proc.io.perdev.direction': 'D', + 'bcc.proc.io.perdev.major': 'MAJ', + 'bcc.proc.io.perdev.minor': 'MIN', + 'bcc.proc.io.perdev.disk': 'DISK', + 'bcc.proc.io.perdev.io': 'I/O', + 'bcc.proc.io.perdev.bytes': 'Kbytes', // will be shortly + 'bcc.proc.io.perdev.duration': 'AVGms', // will be shortly + }), + divideByOnlyMetric(1024, [ 'Kbytes' ]), + divideByOnlyMetric(1000, [ 'AVGms' ]), + mathValuesSelective(Math.round, mi => ['Kbytes', 'AVGms'].includes(mi.metric)), + ], + }, + + { + chartId: 'bcc-tcptop', + group: 'BCC/BPF', + title: 'tcptop', + tooltipText: 'tcp throughput "top"', + processor: simpleModel, + visualisation: MultiTable, + metricNames: [ + 'bcc.proc.io.net.tcptop.pid', + 'bcc.proc.io.net.tcptop.comm', + 'bcc.proc.io.net.tcptop.laddr', + 'bcc.proc.io.net.tcptop.lport', + 'bcc.proc.io.net.tcptop.daddr', + 'bcc.proc.io.net.tcptop.dport', + 'bcc.proc.io.net.tcptop.rx', + 'bcc.proc.io.net.tcptop.tx', + ], + transforms: [ + onlyLatestValues(), + renameMetric({ + 'bcc.proc.io.net.tcptop.pid': 'PID', + 'bcc.proc.io.net.tcptop.comm': 'COMM', + 'bcc.proc.io.net.tcptop.laddr': 'LADDR', + 'bcc.proc.io.net.tcptop.lport': 'LPORT', + 'bcc.proc.io.net.tcptop.daddr': 'DADDR', + 'bcc.proc.io.net.tcptop.dport': 'DPORT', + 'bcc.proc.io.net.tcptop.rx': 'RX_KB', + 'bcc.proc.io.net.tcptop.tx': 'TX_KB', + }), + divideByOnlyMetric(1024, [ 'TX_KB', 'RX_KB' ]), + mathValuesSelective(Math.round, mi => ['TX_KB', 'RX_KB'].includes(mi.metric)), + ], + }, + + { + chartId: 'bcc-tracepoint-hits', + group: 'BCC/BPF', + title: 'tracepoint hits', + tooltipText: 'kernel tracepoint hit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.tracepoint.hits', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + + { + chartId: 'bcc-usdt-hits', + group: 'BCC/BPF', + title: 'USDT hits', + tooltipText: 'user-level statically defined tracepoint hit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.usdt.hits', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + + { + chartId: 'bcc-uprobe-hits', + group: 'BCC/BPF', + title: 'uprobe hits', + tooltipText: 'uprobe hit counts', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'bcc.uprobe.hits', + ], + transforms: [ + mapInstanceDomains(), + customTitleAndKeylabel((metric, instance) => instance), + onlyLatestValues(), + ], + }, + ] +} diff --git a/src/app/charts/container.js b/src/app/charts/container.js new file mode 100644 index 000000000..bb887ebbe --- /dev/null +++ b/src/app/charts/container.js @@ -0,0 +1,381 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import Chart from '../components/Charts/Chart.jsx' + +import { + renameMetric, + mapInstanceDomains, + mapContainerNames, + divideByOnlyMetric, + timesliceCalculations, + customTitleAndKeylabel, + kbToGb, + combineValuesByTitle, + defaultTitleAndKeylabel, + divideBy, + cumulativeTransform, + cumulativeTransformOnlyMetrics, + filterForContainerId, + // log, +} from '../processors/transforms' +import { percentage, integer, number } from '../processors/formats' + +import { + firstValueInObject, + keyValueArrayToObjectReducer, +} from '../utils' + +export default function _charts(config) { + if (!config.enableContainerWidgets) return [] + + const containerNameResolver = config.useCgroupId ? (c => c.cgroup) : (c => c.containerId) + + return [ + { + chartId: 'container-percont-cpu', + group: 'Container', + title: 'Per-Container CPU Utilization', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.cpuacct.usage', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpuacct.usage' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpuacct.usage' ]), + defaultTitleAndKeylabel(), + cumulativeTransform(), + divideBy(1000 * 1000 * 1000), + ], + yTickFormat: percentage, + }, + + { + chartId: 'container-percont-mem', + group: 'Container', + title: 'Per-Container Memory Usage (Mb)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.memory.usage', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage' ], containerNameResolver), + filterForContainerId([ 'cgroup.memory.usage' ]), + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-total-cont-mem', + group: 'Container', + title: 'Total Container Memory Usage (Mb)', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'cgroup.memory.usage', + 'mem.util.used', + 'mem.util.free', + ], + transforms: [ + // make sure that all the cgroup memory uses the same metric and then add them together + // this sums all the values across the cgroup (map + fix are so that the cgroup size is calculated only on containers) + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage' ], containerNameResolver), + // do not filter here, we want totals + customTitleAndKeylabel(metric => metric), + combineValuesByTitle((a, b) => a + b), + divideByOnlyMetric(1024, [ 'mem.util.used', 'mem.util.free' ]), + divideByOnlyMetric(1024 * 1024, [ 'cgroup.memory.usage' ]), + timesliceCalculations({ + 'host used': (values) => ({ '-1': values['mem.util.used']['-1'] - firstValueInObject(values['cgroup.memory.usage']) }), + 'free (unused)': (values) => ({ '-1': values['mem.util.free']['-1'] }), + 'container used': (values) => ({ '-1': firstValueInObject(values['cgroup.memory.usage']) }), + }), + // add back a title and keylabel + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-percont-mem-headroom', + group: 'Container', + title: 'Per-Container Memory Headroom (Mb)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.memory.usage', // bytes + 'cgroup.memory.limit', // bytes + 'mem.physmem', // kilobytes + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage', 'cgroup.memory.limit' ], containerNameResolver), + filterForContainerId([ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + divideByOnlyMetric(1024, [ 'mem.physmem' ]), + divideByOnlyMetric(1024*1024, [ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + timesliceCalculations({ + // TODO this calculation is substantially different from the old vector calculation + 'headroom': (slice) => { + let containerNames = Object.keys(slice['cgroup.memory.usage'] || {}) + let headrooms = containerNames.map(cname => ({ + key: cname, + value: Math.min(slice['cgroup.memory.limit'][cname], slice['mem.physmem']['-1']) - slice['cgroup.memory.usage'][cname] + })) + return headrooms.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + /* + * This is not used at netflix, this is for proportional IO blkio cgroup controller + * Is it needed by anyone? + */ + + /* + { + chartId: 'container-disk-iops', + group: 'Container', + title: 'Container Disk IOPS', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.io_serviced.read', + 'cgroup.blkio.all.io_serviced.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.io_serviced.read', 'cgroup.blkio.all.io_serviced.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.io_serviced.read', 'cgroup.blkio.all.io_serviced.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.io_serviced.read': 'read', + 'cgroup.blkio.all.io_serviced.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: number, + }, + + { + chartId: 'container-disk-tput', + group: 'Container', + title: 'Container Disk Throughput (Bytes)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.io_service_bytes.read', + 'cgroup.blkio.all.io_service_bytes.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.io_service_bytes.read', 'cgroup.blkio.all.io_service_bytes.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.io_service_bytes.read', 'cgroup.blkio.all.io_service_bytes.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.io_service_bytes.read': 'read', + 'cgroup.blkio.all.io_service_bytes.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + */ + + /* https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt + * - Number of IOs (bio) issued to the disk by the group. These + * are further divided by the type of operation - read or write, sync + * or async. First two fields specify the major and minor number of the + * device, third field specifies the operation type and the fourth field + * specifies the number of IOs. + */ + { + chartId: 'container-disk-iops', + group: 'Container', + title: 'Container Disk IOPS', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.throttle.io_serviced.read', + 'cgroup.blkio.all.throttle.io_serviced.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.throttle.io_serviced.read', 'cgroup.blkio.all.throttle.io_serviced.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.throttle.io_serviced.read', 'cgroup.blkio.all.throttle.io_serviced.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.throttle.io_serviced.read': 'read', + 'cgroup.blkio.all.throttle.io_serviced.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: number, + }, + + { + chartId: 'container-disk-tput', + group: 'Container', + title: 'Container Disk Throughput (Bytes)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.blkio.all.throttle.io_service_bytes.read', + 'cgroup.blkio.all.throttle.io_service_bytes.write', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.blkio.all.throttle.io_service_bytes.read', + 'cgroup.blkio.all.throttle.io_service_bytes.write' ], containerNameResolver), + filterForContainerId([ 'cgroup.blkio.all.throttle.io_service_bytes.read', 'cgroup.blkio.all.throttle.io_service_bytes.write' ]), + cumulativeTransform(), + renameMetric({ + 'cgroup.blkio.all.throttle.io_service_bytes.read': 'read', + 'cgroup.blkio.all.throttle.io_service_bytes.write': 'write', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-percont-cpu-sched', + group: 'Container', + title: 'Per-Container CPU Scheduler', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.cpusched.shares', + 'cgroup.cpusched.periods', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpusched.shares', 'cgroup.cpusched.periods' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpusched.shares', 'cgroup.cpusched.periods' ]), + renameMetric({ + 'cgroup.cpusched.shares': 'shares', + 'cgroup.cpusched.periods': 'periods', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'container-percont-cpu-headroom', + group: 'Container', + title: 'Per-Container CPU Headroom', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'cgroup.cpuacct.usage', + 'cgroup.cpusched.shares', + 'cgroup.cpusched.periods', + 'hinv.ncpu', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpusched.shares', 'cgroup.cpusched.periods', 'cgroup.cpuacct.usage' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpuacct.usage', 'cgroup.cpusched.shares', 'cgroup.cpusched.periods' ]), + cumulativeTransformOnlyMetrics([ 'cgroup.cpuacct.usage' ]), + divideByOnlyMetric(1000 * 1000 * 1000, [ 'cgroup.cpuacct.usage' ]), + timesliceCalculations({ + // TODO this calculation is substantially different from the old vector calculation + // surely it should be something like: headroom = limits - utilisation + 'usage': (slice) => slice['cgroup.cpuacct.usage'] || [], + 'limit': (slice) => { + let containerNames = Object.keys(slice['cgroup.cpusched.periods'] || {}) + let limits = containerNames.map(cname => ({ + key: cname, + value: slice['cgroup.cpusched.shares'][cname] + ? (slice['cgroup.cpusched.shares'][cname] / slice['cgroup.cpusched.periods'][cname]) + : slice['hinv.ncpu']['-1'] + })) + return limits.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'container-percont-cpu-throttle', + group: 'Container', + title: 'Per-Container Throttled CPU', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.cpusched.throttled_time', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.cpusched.throttled_time' ], containerNameResolver), + filterForContainerId([ 'cgroup.cpusched.throttled_time' ]), + cumulativeTransform(), + customTitleAndKeylabel((metric, instance) => instance), + ], + }, + + { + chartId: 'container-percont-mem-util', + group: 'Container', + title: 'Per-Container Memory Utilization (%)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'cgroup.memory.usage', + 'cgroup.memory.limit', + 'mem.physmem', + ], + transforms: [ + mapInstanceDomains(), + mapContainerNames([ 'cgroup.memory.usage', 'cgroup.memory.limit' ], containerNameResolver), + filterForContainerId([ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + divideByOnlyMetric(1024, [ 'mem.physmem' ]), + divideByOnlyMetric(1024 * 1024, [ 'cgroup.memory.usage', 'cgroup.memory.limit' ]), + timesliceCalculations({ + 'utilization': (slice) => { + let containerNames = Object.keys(slice['cgroup.memory.usage'] || {}) + let utilizations = containerNames.map(cname => ({ + key: cname, + value: (cname in slice['cgroup.memory.limit']) + ? (slice['cgroup.memory.usage'][cname] / Math.min(slice['cgroup.memory.limit'][cname], slice['mem.physmem']['-1'])) + : (slice['cgroup.memory.usage'][cname] / slice['mem.physmem']['-1']) + })) + return utilizations.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: percentage, + }, + ] +} diff --git a/src/app/charts/cpu.js b/src/app/charts/cpu.js new file mode 100644 index 000000000..f17c20caa --- /dev/null +++ b/src/app/charts/cpu.js @@ -0,0 +1,216 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import simpleModel from '../processors/simpleModel' +import { onlyLatestValues, timesliceCalculations, defaultTitleAndKeylabel, divideBy, divideBySeries, cumulativeTransform } from '../processors/transforms' +import { keyValueArrayToObjectReducer } from '../utils' +import { percentage, integer, number } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' +import SimpleTable from '../components/Charts/SimpleTable.jsx' + +const PswitchHelp = () =>

Kernel context switches per second + with a super long explanation

+ +export default [ + { + chartId: 'cpu-pswitch', + group: 'CPU', + title: 'Context Switches per second', + helpComponent: PswitchHelp, + tooltipText: 'Kernel context switches per second', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.pswitch' + ], + transforms: [ + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'cpu-utilization', + group: 'CPU', + title: 'CPU Utilization', + processor: simpleModel, + visualisation: Chart, + tooltipText: 'CPU utilization, both system and CPU', + lineType: 'stackedarea', + metricNames: [ + 'kernel.all.cpu.sys', + 'kernel.all.cpu.user', + 'hinv.ncpu', + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBySeries('hinv.ncpu'), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-utilization-sys', + group: 'CPU', + title: 'CPU Utilization (System)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.cpu.sys', + 'hinv.ncpu', + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBySeries('hinv.ncpu'), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-utilization-user', + group: 'CPU', + title: 'CPU Utilization (user)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.cpu.user', + 'hinv.ncpu' + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBySeries('hinv.ncpu'), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-loadavg', + group: 'CPU', + title: 'Load Average', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.load', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-loadavg-table', + group: 'CPU', + title: 'Load Average (table)', + processor: simpleModel, + visualisation: SimpleTable, + metricNames: [ + 'kernel.all.load', + ], + transforms: [ + defaultTitleAndKeylabel(), + onlyLatestValues(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-percpu-utilization', + group: 'CPU', + title: 'Per-CPU Utilization', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.percpu.cpu.sys', + 'kernel.percpu.cpu.user', + ], + transforms: [ + divideBy(1000), + cumulativeTransform(), + timesliceCalculations({ + 'cpu [sys+user]': (values) => { + let cpus = Object.keys(values['kernel.percpu.cpu.sys']) + let utilizations = cpus.map(cpu => ({ + key: cpu, + value: (values['kernel.percpu.cpu.sys'][cpu] || 0) + (values['kernel.percpu.cpu.user'][cpu] || 0) + })) + return utilizations.reduce(keyValueArrayToObjectReducer, {}) + } + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: percentage, + }, + + { + chartId: 'cpu-percpu-utilization-sys', + group: 'CPU', + title: 'Per-CPU Utilization (System)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.percpu.cpu.sys', + ], + transforms: [ + divideBy(1000), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-percpu-utilization-user', + group: 'CPU', + title: 'Per-CPU Utilization (User)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.percpu.cpu.user', + ], + transforms: [ + defaultTitleAndKeylabel(), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'cpu-runnable', + group: 'CPU', + title: 'Runnable', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'kernel.all.runnable', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + } +] diff --git a/src/app/charts/custom.js b/src/app/charts/custom.js new file mode 100644 index 000000000..db3bef10c --- /dev/null +++ b/src/app/charts/custom.js @@ -0,0 +1,81 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import customChartModel from '../processors/customChartModel' +import customTableModel from '../processors/customTableModel' +import { number } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' +import SimpleTable from '../components/Charts/SimpleTable.jsx' + +import CustomSettingsModal from '../components/SettingsModals/CustomSettingsModal.jsx' + +export default function _charts(config) { + if (!config.enableCustomWidgetFeature) return [] + + return [ + { + chartId: 'custom-chart', + group: 'Custom', + title: 'Custom chart', + tooltipText: 'Allows you to configure a basic chart displaying any available metric', + processor: customChartModel, + visualisation: Chart, + // metrics spec and transforms are handled in the customModel + metricNames: [], + lineType: 'line', + converted: false, + conversionFunction: '', + forceYAxis: false, + percentage: false, + cumulative: false, + settingsComponent: CustomSettingsModal, + yTickFormat: number, + }, + { + chartId: 'custom-table', + group: 'Custom', + title: 'Custom table', + tooltipText: 'Allows you to present a table displaying latest data of any available metric', + processor: customTableModel, + visualisation: SimpleTable, + // metrics spec and transforms are handled in the customModel + metricNames: [], + converted: false, + conversionFunction: '', + percentage: false, + cumulative: false, + settingsComponent: CustomSettingsModal, + yTickFormat: number, + }, + /* + * TODO add this when url can handle full serialisation + * otherwise this is only really useful for bundles, as it cannot be 'persisted' + { + chartId: 'text-label', + group: 'Custom', + title: 'Text label', + tooltipText: 'Displays a text panel with a message of your choice (edit settings)', + processor: nullModel, + visualisation: TextLabel, + settingsComponent: TextLabelModal, + content: '', + size: 'medium', + }, + */ + ] +} diff --git a/src/app/charts/disk.js b/src/app/charts/disk.js new file mode 100644 index 000000000..367d812e2 --- /dev/null +++ b/src/app/charts/disk.js @@ -0,0 +1,98 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { mapInstanceDomains, defaultTitleAndKeylabel, divideBy, cumulativeTransform } from '../processors/transforms' +import { percentage, integer, number } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' + +export default [ + { + chartId: 'disk-iops', + group: 'Disk', + title: 'Disk IOPS', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.read', + 'disk.dev.write', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'disk-latency', + group: 'Disk', + title: 'Disk Latency', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.read_rawactive', + 'disk.dev.write_rawactive', + 'disk.dev.read', + 'disk.dev.write', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: number, + }, + + { + chartId: 'disk-throughput', + group: 'Disk', + title: 'Disk Throughput (Bytes)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.read_bytes', + 'disk.dev.write_bytes', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'disk-utilization', + group: 'Disk', + title: 'Disk Utilization (%)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'disk.dev.avactive', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + divideBy(1000), + cumulativeTransform(), + ], + yTickFormat: percentage, + }, +] diff --git a/src/app/charts/flamegraphs.js b/src/app/charts/flamegraphs.js new file mode 100644 index 000000000..b6acf58ca --- /dev/null +++ b/src/app/charts/flamegraphs.js @@ -0,0 +1,193 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import Flamegraph from '../components/Charts/Flamegraph.jsx' +import { onlyLatestValues } from '../processors/transforms' + +import CpuFlamegraphHelp from '../help/CpuFlamegraphHelp.jsx' +import PackagenameCpuFlamegraphHelp from '../help/PackagenameCpuFlamegraphHelp.jsx' +import UninlinedCpuFlamegraphHelp from '../help/UninlinedCpuFlamegraphHelp.jsx' +import PagefaultFlamegraphHelp from '../help/PagefaultFlamegraphHelp.jsx' +import DiskioFlamegraphHelp from '../help/DiskioFlamegraphHelp.jsx' +import IpcFlamegraphHelp from '../help/IpcFlamegraphHelp.jsx' +import CswFlamegraphHelp from '../help/CswFlamegraphHelp.jsx' +import OffcpuFlamegraphHelp from '../help/OffcpuFlamegraphHelp.jsx' +import OffwakeFlamegraphHelp from '../help/OffwakeFlamegraphHelp.jsx' + +export default function _charts(config) { + if (!config.enableFlamegraphs) return [] + + return [ + { + chartId: 'fg-cpu', + group: 'Flamegraphs', + title: 'CPU', + helpComponent: CpuFlamegraphHelp, + tooltipText: 'Flamegraph of process time on CPU', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.cpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-pname-cpu', + group: 'Flamegraphs', + title: 'Package name CPU', + helpComponent: PackagenameCpuFlamegraphHelp, + tooltipText: 'Flamegraph of process time on CPU, collapsed Java frames to package level', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.pnamecpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-uninlined-cpu', + group: 'Flamegraphs', + title: 'Uninlined CPU', + helpComponent: UninlinedCpuFlamegraphHelp, + tooltipText: 'Flamegraph of process time on CPU, without inlining', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.uninlinedcpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-pagefault', + group: 'Flamegraphs', + title: 'Page faults', + helpComponent: PagefaultFlamegraphHelp, + tooltipText: 'Show call stacks on CPU during page faults', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.pagefaultflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-diskio', + group: 'Flamegraphs', + title: 'Disk I/O', + helpComponent: DiskioFlamegraphHelp, + tooltipText: 'Show disk I/O', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.diskioflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-ipc', + group: 'Flamegraphs', + title: 'IPC', + helpComponent: IpcFlamegraphHelp, + tooltipText: 'Inter-process call flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.ipcflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + }, + + { + chartId: 'fg-csw', + group: 'Flamegraphs', + title: 'CSW', + helpComponent: CswFlamegraphHelp, + tooltipText: 'Context switch flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.cswflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + isHighOverhead: true, + }, + + { + chartId: 'fg-offcpu', + group: 'Flamegraphs', + title: 'Off CPU time', + helpComponent: OffcpuFlamegraphHelp, + tooltipText: 'Off CPU time flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.offcpuflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + isHighOverhead: true, + }, + + { + chartId: 'fg-offwake', + group: 'Flamegraphs', + title: 'Off wake time', + helpComponent: OffwakeFlamegraphHelp, + tooltipText: 'Off wake time flame graph', + isContainerAware: true, + processor: simpleModel, + visualisation: Flamegraph, + metricNames: [ + 'vector.task.offwakeflamegraph', + ], + transforms: [ + onlyLatestValues(), + ], + isHighOverhead: true, + }, + ] +} diff --git a/src/app/charts/index.js b/src/app/charts/index.js new file mode 100644 index 000000000..953b8645b --- /dev/null +++ b/src/app/charts/index.js @@ -0,0 +1,60 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* eslint-disable */ + +import { flatten } from '../utils' +import config from 'config' + +// all the remaining components, particularly vector specific angular components +function requireAll(requireContext) { + const validKeys = requireContext.keys().filter(f => f !== './index.js') + const requires = validKeys.map(requireContext) + return Array.isArray(requires) ? requires : [requires] +} + +function isValidChart(chart, index, charts) { + let errors = [] + + if (!chart.chartId) { + errors.push('chart is missing chartId') + } + if (!chart.group || !chart.title) { + errors.push('chart is missing group or title') + } + if (!chart.processor) { + errors.push('chart processor is not valid') + } + if (charts.findIndex(c => c.chartId === chart.chartId) !== index) { + errors.push('found a duplicate chartId') + } + + if (errors.length) { + console.warn('chart had errors, will not be loaded', chart, errors) + } + return !errors.length +} + +const requires = requireAll(require.context('./', false, /\.js$/)) +const charts = requires + .map(r => r.default) + .map(r => (typeof r === 'function') ? r(config) : r) // if it is a function, call it + .reduce(flatten, []) + .filter(isValidChart) + +export default charts diff --git a/src/app/charts/memory.js b/src/app/charts/memory.js new file mode 100644 index 000000000..122432f82 --- /dev/null +++ b/src/app/charts/memory.js @@ -0,0 +1,116 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { timesliceCalculations, defaultTitleAndKeylabel, cumulativeTransform, kbToGb } from '../processors/transforms' +import { integer } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' + +export default [ + { + chartId: 'memory-utilization-cached', + group: 'Memory', + title: 'Memory Utilization (Cached)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'mem.util.cached', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-utilization-free', + group: 'Memory', + title: 'Memory Utilization (Free)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'mem.util.free', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-utilization', + group: 'Memory', + title: 'Memory Utilization', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'mem.util.cached', + 'mem.util.used', + 'mem.util.free', + 'mem.util.bufmem', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + timesliceCalculations({ + 'free (unused)': (slices) => ({ '-1': slices['mem.util.free']['-1'] }), + 'free (cache)': (slices) => ({ '-1': slices['mem.util.cached']['-1'] + slices['mem.util.bufmem']['-1'] }), + 'application': (slices) => ({ '-1': slices['mem.util.used']['-1'] - slices['mem.util.cached']['-1'] - slices['mem.util.bufmem']['-1'] }), + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-utilization-used', + group: 'Memory', + title: 'Memory Utilization (Used)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'mem.util.used', + ], + transforms: [ + defaultTitleAndKeylabel(), + kbToGb(), + ], + yTickFormat: integer, + }, + + { + chartId: 'memory-page-faults', + group: 'Memory', + title: 'Page Faults', + processor: simpleModel, + visualisation: Chart, + lineType: 'stackedarea', + metricNames: [ + 'mem.vmstat.pgfault', + 'mem.vmstat.pgmajfault', + ], + transforms: [ + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, +] diff --git a/src/app/charts/networkNetwork.js b/src/app/charts/networkNetwork.js new file mode 100644 index 000000000..03f297ee0 --- /dev/null +++ b/src/app/charts/networkNetwork.js @@ -0,0 +1,149 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { renameMetric, defaultTitleAndKeylabel, mapInstanceDomains, cumulativeTransform } from '../processors/transforms' +import { integer } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' +import FilterModal from '../components/SettingsModals/FilterModal.jsx' + +export default [ + { + chartId: 'network-drops-in', + group: 'Network', + title: 'Network Drops (In)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.drops', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-drops-inout', + group: 'Network', + title: 'Network Drops (In + Out)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.drops', + 'network.interface.out.drops', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-drops-out', + group: 'Network', + title: 'Network Drops (Out)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.out.drops', + ], + transforms: [ + mapInstanceDomains(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + yTickFormat: integer, + }, + + { + // TODO should this chart have the container aware warning? + chartId: 'network-packets', + group: 'Network', + title: 'Network Packets', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.packets', + 'network.interface.out.packets', + ], + transforms: [ + mapInstanceDomains(), + FilterModal.filterInstanceIncludesFilterText(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + settingsComponent: FilterModal, + filter: '', + yTickFormat: integer, + }, + + { + chartId: 'network-retransmits', + group: 'Network', + title: 'Network Retransmits', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcp.retranssegs', + 'network.tcp.timeouts', + 'network.tcp.listendrops', + 'network.tcp.fastretrans', + 'network.tcp.slowstartretrans', + 'network.tcp.synretrans', + ], + transforms: [ + cumulativeTransform(), + renameMetric({ + 'network.tcp.retranssegs': 'retranssegs', + 'network.tcp.timeouts': 'timeouts', + 'network.tcp.listendrops': 'listendrops', + 'network.tcp.fastretrans': 'fastretrans', + 'network.tcp.slowstartretrans': 'slowstartretrans', + 'network.tcp.synretrans': 'synretrans', + }), + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-throughput', + group: 'Network', + title: 'Network Throughput (kB)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.interface.in.bytes', + 'network.interface.out.bytes', + ], + transforms: [ + mapInstanceDomains(), + FilterModal.filterInstanceIncludesFilterText(), + defaultTitleAndKeylabel(), + cumulativeTransform(), + ], + settingsComponent: FilterModal, + filter: '', + yTickFormat: integer, + } +] diff --git a/src/app/charts/networkTcp.js b/src/app/charts/networkTcp.js new file mode 100644 index 000000000..7c759410c --- /dev/null +++ b/src/app/charts/networkTcp.js @@ -0,0 +1,86 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import simpleModel from '../processors/simpleModel' +import { defaultTitleAndKeylabel } from '../processors/transforms' +import { integer } from '../processors/formats' +import Chart from '../components/Charts/Chart.jsx' + +export default [ + { + chartId: 'network-tcp-closewait', + group: 'Network', + title: 'TCP Connections (Close Wait)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.close_wait', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-tcp-established', + group: 'Network', + title: 'TCP Connections (Established)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.established', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-tcp', + group: 'Network', + title: 'TCP Connections', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.established', + 'network.tcpconn.time_wait', + 'network.tcpconn.close_wait', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + }, + + { + chartId: 'network-tcp-timewait', + group: 'Network', + title: 'TCP Connections (Time Wait)', + processor: simpleModel, + visualisation: Chart, + metricNames: [ + 'network.tcpconn.time_wait', + ], + transforms: [ + defaultTitleAndKeylabel(), + ], + yTickFormat: integer, + } +] diff --git a/src/app/components/Charts/Chart.jsx b/src/app/components/Charts/Chart.jsx new file mode 100644 index 000000000..0152f1e8f --- /dev/null +++ b/src/app/components/Charts/Chart.jsx @@ -0,0 +1,125 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { ResponsiveXYFrame } from "semiotic" +import moment from 'moment' +import memoizeOne from 'memoize-one' +import ColorHash from 'color-hash' +const colorHash = new ColorHash() +import ErrorBoundary from 'react-error-boundary' + +import ErrorPanel from '../ErrorPanel.jsx' +import ChartTooltip from './ChartTooltip.jsx' + +// most of this is modelled on the semiotic examples + +function fetchCoincidentPoints(passedData, dataset) { + return dataset + .map((point) => ({ + keylabel: point.keylabel, + color: colorHash.hex(point.keylabel), + value: point.data.find((i) => { + return i.ts.getTime() === passedData.ts.getTime(); + })})) + .filter((point) => !!point.value) + .sort((a, b) => { + return b.value.value - a.value.value; + }) +} + +const verticalTickLineGenerator = (axisData) => { + const { xy } = axisData + const style = `M${xy.x1},${xy.y1}L${xy.x1},${xy.y2}Z` + return +} + +const horizontalTickLineGenerator = (axisData) => { + const { xy } = axisData + const style = `M${xy.x1},${xy.y1}L${xy.x2},${xy.y1}Z` + return +} + +const generateAxes = memoizeOne(yTickFormat => ([ + { + orient: "left", + tickFormat: yTickFormat, + tickLineGenerator: horizontalTickLineGenerator + }, + { + orient: "bottom", + tickFormat: ts => moment(ts).format('hh:mm:ss'), + tickLineGenerator: verticalTickLineGenerator, + ticks: 4 + } +])) + + +class Chart extends React.PureComponent { + yExtent = [0, undefined] + hoverAnnotation = [{ type: 'frame-hover' }] + frameMargin = { left: 60, bottom: 60, right: 8, top: 8 } + baseMarkProps = { forceUpdate: true } + colorForElement = (d) => colorHash.hex(d.keylabel) + lineStyle = (d) => ({ stroke: this.colorForElement(d), fill: this.colorForElement(d), fillOpacity: 0.5 }) + areaStyle = (d) => ({ stroke: this.colorForElement(d), fill: this.colorForElement(d), fillOpacity: 0.5, strokeWidth: '2px' }) + valueIsDefined = (d) => d.value !== null + + render () { + const { chartInfo, dataset } = this.props + const lineType = chartInfo.lineType || 'line' + + const axes = generateAxes(chartInfo.yTickFormat) + + return ( + + + + + } + baseMarkProps={this.baseMarkProps} /> + ) + } +} + +Chart.propTypes = { + chartInfo: PropTypes.object.isRequired, + dataset: PropTypes.array.isRequired, +} + +export default Chart diff --git a/src/app/components/Charts/ChartTooltip.jsx b/src/app/components/Charts/ChartTooltip.jsx new file mode 100644 index 000000000..0c63db222 --- /dev/null +++ b/src/app/components/Charts/ChartTooltip.jsx @@ -0,0 +1,74 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Segment } from 'semantic-ui-react' + +const generateTooltipIconStyle = (color) => ({ + width: '10px', + height: '10px', + backgroundColor: color, + display: 'inline-block', + position: 'absolute', + top: '8px', + left: '0', + margin: '0', +}) + +const tooltipStyles = { + header: {fontWeight: 'bold', borderBottom: 'thin solid black', marginBottom: '10px', textAlign: 'center'}, + lineItem: {position: 'relative', display: 'block', textAlign: 'left'}, + title: {display: 'inline-block', margin: '0 5px 0 15px'}, + value: {display: 'inline-block', fontWeight: 'bold', margin: '0'}, + wrapper: {background:"rgba(255,255,255)", minWidth: "max-content", whiteSpace: 'nowrap'} +} + +class ChartTooltip extends React.PureComponent { + render () { + const { header, points, format } = this.props + + return ( + +
+ {header} +
+ { points.map((point, i) => +
+

+

{point.keylabel}

+

{format(point.value && point.value.value)}

+
+ )} +
+ ) + } +} + +ChartTooltip.defaultProps = { + format: (v) => v, // if no format provided, use identity +} + +ChartTooltip.propTypes = { + header: PropTypes.string.isRequired, + points: PropTypes.array.isRequired, + format: PropTypes.func.isRequired, +} + +export default ChartTooltip diff --git a/src/app/components/Charts/Flamegraph.jsx b/src/app/components/Charts/Flamegraph.jsx new file mode 100644 index 000000000..0c412facc --- /dev/null +++ b/src/app/components/Charts/Flamegraph.jsx @@ -0,0 +1,126 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import superagent from 'superagent' + +import { Button, Form } from 'semantic-ui-react' + +const TIMEOUTS = { response: 5000, deadline: 10000 } + +function getStatusFromDataset(dataset) { + // oh for the ?. operator + return dataset && dataset[0] && dataset[0].data && dataset[0].data[0] && dataset[0].data[0].value || '?' +} + +const FG_DURATIONS = [ 5, 10, 20, 60, 120 ] + +/** + * Takes over a chart panel to allow generation of a flamegraph + * + * Directly calls the pmapi to submit requests, and then waits for the response + * to come in via normal datasets. + * + * It is expected that the metricNames[] field in the chart record contains the correct + * metric name to poll for a flamegraph + */ +class Flamegraph extends React.PureComponent { + state = { + durationSeconds: FG_DURATIONS[0], + fetchFile: null, + } + + static getDerivedStateFromProps(newProps) { + // we need to capture the DONE filename, because it only appears for a single round + // ie: after DONE it reverts to IDLE state + const splitResponse = getStatusFromDataset(newProps.dataset).split(' ') + + return (splitResponse[0] === 'DONE') + ? { fetchFile: splitResponse[1] } + : null + } + + handleDurationChange = (e, { value }) => this.setState({ durationSeconds: value }) + + requestGenerate = async () => { + const { chartInfo } = this.props + const { durationSeconds } = this.state + + const protocol = chartInfo.context.target.protocol + const hostname = chartInfo.context.target.hostname + const contextId = chartInfo.context.contextId + const fgtype = chartInfo.metricNames[0] + + try { + this.setState({ fetchFile: null }) + await superagent.get(`${protocol}://${hostname}/pmapi/${contextId}/_store`) + .timeout(TIMEOUTS) + .query({ name: fgtype, value: durationSeconds }) + } catch (err) { + console.log('flamegraph trigger failed', err) + console.error(err) + } + } + + render () { + const { durationSeconds, fetchFile } = this.state + const { dataset } = this.props + + const protocol = this.props.chartInfo.context.target.protocol + const hostname = this.props.chartInfo.context.target.hostname + const status = getStatusFromDataset(dataset) + const isIdle = ['IDLE', 'ERROR'].includes(status.split(' ')[0]) + const durationOptions = FG_DURATIONS.map(sec => ({ text: `${sec} sec`, value: sec })) + + return ( +
+

Flamegraph previous request status: {status}

+ +

Profile duration:

+ + + +

+ +

+ ) + } +} + +Flamegraph.propTypes = { + chartInfo: PropTypes.object.isRequired, + dataset: PropTypes.array.isRequired, +} + +export default Flamegraph diff --git a/src/app/components/Charts/Heatmap.jsx b/src/app/components/Charts/Heatmap.jsx new file mode 100644 index 000000000..87f3ddc41 --- /dev/null +++ b/src/app/components/Charts/Heatmap.jsx @@ -0,0 +1,134 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { ResponsiveXYFrame } from "semiotic" +import moment from 'moment' +import { scaleThreshold } from 'd3-scale' +import isEqual from 'lodash.isequal' +import memoizeOne from 'memoize-one' + +import { uniqueFilter } from '../../utils' +import { getLargestValueInDataset } from '../../processors/modelUtils' +import HeatmapScale from './HeatmapScale.jsx' +import HeatmapTooltip from './HeatmapTooltip.jsx' + +// collapse dataset into a single stream as this is what the xyframe heatmap view requires +function extractHeatmapValuesFromDataset(dataset, yAxisLabels) { + const values = [] + if (dataset) { + for (let d of dataset) { + for (let tsv of d.data) { + for (let weight = 0; weight < tsv.value; weight++) { + values.push({ ts: tsv.ts, value: d.instance, label: yAxisLabels[d.instance] || '?' }) + } + } + } + } + return values +} + +function createScale(thresholds, colors) { + return scaleThreshold() + .domain(thresholds) + .range(colors) +} + +// cache the scale; avoid unnecessary redrawing the heatmap which is actually quite expensive +const memoizedCreateScale = memoizeOne(createScale, isEqual) + +function determineThresholds(chartInfo, dataset) { + // works because input thresholds are ranged [0,1], so we can just multiply out + const scaleFactor = chartInfo.heatmapMaxValue || getLargestValueInDataset(dataset) || 1 + const thresholds = chartInfo.heatmap.thresholds.map(v => v * scaleFactor) + + // but we need to put the first value back to ensure the 0/1 transition works cleanly + // TODO potentially a bug here for super large heatmapMaxValues? + thresholds[0] = chartInfo.heatmap.thresholds[0] + + return memoizedCreateScale(thresholds, chartInfo.heatmap.colors) +} + +class Heatmap extends React.PureComponent { + heatmapDivStyle = { height: '100%', display: 'flex', flexDirection: 'column' } + margin = { left: 90, bottom: 30, right: 8, top: 8 } + baseMarkProps = { forceUpdate: true } + + render () { + const { chartInfo, dataset } = this.props + + const yAxisLookup = (dataset && dataset.map(mi => mi.yAxisLabels) || []).filter(uniqueFilter) + const thresholds = determineThresholds(chartInfo, dataset) + const heatmapValues = extractHeatmapValuesFromDataset(dataset, yAxisLookup) + + if (! (dataset.every(d => d.data.length > 0) && heatmapValues.length > 0)) { + return Insufficient data + } + + const areas = [{ coordinates: heatmapValues }] + const areaType = { type: 'heatmap', xBins: dataset[0].data.length, yBins: yAxisLookup.length } + + return (
+ + + + ({ + fill: thresholds(d.value), + stroke: 'lightgrey' + })} + margin={this.margin} + yExtent={[0, yAxisLookup.length]} + hoverAnnotation={true} + tooltipContent={dp => dp.binItems.length > 0 + && + } + axes={[ + { + orient: "left", + tickFormat: v => yAxisLookup[v - 1] || '', + ticks: yAxisLookup && yAxisLookup.length, + }, + { + orient: "bottom", + tickFormat: ts => moment(ts).format('hh:mm:ss'), + ticks: 4, + } + ]} + baseMarkProps={this.baseMarkProps} /> +
) + } +} + +Heatmap.propTypes = { + dataset: PropTypes.array.isRequired, + chartInfo: PropTypes.object.isRequired, +} + +export default Heatmap diff --git a/src/app/components/Charts/HeatmapScale.jsx b/src/app/components/Charts/HeatmapScale.jsx new file mode 100644 index 000000000..31f56ea56 --- /dev/null +++ b/src/app/components/Charts/HeatmapScale.jsx @@ -0,0 +1,78 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { select } from 'd3-selection' +import { legendColor } from 'd3-svg-legend' + +const svgStyle = { + height: '60px', + display: 'block', + margin: 'auto', +} + +class HeatmapScale extends React.PureComponent { + componentDidMount() { + this.createHeatmap() + } + + componentDidUpdate() { + this.createHeatmap() + } + + setNode = (node) => this.node = node + + render () { + return + } + + filterLabels = ({ i, genLength, generatedLabels }) => { + // we want first, last, and every third label, also clean up the NaN + return ((i === 0) || (i % 3 === 0) || (i === genLength - 1)) + ? generatedLabels[i].replace('NaN', '∞') + : null + } + + createHeatmap() { + const legend = legendColor() + .shapeHeight(30) + .shapeWidth(30) + .shapePadding(10) + .labelDelimiter('-') + .orient('horizontal') + .scale(this.props.thresholds) + .labelFormat('d') + .labels(this.filterLabels) + + select(this.node) + .append('g') + .attr('class', 'legendLinear') + + select(this.node) + .select('g') + .call(legend) + } +} + +HeatmapScale.propTypes = { + thresholds: PropTypes.func.isRequired, +} + +export default HeatmapScale diff --git a/src/app/components/Charts/HeatmapTooltip.jsx b/src/app/components/Charts/HeatmapTooltip.jsx new file mode 100644 index 000000000..8fb069af0 --- /dev/null +++ b/src/app/components/Charts/HeatmapTooltip.jsx @@ -0,0 +1,45 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +const tooltipContentStyle = { + background: 'rgba(255, 255, 255, 0.85)', + border: '1px double #ddd', + padding: '10px 20px', +} + +class HeatmapTooltip extends React.PureComponent { + render () { + const { label, count } = this.props + + return ( +
+

{label}: {count}

+
+ ) + } +} + +HeatmapTooltip.propTypes = { + label: PropTypes.string.isRequired, + count: PropTypes.number.isRequired, +} + +export default HeatmapTooltip diff --git a/src/app/components/Charts/MultiTable.jsx b/src/app/components/Charts/MultiTable.jsx new file mode 100644 index 000000000..64d53b298 --- /dev/null +++ b/src/app/components/Charts/MultiTable.jsx @@ -0,0 +1,74 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { Table } from 'semantic-ui-react' + +import { uniqueFilter } from '../../utils' + +function createTableRows(dataset) { + if (!dataset) return { headers: [], tableData: [] } + + // an array of [ pid, comm, laddr ..] + const headers = dataset.map(mi => mi.metric).filter(uniqueFilter) + + // create a two dimensional array of arrays + const rows = [] + dataset.forEach(({ metric, instance, data }) => { + rows[instance] = rows[instance] || [] // ensure a row exists for this instance + let column = headers.indexOf(metric) // determine which column to set + rows[instance][column] = data[0].value // set the value at the column + }) + + return { headers, tableData: rows } +} + +class MultiTable extends React.PureComponent { + render () { + const { headers, tableData } = createTableRows(this.props.dataset) + + return ( + + + + { headers.map(hdr => + {hdr} + )} + + + + { tableData.map((row, ridx) => + + { row.map((col, cidx) => + {col}) } + + )} + +
+ ) + } +} + +MultiTable.propTypes = { + dataset: PropTypes.array.isRequired, +} + +MultiTable.createTableRows = createTableRows + +export default MultiTable diff --git a/src/app/components/Charts/MultiTable.spec.js b/src/app/components/Charts/MultiTable.spec.js new file mode 100644 index 000000000..664fb826a --- /dev/null +++ b/src/app/components/Charts/MultiTable.spec.js @@ -0,0 +1,81 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { expect } from 'chai' +import MultiTable from './MultiTable.jsx' + +describe('createTableRows', () => { + describe('with a missing dataset', () => { + let dataset = null + let result = MultiTable.createTableRows(dataset) + it('returns an empty headers result', () => { + expect(Array.isArray(result.headers)).to.equal(true) + expect(result.headers.length).to.equal(0) + }) + it('returns an empty tableData result', () => { + expect(Array.isArray(result.tableData)).to.equal(true) + expect(result.tableData.length).to.equal(0) + }) + }) + + describe('with a complex dataset', () => { + let data = [ + { "metric": "PID", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1752 } ] }, + { "metric": "PID", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1752 } ] }, + { "metric": "PID", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1412 } ] }, + { "metric": "COMM", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "pmwebd" } ] }, + { "metric": "COMM", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "pmwebd" } ] }, + { "metric": "COMM", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "pmcd" } ] }, + { "metric": "LADDR", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "192.168.251.133" } ] }, + { "metric": "LADDR", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "LADDR", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "LPORT", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 44323 } ] }, + { "metric": "LPORT", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 47558 } ] }, + { "metric": "LPORT", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 44321 } ] }, + { "metric": "DADDR", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "192.168.251.1" } ] }, + { "metric": "DADDR", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "DADDR", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": "127.0.0.1" } ] }, + { "metric": "DPORT", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 49644 } ] }, + { "metric": "DPORT", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 44321 } ] }, + { "metric": "DPORT", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 47558 } ] }, + { "metric": "RX_KB", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1 } ] }, + { "metric": "RX_KB", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] }, + { "metric": "RX_KB", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] }, + { "metric": "TX_KB", "instance": 0, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 1 } ] }, + { "metric": "TX_KB", "instance": 1, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] }, + { "metric": "TX_KB", "instance": 2, "data": [ { "ts": "2018-08-31T16:16:30.466Z", "value": 0 } ] } + ] + let result = MultiTable.createTableRows(data) + + it('collects the correct header instances', () => { + expect(result.headers.length).to.equal(8) + expect(result.headers).to.have.deep.members([ + 'PID', 'COMM', 'LADDR', 'LPORT', 'DADDR', 'DPORT', 'RX_KB', 'TX_KB' + ]) + }) + + it('collects the correct data rows', () => { + expect(result.tableData.length).to.equal(3) // there are three instances + expect(result.tableData).to.have.deep.members([ + [ 1752, 'pmwebd', '192.168.251.133', 44323, '192.168.251.1', 49644, 1, 1 ], + [ 1752, 'pmwebd', '127.0.0.1', 47558, '127.0.0.1', 44321, 0, 0 ], + [ 1412, 'pmcd', '127.0.0.1', 44321, '127.0.0.1', 47558, 0, 0], + ]) + }) + }) +}) diff --git a/src/app/components/Charts/SimpleTable.jsx b/src/app/components/Charts/SimpleTable.jsx new file mode 100644 index 000000000..ce5c4817c --- /dev/null +++ b/src/app/components/Charts/SimpleTable.jsx @@ -0,0 +1,52 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { Table } from 'semantic-ui-react' + +class SimpleTable extends React.PureComponent { + render () { + const dataset = this.props.dataset + + return ( + + + + Title + Value + + + + { dataset.map(({ title, data }, ridx) => + + {title} + {data[0].value} + + )} + +
+ ) + } +} + +SimpleTable.propTypes = { + dataset: PropTypes.array.isRequired, +} + +export default SimpleTable diff --git a/src/app/components/flamegraph/flamegraph.module.js b/src/app/components/Charts/TextLabel.jsx similarity index 58% rename from src/app/components/flamegraph/flamegraph.module.js rename to src/app/components/Charts/TextLabel.jsx index 898ece8c0..b2da4a342 100644 --- a/src/app/components/flamegraph/flamegraph.module.js +++ b/src/app/components/Charts/TextLabel.jsx @@ -1,6 +1,6 @@ /**! * - * Copyright 2016 Netflix, Inc. + * Copyright 2018 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,12 +15,23 @@ * limitations under the License. * */ -(function() { - 'use strict'; - angular - .module('flamegraph', [ - 'dashboard' - ]); +import React from 'react' +import PropTypes from 'prop-types' +import { Header } from 'semantic-ui-react' -})(); +class TextLabel extends React.PureComponent { + render () { + const { size, content } = this.props.chartInfo + + return ( +
+ ) + } +} + +TextLabel.propTypes = { + chartInfo: PropTypes.object.isRequired, +} + +export default TextLabel diff --git a/src/app/components/Charts/cividis.js b/src/app/components/Charts/cividis.js new file mode 100644 index 000000000..14ba81dfa --- /dev/null +++ b/src/app/components/Charts/cividis.js @@ -0,0 +1,62 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* +// https://github.com/plotly/plotly.py/pull/883/files +const cividis = [ + [0.000000, 'rgb(0,32,76)'], [0.058824, 'rgb(0,42,102)'], + [0.117647, 'rgb(0,52,110)'], [0.176471, 'rgb(39,63,108)'], + [0.235294, 'rgb(60,74,107)'], [0.294118, 'rgb(76,85,107)'], + [0.352941, 'rgb(91,95,109)'], [0.411765, 'rgb(104,106,112)'], + [0.470588, 'rgb(117,117,117)'], [0.529412, 'rgb(131,129,120)'], + [0.588235, 'rgb(146,140,120)'], [0.647059, 'rgb(161,152,118)'], + [0.705882, 'rgb(176,165,114)'], [0.764706, 'rgb(192,177,109)'], + [0.823529, 'rgb(209,191,102)'], [0.882353, 'rgb(225,204,92)'], + [0.941176, 'rgb(243,219,79)'], [1.000000, 'rgb(255,233,69)'] +] +*/ + +// use a slight variation on cividis, since +// (1) we want the unset cells to by white, rather than dark blue +// (2) we need the top of the range to be unset domain, for d3 scaleThreshold +const cividis = [ + [0.000001, 'rgb(255,255,255)'], + [0.058824, 'rgb(0,42,102)'], + [0.117647, 'rgb(0,52,110)'], + [0.176471, 'rgb(39,63,108)'], + [0.235294, 'rgb(60,74,107)'], + [0.294118, 'rgb(76,85,107)'], + [0.352941, 'rgb(91,95,109)'], + [0.411765, 'rgb(104,106,112)'], + [0.470588, 'rgb(117,117,117)'], + [0.529412, 'rgb(131,129,120)'], + [0.588235, 'rgb(146,140,120)'], + [0.647059, 'rgb(161,152,118)'], + [0.705882, 'rgb(176,165,114)'], + [0.764706, 'rgb(192,177,109)'], + [0.823529, 'rgb(209,191,102)'], + [0.882353, 'rgb(225,204,92)'], + [0.941176, 'rgb(243,219,79)'], + [undefined, 'rgb(255,233,69)'] +] + +const _thresholds = cividis.map(v => v[0]) +const _colors = cividis.map(v => v[1]) + +export const thresholds = _thresholds +export const colors = _colors diff --git a/src/app/components/ConfigPanel/AddContextModal.jsx b/src/app/components/ConfigPanel/AddContextModal.jsx new file mode 100644 index 000000000..544e8f5ae --- /dev/null +++ b/src/app/components/ConfigPanel/AddContextModal.jsx @@ -0,0 +1,137 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Modal, Form } from 'semantic-ui-react' +import debounce from 'lodash.debounce' + +import { fetchContainerList } from '../../utils' + +class AddContextModal extends React.PureComponent { + state = { + modalOpen: !!this.props.initiallyOpen, + protocolDropdownOptions: [ + { text: 'HTTP', value: 'http' }, + { text: 'HTTPS', value: 'https' } + ], + containerDropdownOptions: [ + { text: 'N/A', value: '_all' } + ], + containerId: '_all', + connected: false, + protocol: this.props.defaultProtocol, + hostport: this.props.defaultPort, + hostspec: this.props.defaultHostspec, + } + + containerNameResolver = this.props.useCgroupId ? (c => c.cgroup) : (c => c.containerId) + + refreshContainerList = async () => { + const { protocol, hostname, hostport, hostspec } = this.state + if (!protocol || !hostname || !hostport || !hostspec) return + + this.setState({ + containerDropdownOptions: [ + { value: '_all', text: '.. connecting ..' } + ], + containerId: '_all', + connected: false, + }) + + const containerList = await fetchContainerList(protocol, hostname, hostport, hostspec) + + const containerDropdownOptions = [] + .concat({ text: 'All', value: '_all' }) + .concat(containerList.map(c => ({ text: this.containerNameResolver(c), value: this.containerNameResolver(c) }))) + + this.setState({ containerDropdownOptions, containerId: '_all', connected: true }) + } + refreshContainerList = debounce(this.refreshContainerList, 500) + + handleProtocolChange = (e, { value }) => this.setState({ protocol: value }, this.refreshContainerList) + handleHostnameChange = (e, { value }) => this.setState({ hostname: value }, this.refreshContainerList) + handleHostportChange = (e, { value }) => this.setState({ hostport: value }, this.refreshContainerList) + handleHostspecChange = (e, { value }) => this.setState({ hostspec: value }, this.refreshContainerList) + handleContainerChange = (e, { value }) => this.setState({ containerId: value }) + handleClose = () => this.setState({ modalOpen: false }) + handleOpen = () => this.setState({ modalOpen: true }) + + handleSubmit = () => { + const { protocol, hostname, hostport, hostspec, containerId } = this.state + const { onNewContext } = this.props + onNewContext({ + protocol: protocol, + hostname: hostname + ':' + hostport, + hostspec: hostspec, + containerId: containerId || '_all', + }) + this.setState({ modalOpen: false }) + } + + render () { + const { modalOpen, protocolDropdownOptions, protocol, hostport, hostspec, connected, containerId, containerDropdownOptions } = this.state + const { render, disableHostspecInput, disableContainerSelect } = this.props + + return ( + + + Add connection + + +
+ + + + + + + + + Add + + +
+ +
+ ) + } +} + +AddContextModal.propTypes = { + onNewContext: PropTypes.func.isRequired, + defaultProtocol: PropTypes.string.isRequired, + defaultPort: PropTypes.number.isRequired, + defaultHostspec: PropTypes.string.isRequired, + disableHostspecInput: PropTypes.bool.isRequired, + disableContainerSelect: PropTypes.bool.isRequired, + useCgroupId: PropTypes.bool.isRequired, + render: PropTypes.func.isRequired, + initiallyOpen: PropTypes.bool, +} + +export default AddContextModal diff --git a/src/app/components/ConfigPanel/ChartSelector.jsx b/src/app/components/ConfigPanel/ChartSelector.jsx new file mode 100644 index 000000000..490a8c214 --- /dev/null +++ b/src/app/components/ConfigPanel/ChartSelector.jsx @@ -0,0 +1,81 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' +import { Menu } from 'semantic-ui-react' + +import CustomChartSelector from './CustomChartSelector.jsx' +import SimpleChartSelector from './SimpleChartSelector.jsx' + +class ChartSelector extends React.PureComponent { + state = { + activeTab: 'simple', + } + + handleTabClick = (e, { name }) => this.setState({ activeTab: name }) + + render () { + const { activeTab } = this.state + const { charts, bundles, disabled, selectedPmids, selectedChartIds } = this.props + const { onClearCharts, onAddChart, onRequestClose } = this.props + + return (
+ + + + + + { activeTab === 'simple' && + } + + { activeTab === 'custom' && + } + +
) + } +} + +ChartSelector.defaultProps = { + disabled: false, +} + +ChartSelector.propTypes = { + charts: PropTypes.array.isRequired, + bundles: PropTypes.array.isRequired, + onClearCharts: PropTypes.func.isRequired, + onAddChart: PropTypes.func.isRequired, + onRequestClose: PropTypes.func.isRequired, + disabled: PropTypes.bool, + selectedPmids: PropTypes.object, + selectedChartIds: PropTypes.array, +} + +export default ChartSelector diff --git a/src/app/components/ConfigPanel/ConfigPanel.jsx b/src/app/components/ConfigPanel/ConfigPanel.jsx new file mode 100644 index 000000000..48e7a4560 --- /dev/null +++ b/src/app/components/ConfigPanel/ConfigPanel.jsx @@ -0,0 +1,163 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Segment } from 'semantic-ui-react' +import ChartSelector from './ChartSelector.jsx' +import ContextMenu from './ContextMenu.jsx' +import { matchesTarget, isContextLoading } from '../../utils' + +const panelStyle = { + marginTop: '0px', +} + +function getSelectedContextPmids(contextDatas, selected) { + if (!selected) return undefined + + const context = contextDatas.find(cd => matchesTarget(cd.target, selected.target)) + return context && context.pmids +} + +class ConfigPanel extends React.PureComponent { + state = {} + + handleClearCharts = () => { + if (this.state.selectedContext) { + this.props.onClearChartsFromContext(this.state.selectedContext) + } + } + + handleAddChart = (chart) => { + if (this.state.selectedContext) { + this.props.onAddChartToContext(this.state.selectedContext, chart) + } + } + + handleContextSelect = (context) => { + this.setState({ selectedContext: context }) + } + + handleNewContext = (context) => { + this.props.onNewContext(context) + if (this.state.selectedContext === null) { + this.setState({ selectedContext: context }) + } + } + + handleRemoveContext = (context) => { + this.props.onRemoveContext(context) + if (matchesTarget(this.state.selectedContext.target, context.target)) { + this.setState({ selectedContext: null }) + } + } + + componentDidUpdate = () => { + const { contextData } = this.props + const { selectedContext } = this.state + + let validContexts = contextData.filter(cd => !isContextLoading(cd)) + + // it is valid if we have a selection, and there is some context that matches our selection + let validSelection = selectedContext && + validContexts.some(cd => matchesTarget(cd.target, selectedContext.target)) + + // early exit + if (validSelection) return + + // if there is an available context to use, connect + if (validContexts.length > 0) { + this.setState({ selectedContext: validContexts[0] }) + } + + // if not, then clear out our state + if (selectedContext && validContexts.length === 0) { + this.setState({ selectedContext: null }) + } + } + + render () { + const { config, contextData, initialAddContext, charts, bundles, onRequestClose, chartlist } = this.props + const { selectedContext } = this.state + + // given a selected context, find all charts in the chartlist that match, and return their ids + const selectedCharts = chartlist.filter(c => matchesTarget(c.context.target, selectedContext && selectedContext.target)) + const selectedChartIds = selectedCharts.map(c => c.chartId) + + return ( + + + + + + + ) + } +} + +ConfigPanel.propTypes = { + config: PropTypes.shape({ + defaultPort: PropTypes.number.isRequired, + defaultHostspec: PropTypes.string.isRequired, + dataWindows: PropTypes.arrayOf( + PropTypes.shape({ + valueSeconds: PropTypes.number.isRequired, + text: PropTypes.string.isRequired, + }) + ), + pollIntervals: PropTypes.arrayOf( + PropTypes.shape({ + valueSeconds: PropTypes.number.isRequired, + text: PropTypes.string.isRequired, + }) + ), + disableHostspecInput: PropTypes.bool.isRequired, + disableContainerSelect: PropTypes.bool.isRequired, + }), + contextData: PropTypes.array.isRequired, + onNewContext: PropTypes.func.isRequired, + onAddChartToContext: PropTypes.func.isRequired, + onClearChartsFromContext: PropTypes.func.isRequired, + onRemoveContext: PropTypes.func.isRequired, + onRequestClose: PropTypes.func.isRequired, + charts: PropTypes.array.isRequired, + bundles: PropTypes.array.isRequired, + initialAddContext: PropTypes.bool.isRequired, + chartlist: PropTypes.array.isRequired, +} + +ConfigPanel.getSelectedContextPmids = getSelectedContextPmids + +export default ConfigPanel diff --git a/src/app/components/ConfigPanel/ContextMenu.jsx b/src/app/components/ConfigPanel/ContextMenu.jsx new file mode 100644 index 000000000..abd7125e4 --- /dev/null +++ b/src/app/components/ConfigPanel/ContextMenu.jsx @@ -0,0 +1,100 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Menu, Button } from 'semantic-ui-react' + +import AddContextModal from './AddContextModal.jsx' +import ContextMenuItem from './ContextMenuItem.jsx' +import { matchesTarget } from '../../utils' + +const chartSelectorStyle = { + marginTop: '0px', +} + +class ContextMenu extends React.PureComponent { + handleNewContext = (target) => { + const { contextData, onNewContext } = this.props + if (contextData.some(c => matchesTarget(target, c.target))) { + alert('A context already exists for this target') + } else { + onNewContext(target) + } + } + + addContextButton = (showModal) => + + render () { + const { contextData, config, initialAddContext, onRemoveContext, onContextSelect, selectedContext } = this.props + const { defaultProtocol, defaultPort, defaultHostspec, disableHostspecInput, disableContainerSelect, useCgroupId } = config + + return ( + + + { /* advise if no connections */ } + { (contextData === null || contextData.length === 0) && + No active connections + } + + { /* regular context menu selector */ } + { (contextData || []).map(ctx => + ) } + + { /* add context modal, popped by a button */ } + + + + + + ) + } +} + +ContextMenu.propTypes = { + config: PropTypes.shape({ + disableHostspecInput: PropTypes.bool.isRequired, + disableContainerSelect: PropTypes.bool.isRequired, + defaultPort: PropTypes.number.isRequired, + defaultHostspec: PropTypes.string.isRequired, + useCgroupId: PropTypes.bool.isRequired, + }), + contextData: PropTypes.array.isRequired, + onContextSelect: PropTypes.func.isRequired, + onNewContext: PropTypes.func.isRequired, + onRemoveContext: PropTypes.func.isRequired, + selectedContext: PropTypes.object, + initialAddContext: PropTypes.bool, +} + +export default ContextMenu diff --git a/src/app/components/ConfigPanel/ContextMenuItem.jsx b/src/app/components/ConfigPanel/ContextMenuItem.jsx new file mode 100644 index 000000000..3a3396653 --- /dev/null +++ b/src/app/components/ConfigPanel/ContextMenuItem.jsx @@ -0,0 +1,96 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Menu, Loader, Button } from 'semantic-ui-react' +import { isContextLoading } from '../../utils' + +function itemColor(context) { + if (context.errText) { + return 'red' + } else { + if (isContextLoading(context)) { + return 'grey' + } else { + return 'green' + } + } + +} + +class ContextMenuItem extends React.Component { + menuText = (target) => { + let children = [target.hostname, ' => ', target.hostspec] + if (target.containerId !== '_all') { + children.push( +
) + children.push('Container: ') + children.push(target.containerId) + } + return children + } + + handleContextClick = (e, { context }) => { + this.props.onContextSelect(context) + } + + handleContextXClick = (e, { context }) => { + // the button is inside the menu; stop propagation to prevent the + // x button followed by a context menu item click + e.stopPropagation() + this.props.onRemoveContext(context) + } + + render () { + const { ctx, isActive } = this.props + const menuText = this.menuText(ctx.target) + const isLoading = isContextLoading(ctx) + + return ( + + + { /* text area of menu */ } + {menuText} + + { /* loading spinner */ } + + + { /* x button to close */ } + + + + ) + } +} + +FilterModal.propTypes = { + filter: PropTypes.string.isRequired, + onNewSettings: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +/** + * Filter instance name by settings configured by modal (basic includes) + * + * @return {function} a transform function + */ +FilterModal.filterInstanceIncludesFilterText = function () { + return function _filterInstanceIncludesFilterText (metricInstances, { chartInfo }) { + if (!chartInfo.filter) return metricInstances + return metricInstances.filter(mi => (mi.instance && mi.instance.includes) ? mi.instance.includes(chartInfo.filter) : true) + } +} + +export default FilterModal diff --git a/src/app/components/SettingsModals/HeatmapSettingsModal.jsx b/src/app/components/SettingsModals/HeatmapSettingsModal.jsx new file mode 100644 index 000000000..52b13bab3 --- /dev/null +++ b/src/app/components/SettingsModals/HeatmapSettingsModal.jsx @@ -0,0 +1,107 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { getLargestValueInDataset } from '../../processors/modelUtils' +import { uniqueFilter } from '../../utils' + +import { Form } from 'semantic-ui-react' + +class HeatmapSettingsModal extends React.PureComponent { + state = { + heatmapMaxValue: this.props.heatmapMaxValue, + maxInstanceValue: this.props.maxInstanceValue, + selectedMetrics: this.props.selectedMetrics, + } + + handleMaxValueChange = (e, { value }) => this.setState({ heatmapMaxValue: parseInt(value, 10) }) + handleMaxYValueChange = (e, { value }) => this.setState({ maxInstanceValue: parseInt(value, 10) }) + handleSelectedMetricChange = (e, { label, checked }) => { + if (checked) { + this.setState((state) => ({ + selectedMetrics: state.selectedMetrics.concat(label).filter(uniqueFilter) + })) + } + + if (!checked) { + this.setState((state) => ({ + selectedMetrics: state.selectedMetrics.filter(e => e !== label) + })) + } + } + + handleSubmit = () => { + this.props.onNewSettings(this.state) + this.props.onClose() + } + + render() { + const { dataset = [], selectedMetrics, metricNames } = this.props + const { heatmapMaxValue = 0, maxInstanceValue = 0 } = this.state + + const chartMaxValue = getLargestValueInDataset(dataset) + const yAxisOptions = dataset + .map(mi => mi.yAxisLabels) + .filter(uniqueFilter) + .map((label, index) => ({ text: label, value: index })) + .filter(li => li.value !== 0) // remove any 0 so we can replace it with an auto + .concat({ text: 'Auto', value: 0 }) + + return ( +
+ + + +
+ + + + { selectedMetrics && + + + { metricNames.map((m) => + + )} + } + + OK + + ) + } +} + +HeatmapSettingsModal.propTypes = { + heatmapMaxValue: PropTypes.number, + maxInstanceValue: PropTypes.number, + selectedMetrics: PropTypes.arrayOf(PropTypes.string), + metricNames: PropTypes.arrayOf(PropTypes.string), + dataset: PropTypes.array, + onNewSettings: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default HeatmapSettingsModal diff --git a/src/app/components/SettingsModals/TextLabelModal.jsx b/src/app/components/SettingsModals/TextLabelModal.jsx new file mode 100644 index 000000000..2843e1c1f --- /dev/null +++ b/src/app/components/SettingsModals/TextLabelModal.jsx @@ -0,0 +1,67 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import { Form } from 'semantic-ui-react' + +const SIZES = ['tiny', 'small', 'medium', 'large', 'huge'] + +class TextLabelModal extends React.PureComponent { + state = { + content: this.props.content, + size: this.props.size, + } + + handleSubmit = () => { + this.props.onNewSettings(this.state) + this.props.onClose() + } + + handleContentChange = (e, { value }) => this.setState({ content: value }) + handleSizeChange = (e, { value }) => this.setState({ size: value }) + + render() { + return ( +
+ + + + + + { SIZES.map(size => + + )} + + + OK + + ) + } +} + +TextLabelModal.propTypes = { + content: PropTypes.string.isRequired, + size: PropTypes.oneOf(SIZES).isRequired, + + onNewSettings: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default TextLabelModal diff --git a/src/app/components/chart/areaStackedTimeSeries.chart.directive.js b/src/app/components/chart/areaStackedTimeSeries.chart.directive.js deleted file mode 100644 index 33559ddbf..000000000 --- a/src/app/components/chart/areaStackedTimeSeries.chart.directive.js +++ /dev/null @@ -1,109 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global d3, nv*/ - -(function () { - 'use strict'; - - function areaStackedTimeSeries($rootScope, $log, D3Service) { - - function link(scope) { - scope.id = D3Service.getId(); - scope.flags = $rootScope.flags; - scope.legend = true; - - var chart; - - nv.addGraph(function () { - - var yAxisTickFormat = D3Service.yAxisTickFormat(), - height = 250; - - chart = nv.models.stackedAreaChart().options({ - duration: 0, - useInteractiveGuideline: true, - interactive: false, - showLegend: true, - showXAxis: true, - showYAxis: true, - showControls: false - }); - - chart.margin({'left': 35, 'right': 35}); - - chart.height(height); - - if (scope.forcey) { - chart.yDomain([0, scope.forcey]); - } - - chart.x(D3Service.xFunction()); - chart.y(D3Service.yFunction()); - - chart.xAxis.tickFormat(D3Service.xAxisTickFormat()); - - if (scope.percentage) { - yAxisTickFormat = D3Service.yAxisPercentageTickFormat(); - chart.yAxis.tickFormat(); - } else if (scope.integer) { - yAxisTickFormat = D3Service.yAxisIntegerTickFormat(); - chart.yAxis.tickFormat(); - } - - chart.yAxis.tickFormat(yAxisTickFormat); - - nv.utils.windowResize(chart.update); - - d3.select('#' + scope.id + ' svg') - .datum(scope.data) - .style('height', height + 'px') - .transition().duration(0) - .call(chart); - - return chart; - }); - - scope.$on('updateMetrics', function () { - chart.update(); - }); - } - - return { - restrict: 'A', - templateUrl: 'app/components/chart/chart.html', - scope: { - data: '=', - percentage: '=', - integer: '=', - forcey: '=' - }, - link: link - }; - } - - areaStackedTimeSeries.$inject = [ - '$rootScope', - '$log', - 'D3Service' - ]; - - angular - .module('chart') - .directive('areaStackedTimeSeries', areaStackedTimeSeries); -})(); diff --git a/src/app/components/chart/chart.html b/src/app/components/chart/chart.html deleted file mode 100644 index eb25637c1..000000000 --- a/src/app/components/chart/chart.html +++ /dev/null @@ -1,6 +0,0 @@ -
- -
- -
-
diff --git a/src/app/components/chart/lineTimeSeries.chart.directive.js b/src/app/components/chart/lineTimeSeries.chart.directive.js deleted file mode 100644 index 88852bb98..000000000 --- a/src/app/components/chart/lineTimeSeries.chart.directive.js +++ /dev/null @@ -1,105 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global d3, nv*/ - -(function () { - 'use strict'; - - function lineTimeSeries($rootScope, $log, D3Service) { - - function link(scope) { - scope.id = D3Service.getId(); - scope.flags = $rootScope.flags; - - var chart; - - nv.addGraph(function () { - - var height = 250; - - chart = nv.models.lineChart().options({ - duration: 0, - useInteractiveGuideline: true, - interactive: false, - showLegend: true, - showXAxis: true, - showYAxis: true - }); - - chart.margin({'left': 35, 'right': 35}); - - chart.height(height); - - if (scope.forcey) { - chart.forceY([0, scope.forcey]); - } - - chart.x(D3Service.xFunction()); - chart.y(D3Service.yFunction()); - - chart.xAxis.tickFormat(D3Service.xAxisTickFormat()); - - if (scope.percentage) { - chart.yAxis.tickFormat(D3Service.yAxisPercentageTickFormat()); - } else if (scope.integer) { - chart.yAxis.tickFormat(D3Service.yAxisIntegerTickFormat()); - } else { - chart.yAxis.tickFormat(D3Service.yAxisTickFormat()); - } - - nv.utils.windowResize(chart.update); - - d3.select('#' + scope.id + ' svg') - .datum(scope.data) - .style('height', height + 'px') - .transition().duration(0) - .call(chart); - - return chart; - }); - - scope.$on('updateMetrics', function () { - if (scope.area) { - angular.forEach(scope.data, function (instance) { - instance.area=true; - }); - } - chart.update(); - }); - } - - return { - restrict: 'A', - templateUrl: 'app/components/chart/chart.html', - scope: { - data: '=', - percentage: '=', - integer: '=', - forcey: '=', - area: '=' - }, - link: link - }; - } - - angular - .module('chart') - .directive('lineTimeSeries', lineTimeSeries); - -})(); diff --git a/src/app/components/chart/nvd3-tooltip.js b/src/app/components/chart/nvd3-tooltip.js deleted file mode 100644 index 8bacc6f4d..000000000 --- a/src/app/components/chart/nvd3-tooltip.js +++ /dev/null @@ -1,465 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*global d3, nv, document*/ -/*eslint-disable angular/document-service, angular/definedundefined*/ - -nv.models.tooltip = function () { - - 'use strict'; - - var id = 'nvtooltip-' + Math.floor(Math.random() * 100000), // Generatooltip() object. - data = null, - gravity = 'w', // Can be 'n','s','e','w'. Determines how tooltip is positioned. - distance = 25, // Distance to offset tooltip from the mouse location. - snapDistance = 0, // Tolerance a - // fixedTop = null, // If not null, this fixes the top position of the tooltip. - classes = null, // Attaches additional CSS classes to the tooltip DIV that is created. - chartContainer = null, // Parent dom element of the SVG that holds the chart. - hidden = true, // Start off hidden, toggle with hide/show functions below. - hideDelay = 200, // Delay (in ms) before the tooltip hides after calling hide(). - tooltip = null, // d3 select of the tooltip div. - lastPosition = {left: null, top: null}, // Last position the tooltip was in. - enabled = true, // True -> tooltips are rendered. False -> don't render tooltips. - duration = 100, // Tooltip movement duration, in ms. - headerEnabled = true, // If is to show the tooltip header. - nvPointerEventsClass = 'nv-pointer-events-none'; // CSS class to specify whether element should not have - var position = function () { - return { - left: d3.event.clientX, - top: d3.event.clientY - }; - }; - - // Format function for the tooltip values column. - var valueFormatter = function (d) { - return d; - }; - - // Format function for the tooltip header value. - var headerFormatter = function (d) { - return d; - }; - - var keyFormatter = function (d) { - return d; - }; - - // By default, the tooltip model renders a beautiful table inside a DIV. - // You can override this function if a custom tooltip is desired. - var contentGenerator = function (d) { - if (d === null) { - return ''; - } - - var table = d3.select(document.createElement('table')); - if (headerEnabled) { - var theadEnter = table.selectAll('thead') - .data([d]) - .enter().append('thead'); - - theadEnter.append('tr') - .append('td') - .attr('colspan', 3) - .append('strong') - .classed('x-value', true) - .html(headerFormatter(d.value)); - } - - var tbodyEnter = table.selectAll('tbody') - .data([d]) - .enter().append('tbody'); - - var trowEnter = tbodyEnter.selectAll('tr') - .data(function (p) { - return p.series; - }) - .enter() - .append('tr') - .classed('highlight', function (p) { - return p.highlight; - }); - - trowEnter.append('td') - .classed('legend-color-guide', true) - .append('div') - .style('background-color', function (p) { - return p.color; - }); - - trowEnter.append('td') - .classed('key', true) - .classed('total', function (p) { - return !!p.total; - }) - .html(function (p, i) { - return keyFormatter(p.key, i); - }); - - trowEnter.append('td') - .classed('value', true) - .html(function (p, i) { - return valueFormatter(p.value, i); - }); - - trowEnter.selectAll('td').each(function (p) { - if (p.highlight) { - var opacityScale = d3.scale.linear().domain([0, 1]).range(['#fff', p.color]); - var opacity = 0.6; - d3.select(this) - .style('border-bottom-color', opacityScale(opacity)) - .style('border-top-color', opacityScale(opacity)) - ; - } - }); - - var html = table.node().outerHTML; - if (d.footer !== undefined) { - html += ''; - } - return html; - - }; - - var dataSeriesExists = function (d) { - if (d && d.series) { - if (d.series instanceof Array) { - return !!d.series.length; - } - // if object, it's okay just convert to array of the object - if (d.series instanceof Object) { - d.series = [d.series]; - return true; - } - } - return false; - }; - - // Calculates the gravity offset of the tooltip. Parameter is position of tooltip - // relative to the viewport. - var calcGravityOffset = function (pos) { - var height = tooltip.node().offsetHeight, - width = tooltip.node().offsetWidth, - clientWidth = document.documentElement.clientWidth, // Don't want scrollbars. - clientHeight = document.documentElement.clientHeight, // Don't want scrollbars. - left, top, tmp; - - // calculate position based on gravity - switch (gravity) { - case 'e': - left = -width - distance; - top = -(height / 2); - if (pos.left + left < 0) { - left = distance; - } - if ((tmp = pos.top + top) < 0) { - top -= tmp; - } - if ((tmp = pos.top + top + height) > clientHeight) { - top -= tmp - clientHeight; - } - break; - case 'w': - left = distance; - top = -(height / 2); - if (pos.left + left + width > clientWidth) { - left = -width - distance; - } - if ((tmp = pos.top + top) < 0) { - top -= tmp; - } - if ((tmp = pos.top + top + height) > clientHeight) { - top -= tmp - clientHeight; - } - break; - case 'n': - left = -(width / 2) - 5; // - 5 is an approximation of the mouse's height. - top = distance; - if (pos.top + top + height > clientHeight) { - top = -height - distance; - } - if ((tmp = pos.left + left) < 0) { - left -= tmp; - } - if ((tmp = pos.left + left + width) > clientWidth) { - left -= tmp - clientWidth; - } - break; - case 's': - left = -(width / 2); - top = -height - distance; - if (pos.top + top < 0) { - top = distance; - } - if ((tmp = pos.left + left) < 0) { - left -= tmp; - } - if ((tmp = pos.left + left + width) > clientWidth) { - left -= tmp - clientWidth; - } - break; - case 'center': - left = -(width / 2); - top = -(height / 2); - break; - default: - left = 0; - top = 0; - break; - } - - return {'left': left, 'top': top}; - }; - - /* - Positions the tooltip in the correct place, as given by the position() function. - */ - var positionTooltip = function () { - nv.dom.read(function () { - var pos = position(), - gravityOffset = calcGravityOffset(pos), - left = pos.left + gravityOffset.left, - top = pos.top + gravityOffset.top; - - // delay hiding a bit to avoid flickering - if (hidden) { - tooltip - .interrupt() - .transition() - .delay(hideDelay) - .duration(0) - .style('opacity', 0); - } else { - // using tooltip.style('transform') returns values un-usable for tween - var oldTranslate = 'translate(' + lastPosition.left + 'px, ' + lastPosition.top + 'px)'; - var newTranslate = 'translate(' + left + 'px, ' + top + 'px)'; - var translateInterpolator = d3.interpolateString(oldTranslate, newTranslate); - var isHidden = tooltip.style('opacity') < 0.1; - - tooltip - .interrupt() // cancel running transitions - .transition() - .duration(isHidden ? 0 : duration) - // using tween since some versions of d3 can't auto-tween a translate on a div - .styleTween('transform', function () { - return translateInterpolator; - }, 'important') - // Safari has its own `-webkit-transform` and does not support `transform` - .styleTween('-webkit-transform', function () { - return translateInterpolator; - }) - .style('-ms-transform', newTranslate) - .style('opacity', 1); - } - - lastPosition.left = left; - lastPosition.top = top; - }); - }; - - // Creates new tooltip container, or uses existing one on DOM. - function initTooltip() { - if (!tooltip) { - - var container = document.body; - - // Create new tooltip div if it doesn't exist on DOM. - tooltip = d3.select(container).append('div') - .attr('class', 'nvtooltip ' + (classes ? classes : 'xy-tooltip')) - .attr('id', id); - tooltip.style('top', 0).style('left', 0); - tooltip.style('opacity', 0); - tooltip.style('position', 'fixed'); - tooltip.selectAll('div, table, td, tr').classed(nvPointerEventsClass, true); - tooltip.classed(nvPointerEventsClass, true); - } - } - - // Draw the tooltip onto the DOM. - function nvtooltip() { - if (!enabled) { - return; - } - if (!dataSeriesExists(data)) { - return; - } - - nv.dom.write(function () { - initTooltip(); - // Generate data and set it into tooltip. - // Bonus - If you override contentGenerator and return falsey you can use something like - // React or Knockout to bind the data for your tooltip. - var newContent = contentGenerator(data); - if (newContent) { - tooltip.node().innerHTML = newContent; - } - - positionTooltip(); - }); - - return nvtooltip; - } - - nvtooltip.nvPointerEventsClass = nvPointerEventsClass; - nvtooltip.options = nv.utils.optionsFunc.bind(nvtooltip); - - nvtooltip._options = Object.create({}, { - // simple read/write options - duration: { - get: function () { - return duration; - }, set: function (_) { - duration = _; - } - }, - gravity: { - get: function () { - return gravity; - }, set: function (_) { - gravity = _; - } - }, - distance: { - get: function () { - return distance; - }, set: function (_) { - distance = _; - } - }, - snapDistance: { - get: function () { - return snapDistance; - }, set: function (_) { - snapDistance = _; - } - }, - classes: { - get: function () { - return classes; - }, set: function (_) { - classes = _; - } - }, - chartContainer: { - get: function () { - return chartContainer; - }, set: function (_) { - chartContainer = _; - } - }, - enabled: { - get: function () { - return enabled; - }, set: function (_) { - enabled = _; - } - }, - hideDelay: { - get: function () { - return hideDelay; - }, set: function (_) { - hideDelay = _; - } - }, - contentGenerator: { - get: function () { - return contentGenerator; - }, set: function (_) { - contentGenerator = _; - } - }, - valueFormatter: { - get: function () { - return valueFormatter; - }, set: function (_) { - valueFormatter = _; - } - }, - headerFormatter: { - get: function () { - return headerFormatter; - }, set: function (_) { - headerFormatter = _; - } - }, - keyFormatter: { - get: function () { - return keyFormatter; - }, set: function (_) { - keyFormatter = _; - } - }, - headerEnabled: { - get: function () { - return headerEnabled; - }, set: function (_) { - headerEnabled = _; - } - }, - position: { - get: function () { - return position; - }, set: function (_) { - position = _; - } - }, - - // options with extra logic - hidden: { - get: function () { - return hidden; - }, set: function (_) { - if (hidden !== _) { - hidden = !!_; - nvtooltip(); - } - } - }, - data: { - get: function () { - return data; - }, set: function (_) { - // if showing a single data point, adjust data format with that - if (_.point) { - _.value = _.point.x; - _.series = _.series || {}; - _.series.value = _.point.y; - _.series.color = _.point.color || _.series.color; - } - data = _; - } - }, - - // read only properties - node: { - get: function () { - return tooltip.node(); - }, set: function () { - } - }, - id: { - get: function () { - return id; - }, set: function () { - } - } - }); - - nv.utils.initOptions(nvtooltip); - return nvtooltip; -}; diff --git a/src/app/components/containermetadata/containermetadata.service.js b/src/app/components/containermetadata/containermetadata.service.js deleted file mode 100644 index f5f7a2028..000000000 --- a/src/app/components/containermetadata/containermetadata.service.js +++ /dev/null @@ -1,231 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*global _*/ - - (function () { - 'use strict'; - - /** - * @name ContainerMetadataService - */ - function ContainerMetadataService($http, $rootScope, $q, $interval, $routeParams, $location, $injector, $log, config, MetricListService) { - - var containerParsedFromQuerystring = false, - containerNameResolver; - - // loading containerNameResolver if it was defined - try { - containerNameResolver = $injector.get('containerNameResolver'); - } catch(e) { - $log.debug("No external container name resolver defined."); - } - - /** - * @name idDictionary - * @desc - */ - var idMap = {}; - function idDictionary(key) { - return idMap[parseId(key)]; - } - - /** - * @name parseId - * @desc parses different types of docker ID - */ - function parseId(id) { - //handle regular docker - if (id === null){ - return false; - } - if (id.indexOf('docker/') !==-1){ - id = id.split('/')[2]; - //handle systemd - } else if (id.indexOf('/docker-') !==-1){ - id = id.split('-')[1].split('.')[0]; - } - return id; - } - - /** - * @name clearIdDictionary - * @desc - */ - function clearIdDictionary() { - idMap = {}; - } - - /** - * @name containerIdExist - * @desc returns true if id exists in the idMap - */ - function containerIdExist(id) { - return (angular.isDefined(idMap[parseId(id)]) && idMap[parseId(id)] !== ''); - } - - /** - * @name updateMetrics - * @desc - */ - function updateMetrics() { - updateIdDictionary(); - $rootScope.properties.containerList = getContainerList(); - - //TODO: find a better way for parsing the container name from the query string just once. - if (containerParsedFromQuerystring) { - if($rootScope.properties.containerList.indexOf($routeParams.container) === -1) { // can't find the selected container in the list - $rootScope.properties.selectedContainer = ''; - } - } else { - if (angular.isDefined($routeParams.container)) { - if ($rootScope.properties.containerList.indexOf($routeParams.container) !== -1) { - $rootScope.properties.selectedContainer = $routeParams.container; - $rootScope.flags.disableContainerSelectNone = true; - containerParsedFromQuerystring = true; - } - } else { - containerParsedFromQuerystring = true; - } - } - } - - /**; - * @name initialize - * @desc - */ - /*eslint-disable no-unused-vars*/ - var containerCgroups, - containerNames, - updateMetricsListener; - function initialize() { - containerCgroups = MetricListService.getOrCreateMetric('containers.cgroup'); - containerNames = MetricListService.getOrCreateMetric('containers.name'); - - updateMetricsListener = $rootScope.$on('updateMetrics', updateMetrics); - } - /*eslint-enable no-unused-vars*/ - - /** - * @name resolveId - * @desc - */ - function resolveId(instanceKey) { - var instanceName; - if(typeof containerNameResolver === 'undefined') { - if (!config.useCgroupId) { - instanceName = _.find(containerNames.data, function (el) { - return el.key === instanceKey; - }); - if (instanceName) { - return instanceName.values[instanceName.values.length - 1].y; - } - } - return instanceKey.substring(0,12); - } else { - instanceName = _.find(containerNames.data, function (el) { - return el.key === instanceKey; - }); - return containerNameResolver.resolve(instanceKey, instanceName); - } - } - - /**; - * @name updateIdDictionary - * @desc - */ - function updateIdDictionary(){ - //TODO: implement better logic to add and remove items from idMap. Always creating a new object and resolving all names is expensive. - idMap = containerCgroups.data.reduce(function(obj, item) { - obj[item.key] = resolveId(item.key); - return obj; - },{}); - } - - /** - * @name getContainerList - * @desc - */ - function getContainerList() { - return containerCgroups.data.reduce(function(obj, item) { - var resolved = resolveId(item.key); - if (angular.isDefined(resolved)){ - obj.push(resolved); - } - return obj; - },[]); - } - - /** - * @name checkContainerFilter - * @desc - */ - function checkContainerFilter(name){ - return ($rootScope.properties.containerFilter === '' || name.indexOf($rootScope.properties.containerFilter) !==-1); - } - - /** - * @name checkContainerName - * @desc - */ - function checkContainerName(name){ - return ($rootScope.properties.selectedContainer === '' || name.indexOf($rootScope.properties.selectedContainer) !== -1); - } - - /** - * @name updateContainer - * @desc - */ - function updateContainer(){ - $location.search('container', $rootScope.properties.selectedContainer); - if ($rootScope.properties.selectedContainer !== '') { - $rootScope.flags.disableContainerSelectNone = true; - } else { - $rootScope.flags.disableContainerSelectNone = false; - } - } - - /** - * @name updateContainerFilter - * @desc - */ - function updateContainerFilter() { - $location.search('containerFilter', $rootScope.properties.containerFilter); - } - - return { - idDictionary: idDictionary, - getContainerList: getContainerList, - updateIdDictionary: updateIdDictionary, - clearIdDictionary: clearIdDictionary, - checkContainerFilter: checkContainerFilter, - containerIdExist: containerIdExist, - checkContainerName: checkContainerName, - updateContainer: updateContainer, - updateContainerFilter: updateContainerFilter, - initialize: initialize - }; - } - - angular - .module('containermetadata', [ - 'metriclist' - ]) - .factory('ContainerMetadataService', ContainerMetadataService); - - })(); diff --git a/src/app/components/customWidgetSettings/customWidgetSettings.controller.js b/src/app/components/customWidgetSettings/customWidgetSettings.controller.js deleted file mode 100644 index a6c5a7b0a..000000000 --- a/src/app/components/customWidgetSettings/customWidgetSettings.controller.js +++ /dev/null @@ -1,40 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*eslint-disable angular/controller-as*/ - -(function () { - 'use strict'; - - function CustomWidgetSettingsCtrl($scope, $uibModalInstance, widget) { - $scope.widget = widget; - $scope.result = angular.extend({}, $scope.result, widget); - - $scope.ok = function () { - $uibModalInstance.close($scope.result); - }; - - $scope.cancel = function () { - $uibModalInstance.dismiss('cancel'); - }; - } - - angular - .module('customWidgetSettings', []) - .controller('CustomWidgetSettingsController', CustomWidgetSettingsCtrl); -})(); diff --git a/src/app/components/customWidgetSettings/customWidgetSettings.html b/src/app/components/customWidgetSettings/customWidgetSettings.html deleted file mode 100644 index 24ac37d5b..000000000 --- a/src/app/components/customWidgetSettings/customWidgetSettings.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/src/app/components/d3/d3.service.js b/src/app/components/d3/d3.service.js deleted file mode 100644 index 8235d26c6..000000000 --- a/src/app/components/d3/d3.service.js +++ /dev/null @@ -1,85 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global d3*/ - - (function () { - 'use strict'; - - /** - * @name D3Service - * @desc - */ - function D3Service() { - - function xAxisTickFormat() { - return function (d) { - return d3.time.format('%X')(new Date(d)); - }; - } - - function yAxisTickFormat() { - return function (d) { - return d3.format('.02f')(d); - }; - } - - function yAxisIntegerTickFormat() { - return function (d) { - return d3.format('f')(d); - }; - } - - function yAxisPercentageTickFormat() { - return function (d) { - return d3.format('%')(d); - }; - } - - function xFunction() { - return function (d) { - return d.x; - }; - } - - function yFunction() { - return function (d) { - return d.y; - }; - } - - function getId() { - return 'chart_' + - Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - - return { - xAxisTickFormat: xAxisTickFormat, - yAxisTickFormat: yAxisTickFormat, - yAxisIntegerTickFormat: yAxisIntegerTickFormat, - yAxisPercentageTickFormat: yAxisPercentageTickFormat, - xFunction: xFunction, - yFunction: yFunction, - getId: getId - }; - } - - angular - .module('d3', []) - .factory('D3Service', D3Service); - })(); diff --git a/src/app/components/dashboard/dashboard.html b/src/app/components/dashboard/dashboard.html deleted file mode 100644 index ef578302f..000000000 --- a/src/app/components/dashboard/dashboard.html +++ /dev/null @@ -1,147 +0,0 @@ -
-
-
-
- Hostname   - - - -
-
-
-
- - -
-
-
-
- Window - -
-
-
-
-
-
- Interval - -
-
-
-
-
-
-
-
- Hostspec - -
-
- Container Filter - -
-
- Container Id - -
-
-
-
-

{{flags.contextAvailable && properties.hostname ? properties.hostname : 'Disconnected'}}

-
-
-
-
-
-
- - -
- -
- -
- - - - - - -
- -
-
-
-
-

- {{widget.title}} - - - {{widget.name}} - - -

-
-
-
-
-
-
-
-
-
-
Version: {{vm.version}}
- diff --git a/src/app/components/dashboard/dashboard.service.js b/src/app/components/dashboard/dashboard.service.js deleted file mode 100644 index 43e76bacc..000000000 --- a/src/app/components/dashboard/dashboard.service.js +++ /dev/null @@ -1,333 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*global _*/ - - (function () { - 'use strict'; - - /** - * @name DashboardService - * @desc - */ - function DashboardService($rootScope, $http, $interval, $log, $location, toastr, config, PMAPIService, MetricListService, ContainerMetadataService) { - var loopErrors = 0, - intervalPromise; - - /** - * @name cancelInterval - * @desc - */ - function cancelInterval() { - if (intervalPromise) { - $interval.cancel(intervalPromise); - } - } - - /** - * @name updateMetricsCallback - * @desc - */ - function updateMetricsCallback(success) { - if (!success) { - toastr.error('Failed fetching metrics. Trying again.', 'Error'); - loopErrors = loopErrors + 1; - } else { - loopErrors = 0; - } - if (loopErrors > 5) { - cancelInterval(intervalPromise); - loopErrors = 0; - $rootScope.properties.context = '-1'; - $rootScope.flags.contextAvailable = false; - toastr.error('Consistently failed fetching metrics from host (>5). Please update the hostname to resume operation.', 'Error'); - } - } - - /** - * @name updateMetrics - * @desc - */ - function updateMetrics(callback) { - var metricArr = [], - pmidArr = [], - context = $rootScope.properties.context, - simpleMetrics = MetricListService.getSimpleMetricList(); - - if (context && context > 0 && simpleMetrics.length > 0) { - angular.forEach(simpleMetrics, function (value) { - if (angular.isDefined(value.pmid) && value.pmid !== null) { - pmidArr.push(value.pmid); - } else { - metricArr.push(value.name); - } - }); - - PMAPIService.getMetrics(context, metricArr, pmidArr) - .then(function (metrics) { - var name, - metricInstance, - iid, - iname; - - if (metrics.values.length !== simpleMetrics.length) { - var currentMetric; - - angular.forEach(simpleMetrics, function (metric) { - currentMetric= _.find(metrics.values, function (el) { - return el.name === metric.name; - }); - if (angular.isUndefined(currentMetric)) { - metric.clearData(); - } - }); - } - - angular.forEach(metrics.values, function (value) { - name = value.name; - - metricInstance = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if(value.instances.length !== metricInstance.data.length) { - metricInstance.deleteInvalidInstances(value.instances); - } - - if (angular.isDefined(metricInstance) && metricInstance !== null) { - if(!angular.isNumber(metricInstance.pmid)) { - metricInstance.pmid = value.pmid; - } - - angular.forEach(value.instances, function (instance) { - iid = angular.isUndefined(instance.instance) ? 1 : instance.instance; - iname = metrics.inames[name].inames[iid]; - - metricInstance.pushValue(metrics.timestamp, iid, iname, instance.value); - }); - } - }); - }).then( - function () { - callback(true); - $rootScope.$broadcast('updateMetrics'); - }, - function (response) { - if(response.status === 400 && response.data.indexOf('-12376') !== -1) { - updateContext(); - } - callback(false); - }); - } - } - - /** - * @name updateDerivedMetrics - * @desc - */ - function updateDerivedMetrics() { - var derivedMetrics = MetricListService.getDerivedMetricList(); - if (derivedMetrics.length > 0) { - angular.forEach(derivedMetrics, function (metric) { - metric.updateValues(); - }); - $rootScope.$broadcast('updateDerivedMetrics'); - } - } - - /** - * @name intervalFunction - * @desc - */ - function intervalFunction() { - updateMetrics(updateMetricsCallback); - updateDerivedMetrics(); - } - - /** - * @name updateInterval - * @desc - */ - function updateInterval() { - cancelInterval(intervalPromise); - - if ($rootScope.properties.host) { - if ($rootScope.properties.context && - $rootScope.properties.context > 0) { - intervalPromise = $interval(intervalFunction, parseInt($rootScope.properties.interval) * 1000); - } else { - toastr.error('Vector is not connected to the host. Please update the hostname to resume operation.', 'Error'); - } - } - } - - /** - * @name parseHostInput - * @desc - */ - function parseHostInput(host) { - var hostMatch = null; - if (host) { - hostMatch = host.match('(.*):([0-9]*)'); - if (hostMatch !== null) { - $rootScope.properties.host = hostMatch[1]; - $rootScope.properties.port = hostMatch[2]; - } else { - $rootScope.properties.host = host; - } - } - } - - /** - * @name updateContext - * @desc - */ - function updateContext() { - $rootScope.flags.contextUpdating = true; - $rootScope.flags.contextAvailable = false; - - PMAPIService.getHostspecContext($rootScope.properties.hostspec, 600) - .then(function (data) { - $rootScope.flags.contextUpdating = false; - $rootScope.flags.contextAvailable = true; - $rootScope.properties.context = data; - updateInterval(); - PMAPIService.getMetrics(data, ['pmcd.hostname']) - .then(function (data) { - $rootScope.properties.hostname = data.values[0].instances[0].value; - }, function () { - $rootScope.properties.hostname = 'Hostname not available.'; - $log.error('Error fetching hostname.'); - }); - }, function () { - toastr.error('Failed fetching context from host. Try updating the hostname.', 'Error'); - $rootScope.flags.contextUpdating = false; - $rootScope.flags.contextAvailable = false; - }); - } - - /** - * @name updateHost - * @desc - */ - function updateHost(host) { - $location.search('host', host); - $location.search('hostspec', $rootScope.properties.hostspec); - - $rootScope.properties.context = -1; - $rootScope.properties.hostname = null; - $rootScope.properties.port = config.port; - - MetricListService.clearMetricList(); - MetricListService.clearDerivedMetricList(); - - parseHostInput(host); - updateContext(); - } - - /** - * @name initialize - * @desc - */ - function initialize() { - if ($rootScope.properties) { - if (!$rootScope.properties.interval) { - $rootScope.properties.interval = config.interval; - } - if (!$rootScope.properties.window) { - $rootScope.properties.window = config.window; - } - if (!$rootScope.properties.protocol) { - $rootScope.properties.protocol = config.protocol; - } - if (!$rootScope.properties.host) { - $rootScope.properties.host = ''; - } - if (!$rootScope.properties.hostspec) { - $rootScope.properties.hostspec = config.hostspec; - } - if (!$rootScope.properties.port) { - $rootScope.properties.port = config.port; - } - if (!$rootScope.properties.context || - $rootScope.properties.context < 0) { - updateContext(); - } else { - updateInterval(); - } - } else { - $rootScope.properties = { - protocol: config.protocol, - host: '', - hostspec: config.hostspec, - port: config.port, - context: -1, - hostname: null, - window: config.window, - interval: config.interval, - containerFilter: '', - containerList: [], - selectedContainer: '' - }; - } - - $rootScope.flags = { - contextAvailable: false, - contextUpdating: false, - isHostnameExpanded: config.expandHostname, - enableContainerWidgets: config.enableContainerWidgets, - disableHostspecInput: config.disableHostspecInput, - disableContainerFilter: config.disableContainerFilter, - disableContainerSelect: config.disableContainerSelect, - containerSelectOverride: config.containerSelectOverride, - disableContainerSelectNone: false, - disableHostnameInputContainerSelect: config.disableHostnameInputContainerSelect - }; - - if (config.enableContainerWidgets) { - ContainerMetadataService.initialize(); - } - } - - /** - * @name getGuid - * @desc - */ - function getGuid() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - - return { - cancelInterval: cancelInterval, - updateInterval: updateInterval, - updateHost: updateHost, - updateContext: updateContext, - getGuid: getGuid, - initialize: initialize - }; - } - - angular - .module('dashboard', [ - 'pmapi', - 'metriclist', - 'containermetadata' - ]) - .factory('DashboardService', DashboardService); - - })(); diff --git a/src/app/components/datamodel/cgroupCPUHeadroomMetric.datamodel.factory.js b/src/app/components/datamodel/cgroupCPUHeadroomMetric.datamodel.factory.js deleted file mode 100644 index a62b99435..000000000 --- a/src/app/components/datamodel/cgroupCPUHeadroomMetric.datamodel.factory.js +++ /dev/null @@ -1,132 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*global _*/ - - (function () { - 'use strict'; - - /** - * @name CgroupCPUHeadroomMetricDataModel - * @desc - */ - function CgroupCPUHeadroomMetricDataModel(ContainerMetadataService, WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - // create create base metrics - var cpuUsageMetric = MetricListService.getOrCreateCumulativeMetric('cgroup.cpuacct.usage'), - cpuSharesMetric = MetricListService.getOrCreateMetric('cgroup.cpusched.shares'), - cpuPeriodsMetric = MetricListService.getOrCreateMetric('cgroup.cpusched.periods'), - ncpuMetric = MetricListService.getOrCreateMetric('hinv.ncpu'), - derivedFunction; - - derivedFunction = function () { - var returnValues = []; - - if ( cpuUsageMetric.data.length > 0){ - angular.forEach(cpuUsageMetric.data, function (instance) { - - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - var lastValue = instance.values[instance.values.length - 1]; - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)) { - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: lastValue.y / 1000 / 1000 / 1000 - }); - } - } - }); - } - - if ( cpuPeriodsMetric.data.length > 0) { - angular.forEach(cpuPeriodsMetric.data, function (instance) { - - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - var lastValue = instance.values[instance.values.length - 1]; - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)) { - - if (lastValue.y > 0) { - var cpuSharesInstance = _.find(cpuSharesMetric.data, function(el) { - return el.key === instance.key; - }); - - if (angular.isDefined(cpuSharesInstance)) { - var cpuSharesValue = cpuSharesInstance.values[cpuSharesInstance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: name + ' (limit)', - value: cpuSharesValue.y / lastValue.y - }); - } - } else { - if (ncpuMetric.data.length > 0) { - var ncpuInstance = ncpuMetric.data[ncpuMetric.data.length - 1]; - if (ncpuInstance.values.length > 0) { - var ncpuValue = ncpuInstance.values[ncpuInstance.values.length - 1]; - returnValues.push({ - timestamp: ncpuValue.x, - key: name + ' (physical)', - value: ncpuValue.y - }); - } - } - } - } - } - }); - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.cpuacct.usage'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CgroupCPUHeadroomMetricDataModel', CgroupCPUHeadroomMetricDataModel); - })(); diff --git a/src/app/components/datamodel/cgroupCPUUsageMetric.datamodel.factory.js b/src/app/components/datamodel/cgroupCPUUsageMetric.datamodel.factory.js deleted file mode 100644 index 80971b822..000000000 --- a/src/app/components/datamodel/cgroupCPUUsageMetric.datamodel.factory.js +++ /dev/null @@ -1,88 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CgroupCPUUsageMetricDataModel - * @desc - */ - function CgroupCPUUsageMetricDataModel(ContainerMetadataService, WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - // create create base metrics - var cpuUsageMetric = MetricListService.getOrCreateCumulativeMetric('cgroup.cpuacct.usage'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - lastValue, - name; - - if ( cpuUsageMetric.data.length > 0){ - angular.forEach(cpuUsageMetric.data, function (instance) { - - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - lastValue = instance.values[instance.values.length - 1]; - name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)) { - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: lastValue.y / 1000 / 1000 / 1000 - }); - } - } - }); - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.cpuacct.usage'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CgroupCPUUsageMetricDataModel', CgroupCPUUsageMetricDataModel); - })(); diff --git a/src/app/components/datamodel/cgroupMemoryHeadroomMetric.datamodel.factory.js b/src/app/components/datamodel/cgroupMemoryHeadroomMetric.datamodel.factory.js deleted file mode 100644 index 9788848f1..000000000 --- a/src/app/components/datamodel/cgroupMemoryHeadroomMetric.datamodel.factory.js +++ /dev/null @@ -1,126 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CgroupMemoryHeadroomMetricDataModel - * @desc - */ - function CgroupMemoryHeadroomMetricDataModel(WidgetDataModel, MetricListService, DashboardService, ContainerMetadataService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - // create create base metrics - var conversionFunction = function (value) { - return value / 1024 / 1024; - }, - physmemConversionFunction = function (value) { - return value / 1024; - }, - usageMetric = MetricListService.getOrCreateConvertedMetric('cgroup.memory.usage', conversionFunction), - limitMetric = MetricListService.getOrCreateConvertedMetric('cgroup.memory.limit', conversionFunction), - physmemMetric = MetricListService.getOrCreateConvertedMetric('mem.physmem', physmemConversionFunction), - derivedFunction; - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastPhysmemValue; - - lastPhysmemValue = (function () { - if (physmemMetric.data.length > 0) { - var instance = physmemMetric.data[physmemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - angular.forEach(usageMetric.data, function (instance) { - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - var lastValue = instance.values[instance.values.length - 1]; - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)){ - returnValues.push({ - timestamp: lastValue.x, - key: name + ' used', - value: lastValue.y - }); - } - } - }); - - angular.forEach(limitMetric.data, function (instance) { - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - var lastValue = instance.values[instance.values.length - 1]; - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)) { - if (lastValue.y >= lastPhysmemValue.y) { - returnValues.push({ - timestamp: lastPhysmemValue.x, - key: name + ' limit (physical)', - value: lastPhysmemValue.y - }); - } else { - returnValues.push({ - timestamp: lastValue.x, - key: name + ' limit', - value: lastValue.y - }); - } - } - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.memory.usage'); - MetricListService.destroyMetric('cgroup.memory.limit'); - MetricListService.destroyMetric('mem.physmem'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CgroupMemoryHeadroomMetricDataModel', CgroupMemoryHeadroomMetricDataModel); - })(); diff --git a/src/app/components/datamodel/cgroupMemoryUsageMetric.datamodel.factory.js b/src/app/components/datamodel/cgroupMemoryUsageMetric.datamodel.factory.js deleted file mode 100644 index 87df2d19c..000000000 --- a/src/app/components/datamodel/cgroupMemoryUsageMetric.datamodel.factory.js +++ /dev/null @@ -1,91 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CgroupMemoryUsageMetricTimeSeriesDataModel - * @desc - */ - function CgroupMemoryUsageMetricTimeSeriesDataModel(ContainerMetadataService, WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - // create create base metrics - var conversionFunction = function (value) { - return value / 1024 / 1024; - }, - usageMetric = MetricListService.getOrCreateConvertedMetric('cgroup.memory.usage', conversionFunction), - derivedFunction; - - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastValue, - name; - - angular.forEach(usageMetric.data, function (instance) { - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - lastValue = instance.values[instance.values.length - 1]; - name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)){ - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: lastValue.y - }); - } - - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.memory.usage'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CgroupMemoryUsageMetricTimeSeriesDataModel', CgroupMemoryUsageMetricTimeSeriesDataModel); - })(); diff --git a/src/app/components/datamodel/cgroupMemoryUtilizationMetric.datamodel.factory.js b/src/app/components/datamodel/cgroupMemoryUtilizationMetric.datamodel.factory.js deleted file mode 100644 index 3b247c607..000000000 --- a/src/app/components/datamodel/cgroupMemoryUtilizationMetric.datamodel.factory.js +++ /dev/null @@ -1,122 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/* global _*/ - (function () { - 'use strict'; - - /** - * @name CgroupMemoryUtilizationMetricDataModel - * @desc - */ - function CgroupMemoryUtilizationMetricDataModel(WidgetDataModel, MetricListService, DashboardService, ContainerMetadataService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - // create create base metrics - var conversionFunction = function (value) { - return value / 1024 / 1024; - }, - physmemConversionFunction = function (value) { - return value / 1024; - }, - usageMetric = MetricListService.getOrCreateConvertedMetric('cgroup.memory.usage', conversionFunction), - limitMetric = MetricListService.getOrCreateConvertedMetric('cgroup.memory.limit', conversionFunction), - physmemMetric = MetricListService.getOrCreateConvertedMetric('mem.physmem', physmemConversionFunction), - derivedFunction; - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastPhysmemValue; - - lastPhysmemValue = (function () { - if (physmemMetric.data.length > 0) { - var instance = physmemMetric.data[physmemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - angular.forEach(usageMetric.data, function (instance) { - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - var lastValue = instance.values[instance.values.length - 1]; - var name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - if (ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)){ - var limitInstance = _.find(limitMetric.data, function(el) { - return el.key === instance.key; - }); - - if (angular.isDefined(limitInstance)) { - var lastLimitValue = limitInstance.values[limitInstance.values.length - 1]; - - if (lastLimitValue.y >= lastPhysmemValue.y) { - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: lastValue.y / lastPhysmemValue.y - }); - } else { - returnValues.push({ - timestamp: lastValue.x, - key: name, - value: lastValue.y / lastLimitValue.y - }); - } - } - } - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('cgroup.memory.usage'); - MetricListService.destroyMetric('cgroup.memory.limit'); - MetricListService.destroyMetric('mem.physmem'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CgroupMemoryUtilizationMetricDataModel', CgroupMemoryUtilizationMetricDataModel); - })(); diff --git a/src/app/components/datamodel/containerMemoryUsageMetric.datamodel.factory.js b/src/app/components/datamodel/containerMemoryUsageMetric.datamodel.factory.js deleted file mode 100644 index 052952cb0..000000000 --- a/src/app/components/datamodel/containerMemoryUsageMetric.datamodel.factory.js +++ /dev/null @@ -1,145 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerMemoryUsageMetricDataModel - * @desc - */ - function ContainerMemoryUsageMetricDataModel(WidgetDataModel, MetricListService, DashboardService, ContainerMetadataService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var cgroupConversionFunction = function (value) { - return value / 1024 / 1024; - }, - memConversionFunction = function (value) { - return value / 1024; - }, - usedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.used', memConversionFunction), - freeMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.free', memConversionFunction), - containerMemMetric = MetricListService.getOrCreateConvertedMetric('cgroup.memory.usage', cgroupConversionFunction), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - usedValue, - freeValue, - containerValue; - - - usedValue = (function () { - if (usedMemMetric.data.length > 0) { - var instance = usedMemMetric.data[usedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - freeValue = (function () { - if (freeMemMetric.data.length > 0) { - var instance = freeMemMetric.data[freeMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - containerValue = (function () { - if (containerMemMetric.data.length > 0) { - var total = 0; - var timestamp = containerMemMetric.data[containerMemMetric.data.length - 1].values[containerMemMetric.data[containerMemMetric.data.length - 1].values.length - 1].x; - angular.forEach(containerMemMetric.data, function (instance) { - if (instance.values.length > 0 && ContainerMetadataService.containerIdExist(instance.key)) { - total = total + instance.values[instance.values.length - 1].y; - } - }); - return { - x: timestamp, - y: total - }; - } - }()); - - if (angular.isDefined(usedValue) && - angular.isDefined(containerValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'host used', - value: usedValue.y - containerValue.y - }); - - } - - if (angular.isDefined(freeValue)) { - - returnValues.push({ - timestamp: freeValue.x, - key: 'free (unused)', - value: freeValue.y - }); - } - - if (angular.isDefined(containerValue) && - angular.isDefined(usedValue)) { - returnValues.push({ - timestamp: containerValue.x, - key: 'container used', - value: containerValue.y - }); - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('mem.util.used'); - MetricListService.destroyMetric('mem.util.free'); - MetricListService.destroyMetric('cgroup.memory.usage'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('ContainerMemoryUsageMetricDataModel', ContainerMemoryUsageMetricDataModel); - })(); diff --git a/src/app/components/datamodel/containerMultipleCumulativeMetric.datamodel.factory.js b/src/app/components/datamodel/containerMultipleCumulativeMetric.datamodel.factory.js deleted file mode 100644 index 6b61cb056..000000000 --- a/src/app/components/datamodel/containerMultipleCumulativeMetric.datamodel.factory.js +++ /dev/null @@ -1,95 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerMultipleCumulativeMetricDataModel - * @desc - */ - function ContainerMultipleCumulativeMetricDataModel(WidgetDataModel, MetricListService, DashboardService, ContainerMetadataService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - var derivedFunction, - metrics = {}; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateCumulativeMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue, - name; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - - if (ContainerMetadataService.containerIdExist(instance.key)) { - name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - if (instance.values.length > 0 && ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', name), - value: lastValue.y - }); - } - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('ContainerMultipleCumulativeMetricDataModel', ContainerMultipleCumulativeMetricDataModel); - })(); diff --git a/src/app/components/datamodel/containerMultipleMetric.datamodel.factory.js b/src/app/components/datamodel/containerMultipleMetric.datamodel.factory.js deleted file mode 100644 index f7e8e4606..000000000 --- a/src/app/components/datamodel/containerMultipleMetric.datamodel.factory.js +++ /dev/null @@ -1,95 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerMultipleMetricDataModel - * @desc - */ - function ContainerMultipleMetricDataModel(WidgetDataModel, MetricListService, DashboardService, ContainerMetadataService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - var derivedFunction, - metrics = {}; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue, - name; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - - if (ContainerMetadataService.containerIdExist(instance.key)) { - name = ContainerMetadataService.idDictionary(instance.key) || instance.key; - if (instance.values.length > 0 && ContainerMetadataService.checkContainerName(name) && ContainerMetadataService.checkContainerFilter(name)) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', name), - value: lastValue.y - }); - } - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('ContainerMultipleMetricDataModel', ContainerMultipleMetricDataModel); - })(); diff --git a/src/app/components/datamodel/containerNetworkBytesMetric.datamodel.factory.js b/src/app/components/datamodel/containerNetworkBytesMetric.datamodel.factory.js deleted file mode 100644 index c40104abc..000000000 --- a/src/app/components/datamodel/containerNetworkBytesMetric.datamodel.factory.js +++ /dev/null @@ -1,96 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ContainerNetworkBytesMetricDataModel - * @desc - */ - function ContainerNetworkBytesMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var widgetDefinition = this; - // create create base metrics - var inMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.in.bytes'), - outMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.out.bytes'), - derivedFunction; - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(inMetric.data, function (instance) { - if (instance.values.length > 0 && instance.key.indexOf('veth') !== -1 && instance.key.indexOf(widgetDefinition.widgetScope.widget.filter) !==-1) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key + ' in', - value: lastValue.y / 1024 - }); - } - }); - - angular.forEach(outMetric.data, function (instance) { - if (instance.values.length > 0 && instance.key.indexOf('veth') !==- 1 && instance.key.indexOf(widgetDefinition.widgetScope.widget.filter) !==-1) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key + ' out', - value: lastValue.y / 1024 - }); - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric('container.network.interface', derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric('container.network.interface'); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('network.interface.in.bytes'); - MetricListService.destroyMetric('network.interface.out.bytes'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('ContainerNetworkBytesMetricDataModel', ContainerNetworkBytesMetricDataModel); - })(); diff --git a/src/app/components/datamodel/convertedMetric.datamodel.factory.js b/src/app/components/datamodel/convertedMetric.datamodel.factory.js deleted file mode 100644 index 2ca7e807d..000000000 --- a/src/app/components/datamodel/convertedMetric.datamodel.factory.js +++ /dev/null @@ -1,58 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name SimpleMetricDataModel - * @desc - */ - function ConvertedMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - - this.conversionFunction = this.dataModelOptions.conversionFunction; - - this.metric = MetricListService.getOrCreateConvertedMetric(this.name, this.conversionFunction); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('ConvertedMetricDataModel', ConvertedMetricDataModel); - })(); diff --git a/src/app/components/datamodel/cpuUtilizationMetric.datamodel.factory.js b/src/app/components/datamodel/cpuUtilizationMetric.datamodel.factory.js deleted file mode 100644 index 57000b9c9..000000000 --- a/src/app/components/datamodel/cpuUtilizationMetric.datamodel.factory.js +++ /dev/null @@ -1,102 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CpuUtilizationMetricDataModel - * @desc - */ - function CpuUtilizationMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - // create create base metrics - var cpuSysMetric = MetricListService.getOrCreateCumulativeMetric('kernel.all.cpu.sys'), - cpuUserMetric = MetricListService.getOrCreateCumulativeMetric('kernel.all.cpu.user'), - ncpuMetric = MetricListService.getOrCreateMetric('hinv.ncpu'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - cpuInstance, - cpuCount; - - if (ncpuMetric.data.length > 0) { - cpuInstance = ncpuMetric.data[ncpuMetric.data.length - 1]; - - if (cpuInstance.values.length > 0) { - cpuCount = cpuInstance.values[cpuInstance.values.length - 1].y; - - var pushReturnValues = function(instance, keyName) { - if (instance.values.length > 0) { - var lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: keyName, - value: lastValue.y / (cpuCount * 1000) - }); - } - }; - - angular.forEach(cpuSysMetric.data, function (instance) { - pushReturnValues(instance, 'sys'); - }); - - angular.forEach(cpuUserMetric.data, function (instance) { - pushReturnValues(instance, 'user'); - }); - } - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('kernel.all.cpu.sys'); - MetricListService.destroyMetric('kernel.all.cpu.user'); - MetricListService.destroyMetric('hinv.ncpu'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CpuUtilizationMetricDataModel', CpuUtilizationMetricDataModel); - })(); diff --git a/src/app/components/datamodel/cumulativeMetric.datamodel.factory.js b/src/app/components/datamodel/cumulativeMetric.datamodel.factory.js deleted file mode 100644 index c1e6d1a3c..000000000 --- a/src/app/components/datamodel/cumulativeMetric.datamodel.factory.js +++ /dev/null @@ -1,55 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CumulativeMetricDataModel - * @desc - */ - function CumulativeMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - this.metric = MetricListService.getOrCreateCumulativeMetric(this.name); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CumulativeMetricDataModel', CumulativeMetricDataModel); - })(); diff --git a/src/app/components/datamodel/cumulativeUtilizationMetric.datamodel.factory.js b/src/app/components/datamodel/cumulativeUtilizationMetric.datamodel.factory.js deleted file mode 100644 index b371423b4..000000000 --- a/src/app/components/datamodel/cumulativeUtilizationMetric.datamodel.factory.js +++ /dev/null @@ -1,81 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name CumulativeUtilizationMetricDataModel - * @desc - */ - function CumulativeUtilizationMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var rawMetric = MetricListService.getOrCreateCumulativeMetric(this.name), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(rawMetric.data, function (instance) { - if (instance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key, - value: lastValue.y / 1000 - }); - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('CumulativeUtilizationMetricDataModel', CumulativeUtilizationMetricDataModel); - })(); diff --git a/src/app/components/datamodel/diskLatencyMetric.datamodel.factory.js b/src/app/components/datamodel/diskLatencyMetric.datamodel.factory.js deleted file mode 100644 index 4255913f9..000000000 --- a/src/app/components/datamodel/diskLatencyMetric.datamodel.factory.js +++ /dev/null @@ -1,112 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name DiskLatencyMetricDataModel - * @desc - */ - function DiskLatencyMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var readActiveMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.read_rawactive'), - writeActiveMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.write_rawactive'), - readMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.read'), - writeMetric = MetricListService.getOrCreateCumulativeMetric('disk.dev.write'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - rawactiveInstance, - lastValue, - rawactiveLastValue, - value; - - function calculateValues(metric, rawactiveMetric, key, outputArr) { - if (metric.data.length > 0) { - angular.forEach(metric.data, function (instance) { - rawactiveInstance = _.find(rawactiveMetric.data, function (element) { - return element.key === instance.key; - }); - if (angular.isDefined(rawactiveInstance)) { - if (instance.values.length > 0) { - if (rawactiveInstance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - rawactiveLastValue = rawactiveInstance.values[instance.values.length - 1]; - if (lastValue.y > 0) { - value = rawactiveLastValue.y / lastValue.y; - } else { - value = 0; - } - outputArr.push({ - timestamp: lastValue.x, - key: instance.key + key, - value: value - }); - } - } - } - }); - } - } - - calculateValues(readMetric, readActiveMetric, ' read latency', returnValues); - calculateValues(writeMetric, writeActiveMetric, ' write latency', returnValues); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('disk.dev.read_rawactive'); - MetricListService.destroyMetric('disk.dev.write_rawactive'); - MetricListService.destroyMetric('disk.dev.read'); - MetricListService.destroyMetric('disk.dev.write'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('DiskLatencyMetricDataModel', DiskLatencyMetricDataModel); - })(); diff --git a/src/app/components/datamodel/dummyMetric.datamodel.factory.js b/src/app/components/datamodel/dummyMetric.datamodel.factory.js deleted file mode 100644 index 5e72bb1a7..000000000 --- a/src/app/components/datamodel/dummyMetric.datamodel.factory.js +++ /dev/null @@ -1,50 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name DummyMetricDataModel - * @desc - */ - function DummyMetricDataModel(WidgetDataModel, MetricListService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.metric = MetricListService.getOrCreateMetric('kernel.uname.release'); - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric('kernel.uname.release'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('DummyMetricDataModel', DummyMetricDataModel); - })(); diff --git a/src/app/components/datamodel/memoryUtilizationMetric.datamodel.factory.js b/src/app/components/datamodel/memoryUtilizationMetric.datamodel.factory.js deleted file mode 100644 index 7b3ce7cac..000000000 --- a/src/app/components/datamodel/memoryUtilizationMetric.datamodel.factory.js +++ /dev/null @@ -1,148 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name MemoryUtilizationMetricDataModel - * @desc - */ - function MemoryUtilizationMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var conversionFunction = function (value) { - return value / 1024; - }, - cachedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.cached', conversionFunction), - usedMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.used', conversionFunction), - freeMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.free', conversionFunction), - buffersMemMetric = MetricListService.getOrCreateConvertedMetric('mem.util.bufmem', conversionFunction), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - usedValue, - cachedValue, - freeValue, - buffersValue; - - - usedValue = (function () { - if (usedMemMetric.data.length > 0) { - var instance = usedMemMetric.data[usedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - cachedValue = (function () { - if (cachedMemMetric.data.length > 0) { - var instance = cachedMemMetric.data[cachedMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - freeValue = (function () { - if (freeMemMetric.data.length > 0) { - var instance = freeMemMetric.data[freeMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - buffersValue = (function () { - if (buffersMemMetric.data.length > 0) { - var instance = buffersMemMetric.data[buffersMemMetric.data.length - 1]; - if (instance.values.length > 0) { - return instance.values[instance.values.length - 1]; - } - } - }()); - - if (angular.isDefined(usedValue) && - angular.isDefined(cachedValue) && - angular.isDefined(buffersValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'application', - value: usedValue.y - cachedValue.y - buffersValue.y - }); - } - - if (angular.isDefined(cachedValue) && - angular.isDefined(buffersValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'free (cache)', - value: cachedValue.y + buffersValue.y - }); - } - - if (angular.isDefined(freeValue)) { - - returnValues.push({ - timestamp: usedValue.x, - key: 'free (unused)', - value: freeValue.y - }); - } - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('mem.util.cached'); - MetricListService.destroyMetric('mem.util.used'); - MetricListService.destroyMetric('mem.util.free'); - MetricListService.destroyMetric('mem.util.bufmem'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('MemoryUtilizationMetricDataModel', MemoryUtilizationMetricDataModel); - })(); diff --git a/src/app/components/datamodel/multipleCumulativeMetric.datamodel.factory.js b/src/app/components/datamodel/multipleCumulativeMetric.datamodel.factory.js deleted file mode 100644 index 96c72dab1..000000000 --- a/src/app/components/datamodel/multipleCumulativeMetric.datamodel.factory.js +++ /dev/null @@ -1,92 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name MultipleCumulativeMetricDataModel - * @desc - */ - function MultipleCumulativeMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - - var widgetDefinition = this, - metrics = {}, - derivedFunction; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateCumulativeMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - if (instance.values.length > 0 && ( angular.isUndefined(widgetDefinition.widgetScope.widget.filter) || instance.key.indexOf(widgetDefinition.widgetScope.widget.filter) !==-1)) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', instance.key), - value: lastValue.y - }); - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('MultipleCumulativeMetricDataModel', MultipleCumulativeMetricDataModel); - })(); diff --git a/src/app/components/datamodel/multipleMetric.datamodel.factory.js b/src/app/components/datamodel/multipleMetric.datamodel.factory.js deleted file mode 100644 index 3d3c05ffb..000000000 --- a/src/app/components/datamodel/multipleMetric.datamodel.factory.js +++ /dev/null @@ -1,90 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name MultipleMetricDataModel - * @desc - */ - function MultipleMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - this.metricDefinitions = this.dataModelOptions.metricDefinitions; - - var derivedFunction, - metrics = {}; - - angular.forEach(this.metricDefinitions, function (definition, key) { - metrics[key] = MetricListService.getOrCreateMetric(definition); - }); - - derivedFunction = function () { - var returnValues = [], - lastValue; - - angular.forEach(metrics, function (metric, key) { - angular.forEach(metric.data, function (instance) { - if (instance.values.length > 0) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: key.replace('{key}', instance.key), - value: lastValue.y - }); - } - }); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - angular.forEach(this.metricDefinitions, function (definition) { - MetricListService.destroyMetric(definition); - }); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('MultipleMetricDataModel', MultipleMetricDataModel); - })(); diff --git a/src/app/components/datamodel/networkBytesMetric.datamodel.factory.js b/src/app/components/datamodel/networkBytesMetric.datamodel.factory.js deleted file mode 100644 index 75d55a1c1..000000000 --- a/src/app/components/datamodel/networkBytesMetric.datamodel.factory.js +++ /dev/null @@ -1,94 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - (function () { - 'use strict'; - - /** - * @name NetworkBytesMetricDataModel - * @desc - */ - function NetworkBytesMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var widgetDefinition = this; - // create create base metrics - var inMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.in.bytes'), - outMetric = MetricListService.getOrCreateCumulativeMetric('network.interface.out.bytes'), - derivedFunction; - - // create derived function - derivedFunction = function () { - var returnValues = [], - lastValue; - - var pushReturnValues = function(instance, metricName) { - if (instance.values.length > 0 && instance.key.indexOf(widgetDefinition.widgetScope.widget.filter) !==-1) { - lastValue = instance.values[instance.values.length - 1]; - returnValues.push({ - timestamp: lastValue.x, - key: instance.key + metricName, - value: lastValue.y / 1024 - }); - } - }; - - angular.forEach(inMetric.data, function (instance) { - pushReturnValues(instance, ' in'); - }); - - angular.forEach(outMetric.data, function (instance) { - pushReturnValues(instance, ' out'); - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('network.interface.in.bytes'); - MetricListService.destroyMetric('network.interface.out.bytes'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('NetworkBytesMetricDataModel', NetworkBytesMetricDataModel); - })(); diff --git a/src/app/components/datamodel/perCpuUtilizationMetric.datamodel.factory.js b/src/app/components/datamodel/perCpuUtilizationMetric.datamodel.factory.js deleted file mode 100644 index 00b27d554..000000000 --- a/src/app/components/datamodel/perCpuUtilizationMetric.datamodel.factory.js +++ /dev/null @@ -1,95 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name PerCpuUtilizationMetricDataModel - * @desc - */ - function PerCpuUtilizationMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - var cpuSysMetric = MetricListService.getOrCreateCumulativeMetric('kernel.percpu.cpu.sys'), - cpuUserMetric = MetricListService.getOrCreateCumulativeMetric('kernel.percpu.cpu.user'), - derivedFunction; - - derivedFunction = function () { - var returnValues = [], - cpuUserInstance, - cpuSysLastValue, - cpuUserLastValue; - - angular.forEach(cpuSysMetric.data, function (cpuSysInstance) { - if (cpuSysInstance.values.length > 0) { - cpuUserInstance = _.find(cpuUserMetric.data, function (el) { - return el.key === cpuSysInstance.key; - }); - if (angular.isDefined(cpuUserInstance)) { - cpuSysLastValue = cpuSysInstance.values[cpuSysInstance.values.length - 1]; - cpuUserLastValue = cpuUserInstance.values[cpuUserInstance.values.length - 1]; - if (cpuSysLastValue.x === cpuUserLastValue.x) { - returnValues.push({ - timestamp: cpuSysLastValue.x, - key: cpuSysInstance.key, - value: (cpuSysLastValue.y + cpuUserLastValue.y) / 1000 - }); - } - } - } - }); - - return returnValues; - }; - - // create derived metric - this.metric = MetricListService.getOrCreateDerivedMetric(this.name, derivedFunction); - - this.updateScope(this.metric.data); - }; - - DataModel.prototype.destroy = function () { - // remove subscribers and delete derived metric - MetricListService.destroyDerivedMetric(this.name); - - // remove subscribers and delete base metrics - MetricListService.destroyMetric('kernel.percpu.cpu.sys'); - MetricListService.destroyMetric('kernel.percpu.cpu.user'); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('PerCpuUtilizationMetricDataModel', PerCpuUtilizationMetricDataModel); - })(); diff --git a/src/app/components/datamodel/simpleMetric.datamodel.factory.js b/src/app/components/datamodel/simpleMetric.datamodel.factory.js deleted file mode 100644 index 14fa33c78..000000000 --- a/src/app/components/datamodel/simpleMetric.datamodel.factory.js +++ /dev/null @@ -1,55 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name SimpleMetricDataModel - * @desc - */ - function SimpleMetricDataModel(WidgetDataModel, MetricListService, DashboardService) { - var DataModel = function () { - return this; - }; - - DataModel.prototype = Object.create(WidgetDataModel.prototype); - - DataModel.prototype.init = function () { - WidgetDataModel.prototype.init.call(this); - - this.name = this.dataModelOptions ? this.dataModelOptions.name : 'metric_' + DashboardService.getGuid(); - - this.metric = MetricListService.getOrCreateMetric(this.name); - - this.updateScope(this.metric.data); - - }; - - DataModel.prototype.destroy = function () { - MetricListService.destroyMetric(this.name); - - WidgetDataModel.prototype.destroy.call(this); - }; - - return DataModel; - } - - angular - .module('datamodel') - .factory('MetricDataModel', SimpleMetricDataModel); - })(); diff --git a/src/app/components/flamegraph/flamegraph.directive.js b/src/app/components/flamegraph/flamegraph.directive.js deleted file mode 100644 index d578b39df..000000000 --- a/src/app/components/flamegraph/flamegraph.directive.js +++ /dev/null @@ -1,51 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - function cpuFlameGraph($rootScope, $timeout, FlameGraphService, DashboardService) { - - function link(scope) { - scope.host = $rootScope.properties.host; - scope.port = $rootScope.properties.port; - scope.context = $rootScope.properties.context; - scope.ready = false; - scope.processing = false; - scope.id = DashboardService.getGuid(); - scope.generateFlameGraph = function(){ - FlameGraphService.generate(); - scope.ready = true; - scope.processing = true; - $timeout(function () { - scope.processing = false; - }, 65000); - }; - } - - return { - restrict: 'A', - templateUrl: 'app/components/flamegraph/flamegraph.html', - link: link - }; - } - - angular - .module('flamegraph') - .directive('cpuFlameGraph', cpuFlameGraph); - -})(); diff --git a/src/app/components/flamegraph/flamegraph.html b/src/app/components/flamegraph/flamegraph.html deleted file mode 100644 index 92f8067ac..000000000 --- a/src/app/components/flamegraph/flamegraph.html +++ /dev/null @@ -1,11 +0,0 @@ -
-
-

Click on the button below to generate a CPU flame graph! (60 sec)

- -
-
-

The CPU flame graph is ready. Please click on the button below to open it.

- Open Flame Graph -
- -
diff --git a/src/app/components/flamegraph/flamegraph.service.js b/src/app/components/flamegraph/flamegraph.service.js deleted file mode 100644 index b704f7d78..000000000 --- a/src/app/components/flamegraph/flamegraph.service.js +++ /dev/null @@ -1,48 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name FlameGraphService - */ - function FlameGraphService($log, $rootScope, $http, toastr) { - - /** - * @name generate - * @desc - */ - function generate() { - $http.get($rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + $rootScope.properties.port + '/pmapi/' + $rootScope.properties.context + '/_fetch?names=generic.systack') - .success(function () { - toastr.success('generic.systack requested.', 'Success'); - }).error(function () { - toastr.error('Failed requesting generic.systack.', 'Error'); - }); - } - - return { - generate: generate - }; - } - - angular - .module('flamegraph') - .factory('FlameGraphService', FlameGraphService); - - })(); diff --git a/src/app/components/metric/converted.metric.factory.js b/src/app/components/metric/converted.metric.factory.js deleted file mode 100644 index 35a4bb431..000000000 --- a/src/app/components/metric/converted.metric.factory.js +++ /dev/null @@ -1,72 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name ConvertedMetric - * @desc - */ - function ConvertedMetric($rootScope, $log, SimpleMetric) { - - var Metric = function (name, conversionFunction) { - this.base = SimpleMetric; - this.base(name); - this.conversionFunction = conversionFunction; - }; - - Metric.prototype = new SimpleMetric(); - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow, - convertedValue; - - convertedValue = self.conversionFunction(value); - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isDefined(instance) && instance !== null) { - instance.values.push({ x: timestamp, y: convertedValue }); - overflow = instance.values.length - ((parseInt($rootScope.properties.window) * 60) / parseInt($rootScope.properties.interval)); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } else { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [{x: timestamp, y: convertedValue}, {x: timestamp + 1, y: convertedValue}] - }; - self.data.push(instance); - } - }; - - return Metric; - } - - angular - .module('metric') - .factory('ConvertedMetric', ConvertedMetric); - })(); diff --git a/src/app/components/metric/cumulative.metric.factory.js b/src/app/components/metric/cumulative.metric.factory.js deleted file mode 100644 index 3e7ead350..000000000 --- a/src/app/components/metric/cumulative.metric.factory.js +++ /dev/null @@ -1,78 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name CumulativeMetric - * @desc - */ - function CumulativeMetric($rootScope, $log, SimpleMetric) { - - var Metric = function (name) { - this.base = SimpleMetric; - this.base(name); - }; - - Metric.prototype = new SimpleMetric(); - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow, - diffValue; - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isUndefined(instance)) { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [], - previousValue: value, - previousTimestamp: timestamp - }; - self.data.push(instance); - } else { - diffValue = ((value - instance.previousValue) / ((timestamp - instance.previousTimestamp) / 1000)); // sampling frequency - if (instance.values.length < 1) { - instance.values.push({ x: timestamp, y: diffValue }, { x: timestamp + 1, y: diffValue }); - } else { - instance.values.push({ x: timestamp, y: diffValue }); - } - instance.previousValue = value; - instance.previousTimestamp = timestamp; - overflow = instance.values.length - ((parseInt($rootScope.properties.window) * 60) / parseInt($rootScope.properties.interval)); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } - }; - - return Metric; - } - - angular - .module('metric') - .factory('CumulativeMetric', CumulativeMetric); - })(); diff --git a/src/app/components/metric/cumulativeConverted.metric.factory.js b/src/app/components/metric/cumulativeConverted.metric.factory.js deleted file mode 100644 index 18820c6d9..000000000 --- a/src/app/components/metric/cumulativeConverted.metric.factory.js +++ /dev/null @@ -1,77 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name CumulativeConvertedMetric - * @desc - */ - function CumulativeConvertedMetric($rootScope, $log, SimpleMetric) { - - var Metric = function (name, conversionFunction) { - this.base = Metric; - this.base(name); - this.conversionFunction = conversionFunction; - }; - - Metric.prototype = new SimpleMetric(); - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow, - diffValue, - convertedValue; - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isUndefined(instance)) { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [], - previousValue: value, - previousTimestamp: timestamp - }; - self.data.push(instance); - } else { - diffValue = ((value - instance.previousValue) / (timestamp - instance.previousTimestamp)); // sampling frequency - convertedValue = self.conversionFunction(diffValue); - instance.values.push({ x: timestamp, y: convertedValue }); - instance.previousValue = value; - instance.previousTimestamp = timestamp; - overflow = instance.values.length - ((parseInt($rootScope.properties.window) * 60) / parseInt($rootScope.properties.interval)); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } - }; - - return Metric; - } - - angular - .module('metric') - .factory('CumulativeConvertedMetric', CumulativeConvertedMetric); - })(); diff --git a/src/app/components/metric/derived.metric.factory.js b/src/app/components/metric/derived.metric.factory.js deleted file mode 100644 index dce4fc473..000000000 --- a/src/app/components/metric/derived.metric.factory.js +++ /dev/null @@ -1,79 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name DerivedMetric - * @desc - */ - function DerivedMetric($rootScope) { - - var Metric = function (name, derivedFunction) { - this.name = name; - this.data = []; - this.subscribers = 1; - this.derivedFunction = derivedFunction; - }; - - Metric.prototype.updateValues = function () { - var self = this, - values; - - values = self.derivedFunction(); // timestamp, key, data - - if (values.length !== self.data.length) { - self.data.length = 0; - } - - angular.forEach(values, function (data) { - var overflow, - instance = _.find(self.data, function (el) { - return el.key === data.key; - }); - - if (angular.isUndefined(instance)) { - instance = { - key: data.key, - values: [{x: data.timestamp, y: data.value}, {x: data.timestamp + 1, y: data.value}] - }; - self.data.push(instance); - } else { - instance.values.push({x: data.timestamp, y: data.value}); - overflow = instance.values.length - ((parseInt($rootScope.properties.window) * 60) / parseInt($rootScope.properties.interval)); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } - }); - }; - - Metric.prototype.clearData = function () { - this.data.length = 0; - }; - - return Metric; - } - - angular - .module('metric') - .factory('DerivedMetric', DerivedMetric); - })(); diff --git a/src/app/components/metric/metric.service.js b/src/app/components/metric/metric.service.js deleted file mode 100644 index 25d2c47df..000000000 --- a/src/app/components/metric/metric.service.js +++ /dev/null @@ -1,36 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - /** - * @name MetricService - * @desc Provides Instances names - */ - function MetricService($http, $rootScope, PMAPIService) { - return { - getInames: function (metric, iid) { - return PMAPIService.getInstanceDomainsByName($rootScope.properties.context, metric, [iid]); - } - }; - } - - angular - .module('metric') - .factory('MetricService', MetricService); -})(); diff --git a/src/app/components/metric/simple.metric.factory.js b/src/app/components/metric/simple.metric.factory.js deleted file mode 100644 index ae9d11369..000000000 --- a/src/app/components/metric/simple.metric.factory.js +++ /dev/null @@ -1,95 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - /** - * @name SimpleMetric - * @desc - */ - function SimpleMetric($rootScope) { - - var Metric = function (name) { - this.name = name || null; - this.data = []; - this.subscribers = 1; - this.pmid = null; - }; - - Metric.prototype.toString = function () { - return this.name; - }; - - Metric.prototype.pushValue = function (timestamp, iid, iname, value) { - var self = this, - instance, - overflow; - - instance = _.find(self.data, function (el) { - return el.iid === iid; - }); - - if (angular.isDefined(instance) && instance !== null) { - instance.values.push({ x: timestamp, y: value }); - overflow = instance.values.length - ((parseInt($rootScope.properties.window) * 60) / parseInt($rootScope.properties.interval)); - if (overflow > 0) { - instance.values.splice(0, overflow); - } - } else { - instance = { - key: angular.isDefined(iname) ? iname : this.name, - iid: iid, - values: [{x: timestamp, y: value}, {x: timestamp + 1, y: value}] - }; - self.data.push(instance); - } - }; - - Metric.prototype.clearData = function () { - this.data.length = 0; - }; - - Metric.prototype.deleteInvalidInstances = function (currentInstances) { - var iid, - currentInstance, - index, - self = this; - angular.forEach(self.data, function(instance) { - currentInstance = _.find(currentInstances, function (el) { - iid = angular.isUndefined(el.instance) ? 1 : el.instance; - return iid === instance.iid; - }); - if (angular.isUndefined(currentInstance)) { - index = self.data.indexOf(instance); - if (index > -1) { - self.data.splice(index, 1); - } - } - }); - }; - - return Metric; - } - - angular - .module('metric') - .factory('SimpleMetric', SimpleMetric); - })(); diff --git a/src/app/components/metriclist/metriclist.service.js b/src/app/components/metriclist/metriclist.service.js deleted file mode 100644 index f7ef18b7a..000000000 --- a/src/app/components/metriclist/metriclist.service.js +++ /dev/null @@ -1,213 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - - (function () { - 'use strict'; - - - /** - * @name MetricListService - * @desc - */ - function MetricListService($rootScope, $http, $log, $q, PMAPIService, SimpleMetric, CumulativeMetric, ConvertedMetric, CumulativeConvertedMetric, DerivedMetric) { - var simpleMetrics = [], - derivedMetrics = []; - - /** - * @name getOrCreateMetric - * @desc - */ - function getOrCreateMetric(name) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new SimpleMetric(name); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateCumulativeMetric - * @desc - */ - function getOrCreateCumulativeMetric(name) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new CumulativeMetric(name); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateConvertedMetric - * @desc - */ - function getOrCreateConvertedMetric(name, conversionFunction) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new ConvertedMetric(name, conversionFunction); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateCumulativeConvertedMetric - * @desc - */ - function getOrCreateCumulativeConvertedMetric(name, conversionFunction) { - var metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new CumulativeConvertedMetric(name, conversionFunction); - simpleMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name getOrCreateDerivedMetric - * @desc - */ - function getOrCreateDerivedMetric(name, derivedFunction) { - var metric = _.find(derivedMetrics, function (metric) { - return metric.name === name; - }); - - if (angular.isUndefined(metric)) { - metric = new DerivedMetric(name, derivedFunction); - derivedMetrics.push(metric); - } else { - metric.subscribers++; - } - return metric; - } - - /** - * @name destroyMetric - * @desc - */ - function destroyMetric(name) { - var index, - metric = _.find(simpleMetrics, function (el) { - return el.name === name; - }); - - metric.subscribers--; - - if (metric.subscribers < 1) { - index = simpleMetrics.indexOf(metric); - if (index > -1) { - simpleMetrics.splice(index, 1); - } - } - } - - /** - * @name destroyDerivedMetric - * @desc - */ - function destroyDerivedMetric(name) { - var index, - metric = _.find(derivedMetrics, function (el) { - return el.name === name; - }); - - metric.subscribers--; - - if (metric.subscribers < 1) { - index = derivedMetrics.indexOf(metric); - if (index > -1) { - derivedMetrics.splice(index, 1); - } - } - } - - /** - * @name clearMetricList - * @desc - */ - function clearMetricList() { - angular.forEach(simpleMetrics, function (metric) { - metric.clearData(); - }); - } - - /** - * @name clearDerivedMetricList - * @desc - */ - function clearDerivedMetricList() { - angular.forEach(derivedMetrics, function (metric) { - metric.clearData(); - }); - } - - function getDerivedMetricList() { - return derivedMetrics; - } - - function getSimpleMetricList() { - return simpleMetrics; - } - - return { - getOrCreateMetric: getOrCreateMetric, - getOrCreateCumulativeMetric: getOrCreateCumulativeMetric, - getOrCreateConvertedMetric: getOrCreateConvertedMetric, - getOrCreateCumulativeConvertedMetric: getOrCreateCumulativeConvertedMetric, - getOrCreateDerivedMetric: getOrCreateDerivedMetric, - destroyMetric: destroyMetric, - destroyDerivedMetric: destroyDerivedMetric, - clearMetricList: clearMetricList, - clearDerivedMetricList: clearDerivedMetricList, - getSimpleMetricList: getSimpleMetricList, - getDerivedMetricList: getDerivedMetricList - }; - } - - angular - .module('metriclist', [ - 'pmapi', - 'metric' - ]) - .factory('MetricListService', MetricListService); - - })(); diff --git a/src/app/components/modal/modal.service.js b/src/app/components/modal/modal.service.js deleted file mode 100644 index 7c5ae97f4..000000000 --- a/src/app/components/modal/modal.service.js +++ /dev/null @@ -1,81 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - (function () { - 'use strict'; - - /** - * @name ModalService - * @desc - */ - function ModalService($uibModal) { - - var defaultModal = { - backdrop: true, - keyboard: true, - modalFade: true, - template: '' - }; - - var defaultModalOptions = { - closeButtonText: 'Close', - actionButtonText: 'OK', - headerText: 'Proceed?', - bodyText: 'Perform this action?' - }; - - /** - * @name show - * @desc - */ - function showModal(customModal, customModalOptions) { - //Create temp objects to work with since we're in a singleton service - var modal = {}; - var modalOptions = {}; - - customModal.backdrop = 'static'; - - //Map angular-ui modal custom defaults to modal defaults defined in service - angular.extend(modal, defaultModal, customModal); - - //Map modal.html $scope custom properties to defaults defined in service - angular.extend(modalOptions, defaultModalOptions, customModalOptions); - - modal.controller = ['$scope','$uibModalInstance', function ($scope, $uibModalInstance) { - $scope.modalOptions = modalOptions; - $scope.modalOptions.ok = function (result) { - $uibModalInstance.close(result); - }; - $scope.modalOptions.close = function () { - $uibModalInstance.dismiss('cancel'); - }; - }]; - - return $uibModal.open(modal).result; - } - - return { - showModal: showModal - }; - - } - - angular - .module('modal' , []) - .factory('ModalService', ModalService); - - })(); diff --git a/src/app/components/pmapi/pmapi.service.js b/src/app/components/pmapi/pmapi.service.js deleted file mode 100644 index 098bf8368..000000000 --- a/src/app/components/pmapi/pmapi.service.js +++ /dev/null @@ -1,259 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - /*global _*/ - -(function () { - 'use strict'; - - function PMAPIService($http, $log, $rootScope, $q) { - - function getContext(params) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/context'; - settings.params = {}; - settings.params[params.contextType] = params.contextValue; - settings.params.polltimeout = params.pollTimeout.toString(); - settings.timeout = 5000; - - return $http(settings) - .then(function (response) { - if (response.data.context) { - return response.data.context; - } - - return $q.reject('context is undefined'); - }); - } - - function getHostspecContext(hostspec, pollTimeout) { - var params = {}; - params.contextType = 'hostspec'; - params.contextValue = hostspec; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getHostnameContext(hostname, pollTimeout) { - var params = {}; - params.contextType = 'hostname'; - params.contextValue = hostname; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getLocalContext(pollTimeout) { - var params = {}; - params.contextType = 'local'; - params.contextValue = 'ANYTHING'; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getArchiveContext(archiveFile, pollTimeout) { - var params = {}; - params.contextType = 'archivefile'; - params.contextValue = archiveFile; - params.pollTimeout = pollTimeout; - return getContext(params); - } - - function getMetricsValues(context, names, pmids) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/' + context + '/_fetch'; - settings.params = {}; - - if (angular.isDefined(pmids) && pmids !== null && pmids.length > 0) { - settings.params.pmids = pmids.join(','); - } - - if (angular.isDefined(names) && names !== null && names.length > 0) { - settings.params.names = names.join(','); - } - - return $http(settings) - .then(function (response) { - if (angular.isUndefined(response.data.timestamp) || - angular.isUndefined(response.data.timestamp.s) || - angular.isUndefined(response.data.timestamp.us) || - angular.isUndefined(response.data.values)) { - return $q.reject('metric values is empty'); - } - return response; - }); - - } - - function getInstanceDomainsByIndom(context, indom, instances, inames) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/' + context + '/_indom'; - settings.params = {indom: indom}; // required - - if (angular.isDefined(instances) && instances !== null) { - settings.params.instance = instances.join(','); - } - - if (angular.isDefined(inames) && inames !== null) { - settings.params.inames = inames.join(','); - } - - settings.cache = true; - - return $http(settings) - .then(function (response) { - if (angular.isDefined(response.data.indom) || - angular.isDefined(response.data.instances)) { - return response; - } - - return $q.reject('instances is undefined'); - }); - } - - function getInstanceDomainsByName(context, name, instances, inames) { - var baseURI = $rootScope.properties.protocol + '://' + $rootScope.properties.host + ':' + - $rootScope.properties.port; - var settings = {}; - settings.method = 'GET'; - settings.url = baseURI + '/pmapi/' + context + '/_indom'; - settings.params = {name: name}; - - if (angular.isDefined(instances) && instances !== null) { - settings.params.instance = instances.join(','); - } - - if (angular.isDefined(inames) && inames !== null) { - settings.params.inames = inames.join(','); - } - - settings.cache = true; - - return $http(settings) - .then(function (response) { - if (angular.isDefined(response.data.instances)) { - return response; - } - return $q.reject('instances is undefined'); - }); - } - - function convertTimestampToMillis(response) { - // timestamp is in milliseconds - var timestamp = (response.data.timestamp.s * 1000) + - (response.data.timestamp.us / 1000); - var values = response.data.values; - - return { - timestamp: timestamp, - values: values - }; - - } - - function mapMetricNamesToInstanceDomains(responses) { - var instanceDomains = {}; - angular.forEach(responses, function (response) { - var indom = response.data.indom; - var name = response.config.params.name; - var inames = {}; - angular.forEach(response.data.instances, function (inst) { - inames[inst.instance.toString()] = inst.name; - }); - instanceDomains[name.toString()] = { - indom: indom, - name: name, - inames: inames - }; - }); - - return instanceDomains; - } - - function appendInstanceDomains(context, data) { - var deferred = $q.defer(); - var instanceDomainPromises = []; - angular.forEach(data.values, function (value) { - var ids = _.map(value.instances, function (inst) { - if (angular.isDefined(inst.instance) && - inst.instance !== null) { - return inst.instance; - } else { - return -1; - } - }); - instanceDomainPromises.push( - getInstanceDomainsByName(context, value.name, ids)); - }); - - $q.all(instanceDomainPromises) - .then(function (responses) { - var dict = mapMetricNamesToInstanceDomains(responses); - - var result = { - timestamp: data.timestamp, - values: data.values, - inames: dict - }; - - deferred.resolve(result); - }, function (errors) { - deferred.reject(errors); - }, function (updates) { - deferred.update(updates); - }); - - return deferred.promise; - } - - function getMetrics(context, metrics, pmids) { - return getMetricsValues(context, metrics, pmids) - .then(convertTimestampToMillis) - .then(function(data) { - return appendInstanceDomains(context, data); - }); - } - - return { - getHostspecContext: getHostspecContext, - getHostnameContext: getHostnameContext, - getLocalContext: getLocalContext, - getArchiveContext: getArchiveContext, - getMetricsValues: getMetricsValues, - getMetrics: getMetrics, - getInstanceDomainsByIndom: getInstanceDomainsByIndom, - getInstanceDomainsByName: getInstanceDomainsByName - }; - } - - // PMAPI Service factory - angular - .module('pmapi', []) - .factory('PMAPIService', PMAPIService); - - PMAPIService.$inject = ['$http', '$log', '$rootScope', '$q']; - -})(); diff --git a/src/app/components/widget/widget.factory.js b/src/app/components/widget/widget.factory.js deleted file mode 100644 index 4a1fcdb10..000000000 --- a/src/app/components/widget/widget.factory.js +++ /dev/null @@ -1,1051 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true*/ -/*global angular*/ - -(function () { - 'use strict'; - - /* Widgets */ - function widgetDefinitions( - MetricDataModel, - ConvertedMetricDataModel, - CumulativeMetricDataModel, - CgroupCPUUsageMetricDataModel, - CgroupCPUHeadroomMetricDataModel, - CgroupMemoryUsageMetricTimeSeriesDataModel, - ContainerMemoryUsageMetricDataModel, - ContainerNetworkBytesMetricDataModel, - ContainerMultipleMetricDataModel, - ContainerMultipleCumulativeMetricDataModel, - CgroupMemoryHeadroomMetricDataModel, - MemoryUtilizationMetricDataModel, - NetworkBytesMetricDataModel, - CpuUtilizationMetricDataModel, - PerCpuUtilizationMetricDataModel, - MultipleMetricDataModel, - MultipleCumulativeMetricDataModel, - DummyMetricDataModel, - DiskLatencyMetricDataModel, - CumulativeUtilizationMetricDataModel, - CgroupMemoryUtilizationMetricDataModel, - config) { - - var onSettingsClose = function(resultFromModal, widgetModel) { - if (typeof resultFromModal !== 'undefined'){ - widgetModel.filter = resultFromModal.filter; - } - }; - var definitions = [ - { - name: 'kernel.all.load', - title: 'Load Average', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'kernel.all.load' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU' - }, { - name: 'kernel.all.runnable', - title: 'Runnable', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'kernel.all.runnable' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 4, - integer: true - } - }, { - name: 'kernel.all.cpu.sys', - title: 'CPU Utilization (System)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.all.cpu.sys' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.all.cpu.user', - title: 'CPU Utilization (User)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.all.cpu.user' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.all.cpu', - title: 'CPU Utilization', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: CpuUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.all.cpu' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.percpu.cpu.sys', - title: 'Per-CPU Utilization (System)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.percpu.cpu.sys' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.percpu.cpu.user', - title: 'Per-CPU Utilization (User)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.percpu.cpu.user' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.percpu.cpu', - title: 'Per-CPU Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: PerCpuUtilizationMetricDataModel, - dataModelOptions: { - name: 'kernel.percpu.cpu' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'mem.util.free', - title: 'Memory Utilization (Free)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ConvertedMetricDataModel, - dataModelOptions: { - name: 'mem.util.free', - conversionFunction: function (value) { - return value / 1024 / 1024; - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory' - }, { - name: 'mem.util.used', - title: 'Memory Utilization (Used)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ConvertedMetricDataModel, - dataModelOptions: { - name: 'mem.util.used', - conversionFunction: function (value) { - return value / 1024 / 1024; - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory' - }, { - name: 'mem.util.cached', - title: 'Memory Utilization (Cached)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ConvertedMetricDataModel, - dataModelOptions: { - name: 'mem.util.cached', - conversionFunction: function (value) { - return value / 1024 / 1024; - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory' - }, { - name: 'mem', - title: 'Memory Utilization', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: MemoryUtilizationMetricDataModel, - dataModelOptions: { - name: 'mem' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.interface.out.drops', - title: 'Network Drops (Out)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.interface.out.drops' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'network.interface.in.drops', - title: 'Network Drops (In)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.interface.in.drops' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'network.interface.drops', - title: 'Network Drops', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleMetricDataModel, - dataModelOptions: { - name: 'network.interface.drops', - metricDefinitions: { - '{key} in': 'network.interface.in.drops', - '{key} out': 'network.interface.out.drops' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn.established', - title: 'TCP Connections (Estabilished)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.tcpconn.established' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn.time_wait', - title: 'TCP Connections (Time Wait)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.tcpconn.time_wait' - }, - enableVerticalResize: false, - size: { - width: '50%', - height: '250px' - }, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn.close_wait', - title: 'TCP Connections (Close Wait)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MetricDataModel, - dataModelOptions: { - name: 'network.tcpconn.close_wait' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.tcpconn', - title: 'TCP Connections', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleMetricDataModel, - dataModelOptions: { - name: 'network.tcpconn', - metricDefinitions: { - 'established': 'network.tcpconn.established', - 'time_wait': 'network.tcpconn.time_wait', - 'close_wait': 'network.tcpconn.close_wait' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.interface.bytes', - title: 'Network Throughput (kB)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: NetworkBytesMetricDataModel, - dataModelOptions: { - name: 'network.interface.bytes' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - }, - settingsModalOptions: { - templateUrl: 'app/components/customWidgetSettings/customWidgetSettings.html', - controller: 'CustomWidgetSettingsController' - }, - hasLocalSettings: true, - onSettingsClose: onSettingsClose, - filter: '' - }, { - name: 'disk.iops', - title: 'Disk IOPS', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'disk.iops', - metricDefinitions: { - '{key} read': 'disk.dev.read', - '{key} write': 'disk.dev.write' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk' - }, { - name: 'disk.bytes', - title: 'Disk Throughput (Bytes)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'disk.bytes', - metricDefinitions: { - '{key} read': 'disk.dev.read_bytes', - '{key} write': 'disk.dev.write_bytes' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk' - }, { - name: 'disk.dev.avactive', - title: 'Disk Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeUtilizationMetricDataModel, - dataModelOptions: { - name: 'disk.dev.avactive' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk', - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'kernel.all.pswitch', - title: 'Context Switches', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CumulativeMetricDataModel, - dataModelOptions: { - name: 'kernel.all.pswitch' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'mem.vmstat.pgfault', - title: 'Page Faults', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'mem.vmstat.pgfault', - metricDefinitions: { - 'page faults': 'mem.vmstat.pgfault', - 'major page faults': 'mem.vmstat.pgmajfault' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Memory', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'network.interface.packets', - title: 'Network Packets', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'network.interface.packets', - metricDefinitions: { - '{key} in': 'network.interface.in.packets', - '{key} out': 'network.interface.out.packets' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - percentage: false, - integer: true - }, - settingsModalOptions: { - templateUrl: 'app/components/customWidgetSettings/customWidgetSettings.html', - controller: 'CustomWidgetSettingsController' - }, - hasLocalSettings: true, - onSettingsClose: onSettingsClose, - filter: '' - }, { - name: 'network.tcp.retrans', - title: 'Network Retransmits', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: MultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'network.tcp.retrans', - metricDefinitions: { - 'retranssegs': 'network.tcp.retranssegs', - 'timeouts': 'network.tcp.timeouts', - 'listendrops': 'network.tcp.listendrops', - 'fastretrans': 'network.tcp.fastretrans', - 'slowstartretrans': 'network.tcp.slowstartretrans', - 'synretrans': 'network.tcp.synretrans' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Network', - attrs: { - forcey: 10, - percentage: false, - integer: true - } - }, { - name: 'disk.dev.latency', - title: 'Disk Latency', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: DiskLatencyMetricDataModel, - dataModelOptions: { - name: 'disk.dev.latency' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Disk', - attrs: { - percentage: false, - integer: true - } - } - ]; - - if (config.enableCpuFlameGraph) { - definitions.push({ - name: 'graph.flame.cpu', - title: 'CPU Flame Graph', - directive: 'cpu-flame-graph', - dataModelType: DummyMetricDataModel, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'CPU' - }); - } - - if (config.enableContainerWidgets) { - definitions.push( - { - name: 'cgroup.cpuacct.usage', - title: 'Per-Container CPU Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CgroupCPUUsageMetricDataModel, - dataModelOptions: { - name: 'cgroup.cpuacct.usage' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - requireContainerFilter: true, - attrs: { - forcey: 1, - percentage: true, - integer: false - } - }, { - name: 'cgroup.memory.usage', - title: 'Per-Container Memory Usage (Mb)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CgroupMemoryUsageMetricTimeSeriesDataModel, - dataModelOptions: { - name: 'cgroup.memory.usage' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true, - forcey: 10 - } - }, { - name: 'container.memory.usage', - title: 'Total Container Memory Usage (Mb)', - directive: 'area-stacked-time-series', - dataAttrName: 'data', - dataModelType: ContainerMemoryUsageMetricDataModel, - dataModelOptions: { - name: 'container.memory.usage' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'cgroup.memory.headroom', - title: 'Per-Container Memory Headroom (Mb)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CgroupMemoryHeadroomMetricDataModel, - dataModelOptions: { - name: 'cgroup.memory.headroom' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - requireContainerFilter: true, - attrs: { - forcey: 1, - percentage: false, - integer: true, - area: true - } - }, { - name: 'cgroup.blkio.all.io_serviced', - title: 'Container Disk IOPS', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'cgroup.blkio.all.io_serviced', - metricDefinitions: { - '{key} read': 'cgroup.blkio.all.io_serviced.read', - '{key} write': 'cgroup.blkio.all.io_serviced.write' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'cgroup.blkio.all.io_service_bytes', - title: 'Container Disk Throughput (Bytes)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'cgroup.blkio.all.io_service_bytes', - metricDefinitions: { - '{key} read': 'cgroup.blkio.all.io_service_bytes.read', - '{key} write': 'cgroup.blkio.all.io_service_bytes.write' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'cgroup.blkio.all.throttle.io_serviced', - title: 'Container Disk IOPS (Throttled)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'cgroup.blkio.all.throttle.io_serviced', - metricDefinitions: { - '{key} read': 'cgroup.blkio.all.throttle.io_serviced.read', - '{key} write': 'cgroup.blkio.all.throttle.io_serviced.write' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'cgroup.blkio.all.throttle.io_service_bytes', - title: 'Container Disk Throughput (Throttled) (Bytes)', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'cgroup.blkio.all.throttle.io_service_bytes', - metricDefinitions: { - '{key} read': 'cgroup.blkio.all.throttle.io_service_bytes.read', - '{key} write': 'cgroup.blkio.all.throttle.io_service_bytes.write' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'cgroup.cpusched', - title: 'Per-Container CPU Scheduler', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleMetricDataModel, - dataModelOptions: { - name: 'cgroup.cpusched', - metricDefinitions: { - '{key} shares': 'cgroup.cpusched.shares', - '{key} periods': 'cgroup.cpusched.periods' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - percentage: false, - integer: true - } - }, { - name: 'cgroup.cpuacct.headroom', - title: 'Per-Container CPU Headroom', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CgroupCPUHeadroomMetricDataModel, - dataModelOptions: { - name: 'cgroup.cpuacct.headroom' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - requireContainerFilter: true, - attrs: { - forcey: 1, - percentage: true, - integer: false, - area: true - } - }, { - name: 'cgroup.cpusched.throttled_time', - title: 'Per-Container Throttled CPU', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: ContainerMultipleCumulativeMetricDataModel, - dataModelOptions: { - name: 'cgroup.cpusched.throttled_time', - metricDefinitions: { - '{key}': 'cgroup.cpusched.throttled_time' - } - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - attrs: { - forcey: 5, - percentage: false, - integer: true - } - }, { - name: 'cgroup.memory.utilization', - title: 'Per-Container Memory Utilization', - directive: 'line-time-series', - dataAttrName: 'data', - dataModelType: CgroupMemoryUtilizationMetricDataModel, - dataModelOptions: { - name: 'cgroup.memory.utilization' - }, - size: { - width: '50%', - height: '250px' - }, - enableVerticalResize: false, - group: 'Container', - requireContainerFilter: true, - attrs: { - forcey: 1, - percentage: true, - integer: false, - area: false - } - } - - ); - - } - - return definitions; - } - - var defaultWidgets = [ - { - name: 'kernel.all.cpu', - size: { - width: '50%' - } - }, { - name: 'kernel.percpu.cpu', - size: { - width: '50%' - } - }, { - name: 'kernel.all.runnable', - size: { - width: '50%' - } - }, { - name: 'kernel.all.load', - size: { - width: '50%' - } - }, { - name: 'network.interface.bytes', - size: { - width: '50%' - } - }, { - name: 'network.tcpconn', - size: { - width: '50%' - } - }, { - name: 'network.interface.packets', - size: { - width: '50%' - } - }, { - name: 'network.tcp.retrans', - size: { - width: '50%' - } - }, { - name: 'mem', - size: { - width: '50%' - } - }, { - name: 'mem.vmstat.pgfault', - size: { - width: '50%' - } - }, { - name: 'kernel.all.pswitch', - size: { - width: '50%' - } - }, { - name: 'disk.iops', - size: { - width: '50%' - } - }, { - name: 'disk.bytes', - size: { - width: '50%' - } - }, { - name: 'disk.dev.avactive', - size: { - width: '50%' - } - }, { - name: 'disk.dev.latency', - size: { - width: '50%' - } - } - ]; - - var emptyWidgets = []; - - var containerWidgets = [ - { - name: 'cgroup.cpuacct.usage', - size: { - width: '50%' - } - }, { - name: 'container.memory.usage', - size: { - width: '50%' - } - }, { - name: 'cgroup.memory.usage', - size: { - width: '50%' - } - }, { - name: 'cgroup.memory.headroom', - size: { - width: '50%' - } - }, { - name: 'container.disk.iops', - size: { - width: '50%' - } - }, { - name: 'container.disk.bytes', - size: { - width: '50%' - } - } - ]; - - angular - .module('widget', [ - 'datamodel', - 'chart', - 'flamegraph', - 'customWidgetSettings' - ]) - .factory('widgetDefinitions', widgetDefinitions) - .value('defaultWidgets', defaultWidgets) - .value('emptyWidgets', emptyWidgets) - .value('containerWidgets', containerWidgets); - -})(); diff --git a/src/app/help/CommonIssues.jsx b/src/app/help/CommonIssues.jsx new file mode 100644 index 000000000..392b5637b --- /dev/null +++ b/src/app/help/CommonIssues.jsx @@ -0,0 +1,39 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +class CommonIssues extends React.PureComponent { + render () { + return ( +
+

Common Issues

+ +

Broken stacks: If the runtime does not expose a stack walker that the profiler can use (commonly frame-pointer based), then stack traces will be broken and ancestry will be missing. This is usually visible as a "bed of grass": thin frames all at the same level. The fix depends on the runtime and stack walking technique. Eg, to use frame-pointer walking with Java, Java must be run with -XX:+PreserveFramePointer.

+ +

Missing frames: This shows the native stack trace, after inlining. Runtimes like the JVM can inline as much as 70% of all frames, which will be missing from the flame graph. Vector has an uninlined CPU flame graph task that can reveal these missing frames.

+ +

Missing symbols: JIT runtimes need to export a symbol file for the profiler to use. This depends on the runtime. Java should be handled automatically by Vector, making use of perf-map-agent. Node.js currently needs to run with --perf_basic_prof_only_funcitons or --perf_basic_prof.

+ +

ERROR PMCs not available on this instance (see help): This is commonly the case in the cloud. See the earlier PMCs section.

+
+ ) + } +} + +export default CommonIssues diff --git a/src/app/help/CpuFlamegraphHelp.jsx b/src/app/help/CpuFlamegraphHelp.jsx new file mode 100644 index 000000000..b1d0781a1 --- /dev/null +++ b/src/app/help/CpuFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function CpuFlamegraphHelp () { + return ( +
+

Summary

+ +

CPU flame graphs visualize code that is consuming CPUs. This widget works using a profiler that does timed sampling of stack traces at 49 Hertz, on all running CPUs. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

CPU Profiling

+ +

Timed sampling of stack traces is a common industry method for understanding CPU usage with low overhead. This is different to tracing of all functions/methods, which is performed by some CPU profilers and costs high overhead and often skews results (observer effect).

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what is on-CPU, and beneath it is its ancestry. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/help/CswFlamegraphHelp.jsx b/src/app/help/CswFlamegraphHelp.jsx new file mode 100644 index 000000000..c7d0823ee --- /dev/null +++ b/src/app/help/CswFlamegraphHelp.jsx @@ -0,0 +1,55 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function CswFlamegraphHelp() { + return ( +
+

Summary

+ +

Context switch flame graphs visualize code paths that block and wait off-CPU, such as for I/O and lock contention. This widget works by tracing scheduler context switches, then aggregating stack traces in kernel context for efficency using eBPF. Despite this, scheduler events are high frequency, and even tracing them in an efficient way may still cost some noticable overhead. This visualization shows the number of context switches. This runs as a background task until the trace is completed.

+ +

Prerequisites: BPF Stacks

+ +

This instrumentation requires BPF stack trace support, which arrived in the Linux 4.6 kernel.

+ +

Overhead

+ +

This instruments scheduler events, which can be very high frequency: tens of millions of events per second. While the instrumentation has been optimized using eBPF to be efficient, adding some CPU cycles to each event will add up, and for high rates of events may begin to cost noticable overhead. Because of this, the default duration is ten seconds instead of one minute. If you are unsure of the overhead effect, use in a test environment before production use.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more frequently it was present in a code path that led to a block (regardless of the blocking duration). The top edge shows what blocked, and beneath it is its ancestry. The color is blue to indicate blocked time, and the saturation value is randomized to differentiate between frames.

+ +

Interpretation & Actionable Items

+ +

This shows code paths that lead to blocking and waiting off-CPU, such as for disk I/O or lock contention. Ideally these can be minimized. Look for the widest stacks and investigate them first. To understand the duration that these spent off-CPU, use the off-CPU time flame graph.

+ +

The actionable fix depends on the code path. Disk I/O can be improved by reconfiguring the workloads on the system to allow for a larger file system cache, or switching to an instance with faster disks. Lock contention may be reduced by tuning thread pools to smaller counts, or by the developer modifying the code.

+ + + + + +
+ ) +} diff --git a/src/app/help/DiskioFlamegraphHelp.jsx b/src/app/help/DiskioFlamegraphHelp.jsx new file mode 100644 index 000000000..9d65adecc --- /dev/null +++ b/src/app/help/DiskioFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function DiskioFlamegraphHelp () { + return ( +
+

Summary

+ +

Disk I/O flame graphs visualize code that directly requested disk I/O, helping explain the cause of disk I/O. This widget works by tracing whenever a disk I/O event is enqueued. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have low overhead while tracing, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph is generated. Relative to other events, disk I/O is usually a low rate activity, hence the low overhead. There are some exceptions: a large database server may be calling tens of thousands of disk I/O per second, which will have a higher overhead to trace, not just for the extra CPU cycles, but also for the file system and storage I/O to store the trace data. If you suspect you have a high overhead case, test and measure overhead before production use.

+ +

Disk I/O Tracing

+ +

The intent here is to show which code paths are causing disk I/O. It workes by tracing when disk I/O events are inserted on a storage queue to be later issued to the device. (This uses the Linux tracepoint: block:block_rq_insert.) This approach is simple and usually identifies the code path of interest. There are worse approaches: for example, mesauring when the disk I/O actually begins, which is often asynchronous to the request, and so does not identify the code path of interest.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what directly triggered a disk I/O request to be queued, and beneath it is its ancestry. The x-axis width is relative to the number of I/O. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/help/ExternalResources.jsx b/src/app/help/ExternalResources.jsx new file mode 100644 index 000000000..9424c3f05 --- /dev/null +++ b/src/app/help/ExternalResources.jsx @@ -0,0 +1,52 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' +import PropTypes from 'prop-types' + +class ExternalResources extends React.PureComponent { + render () { + const { targetUrl, text } = this.props + + return ( +
+

External Resources

+ + +
+ ) + } +} + +ExternalResources.propTypes = { + targetUrl: PropTypes.string, + text: PropTypes.string, +} + +export default ExternalResources diff --git a/src/app/help/IpcFlamegraphHelp.jsx b/src/app/help/IpcFlamegraphHelp.jsx new file mode 100644 index 000000000..8b4086e32 --- /dev/null +++ b/src/app/help/IpcFlamegraphHelp.jsx @@ -0,0 +1,67 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function IpcFlamegraphHelp () { + return ( +
+

Summary

+ +

IPC flame graphs visualize code that is consuming CPUs, and uses a color spectrum to indicate the instructions-per-cycle (IPC) for individual functions: red means instruction heavier, and blue means cycle heavier (usually stall cycles). This widget works by using a profiler that does overflow-based sampling of stack traces for CPU cycle and instruction events via performance monitoring counters (PMCs), on all running CPUs. Only one in 100 million events are sampled. This runs as a background task until the profile is completed. This only works if PMCs are available on the server, which for many cloud instance types will not be.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

PMCs

+ +

Performance monitoring counters (PMCs) are special programmable hardware counters that report low-level processor behavior. In many cloud environments they are currently disabled. They should currently be available for the largest instance types on AWS EC2. To test at the command line, on Linux, run "perf stat ls" and see if the cycles and instructions counters are measured (if not, they will report "<not supported>").

+ +

IPC Profiling

+ +

Instructions-per-cycle (IPC) is a PMC-based metric commonly used as a starting point for understanding for low-level CPU behavior, particularly whether code is limited by the speed of instruction execution or other resources (usually main memory). The higher the IPC, the more quickly the processor is completing instructions (aka "retiring" instructions). The are many more PMCs for providing more information when desired.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more often it was present in the profile of CPU cycles (equivalent to a CPU flame graph). The top edge shows what is on-CPU, and beneath it is its ancestry. Different color hues are used to show the range of IPC values present in the profile, from red (more instruction heavy) to blue (more cycle heavy). The color spectrum is relative to each flame graph, so the most blue frame in one flame graph may have a different IPC to the most blue frame in another. The gloabal IPC value for the flame graph is shown in the subtitle.

+ +

Interpretation & Actionable Items

+ +

If functions are colored red, they are instruction heavy (with a high IPC), if they are colored blue, they are cycle heavy (a low IPC) and likely stalled on memory I/O.

+

Examples of instruction optimizations:

+
    +
  • – by the system administrator: choosing systems with faster processors, disabling hyperthreads, reducing CPU contention.
  • +
  • – by the developer: finding and eliminating unnecessary work, using faster algorithms.
  • +
+

Examples of memory I/O optimizations:

+
    +
  • – by the system administrator: using different system NUMA settings, using different memory settings including large pages, and choosing systems with larger CPU caches or with faster main memory.
  • +
  • – by the developer: changing the code to do fewer memory copies and object allocations, and using more memory efficient data structures.
  • +
+

As for the IPC value shown in the subtitle: interpreting this depends on the processor and its superscalar retire width. For example, many modern processors can retire four instructions with every cycle, which means its top speed IPC is 4.0 (when executing NOPs). For a production workload that involves memory I/O, an IPC of 1.5 may be considered good (it depends).

+ + + + +
+ ) +} diff --git a/src/app/help/OffcpuFlamegraphHelp.jsx b/src/app/help/OffcpuFlamegraphHelp.jsx new file mode 100644 index 000000000..6f2436565 --- /dev/null +++ b/src/app/help/OffcpuFlamegraphHelp.jsx @@ -0,0 +1,53 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function OffcpuFlamegraphHelp () { + return ( +
+

Summary

+ +

Off-CPU time flame graphs visualize code paths that block and wait off-CPU, such as for I/O and lock contention, and is a complementary visualization to CPU flame graphs. This widget works by tracing scheduler context switches, then aggregating stack traces in kernel context for efficency using eBPF. Despite this, scheduler events are high frequency, and even tracing them in an efficient way may still cost some noticable overhead. This runs as a background task until the trace is completed.

+ +

Prerequisites: BPF Stacks

+ +

This instrumentation requires BPF stack trace support, which arrived in the Linux 4.6 kernel.

+ +

Overhead

+ +

This instruments scheduler events, which can be very high frequency: tens of millions of events per second. While the instrumentation has been optimized using eBPF to be efficient, adding some CPU cycles to each event will add up, and for high rates of events may begin to cost noticable overhead. Because of this, the default duration is ten seconds instead of one minute. If you are unsure of the overhead effect, use in a test environment before production use.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more often it was present in the trace of off-CPU time. The top edge shows what blocked, and beneath it is its ancestry. The color is blue to indicate blocked time, and the saturation value is randomized to differentiate between frames.

+ +

Interpretation & Actionable Items

+ +

Look for applications of interest (the process name is the bottom frame), and then brows its blocked stacks from the widest to the thinnest. There will likely be many paths that are the application waiting for work, and so the stack trace is not interesting. Those are often the widest. Look for paths that occur during an application request, such as for lock contention and disk I/O.

+ +

The actionable fix depends on the code path. Disk I/O time can be improved by reconfiguring the workloads on the system to allow for a larger file system cache, or switching to an instance with faster disks. Lock contention may be reduced by tuning thread pools to smaller counts, or by the developer modifying the code.

+ + + +
+ ) +} diff --git a/src/app/help/OffwakeFlamegraphHelp.jsx b/src/app/help/OffwakeFlamegraphHelp.jsx new file mode 100644 index 000000000..ad7a6a08f --- /dev/null +++ b/src/app/help/OffwakeFlamegraphHelp.jsx @@ -0,0 +1,57 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function PackagenameCpuFlamegraphHelp() { + return ( +
+

Summary

+ +

Off-Wake time flame graphs visualize code paths that block and wait off-CPU, such as for I/O and lock contention, and include both the blocked stack and the waker stack. This is an advanced visualization that works by tracing blocking and wakeup scheduler events, then associating and aggregating stack traces in kernel context for efficency using eBPF. Despite this, scheduler events are high frequency, and even tracing them in an efficient way may still cost some noticable overhead. This runs as a background task until the trace is completed.

+ +

Prerequisites: BPF Stacks

+ +

This instrumentation requires BPF stack trace support, which arrived in the Linux 4.6 kernel.

+ +

Overhead

+ +

This instruments scheduler switch and wakeup events, which can be very high frequency: tens of millions of events per second, and saves wakeup stacks in kernel memory to associate with blocked stacks. While the instrumentation has been optimized using eBPF to be efficient, adding some CPU cycles and memory usage to each event will add up, and for high rates of events this may cost significant overhead. Because of this, the default duration is five seconds instead of one minute. If you are unsure of the overhead effect, use in a test environment before production use.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is, the more often it was present in the trace of off-CPU time. The saturation value is randomized to differentiate between frames.

+ +

In shades of blue, and up until a "--" delimiter frame, is the blocking (off-CPU) stack trace. The top frame of this shows what blocked, and beneath it is its ancestry. The very bottom frame is the process name. The width is how long it was blocked off-CPU.

+ +

In shades of aqua, above a "--" delimiter frame, is the wakeup stack trace. This is in reverse order, so the bottom frame is the top of the stack which did the wakeup, and everything above it is ancestry. This reversing allows the wakeup frame to meet the blocked frame that it woke up in the middle. The very top frame is the process name that did the wakeup.

+ +

Interpretation & Actionable Items

+ +

Look for applications of interest (the process name is the bottom frame), and then brows its blocked stacks from the widest to the thinnest. There will likely be many paths that are the application waiting for work, and so the stack trace is not interesting. Those are often the widest. Look for paths that occur during an application request, such as for lock contention and disk I/O. You can browse the wakeup stacks for more context on why something was blocked.

+ +

The actionable fix depends on the code path. Disk I/O time can be improved by reconfiguring the workloads on the system to allow for a larger file system cache, or switching to an instance with faster disks. Lock contention may be reduced by tuning thread pools to smaller counts, or by the developer modifying the code.

+ + + +
+ ) +} diff --git a/src/app/help/PackagenameCpuFlamegraphHelp.jsx b/src/app/help/PackagenameCpuFlamegraphHelp.jsx new file mode 100644 index 000000000..fcb432cc0 --- /dev/null +++ b/src/app/help/PackagenameCpuFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function PackagenameCpuFlamegraphHelp() { + return ( +
+

Summary

+ +

Package name flame graphs visualize code that is directly consuming CPUs, and visualizes this as a hierarchy based on the package name (currently only supports Java package names). This widget works using a profiler that does timed sampling of the instruction pointer at 49 Hertz, on all running CPUs. This does not need the application to support stack traces, as it only measures the running function (ie, for Java, this does not need -XX:+PreserveFramePointer, so this can be useful for analyzing applications that are running without it). It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

CPU IP Profiling

+ +

Timed sampling of the instruction pointer (aka program counter) is a common industry method for understanding CPU usage with very low overhead. This is different to tracing of all functions/methods, which is performed by some CPU profilers and costs high overhead and often skews results (observer effect). This is also different to profiling stack traces, as is typical with flame graphs. In this case, the stack trace is not collected, so code ancestry is not known or shown. The advantage is a different view of CPU consumption, that can be used in addition to normal flame graphs.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis in this case traverses components of the function or method package name. Each rectangle represents a component of the function or method name. The wider a frame is is, the more often it was present in the profile. The top edge shows the functions that are on-CPu, and beneath them are the larger package groups that they belong to. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/help/PagefaultFlamegraphHelp.jsx b/src/app/help/PagefaultFlamegraphHelp.jsx new file mode 100644 index 000000000..61628e8ad --- /dev/null +++ b/src/app/help/PagefaultFlamegraphHelp.jsx @@ -0,0 +1,51 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function PagefaultFlamegraphHelp () { + return ( +
+

Summary

+ +

Page fault flame graphs visualize code that is triggering page faults, which can explain application memory growth (the growth of resident set size: RSS). This widget works by tracing page faults on all running CPUs. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have low overhead while tracing, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated. Page faults are usually a low rate activity, hence the low overhead. There are some exceptions: software builds that use hundreds of short-lived processes per second can have a much higher rate of page faults, as well as applications that are growing RSS quickly. In such cases, this task may have a higher overhead, not just for the extra CPU cycles, but also for the file system and storage I/O to store the trace data. If you suspect you have a high overhead case, test and measure overhead before production use.

+ +

Page Fault Tracing

+ +

This is one way to analyze memory growth, in this case, the growth of resident set size (RSS).

+

Linux (like most operating systems) uses on-demand memory page allocation. When an application allocates memory (eg, malloc()), the operating system tracks the allocation but does not map physical memory to the process until it begins writing to it. At that point, the lie is revealed, and the processor's memory manangement unit (MMU) will "fault", as there is no virtual-to-physical mapping for the requested address. The kernel handles the fault, and makes the mapping. This is a normal way that processes end up using main memory, and defers the cost of allocation to later on, and only for the pages (unit of memory) that are written to.

+

Some applications pre-allocate memory (by which they mean touch it all – they write to it on startup so that it has mapped to physical memory). In those cases, RSS should be static, and this flame graph won't show many trace application events.

+

To be clear about this: page fault tracing can explain memory growth where the application may end up being out-of-memory (OOM) killed. It usually can't explain memory leaks where the application ends up calling garbage collection more frequently, since in those cases the application may or may not be growing RSS. This can only see RSS growth.

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what directly triggered page faults, and beneath it is its ancestry. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + +
+ ) +} diff --git a/src/app/help/UninlinedCpuFlamegraphHelp.jsx b/src/app/help/UninlinedCpuFlamegraphHelp.jsx new file mode 100644 index 000000000..84b596d3b --- /dev/null +++ b/src/app/help/UninlinedCpuFlamegraphHelp.jsx @@ -0,0 +1,49 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import React from 'react' + +import CommonIssues from './CommonIssues.jsx' +import ExternalResources from './ExternalResources.jsx' + +export default function UninlinedCpuFlamegraphHelp () { + return ( +
+

Summary

+ +

Uninlined CPU flame graphs visualize code that is consuming CPUs, and attempts to uninline application frames so that full stacks are shown (currently only supports Java). This widget works using a profiler that does timed sampling of stack traces at 49 Hertz, on all running CPUs. It runs as a background task until the profile is completed.

+ +

Overhead

+ +

This should have negligible overhead while profiling, and then a short period (seconds) of a single CPU runtime at the end as symbols are collected and the flame graph generated.

+ +

CPU Profiling

+ +

Timed sampling of stack traces is a common industry method for understanding CPU usage with low overhead. This is different to tracing of all functions/methods, which is performed by some CPU profilers and costs high overhead and often skews results (observer effect).

+ +

Flame Graph Visualization

+ +

The x-axis shows the stack profile population, sorted alphabetically (it is not the passage of time), and the y-axis shows stack depth. Each rectangle represents a stack frame. The wider a frame is is, the more often it was present in the profile. The top edge shows what is on-CPU, and beneath it is its ancestry. Different color hues are used for different code types, and the saturation is randomized to differentiate between frames.

+ + + + + +
+ ) +} diff --git a/src/app/index.config.js b/src/app/index.config.js deleted file mode 100644 index da80dc08b..000000000 --- a/src/app/index.config.js +++ /dev/null @@ -1,53 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - function toastrConfig(toastrConfig) { - toastrConfig.allowHtml = true; - toastrConfig.timeOut = 8000; - toastrConfig.positionClass = 'toast-top-right'; - toastrConfig.preventDuplicates = true; - toastrConfig.progressBar = true; - } - - function logProviderConfig($logProvider) { - $logProvider.debugEnabled(true); - } - - angular - .module('vector') - .constant('config', { - 'protocol': 'http', // PMWEBD protocol (http or https) - 'port': 44323, // PMWEBD port - 'hostspec': 'localhost', // Default PMCD hostspec - 'interval': '2', // Default update interval in seconds - 'window': '2', // Default graph time window in minutes - 'enableCpuFlameGraph': false, // Enable CPU flame graph (requires extra PMDA) - 'enableContainerWidgets': true, // Enable container widgets - 'disableHostspecInput': false, // Disable hostspec input - 'disableContainerFilter': false, // Disable container id filter input - 'disableContainerSelect': false, // Disable container name drop down select - 'containerSelectOverride': true, // Overrides requireContainerFilter widget option - 'useCgroupId': false, // Use container cgroup id instead of container name - 'expandHostname': false, // Automatically expand hostname input when application opens - 'disableHostnameInputContainerSelect': false // Disable hostname and hostspec input when container is selected - }) - .config(toastrConfig) - .config(logProviderConfig); -})(); diff --git a/src/app/index.css b/src/app/index.css deleted file mode 100644 index 037523efd..000000000 --- a/src/app/index.css +++ /dev/null @@ -1,256 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -body { - margin: 15px; -} - -.main-container { - padding-top: 46px; - will-change: transform; -} - -.spacer { - margin-top: 12px; -} - -.navbar-inverse .navbar-brand { - text-transform: uppercase; - font-size: 23px; - letter-spacing: 1px; - font-weight: 300; -} - -.navbar-inverse { - background: #5b5b5b; -} - -.navbar .container-fluid .navbar-brand { - margin-left: -10px; -} - -.navbar-logo { - max-width: 42px; - margin-top: -7px; -} - -.hostname-input { - text-overflow: ellipsis; - padding-right: 33px; -} - -.hostname-input { - margin-top: 18px; -} - -.hostname-label { - margin-top: 18px; -} - -form div input[name="widgetFilter"] { - margin-left: -1px; - margin-top: 0px; -} - -.target > input { - margin-top: 0 !important; - margin-left: -1px !important; -} - -.target > span { - min-width: 150px; -} - -.input-group-lg select { - margin: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.input-group-lg { - margin-top: 8px; -} - -.alert, .btn { - background-image: none !important; - box-shadow: none; -} - -.input-group-btn { - top: 2px; -} - -.input-group-btn:hover { - z-index: 3; -} - -.input-group-lg > .input-group-addon { - height: 40px; -} - -.widget-button{ - margin-top: 8px !important; -} - -@-moz-document url-prefix() { - #hostnameInput { - margin-top: 5px; - } -} - -.panel.widget { - border: 1px solid #c4c4c4; -} - -.widget-container { - will-change: transform; - padding-bottom: 0px !important; -} - -.widget-header.panel-heading.ui-sortable-handle { - cursor: all-scroll; - background-color: #f1f1f1; - background-image: none !important; -} - -.dashboard-alert { - margin-top: 15px; -} - -.form-control-feedback { - margin-top: 10px; - margin-right: 10px; - margin-bottom: 10px; - margin-left: 10px; -} - -.widget-icon { - display: inline-block; - width: 100%; - text-align: center; - margin-top: 78px; - color: #ccc; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropdown-submenu > a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu .pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.version-div { - padding-left: 15px; -} - -.panel { - margin-bottom: 20px !important; -} - -@media screen and (max-width: 1280px) { - .widget-wrapper { - width: 50%; - } - .widget-wrapper + .col-md-2 { - clear: left; - } - .widget-wrapper ~ .col-md-2 { - width: 50%; - } - .widget-container { - width: 50% !important; - } - .window > span { - min-width: 150px; - } - .interval > span { - min-width: 150px; - } -} - -@media screen and (max-width: 991px) { - .widget-wrapper + .col-md-2 { - clear: none; - } - .widget-wrapper ~ .col-md-2 { - width: auto; - } - .widget-container { - width: 50% !important; - } - .widget-wrapper { - width: 100% !important; - } - .widget-wrapper ul { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - } - .widget-container { - width: 100% !important; - } - .window > span { - min-width: 150px; - } - - .interval > span { - min-width: 150px; - } -} diff --git a/src/app/index.decorators.js b/src/app/index.decorators.js deleted file mode 100644 index 9e8994d0f..000000000 --- a/src/app/index.decorators.js +++ /dev/null @@ -1,56 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -(function () { - 'use strict'; - - /* Decorators */ - - function decorators($provide) { - /* Register a decorator for the `$interval` service */ - $provide.decorator('$interval', function ($delegate) { - - /* Keep a reference to the original `cancel()` method */ - var originalCancel = $delegate.cancel; - - /* Define a new `cancel()` method */ - $delegate.cancel = function (intervalPromise) { - - /* First, call the original `cancel()` method */ - var retValue = originalCancel(intervalPromise); - - /* If the promise has been successfully cancelled, - * add a `cancelled` property (with value `true`) */ - if (retValue && intervalPromise) { - intervalPromise.isCancelled = true; - } - - /* Return the value returned by the original method */ - return retValue; - }; - - /* Return the original (but "augmented") service */ - return $delegate; - }); - } - - angular - .module('vector') - .config(decorators); - -})(); diff --git a/src/app/index.extensions.js b/src/app/index.extensions.js deleted file mode 100644 index e125d1623..000000000 --- a/src/app/index.extensions.js +++ /dev/null @@ -1,39 +0,0 @@ -/**! - * - * Copyright 2016 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - // Container Name Resolver - // Return resolved name as a strng to be used in chart and container selection - // Return null to exclude the container from charts and container selection. - - // var containerNameResolver = function() { - // var resolve = function (containerId) { - // return containerId.substring(0,12); - // }; - // - // return { - // resolve: resolve - // }; - // }; - - angular - .module('vector') - // .factory('containerNameResolver', containerNameResolver) - ; -})(); diff --git a/src/app/index.filters.js b/src/app/index.filters.js deleted file mode 100644 index 6894b55c0..000000000 --- a/src/app/index.filters.js +++ /dev/null @@ -1,75 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true*/ -/*global angular*/ -/*jslint plusplus: true */ - -(function () { - 'use strict'; - - /* Filters */ - - /** - * @name uniqueItems - * @desc - */ - function uniqueItems(data, key) { - var result = [], - i, - value; - for (i = 0; i < data.length; i++) { - value = data[i][key]; - if (result.indexOf(value) === -1) { - result.push(value); - } - } - return result; - } - - /** - * @name groupBy - * @desc - */ - function groupBy() { - return function (collection, key) { - if (collection === null) { - return; - } - return uniqueItems(collection, key); - }; - } - - /** - * @name groupFilter - * @desc - */ - function groupFilter() { - return function (collection, group) { - return collection.filter(function (item) { - return item.group === group; - }); - }; - } - - angular - .module('vector') - .filter('groupBy', groupBy) - .filter('groupFilter', groupFilter); - -})(); diff --git a/src/app/index.html b/src/app/index.html new file mode 100644 index 000000000..043b1b207 --- /dev/null +++ b/src/app/index.html @@ -0,0 +1,15 @@ + + + + + Vector + + + + + + + +
+ + diff --git a/src/app/index.route.js b/src/app/index.route.js deleted file mode 100644 index fce02931f..000000000 --- a/src/app/index.route.js +++ /dev/null @@ -1,90 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -(function () { - 'use strict'; - - /** - * @name config - * @desc Define valid application routes - */ - function routeConfig($routeProvider) { - $routeProvider.when('/', { - templateUrl: 'app/main/main.html', - controller: 'MainController', - controllerAs: 'vm', - title: 'Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (defaultWidgets) { - return defaultWidgets; - }, - 'embed': function () { - return false; - } - } - }).when('/embed', { - templateUrl: 'app/main/main.html', - controller: 'MainController', - controllerAs: 'vm', - title: 'Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (defaultWidgets) { - return defaultWidgets; - }, - 'embed': function () { - return true; - } - } - }).when('/empty', { - templateUrl: 'app/main/main.html', - controller: 'MainController', - controllerAs: 'vm', - title: 'Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (emptyWidgets) { - return emptyWidgets; - }, - 'embed': function () { - return false; - } - } - }).when('/container', { - templateUrl: 'app/main/main.html', - controller: 'MainController', - controllerAs: 'vm', - title: 'Vector', - reloadOnSearch: false, - resolve: { - 'widgets': function (containerWidgets) { - return containerWidgets; - }, - 'embed': function () { - return false; - } - } - }) - .otherwise('/'); - } - - angular - .module('vector') - .config(routeConfig); - -})(); diff --git a/src/app/main/main.controller.js b/src/app/main/main.controller.js deleted file mode 100644 index 1f99df9ee..000000000 --- a/src/app/main/main.controller.js +++ /dev/null @@ -1,221 +0,0 @@ -/**! - * - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*jslint node: true*/ -/*global angular*/ -/*jslint browser: true*/ -/*jslint nomen: true */ - -(function () { - 'use strict'; - - /** - * @name MainCtrl - * @desc Main Controller - */ - function MainCtrl($document, $rootScope, $log, $route, $routeParams, $location, widgetDefinitions, widgets, embed, version, DashboardService, ContainerMetadataService, ModalService) { - - var vm = this, - widgetsToLoad = widgets; - - /** - * @name visibilityChanged - * @desc Pauses/resumes interval updates if window/tab is out of focus. - */ - function visibilityChanged() { - if ($document[0].hidden || $document[0].webkitHidden || - $document[0].mozHidden || $document[0].msHidden) { - DashboardService.cancelInterval(); - } else { - DashboardService.updateInterval(); - } - } - - /** - * @name activate - * @desc Initiliazes MainCtrl - */ - function activate() { - DashboardService.initialize(); - - if ($routeParams.protocol) { - $rootScope.properties.protocol = $routeParams.protocol; - } - - if ($routeParams.host) { - vm.inputHost = $routeParams.host; - if ($routeParams.hostspec) { - $rootScope.properties.hostspec = $routeParams.hostspec; - } - DashboardService.updateHost(vm.inputHost); - } - - // hack to deal with window/tab out of focus - $document[0] - .addEventListener('visibilitychange', visibilityChanged, false); - $document[0] - .addEventListener('webkitvisibilitychange', visibilityChanged, false); - $document[0] - .addEventListener('msvisibilitychange', visibilityChanged, false); - $document[0] - .addEventListener('mozvisibilitychange', visibilityChanged, false); - - if (angular.isDefined($routeParams.widgets)){ - var widgetNameArr = $routeParams.widgets.split(',') || []; - widgetsToLoad = widgetNameArr.reduce(function(all, name){ - return all.concat(widgetDefinitions.filter(function(def){ - return def.name === name; - })); - },[]); - } else { - var urlArr = widgets.reduce(function(all,item){ - all.push(item.name); - return all; - },[]).join(); - $location.search('widgets', urlArr); - } - - if (angular.isDefined($routeParams.containerFilter)){ - $rootScope.properties.containerFilter = $routeParams.containerFilter; - } - - vm.dashboardOptions = { - hideToolbar: true, - widgetButtons: false, - hideWidgetName: true, - hideWidgetSettings: false, - widgetDefinitions: widgetDefinitions, - defaultWidgets: widgetsToLoad - }; - } - - vm.version = version.id; - - vm.embed = embed; - - // Export controller public functions - vm.addWidgetToURL = function(widgetObj){ - var newUrl =''; - if (angular.isUndefined($routeParams.widgets)) { - $routeParams.widgets = ''; - } else { - newUrl = ','; - } - - if (widgetObj.length){ - $routeParams.widgets = ''; - newUrl = widgetObj.reduce(function(all,item){ - all.push(item.name); - return all; - },[]).join(); - } else { - newUrl = newUrl + widgetObj.name; - } - $location.search('widgets', $routeParams.widgets + newUrl); - }; - - vm.removeWidgetFromURL = function(widgetObj){ - var widgetNameArr = $routeParams.widgets.split(',') || []; - for (var d=0; d< widgetNameArr.length; d++){ - if (widgetNameArr[d] === widgetObj.name){ - widgetNameArr.splice(d,1); - break; - } - } - if (widgetNameArr.length < 1){ - vm.removeAllWidgetFromURL(); - } else { - $location.search('widgets', widgetNameArr.toString()); - } - }; - - vm.removeAllWidgetFromURL = function(){ - $location.search('widgets', null); - }; - - vm.resetDashboard = function(){ - - var modalOptions = { - closeButtonText: 'Cancel', - actionButtonText: 'Ok', - headerText: 'Reset Dashboard', - bodyText: 'Are you sure you want to reset the dashboard?' - }; - - ModalService.showModal({}, modalOptions).then(function() { - $location.search('container', null); - $location.search('containerFilter', null); - $rootScope.flags.disableContainerSelectNone = false; - $rootScope.properties.selectedContainer = ''; - $rootScope.properties.containerFilter = ''; - vm.dashboardOptions.loadWidgets([]); - vm.removeAllWidgetFromURL(); - }); - }; - - vm.updateHost = function() { - DashboardService.updateHost(vm.inputHost); - ContainerMetadataService.clearIdDictionary(); - }; - - vm.addWidget = function(event, directive){ - event.preventDefault(); - if ( vm.checkWidgetType(directive) ) { - vm.dashboardOptions.addWidget(directive); - vm.addWidgetToURL(directive); - } - }; - - vm.checkWidgetType = function(widgetObj) { - if (angular.isDefined(widgetObj.requireContainerFilter) && widgetObj.requireContainerFilter === true && $rootScope.flags.disableContainerSelect === false && !$rootScope.flags.containerSelectOverride) { - if ($rootScope.properties.selectedContainer === ''){ - - var modalOptions = { - closeButtonText: '', - actionButtonText: 'Ok', - headerText: 'Error: Container selection required.', - bodyText: 'This widget requires a container to be selected. Please select a container and try again.' - }; - - ModalService.showModal({}, modalOptions).then(function() { - $document.getElementById('selectedContainer').focus(); - }); - - return false; - } - } - return true; - }; - - vm.updateInterval = DashboardService.updateInterval; - vm.updateContainer = ContainerMetadataService.updateContainer; - vm.updateContainerFilter = ContainerMetadataService.updateContainerFilter; - vm.inputHost = ''; - - activate(); - } - - angular - .module('main', [ - 'dashboard', - 'widget', - 'containermetadata', - 'modal' - ]) - .controller('MainController', MainCtrl); -})(); diff --git a/src/app/main/main.html b/src/app/main/main.html deleted file mode 100644 index 82c919fa2..000000000 --- a/src/app/main/main.html +++ /dev/null @@ -1,23 +0,0 @@ - - -
-
-
-
-
-
-
diff --git a/src/app/processors/customChartModel.js b/src/app/processors/customChartModel.js new file mode 100644 index 000000000..9b46f789b --- /dev/null +++ b/src/app/processors/customChartModel.js @@ -0,0 +1,69 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + transformRawDataToPipelineData, +} from './modelUtils' + +import { + defaultTitleAndKeylabel, + cumulativeTransform, + mathAllValues, +} from './transforms' + +/** + * Extracts all required data for a chart from the input datasets. Constructs the + * transform pipeline from the chart configuration at runtime. + */ +function calculateChart(datasets, chartInfo, context) { + const data = transformRawDataToPipelineData(datasets, chartInfo) + if (data === null || data.length === 0) return null + + const transforms = constructTransformPipeline(chartInfo) + + let transformed = data + transforms.forEach(fn => { + transformed = fn(transformed, context) + }) + return transformed +} + +/** + * Creates the transform pipeline for the custom metric + */ +function constructTransformPipeline(chartInfo) { + let transforms = [] + transforms.push(defaultTitleAndKeylabel()) + if (chartInfo.cumulative) { + transforms.push(cumulativeTransform()) + } + if (chartInfo.converted && chartInfo.conversionFunction) { + const conversionFunction = new Function('value', 'return ' + chartInfo.conversionFunction + ';') + transforms.push(mathAllValues(conversionFunction)) + } + return transforms +} + +function requiredMetricNames(chartInfo) { + return chartInfo.metricNames || null +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/customTableModel.js b/src/app/processors/customTableModel.js new file mode 100644 index 000000000..cd2ca3b02 --- /dev/null +++ b/src/app/processors/customTableModel.js @@ -0,0 +1,72 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + transformRawDataToPipelineData, +} from './modelUtils' + +import { + defaultTitleAndKeylabel, + cumulativeTransform, + mathAllValues, + onlyLatestValues, +} from './transforms' + +/** + * Extracts all required data for a chart from the input datasets. Constructs the + * transform pipeline from the chart configuration at runtime. + */ +function calculateChart(datasets, chartInfo, context) { + const data = transformRawDataToPipelineData(datasets, chartInfo) + if (data === null || data.length === 0) return null + + const transforms = constructTransformPipeline(chartInfo) + + let transformed = data + transforms.forEach(fn => { + transformed = fn(transformed, context) + }) + return transformed +} + +/** + * Creates the transform pipeline for the custom metric + */ +function constructTransformPipeline(chartInfo) { + let transforms = [] + transforms.push(defaultTitleAndKeylabel()) + if (chartInfo.cumulative) { + transforms.push(cumulativeTransform()) + } + if (chartInfo.converted && chartInfo.conversionFunction) { + const conversionFunction = new Function('value', 'return ' + chartInfo.conversionFunction + ';') + transforms.push(mathAllValues(conversionFunction)) + } + transforms.push(mathAllValues(chartInfo.yTickFormat)) + transforms.push(onlyLatestValues()) + return transforms +} + +function requiredMetricNames(chartInfo) { + return chartInfo.metricNames || null +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/components/datamodel/datamodel.module.js b/src/app/processors/formats.js similarity index 75% rename from src/app/components/datamodel/datamodel.module.js rename to src/app/processors/formats.js index 07ab481af..31003c088 100644 --- a/src/app/components/datamodel/datamodel.module.js +++ b/src/app/processors/formats.js @@ -1,6 +1,6 @@ /**! * - * Copyright 2016 Netflix, Inc. + * Copyright 2018 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,14 +15,9 @@ * limitations under the License. * */ -(function() { - 'use strict'; - angular - .module('datamodel', [ - 'containermetadata', - 'dashboard', - 'metriclist' - ]); +import * as d3 from "d3-format"; // does work -})(); +export const percentage = d3.format('.0%') +export const integer = d3.format('.0f') +export const number = d3.format('.02f') diff --git a/src/app/processors/formats.spec.js b/src/app/processors/formats.spec.js new file mode 100644 index 000000000..2f80b8bd2 --- /dev/null +++ b/src/app/processors/formats.spec.js @@ -0,0 +1,82 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as formats from './formats' +import { expect } from 'chai' + +describe('percentage', () => { + describe('with integer', () => { + let data = 3 + it('returns correct percentage', () => { + let result = formats.percentage(data) + expect(result).to.equal('300%') + }) + }) + + describe('with real number', () => { + let data = 3.12345 + it('returns two decimal place number', () => { + let result = formats.percentage(data) + expect(result).to.equal('312%') + }) + }) + + describe('with real number (0 first place)', () => { + let data = 0.12345 + it('returns two decimal place number', () => { + let result = formats.percentage(data) + expect(result).to.equal('12%') + }) + }) +}) + +describe('number', () => { + describe('with integer', () => { + let data = 3 + it('returns two decimal place number', () => { + let result = formats.number(data) + expect(result).to.equal('3.00') + }) + }) + + describe('with real number', () => { + let data = 3.12345 + it('returns two decimal place number', () => { + let result = formats.number(data) + expect(result).to.equal('3.12') + }) + }) +}) + +describe('integer', () => { + describe('with integer', () => { + let data = 3 + it('returns integer', () => { + let result = formats.integer(data) + expect(result).to.equal('3') + }) + }) + + describe('with real number', () => { + let data = 3.12345 + it('returns integer', () => { + let result = formats.integer(data) + expect(result).to.equal('3') + }) + }) +}) diff --git a/src/app/processors/modelUtils.js b/src/app/processors/modelUtils.js new file mode 100644 index 000000000..515bdf62c --- /dev/null +++ b/src/app/processors/modelUtils.js @@ -0,0 +1,61 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +export function transformRawDataToPipelineData (datasets, chartInfo) { + // quick clean loops + const passMetrics = chartInfo.metricNames + + let output = [] + for(const { timestamp, values } of datasets) { + const ts = new Date(timestamp.s * 1000 + timestamp.us / 1000) + + // TODO this is a hot loop, some different data access especially output.find() will probably improve things greatly + for (const { name, instances } of values) { + if (!passMetrics.includes(name)) continue + + for (const { instance, value } of instances) { + if (value === null) continue + + // ensure there is a metric inside the instance + let mi = output.find(e => e.metric === name && e.instance === instance) + if (!mi) { + mi = { metric: name, instance, data: [] } + output.push(mi) + } + + // and put the data in there + mi.data.push({ ts, value }) + } + } + } + + return output +} + +export function getLargestValueInDataset (dataset) { + let max = -Number.MAX_VALUE + if (!dataset) return undefined + + for (let d of dataset) { + for (let tsv of d.data) { + max = Math.max(max, tsv.value) + } + } + return (max === -Number.MAX_VALUE) ? undefined : max +} + diff --git a/src/app/processors/modelUtils.spec.js b/src/app/processors/modelUtils.spec.js new file mode 100644 index 000000000..a58e9f807 --- /dev/null +++ b/src/app/processors/modelUtils.spec.js @@ -0,0 +1,284 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as utils from './modelUtils' +import { expect } from 'chai' + +describe('transformRawDataToPipelineData', () => { + describe('with a full dataset', () => { + let rawdatasets + beforeEach(() => { + rawdatasets = require('../../../test/rawdata.json') + }) + + describe('for kernel.all.load', () => { + it('returns the correct data', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['kernel.all.load'] }) + expect(pipelineData.length).to.equal(3) + expect(pipelineData).to.have.deep.members([ + { "metric": "kernel.all.load", "instance": 1, + "data": [ + { "ts": new Date("2018-08-22T22:23:35.285Z"), "value": 0.1 }, + { "ts": new Date("2018-08-22T22:23:37.275Z"), "value": 0.1 }, + { "ts": new Date("2018-08-22T22:23:39.278Z"), "value": 0.090000004 }, + { "ts": new Date("2018-08-22T22:23:41.284Z"), "value": 0.090000004 }, + { "ts": new Date("2018-08-22T22:23:43.275Z"), "value": 0.090000004 } + ] }, + { "metric": "kernel.all.load", "instance": 5, + "data": [ + { "ts": new Date("2018-08-22T22:23:35.285Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:37.275Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:39.278Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:41.284Z"), "value": 0.039999999 }, + { "ts": new Date("2018-08-22T22:23:43.275Z"), "value": 0.039999999 } + ] }, + { "metric": "kernel.all.load", "instance": 15, + "data": [ + { "ts": new Date("2018-08-22T22:23:35.285Z"), "value": 0.0099999998 }, + { "ts": new Date("2018-08-22T22:23:37.275Z"), "value": 0.0099999998 }, + { "ts": new Date("2018-08-22T22:23:39.278Z"), "value": 0 }, + { "ts": new Date("2018-08-22T22:23:41.284Z"), "value": 0 }, + { "ts": new Date("2018-08-22T22:23:43.275Z"), "value": 0 } + ] + } + ]) + }) + }) + + describe('for bcc.runq.latency', () => { + it('returns the correct data', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['bcc.runq.latency'] }) + expect(pipelineData.length).to.equal(18) + expect(pipelineData).to.have.deep.members([ + { "metric": "bcc.runq.latency", "instance": 0, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 5583 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 5583 } + ] }, + { "metric": "bcc.runq.latency", "instance": 1, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 130837 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 130838 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 130840 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 130840 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 130842 } + ] }, + { "metric": "bcc.runq.latency", "instance": 2, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 256041 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 256049 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 256061 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 256063 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 256079 } + ] }, + { "metric": "bcc.runq.latency", "instance": 3, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 107807 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 107833 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 107855 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 107858 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 107885 } + ] }, + { "metric": "bcc.runq.latency", "instance": 4, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 110856 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 110898 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 110937 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 110974 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 110997 } + ] }, + { "metric": "bcc.runq.latency", "instance": 5, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 60577 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 60583 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 60595 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 60615 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 60642 } + ] }, + { "metric": "bcc.runq.latency", "instance": 6, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 294239 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 294242 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 294249 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 294255 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 294266 } + ] }, + { "metric": "bcc.runq.latency", "instance": 7, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 29600 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 29602 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 29606 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 29611 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 29616 } + ] }, + { "metric": "bcc.runq.latency", "instance": 8, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 6820 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 6822 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 6827 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 6827 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 6829 } + ] }, + { "metric": "bcc.runq.latency", "instance": 9, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 3919 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 3922 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 3923 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 3923 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 3925 } + ] }, + { "metric": "bcc.runq.latency", "instance": 10, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 2453 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 2454 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 2454 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 2457 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 2459 } + ] }, + { "metric": "bcc.runq.latency", "instance": 11, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 3321 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 3322 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 3323 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 3324 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 3328 } + ] }, + { "metric": "bcc.runq.latency", "instance": 12, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 2064 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 2064 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 2064 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 2065 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 2066 } + ] }, + { "metric": "bcc.runq.latency", "instance": 13, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 588 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 588 } + ] }, + { "metric": "bcc.runq.latency", "instance": 14, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 209 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 209 } + ] }, + { "metric": "bcc.runq.latency", "instance": 15, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 57 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 57 } + ] }, + { "metric": "bcc.runq.latency", "instance": 16, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 19 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 19 } + ] }, + { "metric": "bcc.runq.latency", "instance": 17, + "data": [ + { "ts": new Date("2018-08-22T22:23:51.279Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:53.277Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:55.294Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:57.278Z"), "value": 2 }, + { "ts": new Date("2018-08-22T22:23:59.277Z"), "value": 2 } + ] } + ]) + }) + }) + + describe('for kernel.all.cpu.sys and hinv.ncpu', () => { + it('returns the correct data', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['kernel.all.cpu.sys', 'hinv.ncpu'] }) + expect(pipelineData.length).to.equal(2) + expect(pipelineData).to.have.deep.members([ + { "metric": "kernel.all.cpu.sys", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 365600 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 365620 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 365630 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 365640 } + ] }, + { "metric": "hinv.ncpu", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 1 } + ] } + ]) + }) + }) + + describe('for invalid metric', () => { + it.skip('returns null', () => { + let pipelineData = utils.transformRawDataToPipelineData(rawdatasets, { metricNames: ['zzzz'] }) + expect(pipelineData).to.equal(null) + }) + }) + }) +}) + +describe('getLargestValueInDataset', () => { + describe('with undefined input', () => { + let data = undefined + it('returns undefined', () => { + expect(utils.getLargestValueInDataset(data)).to.equal(undefined) + }) + }) + + describe('with no values', () => { + let data = [] + it('returns undefined', () => { + expect(utils.getLargestValueInDataset(data)).to.equal(undefined) + }) + }) + + describe('with many values', () => { + let rawdatasets = [ + { "metric": "kernel.all.cpu.sys", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 365600 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 365620 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 365630 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 365640 } + ] }, + { "metric": "hinv.ncpu", "instance": -1, + "data": [ + { "ts": new Date("2018-08-22T22:24:03.287Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:05.275Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:07.276Z"), "value": 1 }, + { "ts": new Date("2018-08-22T22:24:09.276Z"), "value": 1 } + ] } + ] + it('returns the biggest', () => { + expect(utils.getLargestValueInDataset(rawdatasets)).to.equal(365640) + }) + }) +}) diff --git a/src/app/index.constants.js b/src/app/processors/nullModel.js similarity index 71% rename from src/app/index.constants.js rename to src/app/processors/nullModel.js index db4d079d1..1b4a16056 100644 --- a/src/app/index.constants.js +++ b/src/app/processors/nullModel.js @@ -1,6 +1,6 @@ /**! * - * Copyright 2016 Netflix, Inc. + * Copyright 2018 Netflix, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,18 @@ * */ -/* global moment:false */ - -(function() { - 'use strict'; +/** + * Provides a dummy model that produces no data + */ +function calculateChart() { + return [ 'empty' ] +} - angular - .module('vector') - .constant('moment', moment); +function requiredMetricNames() { + return [] +} -})(); +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/simpleModel.js b/src/app/processors/simpleModel.js new file mode 100644 index 000000000..3e614b385 --- /dev/null +++ b/src/app/processors/simpleModel.js @@ -0,0 +1,47 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + transformRawDataToPipelineData, +} from './modelUtils' + +/** + * Extracts all required data for a chart from the input datasets, and applies required transforms + */ +function calculateChart(datasets, chartInfo, context) { + const data = transformRawDataToPipelineData(datasets, chartInfo) + if (data === null || data.length === 0) return null + + const transforms = chartInfo.transforms || [] + + let transformed = data + transforms.forEach(fn => { + transformed = fn(transformed, context) + }) + + return transformed +} + +function requiredMetricNames(chartInfo) { + return chartInfo.metricNames || [] +} + +export default { + calculateChart, + requiredMetricNames +} diff --git a/src/app/processors/transforms.js b/src/app/processors/transforms.js new file mode 100644 index 000000000..cd967d45a --- /dev/null +++ b/src/app/processors/transforms.js @@ -0,0 +1,350 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + untransposeTimeslices, + applyFunctionsToTimeslices, + combineValuesByTitleReducer, + transposeToTimeslices +} from './utils' + +/* helper to allow selecting all values */ +const SELECT_ALL_FN = () => true + +/** + * Convert a nominal value to a interval value. Performs a derivative over time. + * + * ie: convert a series that increments forever into an average over the last time period + * + * @param {function} the function that decides whether a cumulative transform should be applied + * @returns {function} a transform function + */ +function cumulativeTransformSelective (shouldApplyFn) { + function nominalTsValueToIntervalTsValue(elem, index, arr) { + if (index === 0) return [] + let prev = arr[index - 1] + return { + ...elem, // copy everything over and replace the value with time scaled from previous + value: ((elem.value - prev.value) / ((elem.ts - prev.ts) / 1000)) + } + } + + return function _cumulativeTransformSelective (metricInstances) { + return metricInstances.map(mi => { + return shouldApplyFn(mi) + ? { ...mi, data: mi.data.map(nominalTsValueToIntervalTsValue).slice(1) } + : mi + }) + } +} + +/** + * Convert a nominal value to a interval value. Performs a derivative over time. + * + * ie: convert a series that increments forever into an average over the last time period + * + * @returns {function} a transform function + */ +export const cumulativeTransform = () => cumulativeTransformSelective(SELECT_ALL_FN) + +/** + * Convert a nominal value to a interval value. Performs a derivative over time. + * + * ie: convert a series that increments forever into an average over the last time period + * + * @param {metricNames} list of metric names to apply transform to + * @returns {function} a transform function + */ +export function cumulativeTransformOnlyMetrics (metricNames) { + return cumulativeTransformSelective(mi => metricNames.includes(mi.metric)) +} + +/** + * Perform generic (typically linear) math on instantaneous values + * + * @param {function} math the function that will be executed on all values + * @param {function} shouldApplyFn the function that decides whether the transform will apply + * @return {function} a transform function + */ +export function mathValuesSelective (math, shouldApplyFn) { + return function _mathSomeSelective (metricInstances) { + return metricInstances.map(mi => { + let result = shouldApplyFn(mi) + ? { ...mi, data: mi.data.map(({ ts, value }) => ({ ts, value: math(value) })) } + : mi + return result + }) + } +} + +/** + * Perform generic (typically linear) math on all instantaneous values in a dataset + * + * @param {function} math the function that will be executed on all values + * @return {function} a transform function + */ +export const mathAllValues = (fn) => mathValuesSelective(fn, SELECT_ALL_FN) + +/** + * Perform a kb->gb conversion of all values (ie: divide by 1024^2) + * + * @return {function} a transform function + */ +export const kbToGb = () => mathAllValues(v => v / 1024 / 1024) + +/** + * Perform a division of all values by a constant + * + * @param {number} divisor the constant that will be the divisor + * @return {function} a transform function + */ +export const divideBy = (divisor) => mathAllValues(v => v / divisor) + +/** + * Perform a Math.ceiling against all values + * + * @return {function} a transform function + */ +export const ceiling = () => mathAllValues(v => Math.ceil(v)) + +/** + * Perform a division of values by a constant for the given metrics + * + * @param {number} divisor the constant that will be the divisor + * @param {metricNames} array the list of metric names to transform + * @return {function} a transform function + */ +export const divideByOnlyMetric = (divisor, metricNames) => + mathValuesSelective((v) => v / divisor, (i) => metricNames.includes(i.metric)) + +/** + * Combine metrics sharing the same 'title', applying some function to combine them, for + * example a sum function. + * + * @param {function} fn the combiner (eg a sum function) that will be used to reduce across values + * @return {function} a transform function + */ +export function combineValuesByTitle (fn) { + return function _combineValuesByTitle (metricInstances) { + return metricInstances.reduce(combineValuesByTitleReducer(fn), []) + } +} + +/** + * Divide all values (excluding seriesName) by the values in seriesName, assumes there is only one instance + * for the divisor metric. + * + * @param {string} metricName the divisor metric name + * @return {function} a transform function + */ +export function divideBySeries (divisorMetricName) { + return function _divideBySeries (metricInstances) { + const divisorSeries = metricInstances.find(mi => mi.metric === divisorMetricName).data + const outputs = metricInstances.filter(mi => mi.metric !== divisorMetricName) + let result = outputs.map(mi => { + return { + ...mi, + data: mi.data.map(({ ts, value }) => { + // look up ts in divisor array + let divPoint = divisorSeries.find(divisor => ts.getTime() === divisor.ts.getTime()) + // return value divided by divisor value + return { ts, value: value / divPoint.value } + }) + } + }) + return result + } +} + +/** + * Adds a default title and keylabel to the metric instances + * + * @return {function} a transform function + */ +export function defaultTitleAndKeylabel () { + return function _defaultTitleAndKeylabel (metricInstances) { + return metricInstances.map(mi => { + const defaultTitle = (mi.instance === -1 || mi.instance === '-1') ? mi.metric : `${mi.metric} (${mi.instance})` + return { ...mi, title: defaultTitle, keylabel: defaultTitle } + }) + } +} + +/** + * Adds a custom title and keylabel to the metric instances, where the title and keylabel is generated by a + * user specified function + * + * @param {function} titleFn the fn that will be called to map the metric and instance names to a title + * @return {function} a transform function + */ +export function customTitleAndKeylabel (titleFn) { + return function _customTitleAndKeylabel (metricInstances) { + return metricInstances.map(mi => { + const newTitleAndKeylabel = titleFn(mi.metric, mi.instance) + return { + ...mi, + title: newTitleAndKeylabel, + keylabel: newTitleAndKeylabel, + } + }) + } +} + +/** + * Maps PCP instance domains to metric instances + * Used to map pcp instance ids (such as 0, 1, 2, ...) to strings such as ('xvda', 'xvdb', etc) + * + * @param {string} the instance name to map as, 'instance' if not provided + * @return {function} a transform function + */ +export function mapInstanceDomains (name) { + let tagName = name || 'instance' + return function _mapInstanceDomains (metricInstances, { instanceDomainMappings }) { + return metricInstances.map(mi => ({ + ...mi, + [tagName]: (instanceDomainMappings[mi.metric] && instanceDomainMappings[mi.metric][mi.instance]) || mi.instance + })) + } +} + +/** + * Maps container names to the container instance id + * + * @param {metricNames} array the list of metric names that will have the instance tag mapped to a container + * @param {containerNameResolver} function callback to transform metadata to container name, will be passed { instance, cgroup, containerId } + * @return {function} a transform function + */ +export function mapContainerNames (metricNames, containerNameResolver) { + return function _mapContainerNames (metricInstances, { containerList }) { + return metricInstances + .map(mi => { + if (! metricNames.includes(mi.metric)) return mi + let container = containerList.find(e => e.cgroup === mi.instance) || {} + return { ...mi, instance: containerNameResolver(container) } + }) + // make sure the instance had a valid name + .filter(mi => !!mi.instance) + } +} + +/** + * Logs data at this point in the pipeline (does not actually transform the data) + * + * @param {string} message the log message to add to the console output + * @return {function} a transform function + */ +export function log (message) { + return function _log (metricInstances) { + console.log(message, metricInstances) + return metricInstances + } +} + +/** + * Completely transforms an input set of data at each timepoint + * Assumes that a time sample exists at each point + * + * This is probably an expensive transform though so there may be cheaper ways to hardcode (tbc) + * + * Best to see some of the examples to see what is possible + * + * @param {object} an associative set specifying, for a given output at a given time series, what the fn to be applied should be + * @return {function} a transform function + */ +export function timesliceCalculations (calcs) { + return function _timesliceCalculations (metricInstances) { + const slices = transposeToTimeslices(metricInstances) + const calculated = applyFunctionsToTimeslices(slices, calcs) + const untransposed = untransposeTimeslices(calculated) + return untransposed + } +} + +/** + * Renames one or more metric names + * + * @param {object} a rename mapping table + * @return {function} a transform function + */ +export function renameMetric (renames) { + return function _renameMetric (metricInstances) { + return metricInstances.map(mi => ({ + ...mi, + metric: (mi.metric in renames) ? renames[mi.metric] : mi.metric + })) + } +} + +/** + * Removes anything not matching the configured containerId + * + * Assumes the 'instance' tag refers to the container id, which it should do immediately after a mapContainerNames + * if containerId is falsey, return existing instances + * + * @param {string} metricNames the metric names to check for valid container ids + * @return {function} a transform function + */ +export function filterForContainerId (metricNames) { + return function _filterForContainerId (metricInstances, { containerId }) { + if (!containerId) return metricInstances + // only filter out where (it is not a filterable metric) or (it is a filterable metric and the container instance matches) + return metricInstances.filter(mi => !metricNames.includes(mi.metric) || metricNames.includes(mi.metric) && containerId === mi.instance) + } +} + +/** + * Filter metric names so that only metrics in the referenced list will be passed through + * + * @param {string} the name of the key in which to find metric names to filter by (this will be read from chartInfo) + * + * @return {function} a transform function + */ +export function filterKeepSelectedMetrics (chartInfoKey) { + return function _filterKeepSelectedMetrics (metricInstances, { chartInfo }) { + const selectedMetrics = chartInfo[chartInfoKey] || [] + return metricInstances.filter(mi => selectedMetrics.includes(mi.metric)) + } +} + +export function onlyLatestValues () { + function extractLatest(acc, elem) { + return (acc.ts.getTime() > elem.ts.getTime()) ? acc : elem + } + + return function _onlyLatestValues (metricInstances) { + return metricInstances.map(mi => ({ + ...mi, + data: [ mi.data.reduce(extractLatest, mi.data[0]) ], + })) + } +} + +/* + * Filter out data points that are above the included metric + * + * Also filter out an entire series if there are no data points that meet it + * + * @return {function} a transform function + */ +export function filterAboveMaxInstanceValue () { + return function _filterAboveMaxInstanceValue (metricInstances, { chartInfo }) { + return chartInfo.maxInstanceValue + ? metricInstances.filter(mi => (mi.instance <= chartInfo.maxInstanceValue)) + : metricInstances + } +} diff --git a/src/app/processors/transforms.spec.js b/src/app/processors/transforms.spec.js new file mode 100644 index 000000000..d3491b0f2 --- /dev/null +++ b/src/app/processors/transforms.spec.js @@ -0,0 +1,232 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as transforms from './transforms' +import { expect } from 'chai' + +describe('filterForContainerId', () => { + let data = [ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ] + describe('with a different metric id', () => { + it('returns all values', () => { + let filtered = transforms.filterForContainerId([ 'containerdisk' ])(data, { containerId: 'abc' }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a matching metric id and invalid container id', () => { + it('returns only other metric values', () => { + let filtered = transforms.filterForContainerId([ 'containercpu' ])(data, { containerId: 'zzz' }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a matching metric id', () => { + it('returns all values', () => { + let filtered = transforms.filterForContainerId([ 'containercpu' ])(data, { containerId: 'abc' }) + expect(filtered.length).to.equal(3) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a list including all metrics and empty filter', () => { + it('returns all values', () => { + let filtered = transforms.filterForContainerId([ 'containerdisk', 'containercpu', 'containerram' ])(data, { containerId: '' }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + describe('with a list including all metrics', () => { + it('returns filtered values', () => { + let filtered = transforms.filterForContainerId([ 'containerdisk', 'containercpu', 'containerram' ])(data, { containerId: 'abc' }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + ]) + }) + }) +}) + +describe('filterKeepSelectedMetrics', () => { + let data = [ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ] + + describe('with empty selected metrics', () => { + it('returns no values', () => { + let chartInfo = { selectedMetrics: [ ] } + let filtered = transforms.filterKeepSelectedMetrics('selectedMetrics')(data, { chartInfo }) + expect(filtered.length).to.equal(0) + }) + }) + + describe('with all metrics', () => { + it('returns all values', () => { + let chartInfo = { selectedMetrics: [ 'containercpu', 'containerram' ] } + let filtered = transforms.filterKeepSelectedMetrics('selectedMetrics')(data, { chartInfo }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + + describe('with one selected metrics', () => { + it('returns selected values', () => { + let chartInfo = { selectedMetrics: [ 'containercpu' ] } + let filtered = transforms.filterKeepSelectedMetrics('selectedMetrics')(data, { chartInfo }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 'abc', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 'def', data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) +}) + +describe('onlyLatestValues', () => { + describe('with all equivalent values', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 }, { ts: new Date(1235), value: 5 }, { ts: new Date(1236), value: 7 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 }, { ts: new Date(1235), value: 6 }, { ts: new Date(1236), value: 8 } ] }, + ] + it('returns only latest', () => { + let latest = transforms.onlyLatestValues()(data) + expect(latest.length).to.equal(3) + expect(latest).to.have.deep.members([ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1236), value: 7 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1236), value: 8 } ] }, + ]) + }) + }) + + describe('with mixed values', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 }, { ts: new Date(1235), value: 5 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ] + it('returns latest for each', () => { + let latest = transforms.onlyLatestValues()(data) + expect(latest.length).to.equal(3) + expect(latest).to.have.deep.members([ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1235), value: 5 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ]) + }) + }) + + describe('with one value', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ] + it('returns input', () => { + let latest = transforms.onlyLatestValues()(data) + expect(latest.length).to.equal(3) + expect(latest).to.have.deep.members([ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'mem.used', instance: 99, data: [ { ts: new Date(1234), value: 4 } ] }, + ]) + }) + }) +}) + +describe('filterAboveMaxInstanceValue', () => { + let data = [ + { metric: 'containercpu', instance: 0, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 1, data: [ { ts: new Date(1234), value: 3 } ] }, + { metric: 'containerram', instance: 2, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containerram', instance: 3, data: [ { ts: new Date(1234), value: 3 } ] }, + ] + + describe('with no value set', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: {} }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) + + describe('with a 0 value set', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 0 } }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) + + describe('with a middle value set (1)', () => { + it('returns values for 1 and below', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 1 } }) + expect(filtered.length).to.equal(2) + expect(filtered).to.have.deep.members([ + { metric: 'containercpu', instance: 0, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'containercpu', instance: 1, data: [ { ts: new Date(1234), value: 3 } ] }, + ]) + }) + }) + + describe('with a value on the upper edge', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 4 } }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) + + describe('with a super high value set', () => { + it('returns all values', () => { + let filtered = transforms.filterAboveMaxInstanceValue()(data, { chartInfo: { maxInstanceValue: 9999999 } }) + expect(filtered.length).to.equal(4) + expect(filtered).to.have.deep.members([...data]) + }) + }) +}) diff --git a/src/app/processors/utils.js b/src/app/processors/utils.js new file mode 100644 index 000000000..9d8a4073b --- /dev/null +++ b/src/app/processors/utils.js @@ -0,0 +1,156 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + flatten, + keyValueArrayToObjectReducer, +} from '../utils' + +/** + * Given an array of { ts, value } tuples, combine them so that there is only + * one ts value, using combine function + */ +function combineValuesAtTimestampReducer(combiner) { + return (acc, dp) => { + const existingIndex = acc.findIndex(e => e.ts.getTime() === dp.ts.getTime()) + // not found in array + if (existingIndex === -1) { + return acc.concat(dp) + } + + // found in array, clone the array but replace the element + const newArray = acc.slice() + newArray[existingIndex] = { + ts: acc[existingIndex].ts, + value: combiner(acc[existingIndex].value, dp.value), + } + return newArray + } +} + +/** + * Given an array of [ { title, keylabel, data: { ts, value } } ], + * and having duplicated title lines, combine each of the datapoints, + * applying combiner to the data values such that there will only be unique 'title' lines + */ +function combineValuesByTitleReducer(combiner) { + return (acc, ds) => { + const existingIndex = acc.findIndex(e => e.title === ds.title) + // not found + if (existingIndex === -1) { + return acc.concat(ds) + } + + // found in array, clone array but replace dataset + const newArray = acc.slice() + const newData = [].concat(acc[existingIndex].data, ds.data) + .reduce(combineValuesAtTimestampReducer(combiner), []) + + newArray[existingIndex] = { + ...acc[existingIndex], + data: newData + } + return newArray + } +} + +function getAllMetricInstancesAtTs(metricInstances, ts) { + return metricInstances + .map(({ metric, instance, data }) => { + const tsv = data.find(tsv => tsv.ts.getTime() === ts.getTime()) + return { + metric: metric, + instance: instance, + value: tsv && tsv.value, + } + }) + .filter(({ value }) => value !== null && typeof value !== 'undefined') +} + +/** + * Note: this only keeps timestamps which are present in the first index + */ +function transposeToTimeslices(metricInstances) { + if (!metricInstances || metricInstances.length === 0) return metricInstances + + const timestamps = metricInstances[0].data.map(tsv => tsv.ts) + return timestamps.map(ts => { + const values = getAllMetricInstancesAtTs(metricInstances, ts) + // transform to a hierarchy of associative objects rather than an array of tuples + const transformed = values.reduce((acc, { metric, instance, value }) => { + acc[metric] = acc[metric] || {} + acc[metric][instance] = value + return acc + }, {}) + return { ts, values: transformed } + }) +} + +function applyFunctionsToTimeslices(timeslices, fns) { + return timeslices.map(({ ts, values }) => { + return { + ts, + values: Object.keys(fns) + // apply the function to all the values + .map(fname => { + let valuesOut + try { + valuesOut = fns[fname](values) + } catch (err) { + console.warn('could not apply fn', err.message) + } + return { key: fname, value: valuesOut } + }) + .reduce(keyValueArrayToObjectReducer, {}) + } + }) +} + +function getMetricInstancesFromTimeslice(slice) { + return Object.keys(slice.values).map(metric => { + if (!slice.values[metric]) return [] + const instancesForThisMetric = Object.keys(slice.values[metric]) + return instancesForThisMetric.map(instance => ({ metric, instance })) + }).reduce(flatten, []) +} + + +function untransposeTimeslices(timeslices) { + if (!timeslices.length) return timeslices + + const metricInstances = timeslices + .map(t => getMetricInstancesFromTimeslice(t)) + .reduce(flatten) + .filter((val, index, arr) => arr.findIndex(e => e.metric === val.metric && e.instance === val.instance) === index) + + const untransposed = metricInstances.map(({ metric, instance}) => ({ + metric, + instance, + data: timeslices.map(({ ts, values }) => ({ ts, value: values && values[metric] && values[metric][instance] })).filter(tsv => !!tsv.value) + })) + return untransposed +} + +export { + combineValuesAtTimestampReducer, + combineValuesByTitleReducer, + getAllMetricInstancesAtTs, + transposeToTimeslices, + untransposeTimeslices, + applyFunctionsToTimeslices, +} diff --git a/src/app/processors/utils.spec.js b/src/app/processors/utils.spec.js new file mode 100644 index 000000000..fcb3395e7 --- /dev/null +++ b/src/app/processors/utils.spec.js @@ -0,0 +1,349 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as utils from './utils' +import { expect } from 'chai' + +describe('combineValuesAtTimestampReducer', () => { + describe('with a sum combiner', () => { + const sum = (a, b) => (a + b) + describe('with no timestamps', () => { + const data = [] + it('produces an empty array', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(0) + }) + }) + + describe('with no matching timestamps', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(4567), value: 3 }, + ] + it('produces a concat result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 1 }, + { ts: new Date(4567), value: 3 }, + ]) + }) + }) + + describe('with two matching timestamps', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(1234), value: 3 }, + ] + it('produces a single output with combined result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 4 }, + ]) + }) + }) + + describe('with four matching timestamps', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(1234), value: 3 }, + { ts: new Date(1234), value: 5 }, + { ts: new Date(1234), value: 9 }, + ] + it('produces a single output with combined result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 18 }, + ]) + }) + }) + + describe('with two timestamps and four values each', () => { + const data = [ + { ts: new Date(1234), value: 1 }, + { ts: new Date(1234), value: 3 }, + { ts: new Date(1234), value: 5 }, + { ts: new Date(1234), value: 9 }, + { ts: new Date(5678), value: 101 }, + { ts: new Date(5678), value: 103 }, + { ts: new Date(5678), value: 105 }, + { ts: new Date(5678), value: 109 }, + ] + it('produces two timestamps with correct combined result', () => { + const result = data.reduce(utils.combineValuesAtTimestampReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { ts: new Date(1234), value: 18 }, + { ts: new Date(5678), value: 418 }, + ]) + }) + }) + }) +}) + +describe('combineValuesByTitleReducer', () => { + describe('with a sum combiner', () => { + const sum = (a, b) => (a + b) + describe('with empty input', () => { + const data = [] + it('returns an empty array', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(0) + }) + }) + describe('with no overlap at same time', () => { + const data = [ + { metric: 'cpu', instance: 'cpu0', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { metric: 'iops', instance: 0, title: 'disk', keylabel: 'disk', data: [ { ts: new Date(1234), value: 1 } ] }, + ] + it('returns unique titles', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { metric: 'cpu', instance: 'cpu0', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { metric: 'iops', instance: 0, title: 'disk', keylabel: 'disk', data: [ { ts: new Date(1234), value: 1 } ] }, + ]) + }) + }) + + describe('with no overlap at different time', () => { + const data = [ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + ] + it('returns unique titles', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(2) + expect(result).to.have.deep.members([ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + ]) + }) + }) + + describe('with overlap at different time', () => { + const data = [ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 } ] }, + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(5678), value: 7 } ] }, + ] + it('returns a single timeline', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 }, { ts: new Date(5678), value: 7 } ] }, + ]) + }) + }) + + describe('with a single title and multiple lines', () => { + const data = [ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 }, { ts: new Date(5678), value: 5 } ] }, + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(5678), value: 50 } ] }, + ] + it('combines to a single title', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(1) + expect(result).to.have.deep.members([ + { title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 11 }, { ts: new Date(5678), value: 55 } ] }, + ]) + }) + }) + + describe('with a mix of titles with multiple lines', () => { + const data = [ + { metric: 'cpu', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 1 }, { ts: new Date(5678), value: 5 } ] }, + { metric: 'cpu', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(5678), value: 50 } ] }, + { metric: 'iops', title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + { metric: 'netbytes', title: 'network', keylabel: 'network', data: [ { ts: new Date(1234), value: 5 } ] }, + { metric: 'netbytes', title: 'network', keylabel: 'network', data: [ { ts: new Date(5678), value: 7 } ] }, + ] + it('combines to the correct mix', () => { + const result = data.reduce(utils.combineValuesByTitleReducer(sum), []) + expect(result.length).to.equal(3) + expect(result).to.have.deep.members([ + { metric: 'cpu', title: 'cpu', keylabel: 'cpu', data: [ { ts: new Date(1234), value: 11 }, { ts: new Date(5678), value: 55 } ] }, + { metric: 'iops', title: 'disk', keylabel: 'disk', data: [ { ts: new Date(5678), value: 1 } ] }, + { metric: 'netbytes', title: 'network', keylabel: 'network', data: [ { ts: new Date(1234), value: 5 }, { ts: new Date(5678), value: 7 } ] }, + ]) + }) + }) + }) +}) + +describe('getAllMetricInstancesAtTs', () => { + describe('with a single instance', () => { + let metricInstances = [ + { metric: 'cpu', instance: 'cpu0', data: [ { ts: new Date(1234), value: 0.5 }, { ts: new Date(1235), value: 0.6 }, { ts: new Date(1236), value: 0.5 } ] }, + ] + it('fetches nothing for missing values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1233))).to.deep.equal([ ]) + }) + it('extracts the values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1234))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1235))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.6 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1236))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + ]) + }) + }) + describe('with multiple instances', () => { + let metricInstances = [ + { metric: 'cpu', instance: 'cpu0', data: [ { ts: new Date(1234), value: 0.5 }, { ts: new Date(1235), value: 0.6 }, { ts: new Date(1236), value: 0.5 } ] }, + { metric: 'network', instance: 'eth0', data: [ { ts: new Date(1234), value: 100 }, { ts: new Date(1235), value: 105 }, { ts: new Date(1236), value: 110 } ] } + ] + it('fetches nothing for missing values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1233))).to.deep.equal([ ]) + }) + it('extracts the values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1234))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + { metric: 'network', instance: 'eth0', value: 100 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1235))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.6 }, + { metric: 'network', instance: 'eth0', value: 105 }, + ]) + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1236))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0.5 }, + { metric: 'network', instance: 'eth0', value: 110 }, + ]) + }) + }) + describe('with a zero value', () => { + let metricInstances = [ + { metric: 'cpu', instance: 'cpu0', data: [ { ts: new Date(1234), value: 0 } ] } + ] + it('extracts the values', () => { + expect(utils.getAllMetricInstancesAtTs(metricInstances, new Date(1234))).to.deep.equal([ + { metric: 'cpu', instance: 'cpu0', value: 0 }, + ]) + }) + }) +}) + +describe('transposeToTimeslices', () => { + describe('with multiple instances', () => { + let data = [ + { metric: 'mem.free', instance: -1, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ] + it('transposes', () => { + let transposed = utils.transposeToTimeslices(data) + expect(transposed.length).to.equal(3) + expect(transposed).to.have.deep.members([ + { ts: new Date(1234), values: { 'mem.free': { '-1': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '-1': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '-1': 30 }, 'mem.used': { '-1': 70 } } }, + ]) + }) + }) + describe('with instance tags of 0', () => { + let data = [ + { metric: 'mem.free', instance: 0, data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: -1, data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ] + it('transposes', () => { + let transposed = utils.transposeToTimeslices(data) + expect(transposed.length).to.equal(3) + expect(transposed).to.have.deep.members([ + { ts: new Date(1234), values: { 'mem.free': { '0': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30 }, 'mem.used': { '-1': 70 } } }, + ]) + }) + }) +}) + +describe('applyFunctionsToTimeslices', () => { + let functions = { + 'sum': slice => ({ '-1': slice['mem.free']['0'] + slice['mem.used']['-1'] }), + 'min': slice => ({ '-1': Math.min(slice['mem.free']['0'], slice['mem.used']['-1']) }), + } + let timeslices = [ + { ts: new Date(1234), values: { 'mem.free': { '0': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30 }, 'mem.used': { '-1': 70 } } }, + ] + it('applies the functions', () => { + let applied = utils.applyFunctionsToTimeslices(timeslices, functions) + expect(applied.length).to.equal(3) + expect(applied).to.have.deep.members([ + { ts: new Date(1234), values: { 'sum': { '-1': 100 }, 'min': { '-1': 10 } } }, + { ts: new Date(1235), values: { 'sum': { '-1': 100 }, 'min': { '-1': 15 } } }, + { ts: new Date(1236), values: { 'sum': { '-1': 100 }, 'min': { '-1': 30 } } }, + ]) + }) +}) + +describe('untransposeTimeslices', () => { + describe('with multiple instances', () => { + let data = [ + { ts: new Date(1234), values: { 'mem.free': { '-1': 10 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '-1': 15 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '-1': 30 }, 'mem.used': { '-1': 70 } } }, + ] + it('untransposes', () => { + let untransposed = utils.untransposeTimeslices(data) + expect(untransposed.length).to.equal(2) + expect(untransposed).to.have.deep.members([ + { metric: 'mem.free', instance: '-1', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.used', instance: '-1', data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ]) + }) + }) + + describe('with instance tags of 0', () => { + let data = [ + { ts: new Date(1234), values: { 'mem.free': { '0': 10, 'foo': 3 }, 'mem.used': { '-1': 90 } } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15, 'foo': 4 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30, 'foo': 5 }, 'mem.used': { '-1': 70 } } }, + ] + it('transposes', () => { + let untransposed = utils.untransposeTimeslices(data) + expect(untransposed.length).to.equal(3) + expect(untransposed).to.have.deep.members([ + { metric: 'mem.free', instance: '0', data: [ { ts: new Date(1234), value: 10 }, { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.free', instance: 'foo', data: [ { ts: new Date(1234), value: 3 }, { ts: new Date(1235), value: 4 }, { ts: new Date(1236), value: 5 } ] }, + { metric: 'mem.used', instance: '-1', data: [ { ts: new Date(1234), value: 90 }, { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ]) + }) + }) + + describe('with an empty first timeslice', () => { + let data = [ + { ts: new Date(1234), values: { } }, + { ts: new Date(1235), values: { 'mem.free': { '0': 15, 'foo': 4 }, 'mem.used': { '-1': 85 } } }, + { ts: new Date(1236), values: { 'mem.free': { '0': 30, 'foo': 5 }, 'mem.used': { '-1': 70 } } }, + ] + it('transposes', () => { + let untransposed = utils.untransposeTimeslices(data) + expect(untransposed.length).to.equal(3) + expect(untransposed).to.have.deep.members([ + { metric: 'mem.free', instance: '0', data: [ { ts: new Date(1235), value: 15 }, { ts: new Date(1236), value: 30 } ] }, + { metric: 'mem.free', instance: 'foo', data: [ { ts: new Date(1235), value: 4 }, { ts: new Date(1236), value: 5 } ] }, + { metric: 'mem.used', instance: '-1', data: [ { ts: new Date(1235), value: 85 }, { ts: new Date(1236), value: 70 } ] } + ]) + }) + }) +}) diff --git a/src/app/utils/index.js b/src/app/utils/index.js new file mode 100644 index 000000000..22a80ad1b --- /dev/null +++ b/src/app/utils/index.js @@ -0,0 +1,171 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import superagent from 'superagent' +import { parse } from 'query-string' +import config from 'config' + +///////////////////////////////////// +// window.location handling support + +export function pushQueryStringToHistory(targets, chartlist, history) { + console.log(chartlist) + + const data = targets.map(t => ({ + p: t.protocol, + h: t.hostname, + hs: t.hostspec, + ci: t.containerId, + cl: chartlist + .filter(c => matchesTarget(c.context.target, t)) + .map(c => c.chartId) + })) + const blob = JSON.stringify(data) + const encoded = encodeURI(blob) + + // we can kinda do this because the only way you should be able to add charts is when not in embed mode + history.push(`/?q=${encoded}`) +} + +export function getChartsFromLocation({ search, hash }) { + if (!search && !hash) { + return { chartlist: [], targets: [] } + } + + // check for old world urls + // the links in from legacy are via host= and container=, + // ignore the charts specifically (too bad) + if (hash) { + const queryHash = parse(hash) + const hostname = queryHash['/?host'] + ':' + config.defaultPort + const containerId = queryHash.container || '_all' + return { + isLegacy: true, + targets: [{ + protocol: config.defaultProtocol, + hostname, + hostspec: 'localhost', + containerId, + }], + chartlist: [] + } + } + + function uniqueTargetFilter (val, index, array) { + return array.findIndex(v => matchesTarget(v, val)) === index + } + + if (search) { + const query = parse(search) + + const decoded = decodeURI(query['q']) + const params = JSON.parse(decoded) + + const targets = params + .map(c => ({ + protocol: 'p' in c ? c.p : config.defaultProtocol, + hostname: c.h, + hostspec: c.hs, + containerId: c.ci + })) + .filter(uniqueTargetFilter) // should not be needed, but just in case + + const chartlist = params.map(c => + c.cl.map(chartId => ({ + target: { + protocol: 'p' in c ? c.p : config.defaultProtocol, + hostname: c.h, + hostspec: c.hs, + containerId: c.ci + }, + chartId: chartId + })) + ).reduce(flatten, []) + + return { + targets, + chartlist, + } + } +} + +///////////////////////////////////// +// generic object functions + +export function flatten (xs, ys) { + return xs.concat(ys) +} + +export function uniqueFilter (val, index, array) { + return array.indexOf(val) === index +} + +// use as a reducer +export function keyValueArrayToObjectReducer (obj, { key, value }) { + obj[key] = value + return obj +} + +export function firstValueInObject(obj) { + return obj[Object.keys(obj)[0]] +} + +///////////////////////////////////// +// handling targets and contexts +export function matchesTarget (t1, t2) { + return !!(t1 && t2 && t1.hostname === t2.hostname && t1.hostspec === t2.hostspec && t1.containerId === t2.containerId) +} + +export function isContextLoading (context) { + return !(context.contextId + && (Object.keys(context.pmids || {}).length > 0) + && context.hostname + && context.containerList) +} + +///////////////////////////////////// +// pmwebd connectivity +const PMAPI_POLL_TIMEOUT_SECONDS = 5 + +export async function fetchContainerList (protocol, hostname, hostport, hostspec) { + // set up a new context, then fetch container and cgroup details + const pmapi = `${protocol}://${hostname}:${hostport}/pmapi` + + let res = await superagent + .get(`${pmapi}/context`) + .query({ exclusive: 1, hostspec: hostspec, polltimeout: PMAPI_POLL_TIMEOUT_SECONDS }) + const context = res.body.context + + // need to do this second fetch and join to make sure we get genuine containers + const promisedContainerNames = superagent.get(`${pmapi}/${context}/_fetch?names=containers.name`) + const promisedCgroups = superagent.get(`${pmapi}/${context}/_fetch?names=containers.cgroup`) + + res = await promisedContainerNames + const containers = res.body.values.length ? res.body.values[0].instances : [] + res = await promisedCgroups + const cgroups = res.body.values.length ? res.body.values[0].instances : [] + + const containerList = cgroups.map(({ instance, value }) => ({ + instance, + cgroup: value, + containerId: containers.find(cont => cont.instance === instance).value + })) + + return containerList +} + diff --git a/src/app/utils/index.spec.js b/src/app/utils/index.spec.js new file mode 100644 index 000000000..2ba229988 --- /dev/null +++ b/src/app/utils/index.spec.js @@ -0,0 +1,101 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as utils from './' +import { expect } from 'chai' +import config from 'config' + +describe('getChartsFromLocation', () => { + describe('with new style search string', () => { + const search = '?q=[{"p":"http","h":"192.168.251.133:44323","hs":"localhost","ci":"_all","cl":["cpu-pswitch"]},{"p":"http","h":"1.2.3.4:7402","hs":"localhost","ci":"_all","cl":[]},{"p":"https","h":"192.168.251.133:44323","hs":"localhost","ci":"hopeful_dijkstra","cl":["container-percont-cpu","container-percont-mem","container-total-cont-mem"]}]' + const result = utils.getChartsFromLocation({ search, hash: null }) + it('finds three targets', () => { + expect(result.targets.length).to.equal(3) + expect(result.targets).to.have.deep.members([ + { protocol: 'http', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: '_all' }, + { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, + { protocol: 'http', hostname: '1.2.3.4:7402', hostspec: 'localhost', containerId: '_all' }, + ]) + }) + + it('finds four charts in the chartlist', () => { + expect(result.chartlist.length).to.equal(4) + expect(result.chartlist).to.have.deep.members([ + { target: { protocol: 'http', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: '_all' }, chartId: 'cpu-pswitch' }, + { target: { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, chartId: 'container-percont-cpu' }, + { target: { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, chartId: 'container-percont-mem' }, + { target: { protocol: 'https', hostname: '192.168.251.133:44323', hostspec: 'localhost', containerId: 'hopeful_dijkstra' }, chartId: 'container-total-cont-mem' }, + ]) + }) + }) + + describe('with new style search string, no protocol specified', () => { + const search = '?q=[{"h":"192.168.251.133:44323","hs":"localhost","ci":"_all","cl":["cpu-pswitch"]},{"h":"1.2.3.4:7402","hs":"localhost","ci":"_all","cl":[]},{"h":"192.168.251.133:44323","hs":"localhost","ci":"hopeful_dijkstra","cl":["container-percont-cpu","container-percont-mem","container-total-cont-mem"]}]' + const result = utils.getChartsFromLocation({ search, hash: null }) + it('finds three targets, all with the default protocol', () => { + expect(result.targets.length).to.equal(3) + result.targets.forEach(i => expect(i.protocol).to.equal(config.defaultProtocol)) + }) + + it('finds four charts in the chartlist, all with targets having the default protocol', () => { + expect(result.chartlist.length).to.equal(4) + result.chartlist.forEach(i => expect(i.target.protocol).to.equal(config.defaultProtocol)) + }) + }) + + describe('with old style hash string', () => { + describe('with a container', () => { + const hash = '#/?host=100.65.15.127&container=09fb4cae-8987-49bc-a208-1115aa0443e1' + const result = utils.getChartsFromLocation({ search: null, hash }) + it('finds a single target with a container', () => { + expect(result.targets.length).to.equal(1) + expect(result.targets).to.have.deep.members([ + { protocol: 'http', hostname: '100.65.15.127:7402', hostspec: 'localhost', containerId: '09fb4cae-8987-49bc-a208-1115aa0443e1' } + ]) + }) + it('finds a single chart attached to that container', () => { + expect(result.chartlist.length).to.equal(0) + }) + }) + + describe('without a container', () => { + const hash = '#/?host=100.82.47.121' + const result = utils.getChartsFromLocation({ search: null, hash }) + it('finds a single target connected to _all container', () => { + expect(result.targets.length).to.equal(1) + expect(result.targets).to.have.deep.members([ + { protocol: 'http', hostname: '100.82.47.121:7402', hostspec: 'localhost', containerId: '_all' } + ]) + }) + it('does not find any charts', () => { + expect(result.chartlist.length).to.equal(0) + }) + }) + }) + + describe('with empty string', () => { + const result = utils.getChartsFromLocation({ search: null, hash: null }) + it('finds no targets', () => { + expect(result.targets.length).to.equal(0) + }) + it('finds no charts', () => { + expect(result.chartlist.length).to.equal(0) + }) + }) +}) + diff --git a/src/config.js b/src/config.js new file mode 100644 index 000000000..9c089cc9d --- /dev/null +++ b/src/config.js @@ -0,0 +1,53 @@ +/**! + * + * Copyright 2018 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +const config = { + basename: '/', + + dataWindows: [ + { text: '2 min', valueSeconds: 2*60 }, + { text: '5 min', valueSeconds: 5*60 }, + { text: '10 min', valueSeconds: 10*60 } + ], + pollIntervals: [ + { text: '1 sec', valueSeconds: 1 }, + { text: '2 sec', valueSeconds: 2 }, + { text: '3 sec', valueSeconds: 3 }, + { text: '5 sec', valueSeconds: 5 } + ], + defaultWindowSeconds: 120, // Default graph time window + defaultIntervalSeconds: 2, // Default update interval + + enableContainerWidgets: true, // Enable container widgets + enableCustomWidgetFeature: true, // Enable the custom widget feature to add ad-hoc widgets + enableBcc: true, // Enable BCC widgets (requires BCC PMDA) + enableFlamegraphs: true, // Enable Flamegraph widgets (requires custom PMDA) + + defaultProtocol: 'http', // PMWEBD protocol + defaultPort: 7402, // PMWEBD port + defaultHostspec: 'localhost', // Default PMCD hostspec + disableHostspecInput: true, // Disable hostspec input + disableContainerSelect: false, // Disable container name drop down select + useCgroupId: false, // Use container cgroup id instead of container name + + // TODO what about container name resolver +} + +if (typeof module !== 'undefined') { + module.exports = config; +} diff --git a/src/index.html b/src/index.html deleted file mode 100644 index 053074cc2..000000000 --- a/src/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Vector - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/test/__mocks__/fileMock.js b/test/__mocks__/fileMock.js new file mode 100644 index 000000000..0e56c5b5f --- /dev/null +++ b/test/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub' diff --git a/test/__mocks__/styleMock.js b/test/__mocks__/styleMock.js new file mode 100644 index 000000000..4ba52ba2c --- /dev/null +++ b/test/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {} diff --git a/test/datasets.json b/test/datasets.json new file mode 100644 index 000000000..1e7156a2d --- /dev/null +++ b/test/datasets.json @@ -0,0 +1,2614 @@ +[ + { + "timestamp": { + "s": 1531869878, + "us": 882804 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885593597 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 178 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869881, + "us": 103765 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885757228 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 104 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869883, + "us": 354578 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885880347 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869885, + "us": 509563 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125885975028 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869887, + "us": 757439 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886101256 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869889, + "us": 969822 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886256630 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869892, + "us": 183967 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886439848 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 136 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869894, + "us": 362094 + }, + "values": [ + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886553864 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869896, + "us": 541978 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886669659 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591033300 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869898, + "us": 821179 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125886857999 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 57 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065350170 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591034240 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869901, + "us": 38447 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887044887 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 11 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065392590 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591035440 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869903, + "us": 318814 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887172913 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 10 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065427400 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591037210 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869905, + "us": 550189 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887298210 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065451310 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591038300 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869907, + "us": 748198 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887443983 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065489280 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591038950 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869909, + "us": 996762 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887657847 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 10 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065519070 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591039450 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869911, + "us": 662717 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887747949 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065537580 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591039740 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869912, + "us": 803687 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887899467 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065553170 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591040080 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869913, + "us": 827935 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125887960323 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065565920 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591040240 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869915, + "us": 12796 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888076785 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 13 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065588290 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591040590 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869916, + "us": 75307 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888190734 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 215 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065610540 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041120 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869916, + "us": 257752 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888215591 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065614590 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041200 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869917, + "us": 239458 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888296721 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 8 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065630880 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041450 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869917, + "us": 462006 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888312780 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065633600 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591041680 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869918, + "us": 416088 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888408565 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 41 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065650580 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042020 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869918, + "us": 667927 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888426570 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065654170 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042170 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869919, + "us": 580282 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888483343 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 135 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065666320 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042320 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869919, + "us": 873619 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888500815 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 10 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065669530 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042370 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869920, + "us": 786474 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888562046 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 51 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065681710 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042590 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869921, + "us": 81547 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888583360 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 97 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065685550 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042620 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869922, + "us": 1109 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888640130 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 40 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065698870 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591042930 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869922, + "us": 295117 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888662866 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 57 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065703690 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043000 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869923, + "us": 212100 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 13.67 + }, + { + "instance": 5, + "value": 30.32 + }, + { + "instance": 15, + "value": 36.080002 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888738833 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 15 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065720980 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043350 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869923, + "us": 466975 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 13.67 + }, + { + "instance": 5, + "value": 30.32 + }, + { + "instance": 15, + "value": 36.080002 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888756159 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065725300 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043430 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869924, + "us": 424798 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888848335 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 9 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065744090 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591043750 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869924, + "us": 981264 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888891354 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 153 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065752710 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044050 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869925, + "us": 652482 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888927559 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065763970 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044140 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869926, + "us": 172977 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888956222 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065772140 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044240 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869926, + "us": 812472 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125888994417 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065781320 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044400 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869927, + "us": 312409 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889016315 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 44 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065786740 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044480 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869927, + "us": 986464 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889051102 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 78 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065794580 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044640 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869928, + "us": 472500 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 12.89 + }, + { + "instance": 5, + "value": 29.879999 + }, + { + "instance": 15, + "value": 35.91 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889076757 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065800560 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044740 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869929, + "us": 156269 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889124157 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065811720 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044890 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869929, + "us": 633691 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889153390 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 7 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065818740 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591044980 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869930, + "us": 365784 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889212470 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 6 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065829880 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591045210 + } + ] + } + ] + }, + { + "timestamp": { + "s": 1531869930, + "us": 787234 + }, + "values": [ + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { + "instance": -1, + "value": 64 + } + ] + }, + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { + "instance": 1, + "value": 25.32 + }, + { + "instance": 5, + "value": 32.18 + }, + { + "instance": 15, + "value": 36.619999 + } + ] + }, + { + "pmid": 251658253, + "name": "kernel.all.pswitch", + "instances": [ + { + "instance": -1, + "value": 125889252559 + } + ] + }, + { + "pmid": 251660290, + "name": "kernel.all.runnable", + "instances": [ + { + "instance": -1, + "value": 144 + } + ] + }, + { + "pmid": 251658260, + "name": "kernel.all.cpu.user", + "instances": [ + { + "instance": -1, + "value": 11065837410 + } + ] + }, + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { + "instance": -1, + "value": 591045400 + } + ] + } + ] + } +] diff --git a/test/pcp-target/Dockerfile b/test/pcp-target/Dockerfile new file mode 100644 index 000000000..6e0c7bd5d --- /dev/null +++ b/test/pcp-target/Dockerfile @@ -0,0 +1,13 @@ +FROM ubuntu:bionic + +# need to fetch latest ca-certificates first +RUN apt-get -y update +RUN apt-get -y upgrade +RUN apt-get install -y ca-certificates gnupg2 linux-headers-$(uname -r) + +# install pcp +COPY etc_apt_sources.list.d_pcp.list /etc/apt/sources.list.d/pcp.list +RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys A51D3ADCDEA2C114 +RUN apt-get -y update +RUN apt-get install -y pcp pcp-webapi bpfcc-tools + diff --git a/test/pcp-target/etc_apt_sources.list.d_pcp.list b/test/pcp-target/etc_apt_sources.list.d_pcp.list new file mode 100644 index 000000000..a454b36b7 --- /dev/null +++ b/test/pcp-target/etc_apt_sources.list.d_pcp.list @@ -0,0 +1,2 @@ +deb https://dl.bintray.com/pcp/bionic bionic main + diff --git a/test/rawdata.json b/test/rawdata.json new file mode 100644 index 000000000..5fca5ac2e --- /dev/null +++ b/test/rawdata.json @@ -0,0 +1,293 @@ +[ + { + "timestamp": { "s": 1534976615, "us": 285259 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.1 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0.0099999998 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976617, "us": 275733 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.1 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0.0099999998 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976619, "us": 278537 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.090000004 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976621, "us": 284537 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.090000004 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976623, "us": 275739 }, + "values": [ + { + "pmid": 251660288, + "name": "kernel.all.load", + "instances": [ + { "instance": 1, "value": 0.090000004 }, + { "instance": 5, "value": 0.039999999 }, + { "instance": 15, "value": 0 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976631, "us": 279162 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130837 }, + { "instance": 2, "value": 256041 }, + { "instance": 3, "value": 107807 }, + { "instance": 4, "value": 110856 }, + { "instance": 5, "value": 60577 }, + { "instance": 6, "value": 294239 }, + { "instance": 7, "value": 29600 }, + { "instance": 8, "value": 6820 }, + { "instance": 9, "value": 3919 }, + { "instance": 10, "value": 2453 }, + { "instance": 11, "value": 3321 }, + { "instance": 12, "value": 2064 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976633, "us": 277205 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130838 }, + { "instance": 2, "value": 256049 }, + { "instance": 3, "value": 107833 }, + { "instance": 4, "value": 110898 }, + { "instance": 5, "value": 60583 }, + { "instance": 6, "value": 294242 }, + { "instance": 7, "value": 29602 }, + { "instance": 8, "value": 6822 }, + { "instance": 9, "value": 3922 }, + { "instance": 10, "value": 2454 }, + { "instance": 11, "value": 3322 }, + { "instance": 12, "value": 2064 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976635, "us": 294204 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130840 }, + { "instance": 2, "value": 256061 }, + { "instance": 3, "value": 107855 }, + { "instance": 4, "value": 110937 }, + { "instance": 5, "value": 60595 }, + { "instance": 6, "value": 294249 }, + { "instance": 7, "value": 29606 }, + { "instance": 8, "value": 6827 }, + { "instance": 9, "value": 3923 }, + { "instance": 10, "value": 2454 }, + { "instance": 11, "value": 3323 }, + { "instance": 12, "value": 2064 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976637, "us": 278937 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130840 }, + { "instance": 2, "value": 256063 }, + { "instance": 3, "value": 107858 }, + { "instance": 4, "value": 110974 }, + { "instance": 5, "value": 60615 }, + { "instance": 6, "value": 294255 }, + { "instance": 7, "value": 29611 }, + { "instance": 8, "value": 6827 }, + { "instance": 9, "value": 3923 }, + { "instance": 10, "value": 2457 }, + { "instance": 11, "value": 3324 }, + { "instance": 12, "value": 2065 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976639, "us": 277099 }, + "values": [ + { + "pmid": 624955392, + "name": "bcc.runq.latency", + "instances": [ + { "instance": 0, "value": 5583 }, + { "instance": 1, "value": 130842 }, + { "instance": 2, "value": 256079 }, + { "instance": 3, "value": 107885 }, + { "instance": 4, "value": 110997 }, + { "instance": 5, "value": 60642 }, + { "instance": 6, "value": 294266 }, + { "instance": 7, "value": 29616 }, + { "instance": 8, "value": 6829 }, + { "instance": 9, "value": 3925 }, + { "instance": 10, "value": 2459 }, + { "instance": 11, "value": 3328 }, + { "instance": 12, "value": 2066 }, + { "instance": 13, "value": 588 }, + { "instance": 14, "value": 209 }, + { "instance": 15, "value": 57 }, + { "instance": 16, "value": 19 }, + { "instance": 17, "value": 2 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976643, "us": 287355 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365600 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976645, "us": 275819 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365620 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976647, "us": 276417 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365630 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + }, + { + "timestamp": { "s": 1534976649, "us": 276794 }, + "values": [ + { + "pmid": 251658262, + "name": "kernel.all.cpu.sys", + "instances": [ + { "instance": -1, "value": 365640 } + ] + }, + { + "pmid": 251658272, + "name": "hinv.ncpu", + "instances": [ + { "instance": -1, "value": 1 } + ] + } + ] + } +] diff --git a/webpack.common.js b/webpack.common.js new file mode 100644 index 000000000..a1abedba7 --- /dev/null +++ b/webpack.common.js @@ -0,0 +1,96 @@ +'use strict' +const webpack = require('webpack') +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const WebpackAutoInjectVersion = require('webpack-auto-inject-version') + +module.exports = { + entry: { + javascript: './src/app/App.jsx' + }, + output: { + path: path.join(__dirname, '/dist/'), + filename: 'scripts/bundle.js', + publicPath: '' + }, + externals: { + config: 'config' + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + enforce: 'pre', + exclude: [ /node_modules/, /src\/\_app/ ], + use: [ + { loader: 'eslint-loader' } + ] + }, + { + test: /\.(js|jsx)$/, + exclude: [ /node_modules/ ], + use: [ + { loader: 'babel-loader', options: { babelrc: true } } + ] + }, + { + test: /\.html$/, + exclude: [ + path.resolve(__dirname, 'src/index.html'), + ], + use: [ + { loader: "html-loader" } + ] + }, + { + test: /\.css$/, + use: [ + { loader: "style-loader" }, // creates style nodes from JS strings + { loader: "css-loader" }, // translates CSS into CommonJS + ] + }, + { + test: /\.woff2?(\?v=[0-9]\.[0-9]\.[0-9])?$/, + use: 'url-loader?name=fonts/[name].[ext]&limit=10000', + }, + { + test: /\.(png)(\?[\s\S]+)?$/, + use: 'file-loader?name=images/[name].[ext]', + }, + { + test: /\.(ttf|eot|svg|otf)(\?[\s\S]+)?$/, + use: 'file-loader?name=fonts/[name].[ext]', + }, + { + test: /\.scss$/, + use: [ + { loader: "style-loader" }, // creates style nodes from JS strings + { loader: "css-loader" }, // translates CSS into CommonJS + { loader: "sass-loader" } // compiles Sass to CSS + ] + } + ] + }, + plugins: [ + // needs to go first to insert the file in js + new WebpackAutoInjectVersion({ + components: { + AutoIncreaseVersion: false, + InjectAsComment: false, + InjectByTag: true + } + }), + // the html, which will have the bundle.js script tag injected + new HtmlWebpackPlugin({ + template: 'src/app/index.html', + inject: 'body' + }), + // copy static assets + new CopyWebpackPlugin([ + { from: 'src/config.js', to: 'config.js' }, + { from: 'src/favicon.ico', to: 'favicon.ico' }, + { from: 'src/assets/images/vector_owl.png', to: 'assets/images/vector_owl.png' } + ]) + ] +} diff --git a/webpack.dev.js b/webpack.dev.js new file mode 100644 index 000000000..5c39fb487 --- /dev/null +++ b/webpack.dev.js @@ -0,0 +1,7 @@ +const merge = require('webpack-merge') +const common = require('./webpack.common.js') + +module.exports = merge(common, { + mode: 'development', + devtool: 'inline-source-map', +}) diff --git a/webpack.prod.js b/webpack.prod.js new file mode 100644 index 000000000..9a1a72fb5 --- /dev/null +++ b/webpack.prod.js @@ -0,0 +1,7 @@ +const merge = require('webpack-merge') +const common = require('./webpack.common.js') + +module.exports = merge(common, { + mode: 'production', + devtool: 'source-map', +})