From f65fd57cecb9a806db2df20e14aef5b36deb228b Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 25 Nov 2015 16:47:32 -0800 Subject: [PATCH 01/69] Added support for defining a custom bgColor per row. --- src/webglimpse/timeline/timeline_model.ts | 15 +++++++++++++++ src/webglimpse/timeline/timeline_pane.ts | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index efc019a..ab0ee67 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -88,6 +88,7 @@ module Webglimpse { rowGuid : string; label : string; hidden? : boolean; + bgColor? : string; yMin? : number; yMax? : number; uiHint? : string; @@ -656,6 +657,7 @@ module Webglimpse { private _timeseriesGuids : OrderedStringSet; private _annotationGuids : OrderedStringSet; private _dataAxis : Axis1D; + private _bgColor : Color; constructor( row : TimelineRow ) { this._rowGuid = row.rowGuid; @@ -684,6 +686,7 @@ module Webglimpse { this._label = row.label; this._uiHint = row.uiHint; this._hidden = row.hidden; + this._bgColor = ( hasval( row.bgColor ) ? parseCssColor( row.bgColor ) : null ); this._attrsChanged.fire( ); } @@ -695,6 +698,17 @@ module Webglimpse { this._hidden = hidden; this._attrsChanged.fire( ); } + + get bgColor( ) : Color { + return this._bgColor; + } + + set bgColor( bgColor : Color ) { + if ( bgColor !== this._bgColor ) { + this._bgColor = bgColor; + this._attrsChanged.fire( ); + } + } get dataAxis( ) : Axis1D { return this._dataAxis; @@ -744,6 +758,7 @@ module Webglimpse { rowGuid: this._rowGuid, label: this._label, hidden: this._hidden, + bgColor: ( hasval( this._bgColor ) ? this._bgColor.cssString : null ), uiHint: this._uiHint, eventGuids: this._eventGuids.toArray( ), timeseriesGuids: this._timeseriesGuids.toArray( ), diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 958eed3..ba764fb 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -753,6 +753,9 @@ module Webglimpse { function newRowBackgroundPainter( group : TimelineGroupModel, row : TimelineRowModel ) { return function( gl : WebGLRenderingContext ) { var color = ( group.rowGuids.indexOf( row.rowGuid ) % 2 ? rowBgColor : rowAltBgColor ); + if(row.bgColor) { + color = row.bgColor; + } gl.clearColor( color.r, color.g, color.b, color.a ); gl.clear( GL.COLOR_BUFFER_BIT ); }; From a21156143da39f8e84395b9df2814aa7eb23916f Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Tue, 1 Dec 2015 16:48:30 -0800 Subject: [PATCH 02/69] Added dash fragment shader. Added code to series render function to push necessary data to the dash shader. Added dash property to timeseries. --- src/webglimpse/misc.ts | 18 +++++++++++++ src/webglimpse/timeline/timeline_model.ts | 17 +++++++++++- src/webglimpse/timeline/timeline_pane.ts | 2 +- .../timeline/timeline_timeseries_row.ts | 27 ++++++++++++++++--- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index cec99e7..b707498 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -160,6 +160,24 @@ module Webglimpse { ' } ', ' ' ); + + + export var dash_FRAGSHADER = concatLines( + ' precision highp float; ', + ' uniform mat4 u_modelViewMatrix; ', + ' varying float v_Distance; ', + ' uniform float u_Dash; ', + ' uniform vec4 u_Color; ', + ' ', + ' void main( ) { ', + ' float v = floor(2.0 * fract(v_Distance * (u_Dash * (10.0 * u_modelViewMatrix[0][0])))); ', + ' if(v > 0.5) ', + ' discard; ', + ' else ', + ' gl_FragColor = u_Color; ', + ' } ', + ' ' + ); export var varyingColor_FRAGSHADER = concatLines( diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index ab0ee67..9fe5d1e 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -52,7 +52,8 @@ module Webglimpse { lineColor? : string; pointColor? : string; lineThickness? : number; - pointSize? : number + pointSize? : number; + dash? : number; fragmentGuids? : string[]; } @@ -228,6 +229,7 @@ module Webglimpse { private _pointColor : Color; private _lineThickness : number; private _pointSize : number; + private _dash : number; private _fragmentGuids : OrderedStringSet; constructor( timeseries : TimelineTimeseries ) { @@ -253,6 +255,7 @@ module Webglimpse { this._pointColor = ( hasval( timeseries.pointColor ) ? parseCssColor( timeseries.pointColor ) : null ); this._lineThickness = timeseries.lineThickness; this._pointSize = timeseries.pointSize; + this._dash = timeseries.dash; this._fragmentGuids = new OrderedStringSet( timeseries.fragmentGuids || [] ); this._attrsChanged.fire( ); } @@ -311,6 +314,17 @@ module Webglimpse { this._attrsChanged.fire( ); } } + + get dash( ) : number { + return this._dash; + } + + set dash( dash : number ) { + if ( dash !== this._dash ) { + this._dash = dash; + this._attrsChanged.fire( ); + } + } get uiHint( ) : string { return this._uiHint; @@ -343,6 +357,7 @@ module Webglimpse { pointColor: ( hasval( this._pointColor ) ? this._pointColor.cssString : null ), lineThickness: this._lineThickness, pointSize: this._pointSize, + dash: this._dash, fragmentGuids: this._fragmentGuids.toArray( ), }; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index ba764fb..313ed42 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -500,7 +500,7 @@ module Webglimpse { } - function newTimelineSingleSelectionPainter( timeAxis : TimeAxis1D, interval : TimeIntervalModel, borderColor : Color, fillColor : Color ) : Painter { + export function newTimelineSingleSelectionPainter( timeAxis : TimeAxis1D, interval : TimeIntervalModel, borderColor : Color, fillColor : Color ) : Painter { var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); var a_XyFrac = new Attribute( program, 'a_XyFrac' ); diff --git a/src/webglimpse/timeline/timeline_timeseries_row.ts b/src/webglimpse/timeline/timeline_timeseries_row.ts index db30bd5..7f45517 100644 --- a/src/webglimpse/timeline/timeline_timeseries_row.ts +++ b/src/webglimpse/timeline/timeline_timeseries_row.ts @@ -362,25 +362,32 @@ module Webglimpse { var modelview_pointsize_VERTSHADER = concatLines( ' uniform mat4 u_modelViewMatrix; ', ' attribute vec4 a_Position; ', + ' attribute float a_Distance; ', + ' varying float v_Distance; ', ' uniform float u_PointSize; ', ' ', ' void main( ) { ', ' gl_PointSize = u_PointSize ; ', ' gl_Position = u_modelViewMatrix * a_Position ; ', + ' v_Distance = a_Distance; ', ' } ', ' ' ); - var program = new Program( modelview_pointsize_VERTSHADER, solid_FRAGSHADER ); + var program = new Program( modelview_pointsize_VERTSHADER, dash_FRAGSHADER ); var u_Color = new UniformColor( program, 'u_Color' ); var u_modelViewMatrix = new UniformMatrix4f( program, 'u_modelViewMatrix' ); var a_Position = new Attribute( program, 'a_Position' ); + var a_Distance = new Attribute( program, 'a_Distance' ); var u_PointSize = new Uniform1f( program, 'u_PointSize' ); + var u_Dash = new Uniform1f( program, 'u_Dash' ); var axis = new Axis2D( timeAxis, dataAxis ); var xys = new Float32Array( 0 ); + var dists = new Float32Array( 0 ); var xysBuffer = newDynamicBuffer( ); + var distBuffer = newDynamicBuffer( ); // Painter return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { @@ -393,8 +400,7 @@ module Webglimpse { u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); - for ( var i = 0 ; i < rowModel.timeseriesGuids.length ; i++ ) { - + for ( var i = 0 ; i < rowModel.timeseriesGuids.length ; i++ ) { // collect fragments and sort them by time var totalSize = 0; var sortedFragments = new Array( ); @@ -414,6 +420,7 @@ module Webglimpse { var size = totalSize * 2; xys = ensureCapacityFloat32( xys, size ); + dists = ensureCapacityFloat32( dists, totalSize ); var index = 0; for ( var j = 0 ; j < sortedFragments.length ; j++ ) { @@ -424,17 +431,31 @@ module Webglimpse { for ( var k = 0 ; k < data.length ; k++,index+=2 ) { xys[index] = timeAxis.vAtTime( times_PMILLIS[k] ); xys[index+1] = data[k]; + if(k != 0) { + var x = (timeAxis.vAtTime( times_PMILLIS[k] ) - timeAxis.vAtTime( times_PMILLIS[k - 1] )); + var y = data[k] - data[k - 1]; + dists[k] = dists[k - 1] + Math.sqrt(x * x + y * y); + } + else { + dists[k] = 0; + } } } var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; u_Color.setData( gl, lineColor ); + + var dash = hasval( timeseries.dash ) ? timeseries.dash : 0; + u_Dash.setData(gl, dash); var lineThickness = hasval( timeseries.lineThickness ) ? timeseries.lineThickness : defaultThickness; gl.lineWidth( lineThickness ); xysBuffer.setData( xys.subarray( 0, index ) ); a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + + distBuffer.setData( dists.subarray( 0, totalSize) ); + a_Distance.setDataAndEnable( gl, distBuffer, 1, GL.FLOAT ); if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { // draw the lines From ee550aff5200cca3841dde769ee377c22a2f0e9d Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 2 Dec 2015 13:58:03 -0800 Subject: [PATCH 03/69] Made lines use different shader program than area/bars to get rid of webgl errors. --- .../timeline/timeline_timeseries_row.ts | 65 ++++++++++++++----- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/src/webglimpse/timeline/timeline_timeseries_row.ts b/src/webglimpse/timeline/timeline_timeseries_row.ts index 7f45517..59ef207 100644 --- a/src/webglimpse/timeline/timeline_timeseries_row.ts +++ b/src/webglimpse/timeline/timeline_timeseries_row.ts @@ -359,7 +359,7 @@ module Webglimpse { var defaultColor = hasval( options ) && hasval( options.timelineFgColor ) ? options.timelineFgColor : white; var defaultThickness = hasval( options ) && hasval( options.timelineThickness ) ? options.timelineThickness : 1; - var modelview_pointsize_VERTSHADER = concatLines( + var modelview_line_VERTSHADER = concatLines( ' uniform mat4 u_modelViewMatrix; ', ' attribute vec4 a_Position; ', ' attribute float a_Distance; ', @@ -373,14 +373,33 @@ module Webglimpse { ' } ', ' ' ); + + var modelview_pointsize_VERTSHADER = concatLines( + ' uniform mat4 u_modelViewMatrix; ', + ' attribute vec4 a_Position; ', + ' uniform float u_PointSize; ', + ' ', + ' void main( ) { ', + ' gl_PointSize = u_PointSize ; ', + ' gl_Position = u_modelViewMatrix * a_Position ; ', + ' } ', + ' ' + ); + + var program = new Program( modelview_pointsize_VERTSHADER, solid_FRAGSHADER ); - var program = new Program( modelview_pointsize_VERTSHADER, dash_FRAGSHADER ); var u_Color = new UniformColor( program, 'u_Color' ); var u_modelViewMatrix = new UniformMatrix4f( program, 'u_modelViewMatrix' ); var a_Position = new Attribute( program, 'a_Position' ); - var a_Distance = new Attribute( program, 'a_Distance' ); var u_PointSize = new Uniform1f( program, 'u_PointSize' ); - var u_Dash = new Uniform1f( program, 'u_Dash' ); + + var lineProgram = new Program( modelview_line_VERTSHADER, dash_FRAGSHADER ); + var u_lpColor = new UniformColor( lineProgram, 'u_Color' ); + var u_lpmodelViewMatrix = new UniformMatrix4f( lineProgram, 'u_modelViewMatrix' ); + var a_lpPosition = new Attribute( lineProgram, 'a_Position' ); + var u_lpPointSize = new Uniform1f( lineProgram, 'u_PointSize' ); + var a_lpDistance = new Attribute( lineProgram, 'a_Distance' ); + var u_lpDash = new Uniform1f( lineProgram, 'u_Dash' ); var axis = new Axis2D( timeAxis, dataAxis ); @@ -395,11 +414,6 @@ module Webglimpse { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - // enable the shader - program.use( gl ); - - u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); - for ( var i = 0 ; i < rowModel.timeseriesGuids.length ; i++ ) { // collect fragments and sort them by time var totalSize = 0; @@ -416,7 +430,11 @@ module Webglimpse { sortedFragments.sort( ( a,b ) => { return a.start_PMILLIS - b.start_PMILLIS; } ); if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { - + + // enable the shader + lineProgram.use( gl ); + + u_lpmodelViewMatrix.setData( gl, glOrthoAxis( axis ) ); var size = totalSize * 2; xys = ensureCapacityFloat32( xys, size ); @@ -443,19 +461,19 @@ module Webglimpse { } var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; - u_Color.setData( gl, lineColor ); + u_lpColor.setData( gl, lineColor ); var dash = hasval( timeseries.dash ) ? timeseries.dash : 0; - u_Dash.setData(gl, dash); + u_lpDash.setData(gl, dash); var lineThickness = hasval( timeseries.lineThickness ) ? timeseries.lineThickness : defaultThickness; gl.lineWidth( lineThickness ); xysBuffer.setData( xys.subarray( 0, index ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + a_lpPosition.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); distBuffer.setData( dists.subarray( 0, totalSize) ); - a_Distance.setDataAndEnable( gl, distBuffer, 1, GL.FLOAT ); + a_lpDistance.setDataAndEnable( gl, distBuffer, 1, GL.FLOAT ); if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { // draw the lines @@ -473,9 +491,12 @@ module Webglimpse { gl.drawArrays( GL.POINTS, 0, size / 2 ); } + lineProgram.endUse( gl ); } else if ( timeseries.uiHint == 'bars' ) { - + // enable the shader + program.use( gl ); + u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); // The last data point defines the right edge of the bar // but it does not have its own bar drawn, so we need at // least 2 data points to draw any bars @@ -510,9 +531,13 @@ module Webglimpse { gl.drawArrays( GL.TRIANGLES, 0, size / 2 ); } + program.endUse( gl ); } else if ( timeseries.uiHint == 'area' ) { - + // enable the shader + program.use( gl ); + u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); + var baseline : number = timeseries.baseline; var size = totalSize * 4; @@ -547,11 +572,16 @@ module Webglimpse { gl.drawArrays( GL.TRIANGLE_STRIP, 0, size / 2 ); + program.endUse( gl ); } // highlight hovered point if ( selection.hoveredTimeseries.fragment && timeseries.fragmentGuids.hasValue( selection.hoveredTimeseries.fragment.fragmentGuid ) ) { + // enable the shader + program.use( gl ); + u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); + if ( timeseries.uiHint == 'area' || timeseries.uiHint == 'lines' || timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { var size = 8; xys = ensureCapacityFloat32( xys, size ); @@ -610,12 +640,13 @@ module Webglimpse { gl.drawArrays( GL.LINE_LOOP, 0, size / 2 ); } } + program.endUse( gl ); } } // disable shader and attribute buffers a_Position.disable( gl ); - program.endUse( gl ); + a_lpDistance.disable( gl ); } } } From 3efa664a760db383321c36579cb8295a98ce8dd2 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Tue, 15 Dec 2015 16:46:46 -0800 Subject: [PATCH 04/69] Added ability to highlight a group. If it's highglighted a thick colored line is added before the group name. --- src/webglimpse/timeline/timeline_model.ts | 15 ++++++++++++ src/webglimpse/timeline/timeline_pane.ts | 29 +++++++++++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 9fe5d1e..659e346 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -104,6 +104,7 @@ module Webglimpse { label : string; hidden? : boolean; collapsed? : boolean; + highlighted?: boolean; rowGuids : string[]; } @@ -789,6 +790,7 @@ module Webglimpse { private _hidden : boolean; private _label : string; private _collapsed : boolean; + private _highlighted : boolean; private _rowGuids : OrderedStringSet; constructor( group : TimelineGroup ) { @@ -811,6 +813,7 @@ module Webglimpse { this._hidden = group.hidden; this._label = group.label; this._collapsed = group.collapsed; + this._highlighted = hasval(group.highlighted) ? group.highlighted : false; this._attrsChanged.fire( ); } @@ -845,6 +848,17 @@ module Webglimpse { } } + get highlighted(): boolean { + return this._highlighted; + } + + set highlighted(highlighted: boolean) { + if (highlighted !== this._highlighted) { + this._highlighted = highlighted; + this._attrsChanged.fire(); + } + } + get rowGuids( ) : OrderedStringSet { return this._rowGuids; } @@ -855,6 +869,7 @@ module Webglimpse { label: this._label, hidden: this._hidden, collapsed: ( hasval( this._collapsed ) ? this._collapsed : false ), + highlighted: (hasval(this._highlighted) ? this._highlighted : false), rowGuids: this._rowGuids.toArray( ) }; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 313ed42..c199d96 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -61,6 +61,7 @@ module Webglimpse { fgColor? : Color; rowLabelColor? : Color; groupLabelColor? : Color; + groupHighlightColor? : Color; axisLabelColor? : Color; bgColor? : Color; rowBgColor? : Color; @@ -99,6 +100,7 @@ module Webglimpse { var fgColor = ( hasval( options ) && hasval( options.fgColor ) ? options.fgColor : white ); var rowLabelColor = ( hasval( options ) && hasval( options.rowLabelColor ) ? options.rowLabelColor : fgColor ); var groupLabelColor = ( hasval( options ) && hasval( options.groupLabelColor ) ? options.groupLabelColor : fgColor ); + var groupHighlightColor = ( hasval(options ) && hasval( options.groupHighlightColor ) ? options.groupHighlightColor : rgb( 0, 1, 1 ) ); var axisLabelColor = ( hasval( options ) && hasval( options.axisLabelColor ) ? options.axisLabelColor : fgColor ); var bgColor = ( hasval( options ) && hasval( options.bgColor ) ? options.bgColor : rgb( 0.098, 0.165, 0.243 ) ); var rowBgColor = ( hasval( options ) && hasval( options.rowBgColor ) ? options.rowBgColor : rgb( 0.020, 0.086, 0.165 ) ); @@ -138,7 +140,7 @@ module Webglimpse { selection.selectedEvents.valueRemoved.on( redraw ); var tickTimeZone = ( showTopAxis ? topTimeZone : bottomTimeZone ); - var contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, groupLabelColor: groupLabelColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance }; + var contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance }; var contentPane = newTimelineContentPane( drawable, timeAxis, model, ui, contentPaneOpts ); var scrollLayout = newVerticalScrollLayout( ); @@ -625,6 +627,7 @@ module Webglimpse { fgColor : Color; rowLabelColor : Color; groupLabelColor : Color; + groupHighlightColor : Color; axisLabelColor : Color; bgColor : Color; rowBgColor : Color; @@ -655,6 +658,7 @@ module Webglimpse { var fgColor = options.fgColor; var rowLabelColor = options.rowLabelColor; var groupLabelColor = options.groupLabelColor; + var groupHighlightColor = options.groupHighlightColor; var axisLabelColor = options.axisLabelColor; var bgColor = options.bgColor; var rowBgColor = options.rowBgColor; @@ -705,10 +709,15 @@ module Webglimpse { groupHeaderStripe.addPane( newSolidPane( groupLabelColor ), 1, { height: 1 } ); groupHeaderStripe.addPane( new Pane( null ), 2, { height: null } ); + //Testing adding a highlight + var groupHeaderHighlight = new Pane( newColumnLayout( ) ); + groupHeaderHighlight.addPane(newSolidPane( groupHighlightColor ), 1, { width: 6, height: null }); + var groupHeaderUnderlay = new Pane( newColumnLayout( ) ); groupHeaderUnderlay.addPainter( newBackgroundPainter( bgColor ) ); - groupHeaderUnderlay.addPane( groupButton, 0 ); - groupHeaderUnderlay.addPane( groupHeaderStripe, 1, { ignoreHeight: true } ); + groupHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); + groupHeaderUnderlay.addPane( groupButton, 1 ); + groupHeaderUnderlay.addPane( groupHeaderStripe, 2, { ignoreHeight: true } ); var groupHeaderOverlay = newTimeAxisPane( timeAxis, ui, draggableEdgeWidth, null, selectedIntervalMode ); var groupHeaderOverlayInsets = newInsets( 0, 0, 0, rowLabelPaneWidth ); @@ -728,14 +737,24 @@ module Webglimpse { groupHeaderPanes[ groupGuid ] = groupHeaderPane; groupContentPanes[ groupGuid ] = groupContentPane; - var groupAttrsChanged = function( ) { + var groupAttrsChanged = function( group ) { var groupContentLayoutOpts = timelineContentPane.layoutOptions( groupContentPane ); + var groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); + var redraw = false; + if(group.highlighted !== (!groupHighlightLayoutOpts.hide)) { + groupHighlightLayoutOpts.hide = !group.highlighted; + redraw = true; + } if ( group.collapsed !== groupContentLayoutOpts.hide ) { groupContentLayoutOpts.hide = group.collapsed; + redraw = true; + } + if(redraw) { drawable.redraw( ); } - }; + }.bind(this, group); group.attrsChanged.on( groupAttrsChanged ); + groupAttrsChanged(); groupButton.mouseDown.on( function( ) { group.collapsed = !group.collapsed; From 7cf91ff02ba23272b65f4681b64684f739d41e44 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 10 Aug 2016 14:51:01 -0700 Subject: [PATCH 05/69] Fix issues after merging mocu-changes. group highlighting, dashes, (row colors is now done in master) --- src/webglimpse/timeline/timeline_model.ts | 217 +++++++------ src/webglimpse/timeline/timeline_pane.ts | 351 +++++++++++----------- 2 files changed, 280 insertions(+), 288 deletions(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 69c4721..940b46b 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -28,8 +28,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ module Webglimpse { - - + + export interface TimelineAnnotation { annotationGuid : string; // time (x axis position) of annotation @@ -39,7 +39,7 @@ module Webglimpse { label : string; styleGuid : string; } - + export interface TimelineTimeseries { timeseriesGuid : string; @@ -62,7 +62,7 @@ module Webglimpse { fragmentGuid : string; data? : number[]; times_ISO8601? : string[]; - + // undefined : user cannot adjust data points // 'y' : user can adjust y value of points, but not time value // 'xy : user can adjust both x (time) and y value of points @@ -107,7 +107,7 @@ module Webglimpse { labelVAlign? : number; // relative position within the text label of the point considered the start of the label text (0 = bottom, 1 = top) this is the point positioned by labelVAlign // if labelVPos is not set, it defaults to labelVAlign's value, which is usually what is intended anyway - labelVPos? : number; + labelVPos? : number; // vertical alignment of label text (0=left side, 0.5 = middle of event, 1=right side) labelHAlign? : number; // relative position within the text label of the point considered the start of the label text (0 = left side, 1 = right side) this is the point positioned by labelHAlign @@ -163,7 +163,7 @@ module Webglimpse { root : TimelineRoot; } - + export class TimelineAnnotationModel { private _annotationGuid : string; private _attrsChanged : Notification; @@ -171,13 +171,13 @@ module Webglimpse { private _y : number; private _label : string; private _styleGuid : string; - + constructor( annotation : TimelineAnnotation ) { this._annotationGuid = annotation.annotationGuid; this._attrsChanged = new Notification( ); this.setAttrs( annotation ); } - + get annotationGuid( ) : string { return this._annotationGuid; } @@ -185,7 +185,7 @@ module Webglimpse { get attrsChanged( ) : Notification { return this._attrsChanged; } - + setLocation( time_PMILLIS : number, y : number ) { if ( time_PMILLIS !== this._time_PMILLIS || y !== this.y ) { this._y = y; @@ -194,44 +194,44 @@ module Webglimpse { } } - + get time_PMILLIS( ) : number { return this._time_PMILLIS; } - + set time_PMILLIS( time_PMILLIS : number ) { if ( time_PMILLIS !== this._time_PMILLIS ) { this._time_PMILLIS = time_PMILLIS; this._attrsChanged.fire( ); } } - + get y( ) : number { return this._y; } - + set y( y : number ) { if ( y !== this.y ) { this._y = y; this._attrsChanged.fire( ); } } - + get label( ) : string { return this._label; } - + set label( label : string ) { if ( label !== this.label ) { this._label = label; this._attrsChanged.fire( ); } } - + get styleGuid( ) : string { return this._styleGuid; } - + set styleGuid( styleGuid : string ) { if ( styleGuid !== this.styleGuid ) { this._styleGuid = styleGuid; @@ -247,7 +247,7 @@ module Webglimpse { this._styleGuid = annotation.styleGuid; this._attrsChanged.fire( ); } - + snapshot( ) : TimelineAnnotation { return { annotationGuid: this._annotationGuid, @@ -354,7 +354,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get dash( ) : number { return this._dash; } @@ -376,11 +376,11 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get fragmentGuids( ) : OrderedStringSet { return this._fragmentGuids; } - + set fragmentGuids( fragmentGuids : OrderedStringSet ) { if ( fragmentGuids !== this._fragmentGuids ) { this._fragmentGuids = fragmentGuids; @@ -407,7 +407,7 @@ module Webglimpse { export class TimelineTimeseriesFragmentModel { private _fragmentGuid : string; // notification provides the start and end indexes of the modified range - // start index is inclusive, end index is exclusive + // start index is inclusive, end index is exclusive private _dataChanged : Notification2; private _attrsChanged : Notification; private _userEditMode : string; @@ -460,7 +460,7 @@ module Webglimpse { this._dataChanged.fire( 0, this._data.length ); } } - + // Time should only be modified in a way which keeps the _times_PMILLIS // array sorted. This is currently not enforced by the model. setAllData( data : number[], times_PMILLIS : number[] ) { @@ -470,7 +470,7 @@ module Webglimpse { this._dataChanged.fire( 0, this._data.length ); } } - + // Handles adjusting the _times_PMILLIS and _data arrays if the new time // requires them to be rearranged to stay in time order. Returns the new // index assigned to the data point. @@ -488,11 +488,11 @@ module Webglimpse { // remove the current point at index this._times_PMILLIS.splice( index, 1 ); this._data.splice( index, 1 ); - + // find the index to reinsert new data at index = indexOf( this._times_PMILLIS, time ); if ( index < 0 ) index = -index-1; - + this._times_PMILLIS.splice( index, 0, time ); this._data.splice( index, 0, value ); this._dataChanged.fire( index, index+1 ); @@ -503,10 +503,10 @@ module Webglimpse { this._dataChanged.fire( index, index+1 ); } } - + return index; } - + get start_PMILLIS( ) : number { return this._times_PMILLIS[ 0 ]; } @@ -514,7 +514,7 @@ module Webglimpse { get end_PMILLIS( ) : number { return this._times_PMILLIS.slice( -1 )[ 0 ]; } - + get userEditMode( ) : string { return this._userEditMode; } @@ -602,20 +602,20 @@ module Webglimpse { setInterval( start_PMILLIS : number, end_PMILLIS : number ) { if ( start_PMILLIS !== this._start_PMILLIS || end_PMILLIS !== this._end_PMILLIS ) { - + var initial_start_PMILLIS = this._start_PMILLIS; var initial_end_PMILLIS = this._end_PMILLIS; - + var underStartLimit = hasval( this._startLimit_PMILLIS ) && start_PMILLIS < this._startLimit_PMILLIS; var overEndLimit = hasval( this._endLimit_PMILLIS ) && end_PMILLIS > this._endLimit_PMILLIS; var duration_PMILLIS = end_PMILLIS - start_PMILLIS; var durationLimit_PMILLIS = this._endLimit_PMILLIS - this._startLimit_PMILLIS; - + // If both limits are present and the event is larger than the total distance between them // then shrink the event to fit between the limits. if ( hasval( this._startLimit_PMILLIS ) && hasval( this._endLimit_PMILLIS ) && durationLimit_PMILLIS < duration_PMILLIS ) { this._start_PMILLIS = this._startLimit_PMILLIS; - this._end_PMILLIS = this._endLimit_PMILLIS; + this._end_PMILLIS = this._endLimit_PMILLIS; } // Otherwise shift the event to comply with the limits without adjusting its total duration else if ( underStartLimit ) { @@ -628,9 +628,9 @@ module Webglimpse { } else { this._end_PMILLIS = end_PMILLIS; - this._start_PMILLIS = start_PMILLIS; + this._start_PMILLIS = start_PMILLIS; } - + // its possible due to the limits that the values didn't actually change // only fire attrsChanged if one of the values did actually change if ( initial_start_PMILLIS !== this._start_PMILLIS || initial_end_PMILLIS !== this._end_PMILLIS ) { @@ -638,15 +638,15 @@ module Webglimpse { } } } - + private limit_start_PMILLIS( start_PMILLIS : number ) { return hasval( this._startLimit_PMILLIS ) ? Math.max( start_PMILLIS, this._startLimit_PMILLIS ) : start_PMILLIS; } - + private limit_end_PMILLIS( end_PMILLIS : number ) { return hasval( this._endLimit_PMILLIS ) ? Math.min( end_PMILLIS, this._endLimit_PMILLIS ) : end_PMILLIS; } - + get start_PMILLIS( ) : number { return this._start_PMILLIS; } @@ -668,7 +668,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get startLimit_PMILLIS( ) : number { return this._startLimit_PMILLIS; } @@ -730,40 +730,40 @@ module Webglimpse { get styleGuid( ) : string { return this._styleGuid; } - + set styleGuid( styleGuid : string ) { if ( styleGuid !== this._styleGuid ) { this._styleGuid = styleGuid; this._attrsChanged.fire( ); } } - + get order( ) : number { return this._order; } - + set order( order : number ) { if ( order !== this._order ) { this._order = order; this._attrsChanged.fire( ); } } - + get topMargin( ) : number { return this._topMargin; } - + set topMargin( topMargin : number ) { if ( topMargin !== this._topMargin ) { this._topMargin = topMargin; this._attrsChanged.fire( ); } } - + get bottomMargin( ) : number { return this._bottomMargin; } - + set bottomMargin( bottomMargin : number ) { if ( bottomMargin !== this._bottomMargin ) { this._bottomMargin = bottomMargin; @@ -803,66 +803,66 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get labelTopMargin( ) : number { return this._labelTopMargin; } - + set labelTopMargin( labelTopMargin : number ) { if ( labelTopMargin !== this._labelTopMargin ) { this._labelTopMargin = labelTopMargin; this._attrsChanged.fire( ); } } - + get labelBottomMargin( ) : number { return this._labelBottomMargin; } - + set labelBottomMargin( labelBottomMargin : number ) { if ( labelBottomMargin !== this._labelBottomMargin ) { this._labelBottomMargin = labelBottomMargin; this._attrsChanged.fire( ); } } - + get labelVAlign( ) : number { return this._labelVAlign; } - + set labelVAlign( labelVAlign : number ) { if ( labelVAlign !== this._labelVAlign ) { this._labelVAlign = labelVAlign; this._attrsChanged.fire( ); } } - + get labelVPos( ) : number { return this._labelVPos; } - + set labelVPos( labelVPos : number ) { if ( labelVPos !== this._labelVPos ) { this._labelVPos = labelVPos; this._attrsChanged.fire( ); } } - + get labelHAlign( ) : number { return this._labelHAlign; } - + set labelHAlign( labelHAlign : number ) { if ( labelHAlign !== this._labelHAlign ) { this._labelHAlign = labelHAlign; this._attrsChanged.fire( ); } } - + get labelHPos( ) : number { return this._labelHPos; } - + set labelHPos( labelHPos : number ) { if ( labelHPos !== this._labelHPos ) { this._labelHPos = labelHPos; @@ -908,7 +908,6 @@ module Webglimpse { private _eventGuids : OrderedStringSet; private _timeseriesGuids : OrderedStringSet; private _annotationGuids : OrderedStringSet; - private _bgColor : Color; private _fgLabelColor : Color; private _bgLabelColor : Color; private _labelFont : string; @@ -918,11 +917,11 @@ module Webglimpse { constructor( row : TimelineRow ) { this._rowGuid = row.rowGuid; this._attrsChanged = new Notification( ); - + var min : number = hasval( row.yMin ) ? row.yMin : 0; var max : number = hasval( row.yMax ) ? row.yMax : 1; this._dataAxis = new Axis1D( min, max ); - + this.setAttrs( row ); this._eventGuids = new OrderedStringSet( row.eventGuids || [] ); this._timeseriesGuids = new OrderedStringSet( row.timeseriesGuids || [] ); @@ -949,40 +948,29 @@ module Webglimpse { this._labelFont = row.labelFont; this._attrsChanged.fire( ); } - + get rowHeight( ) : number { return this._rowHeight; } - + set rowHeight( rowHeight : number ) { this._rowHeight = rowHeight; this._attrsChanged.fire( ); } - + get hidden( ) : boolean { return this._hidden; } - + set hidden( hidden : boolean ) { this._hidden = hidden; this._attrsChanged.fire( ); } - - get bgColor( ) : Color { - return this._bgColor; - } - set bgColor( bgColor : Color ) { - if ( bgColor !== this._bgColor ) { - this._bgColor = bgColor; - this._attrsChanged.fire( ); - } - } - get dataAxis( ) : Axis1D { return this._dataAxis; } - + set dataAxis( dataAxis : Axis1D ) { this._dataAxis = dataAxis; this._attrsChanged.fire( ); @@ -1009,7 +997,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get bgColor( ) : Color { return this._bgColor; } @@ -1020,7 +1008,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get bgLabelColor( ) : Color { return this._bgLabelColor; } @@ -1031,7 +1019,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get fgLabelColor( ) : Color { return this._fgLabelColor; } @@ -1042,7 +1030,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get labelFont( ) : string { return this._labelFont; } @@ -1057,11 +1045,11 @@ module Webglimpse { get eventGuids( ) : OrderedStringSet { return this._eventGuids; } - + get timeseriesGuids( ) : OrderedStringSet { return this._timeseriesGuids; } - + get annotationGuids( ) : OrderedStringSet { return this._annotationGuids; } @@ -1072,7 +1060,6 @@ module Webglimpse { label: this._label, rowHeight: this._rowHeight, hidden: this._hidden, - bgColor: ( hasval( this._bgColor ) ? this._bgColor.cssString : null ), uiHint: this._uiHint, eventGuids: this._eventGuids.toArray( ), timeseriesGuids: this._timeseriesGuids.toArray( ), @@ -1110,12 +1097,12 @@ module Webglimpse { get rollupGuid( ) : string { return this._rollupGuid; } - + set rollupGuid( rollupGuid : string ) { this._rollupGuid = rollupGuid; this._attrsChanged.fire( ); } - + get attrsChanged( ) : Notification { return this._attrsChanged; } @@ -1129,11 +1116,11 @@ module Webglimpse { this._highlighted = hasval(group.highlighted) ? group.highlighted : false; this._attrsChanged.fire( ); } - + get hidden( ) : boolean { return this._hidden; } - + set hidden( hidden : boolean ) { this._hidden = hidden; this._attrsChanged.fire( ); @@ -1219,15 +1206,15 @@ module Webglimpse { get groupGuids( ) : OrderedStringSet { return this._groupGuids; } - + get topPinnedRowGuids( ) : OrderedStringSet { return this._topPinnedRowGuids; } - + get bottomPinnedRowGuids( ) : OrderedStringSet { return this._bottomPinnedRowGuids; } - + get maximizedRowGuids( ) : OrderedStringSet { return this._maximizedRowGuids; } @@ -1264,25 +1251,25 @@ module Webglimpse { private _root : TimelineRootModel; constructor( timeline? : Timeline ) { - + var annotations = ( hasval( timeline ) && hasval( timeline.annotations ) ? timeline.annotations : [] ); this._annotations = new OrderedSet( [], (g)=>g.annotationGuid ); for ( var n = 0; n < annotations.length; n++ ) { this._annotations.add( new TimelineAnnotationModel( annotations[ n ] ) ); } - + var timeseriesFragments = ( hasval( timeline ) && hasval( timeline.timeseriesFragments ) ? timeline.timeseriesFragments : [] ); this._timeseriesFragments = new OrderedSet( [], (e)=>e.fragmentGuid ); for ( var n = 0; n < timeseriesFragments.length; n++ ) { this._timeseriesFragments.add( new TimelineTimeseriesFragmentModel( timeseriesFragments[ n ] ) ); } - + var timeseries = ( hasval( timeline ) && hasval( timeline.timeseries ) ? timeline.timeseries : [] ); this._timeseries = new OrderedSet( [], (e)=>e.timeseriesGuid ); for ( var n = 0; n < timeseries.length; n++ ) { this._timeseries.add( new TimelineTimeseriesModel( timeseries[ n ] ) ); } - + var events = ( hasval( timeline ) && hasval( timeline.events ) ? timeline.events : [] ); this._events = new OrderedSet( [], (e)=>e.eventGuid ); for ( var n = 0; n < events.length; n++ ) { @@ -1304,7 +1291,7 @@ module Webglimpse { var root = ( hasval( timeline ) && hasval( timeline.root ) ? timeline.root : newEmptyTimelineRoot( ) ); this._root = new TimelineRootModel( root ); } - + get annotations( ) : OrderedSet { return this._annotations; } get timeseriesFragments( ) : OrderedSet { return this._timeseriesFragments; } get timeseriesSets( ) : OrderedSet { return this._timeseries; } @@ -1331,7 +1318,7 @@ module Webglimpse { this._root.topPinnedRowGuids.retainValues( freshRoot.topPinnedRowGuids ); this._root.bottomPinnedRowGuids.retainValues( freshRoot.bottomPinnedRowGuids ); this._root.maximizedRowGuids.retainValues( freshRoot.maximizedRowGuids ); - + var freshGroups = newTimeline.groups; var retainedGroupGuids : string[] = []; for ( var n = 0; n < freshGroups.length; n++ ) { @@ -1381,7 +1368,7 @@ module Webglimpse { } } this._timeseries.retainIds( retainedTimeseriesGuids ); - + var freshTimeseriesFragments = newTimeline.timeseriesFragments; var retainedTimeseriesFragmentGuids : string[] = []; for ( var n = 0; n < freshTimeseriesFragments.length; n++ ) { @@ -1393,7 +1380,7 @@ module Webglimpse { } } this._timeseriesFragments.retainIds( retainedTimeseriesFragmentGuids ); - + var freshAnnotations = newTimeline.annotations; var retainedAnnotationGuids : string[] = []; for ( var n = 0; n < freshAnnotations.length; n++ ) { @@ -1405,10 +1392,10 @@ module Webglimpse { } } this._annotations.retainIds( retainedAnnotationGuids ); - + // Add new items // - + for ( var n = 0; n < freshAnnotations.length; n++ ) { var freshAnnotation = freshAnnotations[ n ]; var oldAnnotation = this._annotations.valueFor( freshAnnotation.annotationGuid ); @@ -1419,7 +1406,7 @@ module Webglimpse { this._annotations.add( new TimelineAnnotationModel( freshAnnotation ) ); } } - + for ( var n = 0; n < freshTimeseriesFragments.length; n++ ) { var freshTimeseriesFragment = freshTimeseriesFragments[ n ]; var oldTimeseriesFragment = this._timeseriesFragments.valueFor( freshTimeseriesFragment.fragmentGuid ); @@ -1430,7 +1417,7 @@ module Webglimpse { this._timeseriesFragments.add( new TimelineTimeseriesFragmentModel( freshTimeseriesFragment ) ); } } - + for ( var n = 0; n < freshTimeseriesSet.length; n++ ) { var freshTimeseries = freshTimeseriesSet[ n ]; var oldTimeseries = this._timeseries.valueFor( freshTimeseries.timeseriesGuid ); @@ -1485,7 +1472,7 @@ module Webglimpse { merge( newData : Timeline, strategy : TimelineMergeStrategy ) { - + var newAnnotations = hasval( newData.annotations ) ? newData.annotations : []; for ( var n = 0; n < newAnnotations.length; n++ ) { var newAnnotation = newAnnotations[ n ]; @@ -1497,7 +1484,7 @@ module Webglimpse { this._annotations.add( new TimelineAnnotationModel( newAnnotation ) ); } } - + var newTimeseriesFragments = hasval( newData.timeseriesFragments ) ? newData.timeseriesFragments : []; for ( var n = 0; n < newTimeseriesFragments.length; n++ ) { var newTimeseriesFragment = newTimeseriesFragments[ n ]; @@ -1509,7 +1496,7 @@ module Webglimpse { this._timeseriesFragments.add( new TimelineTimeseriesFragmentModel( newTimeseriesFragment ) ); } } - + var newTimeseriesSet = hasval( newData.timeseries ) ? newData.timeseries : []; for ( var n = 0; n < newTimeseriesSet.length; n++ ) { var newTimeseries = newTimeseriesSet[ n ]; @@ -1521,7 +1508,7 @@ module Webglimpse { this._timeseries.add( new TimelineTimeseriesModel( newTimeseries ) ); } } - + var newEvents = hasval( newData.events ) ? newData.events : []; for ( var n = 0; n < newEvents.length; n++ ) { var newEvent = newEvents[ n ]; @@ -1587,20 +1574,20 @@ module Webglimpse { export var timelineMergeNewBeforeOld : TimelineMergeStrategy = { - + updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ) { annotationModel.setAttrs( newAnnotation ); }, - + updateTimeseriesFragmentModel( timeseriesFragmentModel : TimelineTimeseriesFragmentModel, newTimeseriesFragment : TimelineTimeseriesFragment ) { timeseriesFragmentModel.setAttrs( newTimeseriesFragment ); }, - + updateTimeseriesModel( timeseriesModel : TimelineTimeseriesModel, newTimeseries : TimelineTimeseries ) { timeseriesModel.setAttrs( newTimeseries ); timeseriesModel.fragmentGuids.addAll( ( newTimeseries.fragmentGuids || [] ), 0, true ); }, - + updateEventModel: function( eventModel : TimelineEventModel, newEvent : TimelineEvent ) { eventModel.setAttrs( newEvent ); }, @@ -1626,20 +1613,20 @@ module Webglimpse { export var timelineMergeNewAfterOld : TimelineMergeStrategy = { - + updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ) { annotationModel.setAttrs( newAnnotation ); }, - + updateTimeseriesFragmentModel( timeseriesFragmentModel : TimelineTimeseriesFragmentModel, newTimeseriesFragment : TimelineTimeseriesFragment ) { timeseriesFragmentModel.setAttrs( newTimeseriesFragment ); }, - + updateTimeseriesModel( timeseriesModel : TimelineTimeseriesModel, newTimeseries : TimelineTimeseries ) { timeseriesModel.setAttrs( newTimeseries ); timeseriesModel.fragmentGuids.addAll( newTimeseries.fragmentGuids || [] ); }, - + updateEventModel: function( eventModel : TimelineEventModel, newEvent : TimelineEvent ) { eventModel.setAttrs( newEvent ); }, diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index a511b4d..9e97086 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -54,7 +54,7 @@ module Webglimpse { // Scroll showScrollbar? : boolean; scrollbarOptions? : ScrollbarOptions; - + // Colors fgColor? : Color; rowLabelColor? : Color; @@ -92,7 +92,7 @@ module Webglimpse { axisPaneHeight? : number; draggableEdgeWidth? : number; snapToDistance? : number; - + // Event / Selection allowEventMultiSelection? : boolean; // Options: @@ -116,18 +116,18 @@ module Webglimpse { // Misc var font = ( hasval( options ) && hasval( options.font ) ? options.font : '11px verdana,sans-serif' ); var rowPaneFactoryChooser = ( hasval( options ) && hasval( options.rowPaneFactoryChooser ) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT ); - + // Scroll var showScrollbar = ( hasval( options ) && hasval( options.showScrollbar ) ? options.showScrollbar : true ); var scrollbarOptions = ( hasval( options ) ? options.scrollbarOptions : null ); - + // Colors var fgColor = ( hasval( options ) && hasval( options.fgColor ) ? options.fgColor : white ); var bgColor = ( hasval( options ) && hasval( options.bgColor ) ? options.bgColor : rgb( 0.098, 0.165, 0.243 ) ); var rowLabelColor = ( hasval( options ) && hasval( options.rowLabelColor ) ? options.rowLabelColor : fgColor ); var rowLabelBgColor = ( hasval( options ) && hasval( options.rowLabelBgColor ) ? options.rowLabelBgColor : bgColor ); var groupLabelColor = ( hasval( options ) && hasval( options.groupLabelColor ) ? options.groupLabelColor : fgColor ); - var groupHighlightColor = ( hasval(options ) && hasval( options.groupHighlightColor ) ? options.groupHighlightColor : rgb( 0, 1, 1 ) ); + var groupHighlightColor = ( hasval( options ) && hasval( options.groupHighlightColor ) ? options.groupHighlightColor : rgb( 0, 1, 1 ) ); var axisLabelColor = ( hasval( options ) && hasval( options.axisLabelColor ) ? options.axisLabelColor : fgColor ); var rowBgColor = ( hasval( options ) && hasval( options.rowBgColor ) ? options.rowBgColor : rgb( 0.020, 0.086, 0.165 ) ); var rowAltBgColor = ( hasval( options ) && hasval( options.rowAltBgColor ) ? options.rowAltBgColor : rgb( 0.020, 0.086, 0.165 ) ); @@ -171,11 +171,11 @@ module Webglimpse { else { // remove old panes (if the ui is being reused) var outsideManagedUi = true; - ui.panes.removeAll( ); + ui.panes.removeAll( ); } - + var selection = ui.selection; - + var redraw = function( ) { drawable.redraw( ); }; @@ -183,21 +183,21 @@ module Webglimpse { selection.hoveredEvent.changed.on( redraw ); selection.selectedEvents.valueAdded.on( redraw ); selection.selectedEvents.valueRemoved.on( redraw ); - + // Scroll Pane and Maximized Row Pane // - + // setup Pane which either shows timeline content, or only maximized rows - // able to switch between the two depending on model.root.maximizedRowGuids.isEmpty - + // able to switch between the two depending on model.root.maximizedRowGuids.isEmpty + // Scroll Pane - + var tickTimeZone = ( showTopAxis ? topTimeZone : bottomTimeZone ); - var contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; + var contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; var contentPaneArgs; - + if ( showScrollbar ) { - + var scrollLayout = newVerticalScrollLayout( ); var scrollable = new Pane( scrollLayout, false ); ui.addPane( 'scroll-content-pane', scrollable ); @@ -206,51 +206,51 @@ module Webglimpse { var scrollContentPane = newTimelineContentPane( contentPaneArgs ); ui.addPane( 'content-pane', scrollContentPane ); - + scrollable.addPane( scrollContentPane, 0 ); - + var scrollbar = newVerticalScrollbar( scrollLayout, drawable, scrollbarOptions ); ui.addPane( 'scrollbar', scrollbar ); - + var contentPane = new Pane( newColumnLayout( false ), false ); ui.addPane( 'scroll-outer-pane', contentPane ); - + contentPane.addPane( scrollbar, 0, { width: scrollbarWidth, ignoreHeight: true } ); contentPane.addPane( scrollable, 1 ); - + } else { - + contentPaneArgs = { drawable: drawable, scrollLayout: null, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; var contentPane = newTimelineContentPane( contentPaneArgs ); ui.addPane( 'content-pane', contentPane ); - + } - + // Card Pane Switching Logic - + var timelineCardPane = new Pane( newCardLayout( ) ); ui.addPane( 'switch-content-pane', timelineCardPane ); - + var maximizedContentPane = new Pane( newRowLayout( ) ); ui.addPane( 'maximize-content-pane', maximizedContentPane ); - + var insetMaximizedContentPane = newInsetPane( maximizedContentPane, newInsets( 0, scrollbarWidth, 0, 0 ) ); ui.addPane( 'inset-maximize-content-pane', insetMaximizedContentPane ); - + var contentActive = model.root.maximizedRowGuids.isEmpty; timelineCardPane.addPane( insetMaximizedContentPane, !contentActive ); timelineCardPane.addPane( contentPane, contentActive ); - + setupRowContainerPane( contentPaneArgs, maximizedContentPane, model.root.maximizedRowGuids, true, 'maximized' ); - + var updateMaximizedRows = function( rowGuid : string, rowIndex : number ) { var contentActive = model.root.maximizedRowGuids.isEmpty; timelineCardPane.setLayoutArg( insetMaximizedContentPane, !contentActive ); timelineCardPane.setLayoutArg( contentPane, contentActive ); drawable.redraw( ); } - + model.root.maximizedRowGuids.valueAdded.on( updateMaximizedRows ); model.root.maximizedRowGuids.valueRemoved.on( updateMaximizedRows ); @@ -261,7 +261,7 @@ module Webglimpse { ui.addPane( 'underlay-pane', underlayPane ); var axisInsets = newInsets( 0, scrollbarWidth, 0, rowLabelPaneWidth ); - + // top time axis pane var axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate }; if ( showTopAxis ) { @@ -274,20 +274,20 @@ module Webglimpse { // pane containing pinned rows specified in TimelineRoot.topPinnedRowGuids var topPinnedPane = new Pane( newRowLayout( ) ); ui.addPane( 'top-pinned-pane', topPinnedPane ); - + var insetTopPinnedPane = newInsetPane( topPinnedPane, newInsets( 0, scrollbarWidth, 0, 0 ) ); ui.addPane( 'inset-top-pinned-pane', insetTopPinnedPane ); - + setupRowContainerPane( contentPaneArgs, topPinnedPane, model.root.topPinnedRowGuids, false, 'toppinned' ); underlayPane.addPane( insetTopPinnedPane, 1 ); // main pane containing timeline groups and rows underlayPane.addPane( timelineCardPane, 2, { height: 'pref-max', width: null } ); - + // pane containing pinned rows specified in TimelineRoot.bottomPinnedRowGuids var bottomPinnedPane = new Pane( newRowLayout( ) ); ui.addPane( 'bottom-pinned-pane', bottomPinnedPane ); - + var insetBottomPinnedPane = newInsetPane( bottomPinnedPane, newInsets( 0, scrollbarWidth, 0, 0 ) ); ui.addPane( 'inset-bottom-pinned-pane', insetBottomPinnedPane ); @@ -313,7 +313,7 @@ module Webglimpse { ui.addPane( 'timeline-pane', timelinePane ); timelinePane.addPainter( newBackgroundPainter( bgColor ) ); timelinePane.addPane( underlayPane, true ); - + if ( selectedIntervalMode === 'single' || selectedIntervalMode === 'single-unmodifiable' ) { var overlayPane = new Pane( null, false, alwaysTrue ); ui.addPane( 'overlay-pane', overlayPane ); @@ -328,7 +328,7 @@ module Webglimpse { } // Enable double click to center selection on mouse - + if ( centerSelectedIntervalOnDoubleClick ) { var doubleClick = function( ev : PointerEvent ) { if ( selectedIntervalMode === 'single' ) { @@ -342,12 +342,12 @@ module Webglimpse { var time_PMILLIS = timeAtPointer_PMILLIS( timeAxis, ev ); var offset_PMILLIS = selection.selectedInterval.start_PMILLIS + 0.5*selection.selectedInterval.duration_MILLIS; selection.selectedInterval.pan( time_PMILLIS - offset_PMILLIS ); - } + } } }; ui.input.mouseDown.on( doubleClick ); } - + timelinePane.dispose.on( function( ) { // only dispose the ui if we created it (and this manage its lifecycle) if ( !outsideManagedUi ) ui.dispose.fire( ); @@ -367,24 +367,24 @@ module Webglimpse { function newTimeIntervalMask( timeAxis : TimeAxis1D, interval : TimeIntervalModel, selectedIntervalMode : string ) : Mask2D { - + if ( selectedIntervalMode === 'range' ) { return function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { var time_PMILLIS = timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); - + // allow a 10 pixel selection buffer to make it easier to grab ends of the selection var buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; - + return interval.overlaps( time_PMILLIS - buffer_MILLIS, time_PMILLIS + buffer_MILLIS ); }; } else if ( selectedIntervalMode === 'single' ) { return function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { var time_PMILLIS = timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); - + // allow a 10 pixel selection buffer to make it easier to grab the selection var buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; - + return time_PMILLIS < interval.cursor_PMILLIS + buffer_MILLIS && time_PMILLIS > interval.cursor_PMILLIS - buffer_MILLIS; }; } @@ -412,14 +412,14 @@ module Webglimpse { pane.mouseWheel.on( args.options.mouseWheelListener ); } - function newTimeAxisPane( args : TimelineContentPaneArguments, row : TimelineRowModel ) : Pane { + function newTimeAxisPane( args : TimelineContentPaneArguments, row : TimelineRowModel ) : Pane { var timeAxis = args.timeAxis; var ui = args.ui; var draggableEdgeWidth = args.options.draggableEdgeWidth; var scrollLayout = args.scrollLayout; var drawable = args.drawable; var selectedIntervalMode = args.options.selectedIntervalMode; - + var input = ui.input; var axisPane = new Pane( newOverlayLayout( ) ); @@ -450,7 +450,7 @@ module Webglimpse { input.mouseUp.fire( ev ); }; axisPane.mouseUp.on( onMouseUp ); - + var onContextMenu = function( ev : PointerEvent ) { input.contextMenu.fire( ev ); }; @@ -468,10 +468,10 @@ module Webglimpse { selectedIntervalPane.mouseUp.on( onMouseUp ); selectedIntervalPane.contextMenu.on( onContextMenu ); } - + // Dispose // - + // mouse listeners are disposed of automatically by Pane return axisPane; @@ -480,7 +480,7 @@ module Webglimpse { function timeAtPointer_PMILLIS( timeAxis : TimeAxis1D, ev : PointerEvent ) : number { return timeAxis.tAtFrac_PMILLIS( ev.paneViewport.xFrac( ev.i ) ); } - + function attachTimeSelectionMouseListeners( pane : Pane, timeAxis : TimeAxis1D, @@ -488,21 +488,21 @@ module Webglimpse { input : TimelineInput, draggableEdgeWidth : number, selectedIntervalMode : string ) { - + if ( selectedIntervalMode === 'single' ) { - + var chooseDragMode = function chooseDragMode( ev : PointerEvent ) : string { return 'center'; } - + attachTimeIntervalSelectionMouseListeners( pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode ); } else if ( selectedIntervalMode === 'range' ) { - + // Edges are draggable when interval is at least this wide var minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; - + // When dragging an edge, the interval cannot be made narrower than this // // Needs to be greater than minIntervalWidthForEdgeDraggability -- by enough to @@ -510,7 +510,7 @@ module Webglimpse { // the interval so narrow that it can't easily be widened again. // var minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; - + var chooseDragMode = function chooseDragMode( ev : PointerEvent ) : string { var intervalWidth = ( interval.duration_MILLIS ) * ev.paneViewport.w / timeAxis.vSize; if ( intervalWidth < minIntervalWidthForEdgeDraggability ) { @@ -534,11 +534,11 @@ module Webglimpse { } } }; - + attachTimeIntervalSelectionMouseListeners( pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode ); } } - + function attachTimeIntervalSelectionMouseListeners( pane : Pane, timeAxis : TimeAxis1D, interval : TimeIntervalModel, @@ -546,7 +546,7 @@ module Webglimpse { draggableEdgeWidth : number, selectedIntervalMode : string, chooseDragMode : ( ev : PointerEvent ) => string ) { - + // see comments in attachTimeSelectionMouseListeners( ... ) var minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; var minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; @@ -669,7 +669,7 @@ module Webglimpse { dragMode = null; } ); } - + export function newTimelineSingleSelectionPainter( timeAxis : TimeAxis1D, interval : TimeIntervalModel, borderColor : Color, fillColor : Color ) : Painter { var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); @@ -689,7 +689,7 @@ module Webglimpse { var thickWidth = 3 / viewport.w; var highlightWidth = 7 / viewport.w; var index = 0; - + // fill vertices coords[ index++ ] = fracSelection - highlightWidth; coords[ index++ ] = 1; @@ -699,27 +699,27 @@ module Webglimpse { coords[ index++ ] = 0; coords[ index++ ] = fracSelection + highlightWidth; coords[ index++ ] = 0; - + // selection vertices index = putQuadXys( coords, index, fracSelection-thickWidth/2, fracSelection+thickWidth/2, 1, 0+fracHeight ); // selection - + gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); program.use( gl ); coordsBuffer.setData( coords ); a_XyFrac.setDataAndEnable( gl, coordsBuffer, 2, GL.FLOAT ); - + u_Color.setData( gl, fillColor ); gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); u_Color.setData( gl, borderColor ); gl.drawArrays( GL.TRIANGLES, 4, 6 ); - + a_XyFrac.disable( gl ); program.endUse( gl ); - - + + } }; } @@ -744,7 +744,7 @@ module Webglimpse { var fracHeight = 1 / viewport.h; var thickWidth = 3 / viewport.w; var index = 0; - + // fill vertices coords[ index++ ] = fracStart; coords[ index++ ] = 1; @@ -754,7 +754,7 @@ module Webglimpse { coords[ index++ ] = 0; coords[ index++ ] = fracEnd; coords[ index++ ] = 0; - + // border vertices index = putQuadXys( coords, index, fracStart, fracEnd-fracWidth, +1, +1-fracHeight ); // top index = putQuadXys( coords, index, fracStart+fracWidth, fracEnd, 0+fracHeight, 0 ); // bottom @@ -763,30 +763,30 @@ module Webglimpse { // selection vertices index = putQuadXys( coords, index, fracSelection-thickWidth, fracSelection, 1, 0+fracHeight ); // selection - + gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); program.use( gl ); coordsBuffer.setData( coords ); a_XyFrac.setDataAndEnable( gl, coordsBuffer, 2, GL.FLOAT ); - + u_Color.setData( gl, fillColor ); gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); u_Color.setData( gl, borderColor ); gl.drawArrays( GL.TRIANGLES, 4, 30 ); - + a_XyFrac.disable( gl ); program.endUse( gl ); - - + + } }; } - + function newGroupCollapseExpandArrowPainter( group : TimelineGroupModel ) { - + var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); var a_XyFrac = new Attribute( program, 'a_XyFrac' ); var u_Color = new UniformColor( program, 'u_Color' ); @@ -794,32 +794,32 @@ module Webglimpse { // holds vertices for triangle var coords = new Float32Array( 6 ); var coordsBuffer = newDynamicBuffer( ); - + return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { var sizeFracX = 0.5; var sizeX = sizeFracX * viewport.w; var sizeY = sizeX * Math.sqrt(3)/2; var sizeFracY = sizeY / viewport.h; - + var bufferFracX = 0.05; var bufferSize = bufferFracX * viewport.w; var bufferFracY = bufferSize / viewport.h; - + var centerFracX = 0.5; var centerFracY = bufferFracY + sizeFracY/2; - + if ( group.collapsed ) { - + sizeFracX = sizeY / viewport.w; sizeFracY = sizeX / viewport.h; - + var fracStartX = centerFracX - sizeFracX / 2; var fracEndX = centerFracX + sizeFracX / 2; - + var fracStartY = 1 - ( centerFracY - sizeFracY / 2 ) ; var fracEndY = 1 - ( centerFracY + sizeFracY / 2 ) ; - + var index = 0; coords[ index++ ] = fracStartX; coords[ index++ ] = fracStartY; @@ -830,10 +830,10 @@ module Webglimpse { } else { var fracStartX = centerFracX - sizeFracX / 2; var fracEndX = centerFracX + sizeFracX / 2; - + var fracStartY = 1 - ( centerFracY - sizeFracY / 2 ) ; var fracEndY = 1 - ( centerFracY + sizeFracY / 2 ) ; - + var index = 0; coords[ index++ ] = fracStartX; coords[ index++ ] = fracStartY; @@ -842,14 +842,14 @@ module Webglimpse { coords[ index++ ] = ( fracStartX + fracEndX ) / 2; coords[ index++ ] = fracEndY; } - + program.use( gl ); coordsBuffer.setData( coords ); a_XyFrac.setDataAndEnable( gl, coordsBuffer, 2, GL.FLOAT ); - + u_Color.setData( gl, white ); gl.drawArrays( GL.TRIANGLES, 0, 3 ); - + a_XyFrac.disable( gl ); program.endUse( gl ); } @@ -885,7 +885,7 @@ module Webglimpse { mouseWheelListener : ( PointerEvent ) => void; } - + interface TimelineContentPaneArguments { drawable : Drawable; scrollLayout : VerticalScrollLayout; @@ -902,7 +902,7 @@ module Webglimpse { var model = args.model; var ui = args.ui; var options = args.options; - + var root = model.root; var selectedIntervalMode = options.selectedIntervalMode; @@ -933,12 +933,12 @@ module Webglimpse { var textureRenderer = new TextureRenderer( ); var createGroupLabelTexture = createTextTextureFactory( font ); var createRowLabelTexture = createTextTextureFactory( font ); - + // Group panes // var timelineContentPane = new Pane( newRowLayout( ) ); - + var groupHeaderPanes : StringMap = {}; var groupContentPanes : StringMap = {}; @@ -954,14 +954,14 @@ module Webglimpse { parentPrefSize.h = 0; } }, false ); groupArrowPane.addPainter( newGroupCollapseExpandArrowPainter( group ) ); - + var groupPane = new Pane( newColumnLayout( ), false ); groupPane.addPane( groupArrowPane, 0 ); groupPane.addPane( groupLabelPane, 1 ); - + var groupButton = newInsetPane( groupPane, groupLabelInsets, bgColor ); - - + + var redrawLabel = function( ) { groupLabel.text = group.label; drawable.redraw( ); @@ -969,27 +969,30 @@ module Webglimpse { group.attrsChanged.on( redrawLabel ); /// handle rollup group row /// - + + var groupHeaderHighlight = new Pane( newColumnLayout( ) ); + groupHeaderHighlight.addPane( newSolidPane( groupHighlightColor ), 1, { width: 6, height: null } ); + var groupHeaderStripe = new Pane( newRowLayout( ) ); groupHeaderStripe.addPane( new Pane( null ), 0, { height: null } ); groupHeaderStripe.addPane( newSolidPane( groupLabelColor ), 1, { height: 1 } ); groupHeaderStripe.addPane( new Pane( null ), 2, { height: null } ); - + var rollupRow = model.row( group.rollupGuid ); if ( rollupRow ) { - var rowBackgroundPanes = newRowBackgroundPanes( args, group.rowGuids, rollupRow ); + var rowBackgroundPanes = newRowBackgroundPanes( args, group.rowGuids, rollupRow ); var rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; var rowInsetPane = rowBackgroundPanes.rowInsetPane; - + var rollupUi = ui.rowUi( rollupRow.rowGuid ); - + // expose panes in api via TimelineRowUi rollupUi.addPane( 'background', rowBackgroundPane ); rollupUi.addPane( 'inset', rowInsetPane ); - + var rollupDataAxis = rollupRow.dataAxis; - + var rollupContentPane : Pane = null; var rollupPaneFactory : TimelineRowPaneFactory = null; var rollupContentOptions = { timelineFont: font, timelineFgColor: fgColor, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, isMaximized: false, mouseWheelListener: args.options.mouseWheelListener }; @@ -1008,7 +1011,7 @@ module Webglimpse { drawable.redraw( ); } }; - + rollupUi.paneFactoryChanged.on( refreshRollupContentPane ); rollupRow.attrsChanged.on( refreshRollupContentPane ); rollupRow.eventGuids.valueAdded.on( refreshRollupContentPane ); @@ -1016,36 +1019,38 @@ module Webglimpse { rollupRow.timeseriesGuids.valueAdded.on( refreshRollupContentPane ); rollupRow.timeseriesGuids.valueRemoved.on( refreshRollupContentPane ); refreshRollupContentPane( ); - + var groupButtonHeaderUnderlay = new Pane( newColumnLayout( ) ); - groupButtonHeaderUnderlay.addPane( groupButton, 0 ); - groupButtonHeaderUnderlay.addPane( groupHeaderStripe, 1, { ignoreHeight: true } ); - + groupButtonHeaderUnderlay.addPane( groupHeaderHighlight, 0, { ignoreHeight: true } ); + groupButtonHeaderUnderlay.addPane( groupButton, 1 ); + groupButtonHeaderUnderlay.addPane( groupHeaderStripe, 2, { ignoreHeight: true } ); + var groupHeaderUnderlay = new Pane( newColumnLayout( ) ); groupHeaderUnderlay.addPainter( newBackgroundPainter( bgColor ) ); groupHeaderUnderlay.addPane( groupButtonHeaderUnderlay, 0, { width: rowLabelPaneWidth } ); groupHeaderUnderlay.addPane( rowBackgroundPane, 1, { width: null } ); - + var groupHeaderPane = groupHeaderUnderlay; } else { - + var groupHeaderUnderlay = new Pane( newColumnLayout( ) ); groupHeaderUnderlay.addPainter( newBackgroundPainter( bgColor ) ); - groupHeaderUnderlay.addPane( groupButton, 0 ); - groupHeaderUnderlay.addPane( groupHeaderStripe, 1, { ignoreHeight: true } ); - + groupHeaderUnderlay.addPane( groupHeaderHighlight, 0, { ignoreHeight: true } ); + groupHeaderUnderlay.addPane( groupButton, 1 ); + groupHeaderUnderlay.addPane( groupHeaderStripe, 2, { ignoreHeight: true } ); + var groupHeaderOverlay = newTimeAxisPane( args, null ); var groupHeaderOverlayInsets = newInsets( 0, 0, 0, rowLabelPaneWidth ); - + var groupHeaderPane = new Pane( newOverlayLayout( ) ); groupHeaderPane.addPane( groupHeaderUnderlay, true ); groupHeaderPane.addPane( newInsetPane( groupHeaderOverlay, groupHeaderOverlayInsets, null, false ), false ); - + } - + var groupContentPane = new Pane( newRowLayout( ) ); - + timelineContentPane.updateLayoutArgs( function( layoutArg : any ) : any { var shift = ( isNumber( layoutArg ) && layoutArg >= 2*groupIndex ); return ( shift ? layoutArg + 2 : layoutArg ); @@ -1079,20 +1084,20 @@ module Webglimpse { group.collapsed = !group.collapsed; } } ); - + // Handle hidden property // - + timelineContentPane.layoutOptions( groupContentPane ).hide = group.hidden; timelineContentPane.layoutOptions( groupHeaderPane ).hide = group.hidden; setupRowContainerPane( args, groupContentPane, group.rowGuids, false, group.groupGuid ); - + groupContentPane.dispose.on( function( ) { group.attrsChanged.off( redrawLabel ); group.attrsChanged.off( groupAttrsChanged ); }); - + }; root.groupGuids.forEach( addGroup ); root.groupGuids.valueAdded.on( addGroup ); @@ -1109,7 +1114,7 @@ module Webglimpse { drawable.redraw( ); }; root.groupGuids.valueMoved.on( moveGroup ); - + var removeGroup = function( groupGuid : string, groupIndex : number ) { var contentPane : Pane = groupContentPanes[ groupGuid ]; var headerPane : Pane = groupHeaderPanes[ groupGuid ]; @@ -1127,17 +1132,17 @@ module Webglimpse { drawable.redraw( ); }; root.groupGuids.valueRemoved.on( removeGroup ); - + // Handle listing for hidden property // - + var groupAttrsChangedListeners = {}; - + var attachGroupAttrsChangedListener = function( groupGuid : string, groupIndex : number ) { var group = model.group( groupGuid ); var groupAttrsChangedListener = function( ) { if ( hasval( group.hidden ) && hasval( groupContentPanes[groupGuid] ) ) { - + timelineContentPane.layoutOptions( groupContentPanes[groupGuid] ).hide = group.hidden; timelineContentPane.layoutOptions( groupHeaderPanes[groupGuid] ).hide = group.hidden; drawable.redraw( ); @@ -1146,19 +1151,19 @@ module Webglimpse { groupAttrsChangedListeners[ groupGuid ] = groupAttrsChangedListener; group.attrsChanged.on( groupAttrsChangedListener ); }; - + var unattachGroupAttrsChangedListener = function( groupGuid : string, groupIndex : number ) { var group = model.group( groupGuid ); group.attrsChanged.off( groupAttrsChangedListeners[ groupGuid ] ); } - + root.groupGuids.forEach( attachGroupAttrsChangedListener ); root.groupGuids.valueAdded.on( attachGroupAttrsChangedListener ); root.groupGuids.valueRemoved.on( unattachGroupAttrsChangedListener ); // Dispose // - + timelineContentPane.dispose.on( function( ) { root.groupGuids.valueAdded.off( addGroup ); root.groupGuids.valueMoved.off( moveGroup ); @@ -1167,10 +1172,10 @@ module Webglimpse { return timelineContentPane; } - + // Row panes and painters // - + function newRowBackgroundPainter( args : TimelineContentPaneArguments, guidList : OrderedStringSet, row : TimelineRowModel ) { return function( gl : WebGLRenderingContext ) { var color = hasval( row.bgColor ) ? row.bgColor : ( guidList.indexOf( row.rowGuid ) % 2 ? args.options.rowBgColor : args.options.rowAltBgColor ); @@ -1178,56 +1183,56 @@ module Webglimpse { gl.clear( GL.COLOR_BUFFER_BIT ); }; } - + function newRowBackgroundPanes( args : TimelineContentPaneArguments, guidList : OrderedStringSet, row : TimelineRowModel ) { var rowBackgroundPane = newTimeAxisPane( args, row ); rowBackgroundPane.addPainter( newRowBackgroundPainter( args, guidList, row ) ); - + var timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; rowBackgroundPane.addPainter( newTimeGridPainter( args.timeAxis, false, args.options.gridTimeZone, timeGridOpts ) ); - + var rowInsetTop = args.options.rowSeparatorHeight/2; var rowInsetBottom = args.options.rowSeparatorHeight - rowInsetTop; var rowInsetPane = new Pane( newInsetLayout( newInsets( rowInsetTop, 0, rowInsetBottom, 0 ) ), false ); rowInsetPane.addPainter( newBorderPainter( args.options.bgColor, { thickness: rowInsetTop, drawRight: false, drawLeft: false, drawBottom: false } ) ); rowInsetPane.addPainter( newBorderPainter( args.options.bgColor, { thickness: rowInsetBottom, drawRight: false, drawLeft: false, drawTop: false } ) ); rowBackgroundPane.addPane( rowInsetPane, true ); - + var rowOverlayPane = new Pane( null, false ); rowOverlayPane.addPainter( newBorderPainter( args.options.rowLabelColor, { drawRight: false, drawTop: false, drawBottom: false } ) ); rowBackgroundPane.addPane( rowOverlayPane, false ); - + return { rowInsetPane : rowInsetPane, rowBackgroundPane : rowBackgroundPane }; } - + function setupRowContainerPane( args : TimelineContentPaneArguments, parentPane : Pane, guidList : OrderedStringSet, isMaximized : boolean, keyPrefix : string ) { - + var drawable = args.drawable; var scrollLayout = args.scrollLayout; var timeAxis = args.timeAxis; var model = args.model; var ui = args.ui; var options = args.options; - + var rowPanes : StringMap = {}; - + var addRow = function( rowGuid : string, rowIndex : number ) { var row = model.row( rowGuid ); var rowUi = ui.rowUi( rowGuid ); - + var rowLabelColorBg : Color = hasval( row.bgLabelColor ) ? row.bgLabelColor : options.rowLabelBgColor; var rowLabelColorFg : Color = hasval( row.fgLabelColor ) ? row.fgLabelColor : options.rowLabelColor; var rowLabelFont : string = hasval( row.labelFont ) ? row.labelFont : options.font; - + var rowLabel = new Label( row.label, rowLabelFont, rowLabelColorFg ); var rowLabelPane = new Pane( { updatePrefSize: fitToLabel( rowLabel ) }, false ); rowLabelPane.addPainter( newLabelPainter( rowLabel, 0, 0.5, 0, 0.5 ) ); - + var rowLabelBackground = new Background( rowLabelColorBg ); var rowHeaderPane = new Pane( newInsetLayout( options.rowLabelInsets ), true ); rowHeaderPane.addPainter( rowLabelBackground.newPainter( ) ); rowHeaderPane.addPane( rowLabelPane ); - + var rowAttrsChanged = function( ) { rowLabel.text = row.label; rowLabel.fgColor = hasval( row.fgLabelColor ) ? row.fgLabelColor : options.rowLabelColor; @@ -1236,23 +1241,23 @@ module Webglimpse { drawable.redraw( ); } row.attrsChanged.on( rowAttrsChanged ); - - var rowBackgroundPanes = newRowBackgroundPanes( args, guidList, row ); + + var rowBackgroundPanes = newRowBackgroundPanes( args, guidList, row ); var rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; var rowInsetPane = rowBackgroundPanes.rowInsetPane; - + var rowPane = new Pane( newColumnLayout( ) ); rowPane.addPane( rowHeaderPane, 0, { width: options.rowLabelPaneWidth } ); rowPane.addPane( rowBackgroundPane, 1, { width: null } ); - + // expose panes in api via TimelineRowUi rowUi.addPane( keyPrefix+'-background', rowBackgroundPane ); rowUi.addPane( keyPrefix+'-inset', rowInsetPane ); rowUi.addPane( keyPrefix+'-label', rowLabelPane ); rowUi.addPane( keyPrefix+'-header', rowHeaderPane ); - + var rowDataAxis = row.dataAxis; - + var rowContentPane : Pane = null; var rowPaneFactory : TimelineRowPaneFactory = null; var rowContentOptions = { timelineFont: options.font, timelineFgColor: options.fgColor, draggableEdgeWidth: options.draggableEdgeWidth, snapToDistance: options.snapToDistance, isMaximized: isMaximized, mouseWheelListener: options.mouseWheelListener }; @@ -1271,7 +1276,7 @@ module Webglimpse { drawable.redraw( ); } }; - + rowUi.paneFactoryChanged.on( refreshRowContentPane ); row.attrsChanged.on( refreshRowContentPane ); row.eventGuids.valueAdded.on( refreshRowContentPane ); @@ -1279,21 +1284,21 @@ module Webglimpse { row.timeseriesGuids.valueAdded.on( refreshRowContentPane ); row.timeseriesGuids.valueRemoved.on( refreshRowContentPane ); refreshRowContentPane( ); - + parentPane.updateLayoutArgs( function( layoutArg : any ) : any { var shift = ( isNumber( layoutArg ) && layoutArg >= rowIndex ); return ( shift ? layoutArg + 1 : layoutArg ); } ); parentPane.addPane( rowPane, rowIndex ); rowPanes[ rowGuid ] = rowPane; - - + + // Handle hidden property // parentPane.layoutOptions( rowPane ).hide = row.hidden; - + drawable.redraw( ); - + rowPane.dispose.on( function( ) { row.attrsChanged.off( rowAttrsChanged ); rowUi.paneFactoryChanged.off( refreshRowContentPane ); @@ -1302,7 +1307,7 @@ module Webglimpse { row.eventGuids.valueRemoved.off( refreshRowContentPane ); row.timeseriesGuids.valueAdded.off( refreshRowContentPane ); row.timeseriesGuids.valueRemoved.off( refreshRowContentPane ); - + rowUi.removePane( keyPrefix+'-background' ); rowUi.removePane( keyPrefix+'-inset' ); rowUi.removePane( keyPrefix+'-label' ); @@ -1311,7 +1316,7 @@ module Webglimpse { }; guidList.forEach( addRow ); guidList.valueAdded.on( addRow ); - + var valueMoved = function( rowGuid : string, rowOldIndex : number, rowNewIndex : number ) { var nMin = Math.min( rowOldIndex, rowNewIndex ); var nMax = Math.max( rowOldIndex, rowNewIndex ); @@ -1319,11 +1324,11 @@ module Webglimpse { var rowGuid = guidList.valueAt( n ); parentPane.setLayoutArg( rowPanes[ rowGuid ], n ); } - + drawable.redraw( ); }; guidList.valueMoved.on( valueMoved ); - + var removeRow = function( rowGuid : string, rowIndex : number ) { var pane : Pane = rowPanes[ rowGuid ]; pane.dispose.fire( ); @@ -1333,16 +1338,16 @@ module Webglimpse { return ( shift ? layoutArg - 1 : layoutArg ); } ); delete rowPanes[ rowGuid ]; - + drawable.redraw( ); }; guidList.valueRemoved.on( removeRow ); - + // Handle listing for hidden property // - + var attrsChangedListeners = {}; - + var attachAttrsChangedListener = function( rowGuid : string, rowIndex : number ) { var row = model.row( rowGuid ); var attrsChangedListener = function( ) { @@ -1354,28 +1359,28 @@ module Webglimpse { attrsChangedListeners[ rowGuid ] = attrsChangedListener; row.attrsChanged.on( attrsChangedListener ); }; - + var unattachAttrsChangedListener = function( rowGuid : string, rowIndex : number ) { var row = model.row( rowGuid ); row.attrsChanged.off( attrsChangedListeners[ rowGuid ] ); } - + guidList.forEach( attachAttrsChangedListener ); guidList.valueAdded.on( attachAttrsChangedListener ); guidList.valueRemoved.on( unattachAttrsChangedListener ); - + // Redraw // drawable.redraw( ); - + // Dispose - + parentPane.dispose.on( function( ) { - guidList.valueAdded.off( addRow ); + guidList.valueAdded.off( addRow ); guidList.valueMoved.off( valueMoved ); guidList.valueRemoved.off( removeRow ); - + guidList.valueAdded.off( attachAttrsChangedListener ); guidList.valueRemoved.off( unattachAttrsChangedListener ); } ); From dda7af912ee0d25f74102a0e29f6e147eccff903 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 21 Jun 2017 12:10:13 -0700 Subject: [PATCH 06/69] Add ability to modify the formats of absolute time display --- src/webglimpse/timeline/time_axis_painter.ts | 67 ++++++++++++++------ 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/src/webglimpse/timeline/time_axis_painter.ts b/src/webglimpse/timeline/time_axis_painter.ts index c23e90c..fb8bf65 100644 --- a/src/webglimpse/timeline/time_axis_painter.ts +++ b/src/webglimpse/timeline/time_axis_painter.ts @@ -32,18 +32,34 @@ module Webglimpse { // XXX: Much of this is duplicated from edge_axis_painter + export class FormatOptions { + tickFormat : string; + prefixFormat : string; + constructor(tick: string, prefix: string) { + this.tickFormat = tick; + this.prefixFormat = prefix; + } + } + + export interface TimeAxisFormatOptions { + hour? : FormatOptions; + day? : FormatOptions; + month? : FormatOptions; + year? : FormatOptions; + } export interface TimeAxisPainterOptions { - tickSpacing? : number; - font? : string; - textColor? : Color; - tickColor? : Color; - tickSize? : number; - labelAlign? : number; - referenceDate? : string; + tickSpacing? : number; + font? : string; + textColor? : Color; + tickColor? : Color; + tickSize? : number; + labelAlign? : number; + referenceDate? : string; + timeAxisFormat? : TimeAxisFormatOptions; // if true, relative date labels in the future are positive (Day 1) // if false, relative date labels in the future are negative (Day -1) - isFuturePositive? : boolean; + isFuturePositive? : boolean; } @@ -56,6 +72,7 @@ module Webglimpse { var labelAlign = ( hasval( options ) && hasval( options.labelAlign ) ? options.labelAlign : 0.5 ); var referenceDate_PMILLIS = ( hasval( options ) && hasval( options.referenceDate ) ? parseTime_PMILLIS( options.referenceDate ) : undefined ); var isFuturePositive = ( hasval( options ) && hasval( options.isFuturePositive ) ? options.isFuturePositive : true ); + var timeAxisFormat = ( hasval( options ) && hasval(options.timeAxisFormat) ? options.timeAxisFormat : undefined ); var marksProgram = new Program( edgeMarks_VERTSHADER( labelSide ), solid_FRAGSHADER ); var marksProgram_u_VMin = new Uniform1f( marksProgram, 'u_VMin' ); @@ -118,7 +135,7 @@ module Webglimpse { // Tick labels // - var ticks : TickDisplayData = getTickDisplayData( tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive ); + var ticks : TickDisplayData = getTickDisplayData( tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive, timeAxisFormat ); textTextures.resetTouches( ); textureRenderer.begin( gl, viewport ); @@ -212,12 +229,12 @@ module Webglimpse { } } - function getTickDisplayData( tickInterval_MILLIS : number, referenceDate_PMILLIS : number, displayTimeZone : string, isFuturePositive : boolean ) : TickDisplayData { + function getTickDisplayData( tickInterval_MILLIS : number, referenceDate_PMILLIS : number, displayTimeZone : string, isFuturePositive : boolean, timeAxisFormat : TimeAxisFormatOptions ) : TickDisplayData { if ( hasval( referenceDate_PMILLIS ) ) { return getTickDisplayDataRelative( tickInterval_MILLIS, referenceDate_PMILLIS, isFuturePositive ); } else { - return getTickDisplayDataAbsolute( tickInterval_MILLIS, displayTimeZone ); + return getTickDisplayDataAbsolute( tickInterval_MILLIS, displayTimeZone, timeAxisFormat ); } } @@ -325,29 +342,37 @@ module Webglimpse { return { prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory:timeStructFactory }; } - function getTickDisplayDataAbsolute( tickInterval_MILLIS : number, displayTimeZone : string ) : TickDisplayData { + function getTickDisplayDataAbsolute( tickInterval_MILLIS : number, displayTimeZone : string, timeAxisFormat : TimeAxisFormatOptions ) : TickDisplayData { var defaultTickFormat = function( format : string ) : TickFormat { return function( tickTime_PMILLIS : number ) : string { return moment( tickTime_PMILLIS ).zone( displayTimeZone ).format( format ) } }; - var defaultPrefixFormat = function( format : string ) : PrefixFormat { return function( timeStruct : TimeStruct ) : string { return moment( timeStruct.textCenter_PMILLIS ).zone( displayTimeZone ).format( format ) } }; + var defaultPrefixFormat = function( format : string ) : PrefixFormat { return function( timeStruct : TimeStruct ) : string { return moment( timeStruct.textCenter_PMILLIS ).zone( displayTimeZone ).format( format ) } }; if ( tickInterval_MILLIS <= minutesToMillis( 1 ) ) { - var tickFormat = defaultTickFormat( 'mm:ss' ); - var prefixFormat = defaultPrefixFormat( 'D MMM HH:00' ); + var formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00'); + var hour = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.hour) ? timeAxisFormat.hour : formatOptions ); + var tickFormat = defaultTickFormat( ( hasval(hour.tickFormat) && hour.tickFormat !== '' ? hour.tickFormat : formatOptions.tickFormat ) ); + var prefixFormat = defaultPrefixFormat( ( hasval(hour.prefixFormat) && hour.prefixFormat !== '' ? hour.prefixFormat : formatOptions.prefixFormat ) ); var timeStructFactory = function( ) : TimeStruct { return new HourStruct( ) }; } else if ( tickInterval_MILLIS <= hoursToMillis( 12 ) ) { - var tickFormat = defaultTickFormat( 'HH:mm' ); - var prefixFormat = defaultPrefixFormat( 'D MMM YYYY' ); + var formatOptions = new FormatOptions('HH:mm', 'D MMM YYYY'); + var day = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.day) ? timeAxisFormat.day : formatOptions ); + var tickFormat = defaultTickFormat( ( hasval(day.tickFormat) && day.tickFormat !== '' ? day.tickFormat : formatOptions.tickFormat ) ); + var prefixFormat = defaultPrefixFormat( ( hasval(day.prefixFormat) && day.prefixFormat !== '' ? day.prefixFormat : formatOptions.prefixFormat ) ); var timeStructFactory = function( ) : TimeStruct { return new DayStruct( ) }; } else if ( tickInterval_MILLIS <= daysToMillis( 10 ) ) { - var tickFormat = defaultTickFormat( 'D' ); - var prefixFormat = defaultPrefixFormat( 'MMM YYYY' ); + var formatOptions = new FormatOptions('D', 'MMM YYYY'); + var month = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.month) ? timeAxisFormat.month : formatOptions ); + var tickFormat = defaultTickFormat( ( hasval(month.tickFormat) && month.tickFormat !== '' ? month.tickFormat : formatOptions.tickFormat ) ); + var prefixFormat = defaultPrefixFormat( ( hasval(month.prefixFormat) && month.prefixFormat !== '' ? month.prefixFormat : formatOptions.prefixFormat ) ); var timeStructFactory = function( ) : TimeStruct { return new MonthStruct( ) }; } else if ( tickInterval_MILLIS <= daysToMillis( 60 ) ) { - var tickFormat = defaultTickFormat( 'MMM' ); - var prefixFormat = defaultPrefixFormat( 'YYYY' ); + var formatOptions = new FormatOptions('MMM', 'YYYY'); + var year = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.year) ? timeAxisFormat.year : formatOptions ); + var tickFormat = defaultTickFormat( ( hasval(year.tickFormat) && year.tickFormat !== '' ? year.tickFormat : formatOptions.tickFormat ) ); + var prefixFormat = defaultPrefixFormat( ( hasval(year.prefixFormat) && year.prefixFormat !== '' ? year.prefixFormat : formatOptions.prefixFormat ) ); var timeStructFactory = function( ) : TimeStruct { return new YearStruct( ) }; } else { From 0bf0ae364e9f0486dd90b8a7b83a5e01ae5e361b Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 21 Jun 2017 12:15:53 -0700 Subject: [PATCH 07/69] Expose timeAxisFormat option to TimelinePane --- src/webglimpse/timeline/timeline_pane.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index d5f4fa8..390a517 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -76,6 +76,7 @@ module Webglimpse { tickSpacing? : number; axisLabelAlign? : number; isFuturePositive? : boolean; + timeAxisFormat? : TimeAxisFormatOptions; // date in time_ISO8601 format (see util.ts:parseTime_PMILLIS) // that time labels on the timeline should be referenced from @@ -276,7 +277,7 @@ module Webglimpse { var axisInsets = newInsets( 0, scrollbarWidth, 0, rowLabelPaneWidth ); // top time axis pane - var axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive : options.isFuturePositive }; + var axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive : options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; if ( showTopAxis ) { var topAxisPane = newTimeAxisPane( contentPaneArgs, null ); ui.addPane( 'top-axis-pane', topAxisPane ); From e3901d61cb4689f62c13aa568a0dcc6ddad9abc2 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 23 Mar 2018 00:08:09 -0700 Subject: [PATCH 08/69] Update to version to 1.9.2 Made package installable via npm. --- CHANGELOG | 6 ++++++ Gruntfile.js | 7 ++++++- package.json | 16 +++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 206c168..fff3a10 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +Webglimpse 1.9.2 (released 2018-3-22) + +* Made release package installable from npm. +* Add ability to modify the formats of absolute time display with `timeAxisFormat`. +* Added ability to highlight a group with `highlighted` and `groupHighlightColor`. + Webglimpse 1.9.1 (released 2016-11-22) * Allow truncation of event text (feature intended for 1.9.0 but inadvertently left out) diff --git a/Gruntfile.js b/Gruntfile.js index 64f2993..d3ef9dc 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -8,7 +8,7 @@ module.exports = function ( grunt ) { var sourceHeader = '/*\n' + licenseText.replace( /^/mg, ' * ' ).replace( / *$/mg, '' ) + '\n */'; var mungedSourceHeader = '\n' + licenseText.replace( /^/mg, '* ' ).replace( / *$/mg, '' ) + '\n'; - var releaseVersion = '1.9.1'; + var releaseVersion = '1.9.2'; var releaseDate = grunt.template.today( 'UTC:yyyy-mm-dd HH:MM:ss Z' ); var releaseText = [ 'Web Glimpse v' + releaseVersion, @@ -108,6 +108,10 @@ module.exports = function ( grunt ) { src: [ '**' ], dest: 'build/grunt/release/' }, + release_package: { + src: './package.json', + dest: 'build/grunt/release/' + }, release_license: { src: 'LICENSE', dest: 'build/grunt/release/' @@ -297,6 +301,7 @@ module.exports = function ( grunt ) { 'clean:release', // Copy all, and modify copies 'copy:release_sources', + 'copy:release_package', 'copy:release_license', 'copy:release_changelog', 'replace:release_reference', diff --git a/package.json b/package.json index ec2615b..2f3c31c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,20 @@ { "name": "webglimpse", - "private": true, + "version": "1.9.2", + "description": "Webglimpse is a data visualization library for the web.", + "repository":{ + "type": "git", + "url": "https://github.com/skaughtx0r/webglimpse" + }, + "keywords": [ + "webglimpse", + "data", + "visualization", + "timeline", + "webgl" + ], + "main": "webglimpse.js", + "typings": "webglimpse.d.ts", "devDependencies": { "typescript": "1.0.1", "grunt": "~0.4.2", From eef9dfbc678b54828d6179a27f10d56f79416ef5 Mon Sep 17 00:00:00 2001 From: Stephen Harding Date: Tue, 27 Mar 2018 14:51:41 -0700 Subject: [PATCH 09/69] fixed the stuff --- src/examples/plot/plot.ts | 4 +- src/examples/scroll/scroll.ts | 4 +- src/examples/timeline/timeline.ts | 134 ++++----- src/webglimpse/bounds.ts | 3 +- src/webglimpse/buffer.ts | 3 +- src/webglimpse/color.ts | 3 +- src/webglimpse/core.ts | 38 +-- src/webglimpse/gradient.ts | 29 +- src/webglimpse/label.ts | 11 +- src/webglimpse/layout/card_layout.ts | 11 +- src/webglimpse/layout/column_layout.ts | 3 +- src/webglimpse/layout/corner_layout.ts | 3 +- src/webglimpse/layout/inset_layout.ts | 3 +- src/webglimpse/layout/overlay_layout.ts | 3 +- src/webglimpse/layout/row_layout.ts | 15 +- src/webglimpse/matrix.ts | 7 +- src/webglimpse/misc.ts | 32 +- src/webglimpse/painter/border_painter.ts | 3 +- src/webglimpse/plot/axis.ts | 3 +- src/webglimpse/plot/edge_axis_painter.ts | 64 ++-- src/webglimpse/plot/line_painter.ts | 8 +- src/webglimpse/plot/plot_layout.ts | 4 +- src/webglimpse/scroll.ts | 9 +- src/webglimpse/shader.ts | 3 +- src/webglimpse/text.ts | 3 +- src/webglimpse/texture.ts | 9 +- src/webglimpse/time.ts | 3 +- src/webglimpse/timeline/time_axis.ts | 7 +- src/webglimpse/timeline/time_axis_painter.ts | 18 +- src/webglimpse/timeline/time_grid_painter.ts | 3 +- .../timeline/timeline_annotation_painter.ts | 61 ++-- .../timeline/timeline_annotation_style.ts | 23 +- .../timeline/timeline_cursor_painter.ts | 35 ++- .../timeline/timeline_event_style.ts | 3 +- .../timeline/timeline_events_row.ts | 276 +++++++++--------- src/webglimpse/timeline/timeline_lanes.ts | 77 +++-- src/webglimpse/timeline/timeline_layout.ts | 3 +- src/webglimpse/timeline/timeline_model.ts | 57 ++-- src/webglimpse/timeline/timeline_pane.ts | 6 +- src/webglimpse/timeline/timeline_row.ts | 3 +- src/webglimpse/timeline/timeline_styles.ts | 13 +- .../timeline/timeline_timeseries_row.ts | 264 ++++++++--------- src/webglimpse/timeline/timeline_ui.ts | 81 +++-- src/webglimpse/util/binary_tree.ts | 189 ++++++------ src/webglimpse/util/cache.ts | 3 +- src/webglimpse/util/multikey_cache.ts | 3 +- src/webglimpse/util/notification.ts | 11 +- src/webglimpse/util/ordered_set.ts | 3 +- src/webglimpse/util/sorted_arrays.ts | 13 +- src/webglimpse/util/sorted_multimap.ts | 91 +++--- src/webglimpse/util/split.ts | 4 +- src/webglimpse/util/util.ts | 6 +- 52 files changed, 815 insertions(+), 853 deletions(-) diff --git a/src/examples/plot/plot.ts b/src/examples/plot/plot.ts index 972d9e2..37c3624 100644 --- a/src/examples/plot/plot.ts +++ b/src/examples/plot/plot.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function runPlotExample( container : Node ) { @@ -115,4 +115,4 @@ module Webglimpse { } -} + diff --git a/src/examples/scroll/scroll.ts b/src/examples/scroll/scroll.ts index 553da56..f689fc2 100644 --- a/src/examples/scroll/scroll.ts +++ b/src/examples/scroll/scroll.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function runScrollExample( container : Node ) { @@ -105,4 +105,4 @@ module Webglimpse { } -} + diff --git a/src/examples/timeline/timeline.ts b/src/examples/timeline/timeline.ts index 8faaa38..f0ab68b 100644 --- a/src/examples/timeline/timeline.ts +++ b/src/examples/timeline/timeline.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + interface ExampleTooltip { @@ -181,7 +181,7 @@ module Webglimpse { selectedInterval.start_PMILLIS = selectedInterval.end_PMILLIS - newDuration_MILLIS; drawable.redraw( ); }; - + var a = document.getElementById( 'selected-time-calendar' ); a.onclick = function() { @@ -193,7 +193,7 @@ module Webglimpse { calendardiv = document.createElement( 'div' ); calendardiv.style.fontSize = '12'; - + var rect = a.getBoundingClientRect(); var position: number[] = [rect.left, rect.bottom - 4]; @@ -203,14 +203,14 @@ module Webglimpse { var selectionDiff = selectedInterval.end_PMILLIS - selectedInterval.start_PMILLIS; var axisDiff = timeAxis.tMax_PMILLIS - timeAxis.tMin_PMILLIS; - + // jump the selected and axis times selectedInterval.start_PMILLIS = newTime - selectionDiff; selectedInterval.end_PMILLIS = newTime; timeAxis.tMin_PMILLIS = newTime - axisDiff; timeAxis.tMax_PMILLIS = newTime; - + drawable.redraw( ); } @@ -219,9 +219,9 @@ module Webglimpse { $( calendardiv ).datepicker( 'dialog', date, callback, options, position ); } }; - + // Link a button to maximize / unmaximize two specific rows - + var a = document.getElementById( 'maximize-button' ); a.onclick = function() { if ( model.root.maximizedRowGuids.hasValue( 'metsci.timelineExample.row03a' ) ) { @@ -230,7 +230,7 @@ module Webglimpse { else { model.root.maximizedRowGuids.add( 'metsci.timelineExample.row03a' ); } - + if ( model.root.maximizedRowGuids.hasValue( 'metsci.timelineExample.dynamicRow02' ) ) { model.root.maximizedRowGuids.removeValue( 'metsci.timelineExample.dynamicRow02' ); } @@ -238,9 +238,9 @@ module Webglimpse { model.root.maximizedRowGuids.add( 'metsci.timelineExample.dynamicRow02' ); } }; - + // Toggle row maximize by double clicking on row label - + //add listener for new TimelineRowUi ui.rowUis.valueAdded.on( function ( rowUi : TimelineRowUi ) { // add listener for new Panes @@ -268,9 +268,9 @@ module Webglimpse { } } ); } ); - + // Link a button to pin / unpin some rows to the top/bottom of the timeline - + var a = document.getElementById( 'pin-button' ); a.onclick = function() { if ( model.root.topPinnedRowGuids.hasValue( 'metsci.timelineExample.row01a' ) ) { @@ -279,14 +279,14 @@ module Webglimpse { else { model.root.topPinnedRowGuids.add( 'metsci.timelineExample.row01a' ); } - + if ( model.root.topPinnedRowGuids.hasValue( 'metsci.timelineExample.row01b' ) ) { model.root.topPinnedRowGuids.removeValue( 'metsci.timelineExample.row01b' ); } else { model.root.topPinnedRowGuids.add( 'metsci.timelineExample.row01b' ); } - + if ( model.root.bottomPinnedRowGuids.hasValue( 'metsci.timelineExample.row03a' ) ) { model.root.bottomPinnedRowGuids.removeValue( 'metsci.timelineExample.row03a' ); } @@ -294,25 +294,25 @@ module Webglimpse { model.root.bottomPinnedRowGuids.add( 'metsci.timelineExample.row03a' ); } }; - + // Link a button change the size of a particular row - + var customRowHeight = 135; var a = document.getElementById( 'flag-button' ); a.onclick = function() { customRowHeight = customRowHeight + 10; if ( customRowHeight > 200 ) customRowHeight = 135; - + model.row( 'metsci.timelineExample.row03a' ).rowHeight = customRowHeight; - + // make sure no-one references the event model.rows.forEach( function( row : TimelineRowModel ) { row.eventGuids.removeValue( 'metsci.timelineExample.event01' ); } ); - + // remove the event model.events.removeId( 'metsci.timelineExample.event01' ); - + drawable.redraw( ); }; @@ -361,23 +361,23 @@ module Webglimpse { // // Shows overlay div, containing arbitrary html content, when a timeseries point is hovered // - + var hoveredFragment : TimelineTimeseriesFragmentModel; var updateTimeseriesTooltip = function( ) { - + // unattach any old data change listener if ( hasval( hoveredFragment ) ) { hoveredFragment.dataChanged.off( updateTimeseriesTooltip ); } - + hoveredFragment = selection.hoveredTimeseries.fragment; - + if ( hasval( hoveredFragment ) ) { - + // attach listener to newly selected fragment to update toolip when fragment data changes hoveredFragment.dataChanged.on( updateTimeseriesTooltip ); - + var iMouse = selection.mousePos.x; var jMouse = selection.mousePos.y; if ( isNumber( iMouse ) && isNumber( jMouse ) ) { @@ -395,7 +395,7 @@ module Webglimpse { tooltip.hide( ); } }; - + selection.hoveredTimeseries.changed.on( updateTimeseriesTooltip ); @@ -403,18 +403,18 @@ module Webglimpse { // // Fill these in with application-specific input-handling code // - + selection.hoveredAnnotation.changed.on( function( ) { if ( hasval( selection.hoveredAnnotation.value ) ) { // Do something with the hovered annotation } }); - + selection.hoveredTimeseries.changed.on( function( ) { if ( hasval( selection.hoveredTimeseries.fragment ) ) { - // Do something with the time and data value of the selected timeseries point + // Do something with the time and data value of the selected timeseries point var dataValue = selection.hoveredTimeseries.data; var time_PMILLIS = selection.hoveredTimeseries.times_PMILLIS; } @@ -454,8 +454,8 @@ module Webglimpse { selection.selectedEvents.valueRemoved.on( function( event : TimelineEventModel ) { // Handle event de-selected } ); - - + + // Example Dynamic Data // // Populate the timeline model with a dynamically generated group, row, and custom painters @@ -484,13 +484,13 @@ module Webglimpse { }; model.rows.add( new TimelineRowModel( row ) ); model.group( group4.groupGuid ).rowGuids.add( row.rowGuid ); - + // create an empty timeseries fragment and listen for changes to its data // the fragment will be filled later with data loaded from timeline.json - + var fragment3 = new TimelineTimeseriesFragmentModel( { fragmentGuid: 'metsci.timelineExample.fragment03' } ); model.timeseriesFragments.add( fragment3 ); - + // print the new data value when fragment3 changes // also, ensure that fragment1 data values never exceed 20 fragment3.dataChanged.on( function( startIndex : number, endIndex : number ) { @@ -500,14 +500,14 @@ module Webglimpse { } } } ); - + // Example Custom Row // // Create a heatmap row with data loaded form a json file // - + $.getJSON( 'heatmapData.json', function( json : any ) { - + // pull heat map data fields out of the returned json object var angleMin = json.minY; var angleMax = json.maxY; @@ -515,36 +515,36 @@ module Webglimpse { var timeMax = timeAxis.vAtTime( parseTime_PMILLIS( json.maxX ) ); var ySize = json.sizeY; var xSize = json.sizeX; - + var array = new Float32Array( xSize * ySize ); for ( var x = 0 ; x < xSize ; x++ ) { for ( var y = 0 ; y < ySize ; y++ ) { array[ y * xSize + x ] = json.data[y][x]; } } - + var createHeatmapPlotPane = function( drawable : Drawable, timeAxis : TimeAxis1D, yAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { var axisColor = options.timelineFgColor; var height = options.isMaximized ? null : 270; - + // setup axes var colorAxis = new Axis1D( -0.7, 0.3 ); colorAxis.limitsChanged.on( drawable.redraw ); - + yAxis.setVRange( 0, 180 ); yAxis.limitsChanged.on( drawable.redraw ); - + var rowAxis = new Axis2D( timeAxis, yAxis ); - + var spacerPane = new Pane( { updatePrefSize: fixedSize( null, height ) }, false ); - + var yAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); attachAxisMouseListeners1D( yAxisPane, yAxis, true ); - + var colorAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); attachAxisMouseListeners1D( colorAxisPane, colorAxis, true ); - + var colorInsetPane = newInsetPane( colorAxisPane, newInsets( 10, 10, 10, 10 ), null, false ); colorInsetPane.addPainter( newBlendingBackgroundPainter( rgba( 0, 0, 0, 0.6 ) ) ); @@ -552,7 +552,7 @@ module Webglimpse { var data = { array : array, xSize : xSize, ySize : ySize, xMin : timeMin, xMax : timeMax, yMin : angleMin, yMax : angleMax }; var colorGradient = reverseBone; var colorScale = getGradientTexture( colorGradient ); - + // construct Pane and Painters var plotPane = new Pane( newColumnLayout( ), false ); plotPane.addPainter( newHeatmapPainter( rowAxis, colorAxis, data, colorScale, { blend: true } ) ); @@ -561,51 +561,51 @@ module Webglimpse { plotPane.addPane( yAxisPane, 0 ); plotPane.addPane( spacerPane, 1 ); plotPane.addPane( colorInsetPane, 2 ); - + return plotPane; } // Override content of an existing row ui.rowUi( 'metsci.timelineExample.dynamicRow01' ).paneFactory = createHeatmapPlotPane; }); - + // Another Example Custom Row // // Create a heatmap row with programmatically generated data // - + var createHeatmapPlotPane = function( drawable : Drawable, timeAxis : TimeAxis1D, yAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { var axisColor = options.timelineFgColor; var height = options.isMaximized ? null : 270; - + // setup axes var colorAxis = new Axis1D( 0, 30 ); colorAxis.limitsChanged.on( drawable.redraw ); - + yAxis.setVRange( -400, 400 ); yAxis.limitsChanged.on( drawable.redraw ); - + var rowAxis = new Axis2D( timeAxis, yAxis ); - + var spacerPane = new Pane( { updatePrefSize: fixedSize( null, height ) }, false ); - + var yAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); attachAxisMouseListeners1D( yAxisPane, yAxis, true ); - + var colorAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); attachAxisMouseListeners1D( colorAxisPane, colorAxis, true ); - + var colorInsetPane = newInsetPane( colorAxisPane, newInsets( 10, 10, 10, 10 ), null, false ); colorInsetPane.addPainter( newBlendingBackgroundPainter( rgba( 0, 0, 0, 0.6 ) ) ); // set heat map min/max bounds (in time and y axis value) - + var yMin = -1000; var yMax = 1000; var timeMin = timeAxis.vAtTime( parseTime_PMILLIS( '2013-12-31T21:00:00Z' ) ); var timeMax = timeAxis.vAtTime( parseTime_PMILLIS( '2014-01-02T06:19:00Z' ) ); - + // fill heat map data array var xSize = 1000; var ySize = 300; @@ -620,12 +620,12 @@ module Webglimpse { array[ y * xSize + x ] = value; } } - + // build arguments to newHeatmapPainter( ) var data = { array : array, xSize : xSize, ySize : ySize, xMin : timeMin, xMax : timeMax, yMin : yMin, yMax : yMax }; var colorGradient = jet; var colorScale = getGradientTexture( colorGradient ); - + // construct Pane and Painters var plotPane = new Pane( newColumnLayout( ), false ); plotPane.addPainter( newHeatmapPainter( rowAxis, colorAxis, data, colorScale, { blend: true } ) ); @@ -636,7 +636,7 @@ module Webglimpse { plotPane.addPane( colorInsetPane, 2 ); return plotPane; - + } // Override content of an existing row @@ -648,7 +648,7 @@ module Webglimpse { // $.getJSON( 'timelineData.json', function( newTimeline : Timeline ) { model.merge( newTimeline, timelineMergeNewBeforeOld ); - + // once the timeline has been loaded, add listeners to some of the Panes var pane = ui.rowUi( 'metsci.timelineExample.row03a' ).getPane( 'y-axis' ); var clickListener = function( ev : PointerEvent ) { @@ -656,7 +656,7 @@ module Webglimpse { }; pane.mouseDown.on( clickListener ); } ); - + // Example function for reloading TimelinePane with new TimelinePaneOptions. Takes care of // removing the TimelinePane from its parent pane, disposing of its listeners/resources, // creating a new TimelinePane, and reattaching it to the parent Pane. The new TimelinePane @@ -676,9 +676,9 @@ module Webglimpse { // update the drawable drawable.redraw( ); - + // return the newly created Pane return reloadedTimelinePane; } } -} + diff --git a/src/webglimpse/bounds.ts b/src/webglimpse/bounds.ts index 247f65a..0640b07 100644 --- a/src/webglimpse/bounds.ts +++ b/src/webglimpse/bounds.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class BoundsUnmodifiable { @@ -142,4 +142,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/buffer.ts b/src/webglimpse/buffer.ts index 6017d99..038c07d 100644 --- a/src/webglimpse/buffer.ts +++ b/src/webglimpse/buffer.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface Buffer { @@ -165,4 +165,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/color.ts b/src/webglimpse/color.ts index 06c0de8..71559b6 100644 --- a/src/webglimpse/color.ts +++ b/src/webglimpse/color.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class Color { @@ -143,4 +143,3 @@ module Webglimpse { export var periwinkle = rgb( 0.561, 0.561, 0.961 ); -} \ No newline at end of file diff --git a/src/webglimpse/core.ts b/src/webglimpse/core.ts index de1a61b..2e1ab56 100644 --- a/src/webglimpse/core.ts +++ b/src/webglimpse/core.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface Painter { @@ -117,7 +117,7 @@ module Webglimpse { private _viewport : Bounds; private _scissor : Bounds; private _viewportChanged : Notification; - + private _dispose : Notification; constructor( layout : Layout, consumesInputEvents : boolean = true, isInside : Mask2D = alwaysTrue ) { @@ -134,9 +134,9 @@ module Webglimpse { this._viewport = newBoundsFromRect( 0, 0, 0, 0 ); this._scissor = newBoundsFromRect( 0, 0, 0, 0 ); this._viewportChanged = new Notification( ); - + this._dispose = new Notification( ); - + this._dispose.on( ( ) => { this._mouseUp.dispose( ); this._mouseDown.dispose( ); @@ -145,18 +145,18 @@ module Webglimpse { this._mouseEnter.dispose( ); this._mouseExit.dispose( ); this._contextMenu.dispose( ); - + // recursively dispose all child panes for ( var i = 0 ; i < this.children.length ; i++ ) { this.children.valueAt( i ).pane.dispose.fire( ); } } ); } - + get layout( ) : Layout { return this.layout; } - + set layout( layout : Layout ) { this._layout = layout; } @@ -354,10 +354,10 @@ module Webglimpse { fireContextMenu( i : number, j : number, mouseEvent : MouseEvent ) : any { return this._contextMenu.fire( { paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent } ); } - + // Disposal // - + get dispose( ) : Notification { return this._dispose; } @@ -442,7 +442,7 @@ module Webglimpse { return ev.which === 1; } } - + // detects whether any mouse button is down export function isMouseDown( ev : MouseEvent ) { return ev.buttons !== 0; @@ -601,11 +601,11 @@ module Webglimpse { var endDrag = function( ev : MouseEvent ) { var i = iMouse( element, ev ); var j = jMouse( element, ev ); - + for ( var n = 0; n < currentPanes.length; n++ ) { currentPanes[ n ].fireMouseUp( i, j, clickCount, ev ); } - + dragging = false; if ( pendingExit ) { @@ -635,7 +635,7 @@ module Webglimpse { // We don't receive mouse events that happen over another iframe -- even during a drag. If we miss a mouseup that // should terminate a drag, we end up stuck in dragging mode, which makes for a really lousy user experience. To // avoid that, whenever the mouse moves, check whether the button is down. If we're still in dragging mode, but - // the button is now up, end the drag. + // the button is now up, end the drag. // If we're dragging, and we see a mousemove with no buttons down, end the drag var recentDrag : MouseEvent = null; @@ -730,7 +730,7 @@ module Webglimpse { export interface Drawable { setContentPane( pane : Pane ); redraw( ); - + getPrefSize( ) : Size; prefSizeChanged( ) : Notification1; } @@ -755,18 +755,18 @@ module Webglimpse { if ( !hasval( pendingRequestId ) ) { pendingRequestId = window.requestAnimationFrame( function( ) { if ( hasval( contentPane ) ) { - + var oldPrefSize = { w: contentPrefSize.w, h: contentPrefSize.h }; - + contentPane.updatePrefSizes( contentPrefSize ); contentViewport.setRect( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight ); contentPane.updateBounds( contentViewport.unmod, contentViewport.unmod ); contentPane.paint( gl ); - + // XXX: Trigger an enter/exit check somehow (fake a mouse-event?) } pendingRequestId = null; - + if ( oldPrefSize.w !== contentPrefSize.w || oldPrefSize.h !== contentPrefSize.h ) { contentPrefSizeNotification.fire ( { w: contentPrefSize.w, h: contentPrefSize.h } ); } @@ -783,4 +783,4 @@ module Webglimpse { } -} + diff --git a/src/webglimpse/gradient.ts b/src/webglimpse/gradient.ts index a7558bf..2f4b9a9 100644 --- a/src/webglimpse/gradient.ts +++ b/src/webglimpse/gradient.ts @@ -27,29 +27,29 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // value: a number from 0-1 // out: four component RGBA array indicating the gradient color for the input fraction export interface Gradient { ( value : number ) : number[]; } - + // fills an array with jet colorscale values // webgl does not support 1D textures, so a 2D texture must be used export function jet( value : number ) : number[] { - + var x = 4.0 * value; - - var r = clamp( 1.5 - Math.abs( x - 3.0 ), 0, 1 ); + + var r = clamp( 1.5 - Math.abs( x - 3.0 ), 0, 1 ); var g = clamp( 1.5 - Math.abs( x - 2.0 ), 0, 1 ); var b = clamp( 1.5 - Math.abs( x - 1.0 ), 0, 1 ); - + return [ r, g, b, 1.0 ]; } - + export function reverseBone( value : number ) : number[] { - + var x = 1 - 0.875 * value; if ( value < 0.375 ) { @@ -63,24 +63,24 @@ module Webglimpse { { return [ x + 0.375 - value * 0.5, x - 0.125, x - 0.125, 1 ]; } - + } - + export function getGradientTexture( gradient : Gradient, size : number = 1024 ) : Texture { var array = new Float32Array( size * 4 ); - + for ( var v = 0 ; v < size ; v++ ) { var color = gradient( v / size ); - + array[ 4*v + 0 ] = color[0]; array[ 4*v + 1 ] = color[1]; array[ 4*v + 2 ] = color[2]; array[ 4*v + 3 ] = color[3]; } - + return new FloatDataTexture2D( size, 1, array ); } - + function clamp( n : number, min : number, max : number ) : number { if ( n < min ) { return min; @@ -92,4 +92,3 @@ module Webglimpse { return n; } } -} \ No newline at end of file diff --git a/src/webglimpse/label.ts b/src/webglimpse/label.ts index 9b3b982..3089ea1 100644 --- a/src/webglimpse/label.ts +++ b/src/webglimpse/label.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class Label { @@ -75,7 +75,7 @@ module Webglimpse { } } } - + get fgColor( ) : Color { return this._fgColor; } @@ -89,7 +89,7 @@ module Webglimpse { } } } - + get bgColor( ) : Color { return this._bgColor; } @@ -138,12 +138,12 @@ module Webglimpse { export function newLabelPainter( label : Label, xFrac : number, yFrac : number, xAnchor? : number, yAnchor? : number, rotation_CCWRAD? : number ) { var textureRenderer = new TextureRenderer( ); return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - + if ( hasval( label.bgColor ) ) { gl.clearColor( label.bgColor.r, label.bgColor.g, label.bgColor.b, label.bgColor.a ); gl.clear( GL.COLOR_BUFFER_BIT ); } - + var texture = label.texture; if ( texture ) { textureRenderer.begin( gl, viewport ); @@ -154,4 +154,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/layout/card_layout.ts b/src/webglimpse/layout/card_layout.ts index a1ed237..f1394db 100644 --- a/src/webglimpse/layout/card_layout.ts +++ b/src/webglimpse/layout/card_layout.ts @@ -27,14 +27,14 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + /** * A layout similar to overlay_layout except only one child pane is visible at a time. * That child pane has its size set to the size of the parent pane. The other children panes * are made invisible until they are the active pane. - * + * * The layoutArg for each child is a boolean, true if it should be the active pane. One is chosen * arbitrarily if multiple panes have true layoutArg. */ @@ -44,7 +44,7 @@ module Webglimpse { updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { var activeChild : LayoutEntry; - + for ( var c = 0; c < children.length; c++ ) { var child = children[ c ]; var isActive = child.layoutArg; @@ -81,7 +81,7 @@ module Webglimpse { updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { var activeChildIndex : number; - + for ( var c = 0; c < children.length; c++ ) { var child = children[ c ]; var isActive = child.layoutArg; @@ -89,7 +89,7 @@ module Webglimpse { activeChildIndex = c; } } - + for ( var c = 0; c < children.length; c++ ) { if ( c === activeChildIndex ) { children[ c ].viewport.setBounds( parentViewport ); @@ -102,4 +102,3 @@ module Webglimpse { }; } -} \ No newline at end of file diff --git a/src/webglimpse/layout/column_layout.ts b/src/webglimpse/layout/column_layout.ts index 677a70b..2ac6ff9 100644 --- a/src/webglimpse/layout/column_layout.ts +++ b/src/webglimpse/layout/column_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + function childWidth( child : LayoutEntry ) : number { @@ -172,4 +172,3 @@ module Webglimpse { }; } -} \ No newline at end of file diff --git a/src/webglimpse/layout/corner_layout.ts b/src/webglimpse/layout/corner_layout.ts index 9fe4205..345deba 100644 --- a/src/webglimpse/layout/corner_layout.ts +++ b/src/webglimpse/layout/corner_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function newCornerLayout( hSide : Side, vSide : Side ) : Layout { @@ -80,4 +80,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/layout/inset_layout.ts b/src/webglimpse/layout/inset_layout.ts index cfe90db..4946183 100644 --- a/src/webglimpse/layout/inset_layout.ts +++ b/src/webglimpse/layout/inset_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface Insets { @@ -121,4 +121,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/layout/overlay_layout.ts b/src/webglimpse/layout/overlay_layout.ts index 8784aa5..ccf21c0 100644 --- a/src/webglimpse/layout/overlay_layout.ts +++ b/src/webglimpse/layout/overlay_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + /** @@ -87,4 +87,3 @@ module Webglimpse { }; } -} \ No newline at end of file diff --git a/src/webglimpse/layout/row_layout.ts b/src/webglimpse/layout/row_layout.ts index ebad070..6787483 100644 --- a/src/webglimpse/layout/row_layout.ts +++ b/src/webglimpse/layout/row_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // 'pref' indicates the child's height should be its preferred height @@ -41,11 +41,11 @@ module Webglimpse { var usePrefHeight = ( !hasval( child.layoutOptions ) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max' ); return ( usePrefHeight ? child.prefSize.h : child.layoutOptions.height ); } - + // see above, like childHeight( ) but don't count 'pref-max' function childHeightOverfull( child : LayoutEntry ) : number { var usePrefHeight = ( !hasval( child.layoutOptions ) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' ); - + if ( usePrefHeight ) { return child.prefSize.h; } @@ -64,7 +64,7 @@ module Webglimpse { flexHeight : number; childHeight : ( child : LayoutEntry ) => number; } - + function calculateFlexData( childrenToPlace : LayoutEntry[], parentViewport : BoundsUnmodifiable, childHeight : ( child : LayoutEntry ) => number ) : FlexData { var numFlexible = 0; var totalHeight = 0; @@ -81,7 +81,7 @@ module Webglimpse { var flexHeight = totalFlexHeight / numFlexible; return { numFlexible : numFlexible, totalHeight : totalHeight, flexHeight : flexHeight, totalFlexHeight : totalFlexHeight, childHeight : childHeight }; } - + export function newRowLayout( topToBottom : boolean = true ) : Layout { return { @@ -152,12 +152,12 @@ module Webglimpse { // calculate assuming sufficient space var flexData = calculateFlexData( children, parentViewport, childHeight ); - + // recalculate allowing 'pref-max' children to shrink if insufficient space if ( flexData.totalHeight > parentViewport.h ) { flexData = calculateFlexData( children, parentViewport, childHeightOverfull ); } - + if ( topToBottom ) { var iStart = parentViewport.iStart; var iEnd = parentViewport.iEnd; @@ -211,4 +211,3 @@ module Webglimpse { } }; } -} \ No newline at end of file diff --git a/src/webglimpse/matrix.ts b/src/webglimpse/matrix.ts index 8de7db1..8c58639 100644 --- a/src/webglimpse/matrix.ts +++ b/src/webglimpse/matrix.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // see: http://www.cs.rit.edu/usr/local/pub/wrc/graphics/doc/opengl/books/blue/glOrtho.html @@ -46,12 +46,11 @@ module Webglimpse { -tx, -ty, -tz, 1 ] ); } - + export function glOrthoViewport( viewport : BoundsUnmodifiable ) : Float32Array { return glOrtho( -0.5, viewport.w-0.5, -0.5, viewport.h-0.5, -1, 1 ); } - + export function glOrthoAxis( axis : Axis2D ) : Float32Array { return glOrtho( axis.xAxis.vMin, axis.xAxis.vMax, axis.yAxis.vMin, axis.yAxis.vMax, -1, 1 ); } -} \ No newline at end of file diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index ee375b1..89f0bcc 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function newGroupPainter( ...painters : Painter[] ) : Painter { @@ -38,17 +38,17 @@ module Webglimpse { }; } - + export function newBlendingBackgroundPainter( color : Color ) : Painter { - + var program = new Program( xyNdc_VERTSHADER, solid_FRAGSHADER ); var u_Color = new UniformColor( program, 'u_Color' ); var a_XyNdc = new Attribute( program, 'a_XyNdc' ); - + var numVertices = 4; var xy_NDC = new Float32Array( 2*numVertices ); var xyBuffer_NDC = newDynamicBuffer( ); - + return function( gl : WebGLRenderingContext ) { if ( color.a >= 1 ) { gl.disable( GL.BLEND ); @@ -57,10 +57,10 @@ module Webglimpse { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); } - + program.use( gl ); u_Color.setData( gl, color ); - + xy_NDC[0] = -1; xy_NDC[1] = 1; xy_NDC[2] = -1; @@ -69,7 +69,7 @@ module Webglimpse { xy_NDC[5] = 1; xy_NDC[6] = 1; xy_NDC[7] = -1; - + xyBuffer_NDC.setData( xy_NDC ); a_XyNdc.setDataAndEnable( gl, xyBuffer_NDC, 2, GL.FLOAT ); @@ -79,15 +79,15 @@ module Webglimpse { program.endUse( gl ); }; } - + export class Background { - + private _color : Color; constructor( color? : Color ) { this._color = color; } - + get color( ) : Color { return this._color; } @@ -97,7 +97,7 @@ module Webglimpse { this._color = color; } } - + newPainter( ) { var background : Background = this; return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { @@ -108,7 +108,7 @@ module Webglimpse { }; } } - + export function newBackgroundPainter( color : Color ) : Painter { return function( gl : WebGLRenderingContext ) { @@ -189,8 +189,8 @@ module Webglimpse { ' } ', ' ' ); - - + + export var dash_FRAGSHADER = concatLines( ' precision highp float; ', ' uniform mat4 u_modelViewMatrix; ', @@ -391,4 +391,4 @@ module Webglimpse { } -} + diff --git a/src/webglimpse/painter/border_painter.ts b/src/webglimpse/painter/border_painter.ts index a1e2d9d..3559efa 100644 --- a/src/webglimpse/painter/border_painter.ts +++ b/src/webglimpse/painter/border_painter.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface BorderOptions { @@ -154,4 +154,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/plot/axis.ts b/src/webglimpse/plot/axis.ts index 6b78121..5cc512d 100644 --- a/src/webglimpse/plot/axis.ts +++ b/src/webglimpse/plot/axis.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class Axis1D { @@ -236,4 +236,3 @@ module Webglimpse { } ); } -} \ No newline at end of file diff --git a/src/webglimpse/plot/edge_axis_painter.ts b/src/webglimpse/plot/edge_axis_painter.ts index 08f4675..153469b 100644 --- a/src/webglimpse/plot/edge_axis_painter.ts +++ b/src/webglimpse/plot/edge_axis_painter.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function edgeMarks_VERTSHADER( labelSide : Side ) { @@ -58,7 +58,7 @@ module Webglimpse { ' ' ); } - + export var gradient_FRAGSHADER = concatLines( ' ', ' precision highp float; ', @@ -84,7 +84,7 @@ module Webglimpse { export interface TickLabeler { ( value : number, axis : Axis1D, tickInterval : number ): string; } - + export interface EdgeAxisPainterOptions { tickSpacing? : number; @@ -115,7 +115,7 @@ module Webglimpse { var showBorder = ( hasval( options ) && hasval( options.showBorder ) ? options.showBorder : false ); var gradientFill = ( hasval( options ) && hasval( options.gradientFill ) ? options.gradientFill : undefined ); var tickLabeler = ( hasval( options ) && hasval( options.tickLabeler ) ? options.tickLabeler : undefined ); - + var tickPositions = new Float32Array( 0 ); var gradientProgram = new Program( heatmap_VERTSHADER, gradient_FRAGSHADER ); @@ -123,23 +123,23 @@ module Webglimpse { var gradientProgram_u_colorTexture = new UniformSampler2D( gradientProgram, 'u_colorTex' ); var gradientProgram_a_vertCoord = new Attribute( gradientProgram, 'a_vertCoord' ); var gradientProgram_a_texCoord = new Attribute( gradientProgram, 'a_texCoord' ); - + if ( gradientFill ) var gradientColorTexture = getGradientTexture( gradientFill ); - + var gradientVertCoords = new Float32Array( 0 ); var gradientVertCoordsBuffer = newDynamicBuffer( ); - + var gradientTexCoords = new Float32Array( 0 ); var gradientTexCoordsBuffer = newDynamicBuffer( ); - + var borderProgram = new Program( modelview_VERTSHADER, solid_FRAGSHADER ); var borderProgram_a_Position = new Attribute( borderProgram, 'a_Position' ); var borderProgram_u_modelViewMatrix = new UniformMatrix4f( borderProgram, 'u_modelViewMatrix' ); var borderProgram_u_Color = new UniformColor( borderProgram, 'u_Color' ); - + var borderCoords = new Float32Array( 0 ); var borderCoordsBuffer = newDynamicBuffer( ); - + var marksProgram = new Program( edgeMarks_VERTSHADER( labelSide ), solid_FRAGSHADER ); var marksProgram_u_VMin = new Uniform1f( marksProgram, 'u_VMin' ); var marksProgram_u_VSize = new Uniform1f( marksProgram, 'u_VSize' ); @@ -157,7 +157,7 @@ module Webglimpse { var isVerticalAxis = ( labelSide === Side.LEFT || labelSide === Side.RIGHT ); return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - + var sizePixels = isVerticalAxis ? viewport.h : viewport.w; if ( sizePixels === 0 ) return; var approxNumTicks = sizePixels / tickSpacing; @@ -166,42 +166,42 @@ module Webglimpse { tickPositions = ensureCapacityFloat32( tickPositions, tickCount ); getTickPositions( axis, tickInterval, tickCount, tickPositions ); - + // Border Box and Gradient Fill // - + //XXX border vertices are fixed in normalized 0-1 viewport coordinates //XXX they could be calculated ahead of time -- however I had trouble with 'fuzzy' lines when using 0-1 coordinates if ( showBorder || gradientFill ) { borderCoords = ensureCapacityFloat32( borderCoords, 10 ); - + var horizontal = ( labelSide === Side.TOP || labelSide === Side.BOTTOM ); var bFlip = ( labelSide === Side.LEFT || labelSide === Side.BOTTOM ); var width = viewport.w - 1; var height = viewport.h - 1; - + borderCoords[0] = horizontal ? 0 : ( bFlip ? width - tickSize : 0 ); borderCoords[1] = !horizontal ? 0 : ( bFlip ? height - tickSize : 0 ); - + borderCoords[2] = horizontal ? 0 : ( bFlip ? width : tickSize ); borderCoords[3] = !horizontal ? 0 : ( bFlip ? height : tickSize ); - + borderCoords[4] = horizontal ? width : ( bFlip ? width : tickSize ); borderCoords[5] = !horizontal ? height : ( bFlip ? height : tickSize ); - + borderCoords[6] = horizontal ? width : ( bFlip ? width - tickSize : 0 ); borderCoords[7] = !horizontal ? height : ( bFlip ? height - tickSize : 0 ); - + // finish off the box (same as 0, 1 coordinates) borderCoords[8] = horizontal ? 0 : ( bFlip ? width - tickSize : 0 ); borderCoords[9] = !horizontal ? 0 : ( bFlip ? height - tickSize : 0 ); } - + if ( gradientFill ) { gradientProgram.use( gl ); gradientProgram_u_modelViewMatrix.setData( gl, glOrthoViewport( viewport ) ); gradientProgram_u_colorTexture.setDataAndBind( gl, 0, gradientColorTexture ); - + gradientVertCoords = ensureCapacityFloat32( gradientVertCoords, 8 ); gradientVertCoords[0] = borderCoords[2]; gradientVertCoords[1] = borderCoords[3]; @@ -213,9 +213,9 @@ module Webglimpse { gradientVertCoords[7] = borderCoords[7]; gradientVertCoordsBuffer.setData( gradientVertCoords ); gradientProgram_a_vertCoord.setDataAndEnable( gl, gradientVertCoordsBuffer, 2, GL.FLOAT ); - + // y texture coordinates don't really matter ( we're simulating a 1d texture ) - // using a 1-by-n 2d texture because 1d textures aren't available + // using a 1-by-n 2d texture because 1d textures aren't available gradientTexCoords = ensureCapacityFloat32( gradientTexCoords, 8 ); gradientTexCoords[0] = 0; gradientTexCoords[1] = 0; @@ -227,27 +227,27 @@ module Webglimpse { gradientTexCoords[7] = 1; gradientTexCoordsBuffer.setData( gradientTexCoords ); gradientProgram_a_texCoord.setDataAndEnable( gl, gradientTexCoordsBuffer, 2, GL.FLOAT ); - + gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); - + gradientProgram_u_colorTexture.unbind( gl ); gradientProgram_a_vertCoord.disable( gl ); gradientProgram_a_texCoord.disable( gl ); gradientProgram.endUse( gl ); } - + if ( showBorder ) { borderProgram.use( gl ); borderProgram_u_Color.setData( gl, tickColor ); borderProgram_u_modelViewMatrix.setData( gl, glOrthoViewport( viewport ) ); - + borderCoordsBuffer.setData( borderCoords.subarray( 0, 10 ) ); borderProgram_a_Position.setDataAndEnable( gl, borderCoordsBuffer, 2, GL.FLOAT ); - + // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 gl.lineWidth( 1 ); gl.drawArrays( GL.LINE_STRIP, 0, 5 ); - + borderProgram_a_Position.disable( gl ); borderProgram.endUse( gl ); } @@ -375,10 +375,10 @@ module Webglimpse { if ( showLabel ) { var unitsString = units + ( !shortenLabels || orderAxis === 0 ? '' : ' x 10^' + orderAxis.toFixed( 0 ) ); var axisLabel = label + ( unitsString ? ' (' + unitsString + ')' : '' ); - + if ( axisLabel !== '' ) { var textTexture = textTextures.value( axisLabel ); - + var xFrac : number; var yFrac : number; var textOpts : TextureDrawOptions; @@ -412,4 +412,4 @@ module Webglimpse { }; } -} + diff --git a/src/webglimpse/plot/line_painter.ts b/src/webglimpse/plot/line_painter.ts index 2421c62..db7b25f 100644 --- a/src/webglimpse/plot/line_painter.ts +++ b/src/webglimpse/plot/line_painter.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface XyLinePainterOptions { @@ -71,7 +71,7 @@ module Webglimpse { // set color and projection matrix variables u_Color.setData( gl, color ); - + // set the projection matrix based on the axis bounds u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); @@ -83,7 +83,7 @@ module Webglimpse { // bind buffer data to vertex attribute array coordBuffer.bind( gl, GL.ARRAY_BUFFER ); - + // first argument corresponds to the 0 attrib array set above // second argument indicates two coordinates per vertex gl.vertexAttribPointer( 0, dim, GL.FLOAT, false, 0, 0 ); @@ -97,4 +97,4 @@ module Webglimpse { } -} + diff --git a/src/webglimpse/plot/plot_layout.ts b/src/webglimpse/plot/plot_layout.ts index e643085..b2a9144 100644 --- a/src/webglimpse/plot/plot_layout.ts +++ b/src/webglimpse/plot/plot_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function newPlotLayout( options? : { horizAxisHeight? : number; vertAxisWidth? : number } ) : Layout { var horizAxisHeight = ( hasval( options ) && hasval( options.horizAxisHeight ) ? options.horizAxisHeight : 60 ); @@ -101,4 +101,4 @@ module Webglimpse { }; } -} + diff --git a/src/webglimpse/scroll.ts b/src/webglimpse/scroll.ts index b0f10b9..afa355b 100644 --- a/src/webglimpse/scroll.ts +++ b/src/webglimpse/scroll.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface VerticalScrollLayout extends Layout { @@ -183,18 +183,18 @@ module Webglimpse { // mouse listener for scrolling while panning on the timeline itself export function attachTimelineVerticalScrollMouseListeners( pane : Pane, scrollLayout : VerticalScrollLayout, drawable : Drawable ) { - + // Used when dragging inside pane var grab : number = null; var jOffset : number = null; - + pane.mouseDown.on( function( ev : PointerEvent ) { if ( isLeftMouseDown( ev.mouseEvent ) ) { grab = ev.j; jOffset = scrollLayout.jOffset; } } ); - + pane.mouseMove.on( function( ev : PointerEvent ) { if ( hasval( grab ) ) { scrollLayout.jOffset = jOffset - ( grab - ev.j ); @@ -287,4 +287,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/shader.ts b/src/webglimpse/shader.ts index e5a5a48..2ab5f4d 100644 --- a/src/webglimpse/shader.ts +++ b/src/webglimpse/shader.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + function compileShader( gl : WebGLRenderingContext, shaderType : number, glsl : string ) : WebGLShader { @@ -327,4 +327,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index d3986e4..92c0552 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + interface Dim2D { @@ -524,4 +524,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/texture.ts b/src/webglimpse/texture.ts index 41abcee..bc767f4 100644 --- a/src/webglimpse/texture.ts +++ b/src/webglimpse/texture.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + class TextureEntry { @@ -126,16 +126,16 @@ module Webglimpse { return GL.TEXTURE_2D; }, init: function( gl : WebGLRenderingContext, target : number ) { - + if ( !gl.getExtension( 'OES_texture_float' ) ) { throw new Error( 'OES_texture_float extension is required' ); } - + gl.texParameteri( target, GL.TEXTURE_MAG_FILTER, GL.NEAREST ); gl.texParameteri( target, GL.TEXTURE_MIN_FILTER, GL.NEAREST ); gl.texParameteri( target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE ); gl.texParameteri( target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE ); - + // GL.LUMINANCE isn't supported with GL.FLOAT gl.texImage2D( target, 0, GL.RGBA, w, h, 0, GL.RGBA, GL.FLOAT, array ); } @@ -296,4 +296,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/time.ts b/src/webglimpse/time.ts index 1d916f0..677dcbe 100644 --- a/src/webglimpse/time.ts +++ b/src/webglimpse/time.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function secondsToMillis( value_SECONDS : number ) : number { @@ -63,4 +63,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/time_axis.ts b/src/webglimpse/timeline/time_axis.ts index 85f81c5..ffd1d55 100644 --- a/src/webglimpse/timeline/time_axis.ts +++ b/src/webglimpse/timeline/time_axis.ts @@ -27,13 +27,13 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class TimeAxis1D extends Axis1D { - + private _epoch_PMILLIS : number; - + constructor( tMin_PMILLIS : number, tMax_PMILLIS : number ) { this._epoch_PMILLIS = 0.5*( tMin_PMILLIS + tMax_PMILLIS ); super( tMin_PMILLIS - this._epoch_PMILLIS, tMax_PMILLIS - this._epoch_PMILLIS ); @@ -86,4 +86,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/time_axis_painter.ts b/src/webglimpse/timeline/time_axis_painter.ts index fb8bf65..c2fbb4f 100644 --- a/src/webglimpse/timeline/time_axis_painter.ts +++ b/src/webglimpse/timeline/time_axis_painter.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // XXX: Much of this is duplicated from edge_axis_painter @@ -91,10 +91,10 @@ module Webglimpse { var isVerticalAxis = ( labelSide === Side.LEFT || labelSide === Side.RIGHT ); return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - + var sizePixels = isVerticalAxis ? viewport.h : viewport.w; if ( sizePixels === 0 ) return; - + var tickTimes_PMILLIS = getTickTimes_PMILLIS( timeAxis, sizePixels, tickSpacing, tickTimeZone, referenceDate_PMILLIS ); var tickInterval_MILLIS = getTickInterval_MILLIS( tickTimes_PMILLIS ); var tickCount = tickTimes_PMILLIS.length; @@ -345,7 +345,7 @@ module Webglimpse { function getTickDisplayDataAbsolute( tickInterval_MILLIS : number, displayTimeZone : string, timeAxisFormat : TimeAxisFormatOptions ) : TickDisplayData { var defaultTickFormat = function( format : string ) : TickFormat { return function( tickTime_PMILLIS : number ) : string { return moment( tickTime_PMILLIS ).zone( displayTimeZone ).format( format ) } }; - var defaultPrefixFormat = function( format : string ) : PrefixFormat { return function( timeStruct : TimeStruct ) : string { return moment( timeStruct.textCenter_PMILLIS ).zone( displayTimeZone ).format( format ) } }; + var defaultPrefixFormat = function( format : string ) : PrefixFormat { return function( timeStruct : TimeStruct ) : string { return moment( timeStruct.textCenter_PMILLIS ).zone( displayTimeZone ).format( format ) } }; if ( tickInterval_MILLIS <= minutesToMillis( 1 ) ) { var formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00'); @@ -532,7 +532,7 @@ module Webglimpse { timeStruct.viewEnd_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS ); maxViewDuration_MILLIS = Math.max( maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS ); - + timeStructs.push( timeStruct ); } @@ -580,7 +580,7 @@ module Webglimpse { timeStruct.viewEnd_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS ); maxViewDuration_MILLIS = Math.max( maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS ); - + timeStructs.push( timeStruct ); } @@ -646,7 +646,7 @@ module Webglimpse { } function getTickTimesRelative_PMILLIS( timeAxis : TimeAxis1D, sizePixels : number, tickSpacing : number, referenceDate_PMILLIS : number ) : number[] { - + var dMin_PMILLIS = timeAxis.tMin_PMILLIS; var dMax_PMILLIS = timeAxis.tMax_PMILLIS; var approxTickInterval_MILLIS = tickSpacing * ( dMax_PMILLIS - dMin_PMILLIS ) / sizePixels; @@ -661,7 +661,7 @@ module Webglimpse { function getHourTickTimesRelative_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, approxTickInterval_MILLIS : number, referenceDate_PMILLIS : number ) : number[] { var tickTimes = getHourTickTimes_PMILLIS( dMin_PMILLIS - referenceDate_PMILLIS, dMax_PMILLIS - referenceDate_PMILLIS, approxTickInterval_MILLIS, 0 ); - + for ( var n = 0; n < tickTimes.length; n++ ) { tickTimes[n] = tickTimes[n] + referenceDate_PMILLIS; } @@ -860,4 +860,4 @@ module Webglimpse { } -} + diff --git a/src/webglimpse/timeline/time_grid_painter.ts b/src/webglimpse/timeline/time_grid_painter.ts index 83a85a8..4ec7d7f 100644 --- a/src/webglimpse/timeline/time_grid_painter.ts +++ b/src/webglimpse/timeline/time_grid_painter.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimeGridPainterOptions { @@ -88,4 +88,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_annotation_painter.ts b/src/webglimpse/timeline/timeline_annotation_painter.ts index 9adfccc..f0be8b7 100644 --- a/src/webglimpse/timeline/timeline_annotation_painter.ts +++ b/src/webglimpse/timeline/timeline_annotation_painter.ts @@ -28,48 +28,48 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function newTimeseriesAnnotationPainterFactory( ) : TimelineTimeseriesPainterFactory { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi ) : Painter { - + var textTextures = newTextTextureCache3( ); var textureRenderer = new TextureRenderer( ); - + var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); var u_Color = new UniformColor( program, 'u_Color' ); var a_Position = new Attribute( program, 'a_XyFrac' ); - + var xys = new Float32Array( 0 ); xys = ensureCapacityFloat32( xys, 4 ); var xysBuffer = newDynamicBuffer( ); - + // Painter return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + textTextures.resetTouches( ); - + for ( var i = 0 ; i < rowModel.annotationGuids.length ; i++ ) { var annotationGuid : string = rowModel.annotationGuids.valueAt(i); var annotation : TimelineAnnotationModel = model.annotation( annotationGuid ); var annotationStyle : TimelineAnnotationStyleUi = ui.annotationStyle( annotation.styleGuid ); - + var font = hasval( annotationStyle.font ) ? annotationStyle.font : '11px verdana,sans-serif'; var color = hasval( annotationStyle.color ) ? annotationStyle.color : white; - + var hTextOffset = hasval( annotationStyle.hTextOffset ) ? annotationStyle.hTextOffset : 0; var vTextOffset = hasval( annotationStyle.vTextOffset ) ? annotationStyle.vTextOffset : 0; - + // draw line if ( annotationStyle.uiHint === 'horizontal-line' || annotationStyle.uiHint === 'vertical-line' ) { - + if ( annotationStyle.uiHint === 'horizontal-line' ) { var xFrac = hasval( annotationStyle.align ) ? annotationStyle.align : 1 ; var yFrac = dataAxis.vFrac( annotation.y ); - + xys[0] = 0; xys[1] = yFrac; xys[2] = 1; @@ -78,38 +78,38 @@ module Webglimpse { else if ( annotationStyle.uiHint === 'vertical-line' ) { var xFrac = timeAxis.tFrac( annotation.time_PMILLIS ); var yFrac = hasval( annotationStyle.align ) ? annotationStyle.align : 1 ; - + xys[0] = xFrac; xys[1] = 0; xys[2] = xFrac; xys[3] = 1; } - + program.use( gl ); - + u_Color.setData( gl, color ); - + xysBuffer.setData( xys.subarray( 0, 4 ) ); a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - + gl.drawArrays( GL.LINES, 0, 2 ); - + program.endUse( gl ); } else { var xFrac = timeAxis.tFrac( annotation.time_PMILLIS ); var yFrac = dataAxis.vFrac( annotation.y ); } - + textureRenderer.begin( gl, viewport ); - + // draw icons for ( var n = 0; n < annotationStyle.numIcons; n++ ) { var icon : TimelineAnnotationIcon = annotationStyle.icon( n ); - + var xFracOffset = xFrac + ( hasval( icon.hOffset ) ? icon.hOffset : 0 ) / viewport.w; var yFracOffset = yFrac + ( hasval( icon.vOffset ) ? icon.vOffset : 0 ) / viewport.h; - + var iconTexture = ui.loadImage( icon.url, function( ) { drawable.redraw( ); } ); if ( iconTexture ) { var options = { xAnchor: ( hasval( icon.hAlign ) ? icon.hAlign : 0.5 ), @@ -117,30 +117,29 @@ module Webglimpse { width: icon.displayWidth, height: icon.displayHeight, rotation_CCWRAD: 0 }; - + textureRenderer.draw( gl, iconTexture, xFracOffset, yFracOffset, options ); } } - + // draw text label if ( hasval( annotation.label ) ) { - + var textTexture = textTextures.value( font, color.rgbaString, annotation.label ); - + var xFracOffset = xFrac + hTextOffset / viewport.w; var yFracOffset = yFrac + vTextOffset / viewport.h; - + var xAnchor = hasval( annotationStyle.hTextAlign ) ? annotationStyle.hTextAlign : 0; var yAnchor = textTexture.yAnchor( hasval( annotationStyle.vTextAlign ) ? annotationStyle.vTextAlign : 0.5 ); - + textureRenderer.draw( gl, textTexture, xFracOffset, yFracOffset, { xAnchor: xAnchor, yAnchor: yAnchor } ); } - + textureRenderer.end( gl ); } - + textTextures.retainTouched( ); }; }; } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_annotation_style.ts b/src/webglimpse/timeline/timeline_annotation_style.ts index 6722d63..f4ad689 100644 --- a/src/webglimpse/timeline/timeline_annotation_style.ts +++ b/src/webglimpse/timeline/timeline_annotation_style.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimelineAnnotationIcon { url : string; @@ -52,7 +52,7 @@ module Webglimpse { uiHint? : string; // one of: point, horizontal-line, vertical-line icons? : TimelineAnnotationIcon[]; } - + export class TimelineAnnotationIconUi { private _url : string; private _displayWidth : number; @@ -83,7 +83,7 @@ module Webglimpse { get vAlign( ) : number { return this._vAlign; } get hOffset( ) : number { return this._hOffset; } get vOffset( ) : number { return this._vOffset; } - + snapshot( ) : TimelineAnnotationIcon { return { url: this._url, @@ -115,7 +115,7 @@ module Webglimpse { this._styleGuid = style.styleGuid; this._setAttrs( style ); } - + get styleGuid( ) : string { return this._styleGuid; } @@ -139,7 +139,7 @@ module Webglimpse { icon( index : number ) : TimelineAnnotationIconUi { return this._icons[ index ]; } - + get color( ) : Color { return this._color; } @@ -147,27 +147,27 @@ module Webglimpse { get font( ) : string { return this._font; } - + get hTextOffset( ) : number { return this._hTextOffset; } - + get vTextOffset( ) : number { return this._vTextOffset; } - + get hTextAlign( ) : number { return this._hTextAlign; } - + get vTextAlign( ) : number { return this._vTextAlign; } - + get align( ) : number { return this._align; } - + get uiHint( ) : string { return this._uiHint; } @@ -188,4 +188,3 @@ module Webglimpse { } } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_cursor_painter.ts b/src/webglimpse/timeline/timeline_cursor_painter.ts index 4e8f899..2eb053f 100644 --- a/src/webglimpse/timeline/timeline_cursor_painter.ts +++ b/src/webglimpse/timeline/timeline_cursor_painter.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimeseriesCursorPainterOptions { font? : string; @@ -66,7 +66,7 @@ module Webglimpse { var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); var u_Color = new UniformColor( program, 'u_Color' ); var a_Position = new Attribute( program, 'a_XyFrac' ); - + var xys = new Float32Array( 0 ); xys = ensureCapacityFloat32( xys, 4 ); var xysBuffer = newDynamicBuffer( ); @@ -83,10 +83,10 @@ module Webglimpse { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + var indexXys = 0; textTextures.resetTouches( ); - + var time = ui.selection.hoveredTime_PMILLIS.value; var y = ui.selection.hoveredY.value; @@ -102,9 +102,9 @@ module Webglimpse { var hBox = boxSize_px / viewport.h; if ( hasval( time ) ) { - + var cursorModel = model.cursor( rowModel.cursorGuid ); - + if ( hasval( cursorModel) ) { if ( hasval( cursorModel.lineColor ) ) @@ -128,19 +128,19 @@ module Webglimpse { var timeseriesGuid = cursorModel.labeledTimeseriesGuids.valueAt( i ); var timeseries = model.timeseries( timeseriesGuid ); - + // if the row doesn't contain the timeseries, don't show cursor intersections if ( !rowModel.timeseriesGuids.hasValue( timeseriesGuid ) ) continue; for ( var j = 0 ; j < timeseries.fragmentGuids.length ; j++ ) { var fragmentGuid : string = timeseries.fragmentGuids.valueAt( j ); var fragment : TimelineTimeseriesFragmentModel = model.timeseriesFragment( fragmentGuid ); - + // fragments should not overlap if ( fragment.start_PMILLIS < time && fragment.end_PMILLIS > time ) { - + var value : number; - + // bars are drawn starting at the point and continuing to the next point, so we don't interpolate them if ( timeseries.uiHint == 'bars' ) { var index : number = indexAtOrBefore( fragment.times_PMILLIS, time ); @@ -149,18 +149,18 @@ module Webglimpse { else { var index0 : number = indexAtOrBefore( fragment.times_PMILLIS, time ); var index1 : number = indexAtOrAfter( fragment.times_PMILLIS, time ); - + var value0 = fragment.data[index0]; var time0 = fragment.times_PMILLIS[index0]; - + var value1 = fragment.data[index1]; var time1 = fragment.times_PMILLIS[index1]; - + var diff = time1 - time0; var diff0 = ( time - time0 ) / diff; var diff1 = 1 - diff0; - - value = value0 * diff1 + value1 * diff0; + + value = value0 * diff1 + value1 * diff0; } var textTexture = textTextures.value( textColor.rgbaString, value.toFixed( textDecimals ) ); @@ -194,7 +194,7 @@ module Webglimpse { if ( hasval( cursorModel.showCursorText ) ? cursorModel.showCursorText : true ) { var textTexture = textTextures.value( textColor.rgbaString, y.toFixed( textDecimals ) ); - textureRenderer.draw( gl, textTexture, 1, dataAxis.vFrac( y ) + buffer_px/viewport.h, { xAnchor: 1, yAnchor: 0 } ); + textureRenderer.draw( gl, textTexture, 1, dataAxis.vFrac( y ) + buffer_px/viewport.h, { xAnchor: 1, yAnchor: 0 } ); } textureRenderer.end( gl ); @@ -223,7 +223,7 @@ module Webglimpse { a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); u_Color.setData( gl, lineColor ); gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); - + a_Position.disable( gl ); program.endUse( gl ); } @@ -231,4 +231,3 @@ module Webglimpse { } } } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_event_style.ts b/src/webglimpse/timeline/timeline_event_style.ts index 95a452d..fc89ff9 100644 --- a/src/webglimpse/timeline/timeline_event_style.ts +++ b/src/webglimpse/timeline/timeline_event_style.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimelineEventIcon { @@ -120,4 +120,3 @@ module Webglimpse { -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_events_row.ts b/src/webglimpse/timeline/timeline_events_row.ts index d5e71fe..8ab988f 100644 --- a/src/webglimpse/timeline/timeline_events_row.ts +++ b/src/webglimpse/timeline/timeline_events_row.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimelineEventsPainterOptions { @@ -74,7 +74,7 @@ module Webglimpse { var rowUi = ui.rowUi( row.rowGuid ); var input = ui.input; var selection = ui.selection; - + var lanes = new TimelineLaneArray( model, row, ui, allowMultipleLanes ); var timeAtCoords_PMILLIS = function( viewport : BoundsUnmodifiable, i : number ) : number { @@ -112,7 +112,7 @@ module Webglimpse { var rowContentPane = new Pane( layout, true, isInsideAnEvent ); rowUi.addPane( 'content', rowContentPane ); - + var painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding, laneHeight: laneHeight }; for ( var n = 0; n < painterFactories.length; n++ ) { var createPainter = painterFactories[ n ]; @@ -179,7 +179,7 @@ module Webglimpse { } }; ui.millisPerPx.changed.on( uiMillisPerPxChanged ); - + rowContentPane.mouseUp.on( function( ev : PointerEvent ) { input.mouseUp.fire( ev ); } ); @@ -273,7 +273,7 @@ module Webglimpse { var mouseCursors = { 'center': 'default', 'start': 'w-resize', 'end': 'e-resize', 'undraggable': 'default' }; var hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; - + // if a multi-selection has been made, update the cursor based on all the events in the multi-selection if ( selection.selectedEvents.length > 1 ) { rowContentPane.mouseCursor = mouseCursors[ chooseEventDragMode( ui, hoveredTime_PMILLIS, selection.selectedEvents.toArray( ) ) ]; @@ -294,7 +294,7 @@ module Webglimpse { var eventDragEventsSet = selection.selectedEvents; eventDragEvents = eventDragEventsSet.toArray( ); eventDragMode = chooseEventDragMode( ui, timeAtPointer_PMILLIS( ev ), eventDragEvents ); - + eventDragSnapTimes_PMILLIS = new Array( ); var numSnapTimes = 0; var allEventGuids = row.eventGuids; @@ -510,23 +510,23 @@ module Webglimpse { rowContentPane.dispose.on( function( ) { lanes.dispose( ); - + timeAxis.limitsChanged.off( dragEventEnd ); timeAxis.limitsChanged.off( dragEventStart ); - + ui.millisPerPx.changed.off( uiMillisPerPxChanged ); - + ui.millisPerPx.changed.off( updateCursor ); selection.hoveredTime_PMILLIS.changed.off( updateCursor ); selection.hoveredEvent.changed.off( updateCursor ); - + row.eventGuids.valueAdded.off( redraw ); row.eventGuids.valueMoved.off( redraw ); row.eventGuids.valueRemoved.off( redraw ); row.eventGuids.valueRemoved.off( removeRedraw ); - + row.eventGuids.valueAdded.off( watchEventAttrs ); - + row.eventGuids.forEach( function( eventGuid : string ) { model.event( eventGuid ).attrsChanged.off( redraw ); } ); @@ -549,7 +549,7 @@ module Webglimpse { var lineColor = ( hasval( limitsOpts ) && hasval( limitsOpts.lineColor ) ? limitsOpts.lineColor : new Color( 1, 0, 0, 1 ) ); var lineThickness = ( hasval( limitsOpts ) && hasval( limitsOpts.lineThickness ) ? limitsOpts.lineThickness : 2.5 ); - + var xyFrac_vColor_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', @@ -567,27 +567,27 @@ module Webglimpse { var program = new Program( xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER ); var a_XyFrac = new Attribute( program, 'a_XyFrac' ); var a_Color = new Attribute( program, 'a_Color' ); - + var xys = new Float32Array( 0 ); var xysBuffer = newDynamicBuffer( ); var rgbas = new Float32Array( 0 ); var rgbasBuffer = newDynamicBuffer( ); - + return { paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { if ( indexXys > 0 ) { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + program.use( gl ); xysBuffer.setData( xys.subarray( 0, indexXys ) ); a_XyFrac.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); rgbasBuffer.setData( rgbas.subarray( 0, indexRgbas ) ); a_Color.setDataAndEnable( gl, rgbasBuffer, 4, GL.FLOAT ); - + gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); - + a_Color.disable( gl ); a_XyFrac.disable( gl ); program.endUse( gl ); @@ -599,44 +599,44 @@ module Webglimpse { rgbas = ensureCapacityFloat32( rgbas, 4*numVertices ); }, fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable ) : { indexXys : number; indexRgbas : number } { - + var lane : TimelineLane = lanes.lane( laneIndex ); var event : TimelineEventModel = lane.event( eventIndex ); - + var wLine = lineThickness / viewport.w; var hLine = lineThickness / viewport.h; - + var jTop = rowTopPadding + ( laneIndex )*laneHeight; var yTop = ( viewport.h - jTop ) / viewport.h; var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight; var yBottom = ( viewport.h - jBottom ) / viewport.h; var yMid = ( yTop + yBottom ) / 2; - + var xLeft = hasval( event.startLimit_PMILLIS ) ? timeAxis.tFrac( event.startLimit_PMILLIS ) : 0; var xRight = hasval( event.endLimit_PMILLIS ) ? timeAxis.tFrac( event.endLimit_PMILLIS ) : 1; - + indexXys = putQuadXys( xys, indexXys, xLeft, xRight, yMid-hLine/2, yMid+hLine/2 ); indexXys = putQuadXys( xys, indexXys, xLeft, xLeft-wLine, yTop, yBottom ); indexXys = putQuadXys( xys, indexXys, xRight, xRight+wLine, yTop, yBottom ); indexRgbas = putRgbas( rgbas, indexRgbas, lineColor, 18 ); - + return { indexXys : indexXys, indexRgbas : indexRgbas }; } }; } - + export function newEventLimitsPainterFactory( limitOpts? : TimelineEventLimitsPainterOptions ) : TimelineEventsPainterFactory { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - + var helper = eventLimitsPainterHelper( limitOpts, drawable, timeAxis, lanes, ui, options ); // Painter return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - + var selectedEvents : OrderedSet = ui.selection.selectedEvents; - + //XXX Instead of estimating the number of events we will need to draw ahead of time //XXX (difficult because selected events may be present in multiple lanes, so //XXX selectedEvents.length might not be sufficient) just make enough space for all events. @@ -645,12 +645,12 @@ module Webglimpse { var indexXys = 0; var indexRgbas = 0; - + for ( var l = 0; l < lanes.length; l++ ) { var lane = lanes.lane( l ); for ( var e = 0; e < lane.length; e++ ) { var event = lane.event( e ); - + // check whether the event is selected and has limits defined if ( selectedEvents.hasId( event.eventGuid ) && ( hasval( event.startLimit_PMILLIS ) || hasval( event.endLimit_PMILLIS ) ) ) { var indexes = helper.fillEvent( l, e, indexXys, indexRgbas, viewport ); @@ -659,7 +659,7 @@ module Webglimpse { } } } - + helper.paint( indexXys, indexRgbas, gl, viewport ); }; }; @@ -669,7 +669,7 @@ module Webglimpse { export enum JointType { BEVEL, MITER } - + export interface TimelineEventBarsPainterOptions { topMargin? : number; bottomMargin? : number; @@ -695,7 +695,7 @@ module Webglimpse { // is smaller than this visible width, the event bar is hidden minimumVisibleWidth? : number; } - + export enum FillPattern { solid = 0, stripe = 1, @@ -714,33 +714,33 @@ module Webglimpse { var defaultColor = ( hasval( barOpts ) && hasval( barOpts.defaultColor ) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes( 0.4 ) ); var defaultColorSecondary = new Color( 1, 1, 1, 1 ); var minimumVisibleWidth = ( hasval( barOpts ) && hasval( barOpts.minimumVisibleWidth ) ? barOpts.minimumVisibleWidth : 0 ); - + var stripeWidth = ( hasval( barOpts ) && hasval( barOpts.stripeWidth ) ? barOpts.stripeWidth : 5 ); var stripeSecondaryWidth= ( hasval( barOpts ) && hasval( barOpts.stripeSecondaryWidth ) ? barOpts.stripeSecondaryWidth : 5 ); var stripeSlant = ( hasval( barOpts ) && hasval( barOpts.stripeSlant ) ? barOpts.stripeSlant : 1 ); var featherWidth = ( hasval( barOpts ) && hasval( barOpts.featherWidth ) ? barOpts.featherWidth : 2 ); var selection = ui.selection; - + var xyFrac_vColor_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', ' attribute vec4 a_Color; ', ' attribute vec4 a_ColorSecondary; ', ' attribute vec2 a_relativeXy; ', - ' attribute float a_fillPattern; ', - ' ', + ' attribute float a_fillPattern; ', + ' ', ' varying vec4 v_Color; ', ' varying vec4 v_ColorSecondary; ', - ' varying vec2 v_relativeXy; ', - ' varying float v_fillPattern; ', + ' varying vec2 v_relativeXy; ', + ' varying float v_fillPattern; ', ' ', ' void main( ) { ', ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', ' v_Color = a_Color; ', ' v_ColorSecondary = a_ColorSecondary; ', ' v_relativeXy = a_relativeXy; ', - ' v_fillPattern = a_fillPattern; ', + ' v_fillPattern = a_fillPattern; ', ' } ', ' ' ); @@ -761,7 +761,7 @@ module Webglimpse { ' varying vec4 v_Color; ', ' varying vec4 v_ColorSecondary; ', ' varying vec2 v_relativeXy; ', - ' varying float v_fillPattern; ', + ' varying float v_fillPattern; ', ' ', ' void pattern_stripe( ) { ', ' float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth; ', @@ -862,10 +862,10 @@ module Webglimpse { return { paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable, indexRelativeXys : number, indexFillPattern: number ) { if ( indexXys == 0 || indexRgbas == 0 ) return; - + gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + program.use( gl ); u_slant.setData( gl, stripeSlant ); @@ -912,21 +912,21 @@ module Webglimpse { var wBorder = borderThickness / viewport.w; var hBorder = borderThickness / viewport.h; - + var _topMargin = hasval( event.topMargin ) ? event.topMargin : topMargin; var _bottomMargin = hasval( event.bottomMargin ) ? event.bottomMargin : bottomMargin; - + var jTop = rowTopPadding + ( laneIndex )*laneHeight + _topMargin; var yTop = ( viewport.h - jTop ) / viewport.h; var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight - _bottomMargin; var yBottom = ( viewport.h - jBottom ) / viewport.h; - + var xLeft = timeAxis.tFrac( event.start_PMILLIS ); var xRight = timeAxis.tFrac( event.end_PMILLIS ); - + var xWidthPixels = viewport.w * ( xRight - xLeft ); var yHeightPixels = jTop - jBottom; - + if ( !( xRight < 0 || xLeft > 1 ) && xWidthPixels > minimumVisibleWidth ) { // Fill @@ -937,25 +937,25 @@ module Webglimpse { fillColorSecondary = darker( fillColorSecondary, 0.8 ); } indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yTop-hBorder, yBottom+hBorder ); - + var startIndex = indexRgbas; putQuadRgbas( rgbas, startIndex, fillColor ); indexRgbas = putQuadRgbas( rgbasSecondary, startIndex, fillColorSecondary ); - + // create a quad with relative coordinates indexRelativeXys = putQuadXys(relativeXys, indexRelativeXys, 0.0, xWidthPixels, 0.0, yHeightPixels ); // Set the fillPatternValue per vertex of the quad var fillPatternValue : number = event.fillPattern; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; } - + return { indexXys : indexXys, indexRgbas : indexRgbas, indexRelativeXys: indexRelativeXys, indexFillPattern: indexFillPattern }; } }; @@ -978,7 +978,7 @@ module Webglimpse { var defaultSecondaryColor = new Color( 0, 0, 0, 0 ); var selection = ui.selection; - + var dashedBorder_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', @@ -1040,20 +1040,20 @@ module Webglimpse { var rgbas = new Float32Array( 0 ); var rgbasBuffer = newDynamicBuffer( ); - + var rgbasSecondary = new Float32Array( 0 ); var rgbasSecondaryBuffer = newDynamicBuffer( ); var lengths = new Float32Array( 0 ); var lengthsBuffer = newDynamicBuffer( ); - + return { paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable, indexLengthSoFar : number ) { if ( indexXys == 0 || indexRgbas == 0 ) return; - + gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + program.use( gl ); u_DashLength_PX.setData( gl, dashLength ); xysBuffer.setData( xys.subarray( 0, indexXys ) ); @@ -1093,24 +1093,24 @@ module Webglimpse { fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable, indexLengthSoFar : number ) : { indexXys : number; indexRgbas : number; indexLengthSoFar : number } { var lane : TimelineLane = lanes.lane( laneIndex ); var event : TimelineEventModel = lane.event( eventIndex ); - + var wBorder = borderThickness / viewport.w; var hBorder = borderThickness / viewport.h; - + var _topMargin = hasval( event.topMargin ) ? event.topMargin : topMargin; var _bottomMargin = hasval( event.bottomMargin ) ? event.bottomMargin : bottomMargin; - + var jTop = rowTopPadding + ( laneIndex )*laneHeight + _topMargin; var yTop = ( viewport.h - jTop ) / viewport.h; var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight - _bottomMargin; var yBottom = ( viewport.h - jBottom ) / viewport.h; - + var xLeft = timeAxis.tFrac( event.start_PMILLIS ); var xRight = timeAxis.tFrac( event.end_PMILLIS ); - + var widthPixels = viewport.w * ( xRight - xLeft ); var heightPixels = jBottom - jTop; // confirmed jBottom > jTop - + var setLengthsVertical = function( bottomEdge, topEdge ) { lengths[ indexLengthSoFar++ ] = topEdge; lengths[ indexLengthSoFar++ ] = topEdge; @@ -1118,11 +1118,11 @@ module Webglimpse { lengths[ indexLengthSoFar++ ] = bottomEdge; lengths[ indexLengthSoFar++ ] = topEdge; lengths[ indexLengthSoFar++ ] = bottomEdge; - + // for convenience, return the length of the edge return Math.abs(bottomEdge - topEdge ); }; - + var setLengthsHorizontal = function( leftEdge, rightEdge ) { lengths[ indexLengthSoFar++ ] = leftEdge; lengths[ indexLengthSoFar++ ] = rightEdge; @@ -1130,7 +1130,7 @@ module Webglimpse { lengths[ indexLengthSoFar++ ] = leftEdge; lengths[ indexLengthSoFar++ ] = rightEdge; lengths[ indexLengthSoFar++ ] = rightEdge; - + // for convenience, return the length of the edge return Math.abs(leftEdge - rightEdge); }; @@ -1140,7 +1140,7 @@ module Webglimpse { lengths[ indexLengthSoFar++ ] = length; lengths[ indexLengthSoFar++ ] = length; } - + if ( !( xRight < 0 || xLeft > 1 ) && widthPixels > minimumVisibleWidth ) { // Border @@ -1239,12 +1239,12 @@ module Webglimpse { // left edge cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels , cumulativeLength); } - + break; } } } - + return { indexXys : indexXys, indexRgbas : indexRgbas, indexLengthSoFar : indexLengthSoFar }; } }; @@ -1254,7 +1254,7 @@ module Webglimpse { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - + var helper = eventStripedBarPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); // Painter @@ -1265,7 +1265,7 @@ module Webglimpse { var indexRgbas = 0; var indexRelativeXys = 0; var indexFillPattern = 0; - + for ( var l = 0; l < lanes.length; l++ ) { var lane = lanes.lane( l ); for ( var e = 0; e < lane.length; e++ ) { @@ -1282,12 +1282,12 @@ module Webglimpse { }; }; } - + export function newEventDashedBordersPainterFactory( barOpts? : TimelineEventBarsPainterOptions ) : TimelineEventsPainterFactory { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - + var helper = eventDashedBorderPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); // Painter @@ -1297,7 +1297,7 @@ module Webglimpse { var indexXys = 0; var indexRgbas = 0; var indexLengthSoFar = 0; - + for ( var l = 0; l < lanes.length; l++ ) { var lane = lanes.lane( l ); for ( var e = 0; e < lane.length; e++ ) { @@ -1313,7 +1313,7 @@ module Webglimpse { }; }; } - + export interface TimelineEventIconsPainterOptions { topMargin? : number; @@ -1321,7 +1321,7 @@ module Webglimpse { vAlign? : number; } - + function eventIconsPainterHelper( iconOpts : TimelineEventIconsPainterOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { var rowTopPadding = options.rowTopPadding; @@ -1333,14 +1333,14 @@ module Webglimpse { var vAlign = ( hasval( iconOpts ) && hasval( iconOpts.vAlign ) ? iconOpts.vAlign : 0.5 ); var textureRenderer = new TextureRenderer( ); - + return { textureRenderer : textureRenderer, paintEvent: function( laneIndex : number, eventIndex : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { var lane : TimelineLane = lanes.lane( laneIndex ); var event : TimelineEventModel = lane.event( eventIndex ); var eventStyle = ui.eventStyle( event.styleGuid ); - + var jTop = rowTopPadding + ( laneIndex )*laneHeight + topMargin; var yFrac = ( viewport.h - jTop - ( 1.0 - vAlign )*( laneHeight - topMargin - bottomMargin ) ) / viewport.h; @@ -1364,7 +1364,7 @@ module Webglimpse { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - + var helper = eventIconsPainterHelper( iconOpts, drawable, timeAxis, lanes, ui, options ); // Painter @@ -1394,12 +1394,12 @@ module Webglimpse { vAlign? : number; spacing? : number; extendBeyondBar?: boolean; - + // Options: // 'force' always show text regardless of available space // 'truncate' truncate text with '...' when space is insufficient // 'show' show text if space exits, hide all the text if it cannot be displayed in its entirity - textMode? : string; + textMode? : string; iconsEnabled? : boolean; // Can be a number, or 'imageSize', or 'auto' @@ -1457,18 +1457,18 @@ module Webglimpse { var iconTextures : StringMap = {}; var textTextures = newTextTextureCache2( textFont ); var textureRenderer = new TextureRenderer( ); - + return { textTextures : textTextures, textureRenderer : textureRenderer, paintEvent: function( laneIndex : number, eventIndex : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - + var lane : TimelineLane = lanes.lane( laneIndex ); var event : TimelineEventModel = lane.event( eventIndex ); - + var labelTopMargin = hasval( event.labelTopMargin ) ? event.labelTopMargin : topMargin; var labelBottomMargin = hasval( event.labelBottomMargin ) ? event.labelBottomMargin : bottomMargin; - + var labelVAlign = hasval( event.labelVAlign ) ? event.labelVAlign : vAlign; var labelVPos = hasval( event.labelVPos ) ? event.labelVPos : labelVAlign; @@ -1477,20 +1477,20 @@ module Webglimpse { var jTop = rowTopPadding + ( laneIndex )*laneHeight + labelTopMargin; var yFrac = ( viewport.h - jTop - ( 1.0 - labelVAlign )*( laneHeight - labelTopMargin - labelBottomMargin ) ) / viewport.h; - + var xLeftMin = 2 / viewport.w; var xRightMax = ( viewport.w - 2 ) / viewport.w; var wLeftIndent = leftMargin / viewport.w; var wRightIndent = rightMargin / viewport.w; - + var xStart = timeAxis.tFrac( event.start_PMILLIS ); var xEnd = timeAxis.tFrac( event.end_PMILLIS ); - - var wTotal = ( xEnd - wRightIndent ) - ( xStart + wLeftIndent ) + + var wTotal = ( xEnd - wRightIndent ) - ( xStart + wLeftIndent ) var wSpacing = ( spacing / viewport.w ); if ( !( xEnd <= 0 || xStart > 1 ) ) { - + var xLeft; var xRight; if ( extendBeyondBar ) { @@ -1502,7 +1502,7 @@ module Webglimpse { else { xRight = xRightMax; } - + if ( eventIndex-1 >= 0 ) { var previousEvent = lane.event( eventIndex-1 ); var previousEnd_PMILLIS = effectiveEdges_PMILLIS( ui, previousEvent )[ 1 ]; @@ -1516,12 +1516,12 @@ module Webglimpse { xRight = xEnd; xLeft = xStart; } - + // calculate Text width var calculatedTextWidth = calculateTextWidth(textEnabled, event.label, event.fgColor, textDefaultColor, textTextures, viewport); var wText = calculatedTextWidth.wText; var textTexture = calculatedTextWidth.textTexture; - + // calculate Icon width (and start load if necessary) var wIcon = 0; var wIconPlusSpacing = 0; @@ -1533,7 +1533,7 @@ module Webglimpse { if ( hasval( iconTexture ) ) { iconWidth = ( isNumber( iconsForceWidth ) ? iconsForceWidth : ( iconsForceWidth === 'imageSize' ? iconTexture.w : null ) ); iconHeight = ( isNumber( iconsForceHeight ) ? iconsForceHeight : ( iconsForceHeight === 'imageSize' ? iconTexture.h : null ) ); - + var wIconKnown = hasval( iconWidth ); var hIconKnown = hasval( iconHeight ); if ( !wIconKnown && !hIconKnown ) { @@ -1552,16 +1552,16 @@ module Webglimpse { iconWidth = Math.round( iconsSizeFactor * iconWidth ); iconHeight = Math.round( iconsSizeFactor * iconHeight ); } - + wIcon = ( iconWidth / viewport.w ); - + wIconPlusSpacing = wIcon + wSpacing; } // A null in the map means a fetch has already been initiated // ... either it is still in progress, or it has already failed else if ( iconTexture !== null ) { iconTextures[ event.labelIcon ] = null; - + var image = new Image( ); image.onload = ( function( url, img ) { return function( ) { @@ -1576,19 +1576,19 @@ module Webglimpse { image.src = event.labelIcon; } } - + // NOTE: With extendBeyondBar=true, we detect when there is insufficient space between the current event // and those to either side to display the text + icon. However, if one event has right aligned text // and the other has left aligned text, so both text labels overlap into the same space between the // events, we don't currently try to detect that. - + // Determine whether there is enough space to display both text and icon, or only icon, or neither // coordinates of the start edge of the icon + label var xStartLabel = xStart + wLeftIndent - ( wSpacing + wIcon + wText ) * labelHPos + ( wTotal ) * labelHAlign; // coordinates of the end edge of the icon + label var xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); - + // adjust xStartLabel and xEndLabel if they fall off the screen if ( xStartLabel < xLeftMin ) { xStartLabel = xLeftMin; @@ -1598,7 +1598,7 @@ module Webglimpse { xEndLabel = xRightMax; xStartLabel = xEndLabel - ( wSpacing + wIcon + wText ); } - + if (textMode === 'truncate') { var labelText = event.label; while (!!labelText && labelText !== "...") { @@ -1633,12 +1633,12 @@ module Webglimpse { // there is not enough room for the text, try with just the icon wText = 0; textTexture = null; - + // coordinates of the start edge of the icon + label var xStartLabel = xStart + wLeftIndent - ( wIcon ) * labelHPos + ( wTotal ) * labelHAlign; // coordinates of the end edge of the icon + label var xEndLabel = xStartLabel + ( wIcon ); - + // adjust xStartLabel and xEndLabel if they fall off the screen if ( xStartLabel < xLeftMin ) { xStartLabel = xLeftMin; @@ -1648,7 +1648,7 @@ module Webglimpse { xEndLabel = xRightMax; xStartLabel = xEndLabel - ( wIcon ); } - + // if there is still not enough room, don't show anything if ( xEndLabel > xRight || xStartLabel < xLeft ) { wIcon = 0; @@ -1656,15 +1656,15 @@ module Webglimpse { } } } - + // Icons if ( hasval( iconTexture ) ) { // coordinates of the start edge of the icon + label var xStartLabel = xStart + wLeftIndent - ( wSpacing + wIcon + wText ) * labelHPos + ( wTotal ) * labelHAlign; - + // coordinates of the end edge of the icon + label var xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); - + if ( xStartLabel < xLeftMin ) { textureRenderer.draw( gl, iconTexture, xLeftMin, yFrac, { xAnchor: 0, yAnchor: labelVPos, width: iconWidth, height: iconHeight } ); } @@ -1676,15 +1676,15 @@ module Webglimpse { textureRenderer.draw( gl, iconTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: labelVPos, width: iconWidth, height: iconHeight } ); } } - + // Text if ( hasval( textTexture ) ) { // coordinates of the start edge of the icon + label var xStartLabel = xStart + wLeftIndent - ( wSpacing + wIcon + wText ) * labelHPos + ( wTotal ) * labelHAlign; - + // coordinates of the end edge of the icon + label var xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); - + if ( xStartLabel < xLeftMin ) { textureRenderer.draw( gl, textTexture, xLeftMin + wSpacing + wIcon, yFrac, { xAnchor: 0, yAnchor: textTexture.yAnchor( labelVPos ) } ); } @@ -1707,7 +1707,7 @@ module Webglimpse { return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { var helper = eventLabelsPainterHelper( labelOpts, drawable, timeAxis, lanes, ui, options ); - + // Painter return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); @@ -1741,9 +1741,9 @@ module Webglimpse { var defaultBorderColor = ( hasval( barOpts ) && hasval( barOpts.defaultBorderColor ) ? barOpts.defaultBorderColor : null ); var selectedBorderColor = ( hasval( barOpts ) && hasval( barOpts.selectedBorderColor ) ? barOpts.selectedBorderColor : options.timelineFgColor ); var minimumVisibleWidth = ( hasval( barOpts ) && hasval( barOpts.minimumVisibleWidth ) ? barOpts.minimumVisibleWidth : 0 ); - + var selection = ui.selection; - + var xyFrac_vColor_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', @@ -1767,14 +1767,14 @@ module Webglimpse { var rgbas = new Float32Array( 0 ); var rgbasBuffer = newDynamicBuffer( ); - + return { paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { if ( indexXys == 0 || indexRgbas == 0 ) return; - + gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + program.use( gl ); xysBuffer.setData( xys.subarray( 0, indexXys ) ); a_XyFrac.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); @@ -1805,23 +1805,23 @@ module Webglimpse { fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable ) : { indexXys : number; indexRgbas : number } { var lane : TimelineLane = lanes.lane( laneIndex ); var event : TimelineEventModel = lane.event( eventIndex ); - + var wBorder = borderThickness / viewport.w; var hBorder = borderThickness / viewport.h; - + var _topMargin = hasval( event.topMargin ) ? event.topMargin : topMargin; var _bottomMargin = hasval( event.bottomMargin ) ? event.bottomMargin : bottomMargin; - + var jTop = rowTopPadding + ( laneIndex )*laneHeight + _topMargin; var yTop = ( viewport.h - jTop ) / viewport.h; var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight - _bottomMargin; var yBottom = ( viewport.h - jBottom ) / viewport.h; - + var xLeft = timeAxis.tFrac( event.start_PMILLIS ); var xRight = timeAxis.tFrac( event.end_PMILLIS ); - + var xWidthPixels = viewport.w * ( xRight - xLeft ); - + if ( !( xRight < 0 || xLeft > 1 ) && xWidthPixels > minimumVisibleWidth ) { // Fill @@ -1864,7 +1864,7 @@ module Webglimpse { } } } - + return { indexXys : indexXys, indexRgbas : indexRgbas }; } }; @@ -1875,7 +1875,7 @@ module Webglimpse { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - + var helper = eventBarPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); // Painter @@ -1884,7 +1884,7 @@ module Webglimpse { var indexXys = 0; var indexRgbas = 0; - + for ( var l = 0; l < lanes.length; l++ ) { var lane = lanes.lane( l ); for ( var e = 0; e < lane.length; e++ ) { @@ -1900,9 +1900,9 @@ module Webglimpse { }; } - + export function newCombinedEventPainterFactory( barOpts? : TimelineEventBarsPainterOptions, labelOpts? : TimelineEventLabelOptions, iconOpts? : TimelineEventIconsPainterOptions ) : TimelineEventsPainterFactory { - + // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { @@ -1915,33 +1915,33 @@ module Webglimpse { return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - + for ( var l = 0; l < lanes.length; l++ ) { var lane : TimelineLane = lanes.lane( l ); for ( var e = 0; e < lane.length; e++ ) { - + // draw bar barHelper.ensureCapacity( 1 ); var indexes = barHelper.fillEvent( l, e, 0, 0, viewport, 0, 0 ); var dashedIndexes = dashedHelper.fillEvent( l, e, 0, 0, viewport, 0 ); barHelper.paint( indexes.indexXys, indexes.indexRgbas, gl, viewport, indexes.indexRelativeXys, indexes.indexFillPattern ); dashedHelper.paint( dashedIndexes.indexXys, dashedIndexes.indexRgbas, gl, viewport, dashedIndexes.indexLengthSoFar ); - + // draw label labelHelper.textTextures.resetTouches( ); labelHelper.textureRenderer.begin( gl, viewport ); labelHelper.paintEvent( l, e, gl, viewport ); labelHelper.textureRenderer.end( gl ); labelHelper.textTextures.retainTouched( ); - + // draw icon iconHelper.textureRenderer.begin( gl, viewport ); iconHelper.paintEvent( l, e, gl, viewport ); iconHelper.textureRenderer.end( gl ); } } - + } } } -} + diff --git a/src/webglimpse/timeline/timeline_lanes.ts b/src/webglimpse/timeline/timeline_lanes.ts index 2d172f1..5cf9484 100644 --- a/src/webglimpse/timeline/timeline_lanes.ts +++ b/src/webglimpse/timeline/timeline_lanes.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class TimelineLaneArray { @@ -35,15 +35,15 @@ module Webglimpse { private _row : TimelineRowModel; private _lanes : TimelineLane[]; private _laneNums : StringMap; - + private _rebuildLanesMouseWheel; private _rebuildLanes; private _newEvent; private _addEvent; private _removeEvent; - + private _model : TimelineModel; - + // Keep references to listeners, so that we can remove them later private _eventAttrsListeners : StringMap; @@ -51,7 +51,7 @@ module Webglimpse { this._model = model; this._row = row; this._ui = ui; - + this._lanes = []; this._laneNums = {}; this._eventAttrsListeners = {}; @@ -119,7 +119,7 @@ module Webglimpse { row.eventGuids.forEach( this._addEvent ); row.eventGuids.valueAdded.on( this._addEvent ); - + // attaches listeners to event, should be called only once // when an event is first added to the row model this._newEvent = function( eventGuid : string ) { @@ -155,9 +155,9 @@ module Webglimpse { oldEdges_PMILLIS = newEdges_PMILLIS; } }; - + event.attrsChanged.on( updateLaneAssignment ); - self._eventAttrsListeners[ eventGuid ] = updateLaneAssignment; + self._eventAttrsListeners[ eventGuid ] = updateLaneAssignment; }; row.eventGuids.forEach( this._newEvent ); row.eventGuids.valueAdded.on( this._newEvent ); @@ -190,7 +190,7 @@ module Webglimpse { } } }; - + var hasIcons = function( ) { var oldLanes = self._lanes; for ( var l = 0; l < oldLanes.length; l++ ) { @@ -203,13 +203,13 @@ module Webglimpse { } return false; } - + self._rebuildLanesMouseWheel = function( ) { if ( hasIcons( ) ) { self._rebuildLanes( ); } } - + ui.millisPerPx.changed.on( self._rebuildLanesMouseWheel ); ui.eventStyles.valueAdded.on( self._rebuildLanes ); ui.eventStyles.valueRemoved.on( self._rebuildLanes ); @@ -231,7 +231,7 @@ module Webglimpse { var lane = this._lanes[ laneNum ]; return ( lane && lane.eventAtTime( time_PMILLIS ) ); } - + dispose( ) : void { this._row.eventGuids.valueAdded.off( this._addEvent ); this._row.eventGuids.valueRemoved.off( this._removeEvent ); @@ -240,7 +240,7 @@ module Webglimpse { this._ui.millisPerPx.changed.off( this._rebuildLanesMouseWheel ); this._ui.eventStyles.valueAdded.off( this._rebuildLanes ); this._ui.eventStyles.valueRemoved.off( this._rebuildLanes ); - + for ( var eventGuid in this._eventAttrsListeners ) { if ( this._eventAttrsListeners.hasOwnProperty( eventGuid ) ) { var listener = this._eventAttrsListeners[ eventGuid ]; @@ -436,7 +436,7 @@ module Webglimpse { return true; } } - + // a TimelineLane where events are allowed to overlap arbitrarily // because of this assumptions like the index for an event in the _starts_PMILLIS // and _ends_PMILLIS arrays being the same no longer hold @@ -445,57 +445,57 @@ module Webglimpse { // an inefficient O(n) brute force search to find events (an interval tree // would be needed for efficient search in the general case) export class TimelineLaneSimple implements TimelineLane { - + private _events : TimelineEventModel[]; private _orders : number[]; private _ids : StringMap; private _ui : TimelineUi; - + constructor( ui : TimelineUi ) { this._events = []; this._orders = []; this._ids = {}; this._ui = ui; } - + get length( ) : number { return this._events.length; } - + event( index : number ) : TimelineEventModel { return this._events[ index ]; } - + isEmpty( ) : boolean { return ( this._events.length === 0 ); } - + eventAtTime( time_PMILLIS : number ) : TimelineEventModel { - + var bestEvent : TimelineEventModel; - + // start at end of events list so that eventAtTime result // favors events drawn on top (in cases where events are unordered // those that happen to be at end end of the list are drawn last for ( var n = this._events.length-1; n >= 0; n-- ) { var event : TimelineEventModel = this._events[n]; - + var eventEdges_PMILLIS = effectiveEdges_PMILLIS( this._ui, event ); - + if ( time_PMILLIS > eventEdges_PMILLIS[0] && time_PMILLIS < eventEdges_PMILLIS[1] && ( bestEvent === undefined || bestEvent.order < event.order ) ) { bestEvent = event; } } - + return bestEvent; } - + add( event : TimelineEventModel ) { var eventGuid = event.eventGuid; if ( hasval( this._ids[ eventGuid ] ) ) throw new Error( 'Lane already contains this event: event = ' + formatEvent( event ) ); - + // for events with undefined order, replace with largest possible negative order so sort is correct var order = hasval( event.order ) ? event.order : Number.NEGATIVE_INFINITY; @@ -505,47 +505,47 @@ module Webglimpse { this._orders.splice( i, 0, order ); this._events.splice( i, 0, event ); } - + remove( event : TimelineEventModel ) { var eventGuid = event.eventGuid; if ( !hasval( this._ids[ eventGuid ] ) ) throw new Error( 'Event not found in this lane: event = ' + formatEvent( event ) ); - + delete this._ids[ eventGuid ]; var i : number = this._getIndex( event ); this._orders.splice( i, 1 ); this._events.splice( i, 1 ); } - + update( event : TimelineEventModel ) { this.remove( event ); this.add( event ); } - + collisionsWithInterval( start_PMILLIS : number, end_PMILLIS : number ) : TimelineEventModel[] { - + var results = []; - + for ( var n = 0; n < this._events.length; n++ ) { var event : TimelineEventModel = this._events[n]; - + if ( !(start_PMILLIS > event.end_PMILLIS || end_PMILLIS < event.start_PMILLIS) ) { results.push( event ); } } - + return results; } - + // we can always fit more events because overlaps are allowed eventStillFits( event : TimelineEventModel ) : boolean { return true; } - + // we can always fit more events because overlaps are allowed couldFitEvent( event : TimelineEventModel ) : boolean { return true; } - + _getIndex( queryEvent : TimelineEventModel ) : number { for ( var n = 0; n < this._events.length; n++ ) { var event : TimelineEventModel = this._events[n]; @@ -565,4 +565,3 @@ module Webglimpse { return ( event.label + ' [ ' + formatTime_ISO8601( event.start_PMILLIS ) + ' ... ' + formatTime_ISO8601( event.end_PMILLIS ) + ' ]' ); } } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_layout.ts b/src/webglimpse/timeline/timeline_layout.ts index 0466fd7..73f8def 100644 --- a/src/webglimpse/timeline/timeline_layout.ts +++ b/src/webglimpse/timeline/timeline_layout.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function newTimelineLayout( axisHeight : number ) : Layout { @@ -125,4 +125,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 3c68d85..6f64f73 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -27,8 +27,8 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { - + + export interface TimelineCursor { cursorGuid : string; @@ -39,7 +39,7 @@ module Webglimpse { showHorizontalLine : boolean; showCursorText : boolean; } - + export interface TimelineAnnotation { @@ -197,25 +197,25 @@ module Webglimpse { private _showVerticalLine : boolean; private _showHorizontalLine : boolean; private _attrsChanged : Notification; - + constructor( cursor : TimelineCursor ) { this._cursorGuid = cursor.cursorGuid; this._attrsChanged = new Notification( ); this.setAttrs( cursor ); } - + get labeledTimeseriesGuids( ) : OrderedStringSet { return this._labeledTimeseriesGuids; } - + get cursorGuid( ) : string { return this._cursorGuid; } - + get attrsChanged( ) : Notification { return this._attrsChanged; } - + get lineColor( ) : Color { return this._lineColor; } @@ -223,15 +223,15 @@ module Webglimpse { get textColor( ) : Color { return this._textColor; } - + get showVerticalLine( ) : boolean { return this._showVerticalLine; } - + get showHorizontalLine( ) : boolean { return this._showHorizontalLine; } - + get showCursorText( ) : boolean { return this._showCursorText; } @@ -245,7 +245,7 @@ module Webglimpse { this._showCursorText = cursor.showCursorText; this._attrsChanged.fire( ); } - + snapshot( ) : TimelineCursor { return { cursorGuid: this._cursorGuid, @@ -259,7 +259,7 @@ module Webglimpse { } } - + export class TimelineAnnotationModel { private _annotationGuid : string; private _attrsChanged : Notification; @@ -929,7 +929,7 @@ module Webglimpse { this._attrsChanged.fire( ); } } - + get labelTopMargin( ) : number { return this._labelTopMargin; } @@ -1102,11 +1102,11 @@ module Webglimpse { this._labelFont = row.labelFont; this._attrsChanged.fire( ); } - + get cursorGuid( ) : string { return this._cursorGuid; } - + set cursorGuid( cursorGuid : string ) { this._cursorGuid = cursorGuid; this._attrsChanged.fire( ); @@ -1417,13 +1417,13 @@ module Webglimpse { private _root : TimelineRootModel; constructor( timeline? : Timeline ) { - + var cursors = ( hasval( timeline ) && hasval( timeline.cursors ) ? timeline.cursors : [] ); this._cursors = new OrderedSet( [], (g)=>g.cursorGuid ); for ( var n = 0; n < cursors.length; n++ ) { this._cursors.add( new TimelineCursorModel( cursors[ n ] ) ); } - + var annotations = ( hasval( timeline ) && hasval( timeline.annotations ) ? timeline.annotations : [] ); this._annotations = new OrderedSet( [], (g)=>g.annotationGuid ); for ( var n = 0; n < annotations.length; n++ ) { @@ -1463,7 +1463,7 @@ module Webglimpse { var root = ( hasval( timeline ) && hasval( timeline.root ) ? timeline.root : newEmptyTimelineRoot( ) ); this._root = new TimelineRootModel( root ); } - + get cursors( ) : OrderedSet { return this._cursors; } get annotations( ) : OrderedSet { return this._annotations; } get timeseriesFragments( ) : OrderedSet { return this._timeseriesFragments; } @@ -1566,7 +1566,7 @@ module Webglimpse { } } this._annotations.retainIds( retainedAnnotationGuids ); - + var freshCursors = newTimeline.cursors; var retainedCursorGuids : string[] = []; for ( var n = 0; n < freshCursors.length; n++ ) { @@ -1578,10 +1578,10 @@ module Webglimpse { } } this._cursors.retainIds( retainedCursorGuids ); - + // Add new items // - + for ( var n = 0; n < freshCursors.length; n++ ) { var freshCursor = freshCursors[ n ]; var oldCursor = this._cursors.valueFor( freshCursor.cursorGuid ); @@ -1592,7 +1592,7 @@ module Webglimpse { this._cursors.add( new TimelineCursorModel( freshCursor ) ); } } - + for ( var n = 0; n < freshAnnotations.length; n++ ) { var freshAnnotation = freshAnnotations[ n ]; var oldAnnotation = this._annotations.valueFor( freshAnnotation.annotationGuid ); @@ -1669,7 +1669,7 @@ module Webglimpse { merge( newData : Timeline, strategy : TimelineMergeStrategy ) { - + var newCursors = hasval( newData.cursors ) ? newData.cursors : []; for ( var n = 0; n < newCursors.length; n++ ) { var newCursor = newCursors[ n ]; @@ -1784,11 +1784,11 @@ module Webglimpse { export var timelineMergeNewBeforeOld : TimelineMergeStrategy = { - + updateCursorModel( cursorModel : TimelineCursorModel, newCursor : TimelineCursor ) { cursorModel.setAttrs( newCursor ); }, - + updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ) { annotationModel.setAttrs( newAnnotation ); }, @@ -1827,11 +1827,11 @@ module Webglimpse { export var timelineMergeNewAfterOld : TimelineMergeStrategy = { - + updateCursorModel( cursorModel : TimelineCursorModel, newCursor : TimelineCursor ) { cursorModel.setAttrs( newCursor ); }, - + updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ) { annotationModel.setAttrs( newAnnotation ); }, @@ -1869,4 +1869,3 @@ module Webglimpse { rootModel.maximizedRowGuids.addAll( newRoot.maximizedRowGuids || [] ); } }; -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index dbfa3cf..84720b3 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export class TimelinePane extends Pane { private _model : TimelineModel; @@ -187,7 +187,7 @@ module Webglimpse { selection.selectedEvents.valueRemoved.on( redraw ); // even if the model defines cursors, we may need to redraw when the mouse position changes - // (we might not actually need to if: none of the rows actually use the cursor, or if the + // (we might not actually need to if: none of the rows actually use the cursor, or if the // cursor doesn't show a vertical or horizontal line) // this check just avoids redrawing unncessarily in the easy-to-verify common case where // no cursors are defined @@ -1405,4 +1405,4 @@ module Webglimpse { } -} + diff --git a/src/webglimpse/timeline/timeline_row.ts b/src/webglimpse/timeline/timeline_row.ts index dc035c9..deb8033 100644 --- a/src/webglimpse/timeline/timeline_row.ts +++ b/src/webglimpse/timeline/timeline_row.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimelineRowPaneOptions { timelineFont : string; @@ -51,4 +51,3 @@ module Webglimpse { export interface TimelineRowPaneFactoryChooser { ( row : TimelineRowModel ) : TimelineRowPaneFactory; } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_styles.ts b/src/webglimpse/timeline/timeline_styles.ts index 512bb4e..56353ce 100644 --- a/src/webglimpse/timeline/timeline_styles.ts +++ b/src/webglimpse/timeline/timeline_styles.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // Default @@ -41,7 +41,7 @@ module Webglimpse { buffer_px: 6 } ) ]; - + export var eventsRowPaneFactory_DEFAULT : TimelineRowPaneFactory = newEventsRowPaneFactory( { laneHeight: 40, painterFactories: [ @@ -53,7 +53,7 @@ module Webglimpse { } ) ] } ); - + export var timeseriesRowPaneFactory_DEFAULT : TimelineRowPaneFactory = newTimeseriesRowPaneFactory( { painterFactories: timeseriesRowPainterFactories_DEFAULT, axisOptions: { tickSpacing: 34 } @@ -130,7 +130,7 @@ module Webglimpse { return null; } } - + export var eventsRowPaneFactory_SINGLE : TimelineRowPaneFactory = newEventsRowPaneFactory( { rowTopPadding: 0, rowBottomPadding: 0, @@ -141,7 +141,7 @@ module Webglimpse { lineColor: new Color( 1, 0, 0, 1 ), lineThickness: 2 } ), - newCombinedEventPainterFactory( + newCombinedEventPainterFactory( { bottomMargin: 0, topMargin: 13, @@ -166,7 +166,7 @@ module Webglimpse { ) ] } ); - + export function rowPaneFactoryChooser_SINGLE( row : TimelineRowModel ) : TimelineRowPaneFactory { if ( !row.eventGuids.isEmpty ) { return eventsRowPaneFactory_SINGLE; @@ -179,4 +179,3 @@ module Webglimpse { } } -} \ No newline at end of file diff --git a/src/webglimpse/timeline/timeline_timeseries_row.ts b/src/webglimpse/timeline/timeline_timeseries_row.ts index da32e3a..7d83ef9 100644 --- a/src/webglimpse/timeline/timeline_timeseries_row.ts +++ b/src/webglimpse/timeline/timeline_timeseries_row.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimelineTimeseriesPainterOptions { timelineFont : string; @@ -36,11 +36,11 @@ module Webglimpse { rowTopPadding : number; rowBottomPadding : number; } - + export interface TimelineTimeseriesPainterFactory { ( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi, options : TimelineTimeseriesPainterOptions ) : Painter; } - + export interface TimelineTimeseriesRowPaneOptions { rowHeight? : number; rowTopPadding? : number; @@ -49,18 +49,18 @@ module Webglimpse { axisWidth? : number painterFactories? : TimelineTimeseriesPainterFactory[]; } - + export function newTimeseriesRowPaneFactory( rowOptions? : TimelineTimeseriesRowPaneOptions ) : TimelineRowPaneFactory { return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { - + var rowTopPadding = ( hasval( rowOptions ) && hasval( rowOptions.rowTopPadding ) ? rowOptions.rowTopPadding : 6 ); var rowBottomPadding = ( hasval( rowOptions ) && hasval( rowOptions.rowBottomPadding ) ? rowOptions.rowBottomPadding : 6 ); var axisWidth = ( hasval( rowOptions ) && hasval( rowOptions.axisWidth ) ? rowOptions.axisWidth : 60 ); var painterFactories = ( hasval( rowOptions ) && hasval( rowOptions.painterFactories ) ? rowOptions.painterFactories : [] ); var axisOptions = ( hasval( rowOptions ) && hasval( rowOptions.axisOptions ) ? rowOptions.axisOptions : {} ); - + var keyPrefix = options.isMaximized ? 'maximized-' : ''; - + var getRowHeight = function( ) { // maximized rows do not specifiy a height (they should fill available space) if ( options.isMaximized ) { @@ -79,9 +79,9 @@ module Webglimpse { return 135; } } - + var rowHeight : number = getRowHeight( ); - + var timelineFont = options.timelineFont; var timelineFgColor = options.timelineFgColor; var draggableEdgeWidth = options.draggableEdgeWidth; @@ -90,13 +90,13 @@ module Webglimpse { var rowUi = ui.rowUi( row.rowGuid ); var input = ui.input; var selection = ui.selection; - + if ( !hasval( axisOptions.font ) ) axisOptions.font = timelineFont; if ( !hasval( axisOptions.tickColor ) ) axisOptions.tickColor = timelineFgColor; if ( !hasval( axisOptions.textColor ) ) axisOptions.textColor = timelineFgColor; if ( !hasval( axisOptions.showLabel ) ) axisOptions.showLabel = true; if ( !hasval( axisOptions.shortenLabels ) ) axisOptions.shortenLabels = false; - + var redraw = function( ) { drawable.redraw( ); }; @@ -105,33 +105,33 @@ module Webglimpse { var yAxisPane = new Pane( { updatePrefSize: fixedSize( axisWidth, rowHeight ) } ); dataAxis.limitsChanged.on( redraw ); attachAxisMouseListeners1D( yAxisPane, dataAxis, true ); - + // add listener to update the height of the row if the rowHeight attribute changes var updateRowHeight = function( ) { yAxisPane.layout = { updatePrefSize: fixedSize( axisWidth, getRowHeight( ) ) }; }; row.attrsChanged.on( updateRowHeight ); - + var isDragMode : Mask2D = function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { var fragment = getNearestFragment( viewport, i, j ).fragment; return hasval( fragment ); }; - + var rowContentPane = new Pane( newColumnLayout( ), true, isDragMode ); var underlayPane = new Pane( newOverlayLayout( ), false ); var overlayPane = new Pane( null, false ); - + var painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, timelineThickness: 1, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding }; for ( var n = 0; n < painterFactories.length; n++ ) { var createPainter = painterFactories[ n ]; rowContentPane.addPainter( createPainter( drawable, timeAxis, dataAxis, model, row, ui, painterOptions ) ); } - + yAxisPane.addPainter( newEdgeAxisPainter( dataAxis, Side.RIGHT, axisOptions ) ); rowContentPane.addPane( yAxisPane, 0 ); underlayPane.addPane( rowContentPane, true ); underlayPane.addPane( overlayPane, false ); - + rowUi.addPane( keyPrefix+'content', rowContentPane ); rowUi.addPane( keyPrefix+'overlay', overlayPane ); rowUi.addPane( keyPrefix+'underlay', underlayPane ); @@ -140,23 +140,23 @@ module Webglimpse { row.timeseriesGuids.valueAdded.on( redraw ); row.timeseriesGuids.valueMoved.on( redraw ); row.timeseriesGuids.valueRemoved.on( redraw ); - + var addFragmentRedraw = function( fragmentGuid : string ) { var fragment = model.timeseriesFragment( fragmentGuid ); fragment.dataChanged.on( redraw ); } - + var removeFragmentRedraw = function( fragmentGuid : string ) { var fragment = model.timeseriesFragment( fragmentGuid ); fragment.dataChanged.off( redraw ); } - + var addRedraw = function( timeseriesGuid : string ) { var timeseries = model.timeseries( timeseriesGuid ); timeseries.attrsChanged.on( redraw ); timeseries.fragmentGuids.valueAdded.on( redraw ); timeseries.fragmentGuids.valueRemoved.on( redraw ); - + timeseries.fragmentGuids.forEach( addFragmentRedraw ); timeseries.fragmentGuids.valueAdded.on( addFragmentRedraw ); timeseries.fragmentGuids.valueRemoved.on( removeFragmentRedraw ); @@ -172,15 +172,15 @@ module Webglimpse { timeseries.fragmentGuids.forEach( removeFragmentRedraw ); }; row.timeseriesGuids.valueRemoved.on( removeRedraw ); - + var timeAtCoords_PMILLIS = function( viewport : BoundsUnmodifiable, i : number ) : number { return timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); }; - + var timeAtPointer_PMILLIS = function( ev : PointerEvent ) : number { return timeAtCoords_PMILLIS( ev.paneViewport, ev.i ); }; - + // Used by both sets of listeners to know whether a timeseries-drag is in progress var timeseriesDragMode : string = null; @@ -219,7 +219,7 @@ module Webglimpse { rowContentPane.mouseUp.on( function( ev : PointerEvent ) { input.mouseUp.fire( ev ); } ); - + rowContentPane.mouseDown.on( function( ev : PointerEvent ) { input.mouseDown.fire( ev ); } ); @@ -229,11 +229,11 @@ module Webglimpse { rowContentPane.contextMenu.on( function( ev : PointerEvent ) { input.contextMenu.fire( ev ); } ); - - + + // Begin annotation selection // - + var getNearestAnnotation = function( viewport : BoundsUnmodifiable, i : number, j : number ) { // maximum number of pixels away from a point the mouse can be to select it var pickBuffer_PIXEL : number = 10; @@ -244,20 +244,20 @@ module Webglimpse { var ev_time : number = timeAtCoords_PMILLIS( viewport, i ); var ev_value : number = dataAxis.vAtFrac( viewport.yFrac( j ) ); - + var bestAnnotation : TimelineAnnotationModel = null; var best_PIXEL : number = null; - + if ( ev_time ) { for ( var i = 0 ; i < row.annotationGuids.length ; i++ ) { var annotationGuid : string = row.annotationGuids.valueAt( i ); var annotation : TimelineAnnotationModel = model.annotation( annotationGuid ); var styleGuid : string = annotation.styleGuid; var style : TimelineAnnotationStyleUi = ui.annotationStyle( styleGuid ); - + var dy_PIXEL = Math.abs( annotation.y - ev_value ) / vppy; var dx_PIXEL = Math.abs( annotation.time_PMILLIS - ev_time ) / vppx; - + if ( style.uiHint == 'point' ) { var d_PIXEL = Math.sqrt( dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL ); } @@ -267,7 +267,7 @@ module Webglimpse { else if ( style.uiHint == 'vertical-line' ) { var d_PIXEL = dx_PIXEL; } - + if ( d_PIXEL < pickBuffer_PIXEL ) { if ( !hasval( best_PIXEL ) || d_PIXEL < best_PIXEL ) { bestAnnotation = annotation; @@ -276,14 +276,14 @@ module Webglimpse { } } } - + return bestAnnotation; } - + var getNearestAnnotationEvent = function( ev : PointerEvent ) { return getNearestAnnotation( ev.paneViewport, ev.i, ev.j ); } - + overlayPane.mouseMove.on( function( ev : PointerEvent ) { // update selection.hoveredYValue var y : number = dataAxis.vAtFrac( yFrac( ev ) ); @@ -294,15 +294,15 @@ module Webglimpse { selection.hoveredAnnotation.value = result; } ); selection.hoveredAnnotation.changed.on( redraw ); - + overlayPane.mouseExit.on( function( ) { selection.hoveredY.value = undefined; selection.hoveredAnnotation.value = null; } ); - + // Begin timeseries-drag // - + function chooseTimeseriesDragMode( ui : TimelineUi, hoveredTimeseriesFragment : TimelineTimeseriesFragmentModel ) : string { if ( !hasval( hoveredTimeseriesFragment ) ) { return null; @@ -312,7 +312,7 @@ module Webglimpse { return hoveredTimeseriesFragment.userEditMode; } } - + var updateCursor = function( ) { if ( !timeseriesDragMode ) { var mouseCursors = { 'xy': 'move', 'y': 'ns-resize' }; @@ -321,7 +321,7 @@ module Webglimpse { }; ui.millisPerPx.changed.on( updateCursor ); selection.hoveredTimeseries.changed.on( updateCursor ); - + var getNearestFragment = function( viewport : BoundsUnmodifiable, i : number, j : number ) { // maximum number of pixels away from a point the mouse can be to select it var pickBuffer_PIXEL : number = 10; @@ -329,34 +329,34 @@ module Webglimpse { var vppx : number = ui.millisPerPx.value; var vppy : number = dataAxis.vSize / rowContentPane.viewport.h; var pickBuffer_PMILLIS : number = pickBuffer_PIXEL * vppx; - + var bestFragment : TimelineTimeseriesFragmentModel; var bestIndex : number; var best_PIXEL : number; - + var ev_time : number = timeAtCoords_PMILLIS( viewport, i ); var ev_value : number = dataAxis.vAtFrac( viewport.yFrac( j ) ); - + if ( ev_time ) { for ( var i = 0 ; i < row.timeseriesGuids.length ; i++ ) { var timeseriesGuid : string = row.timeseriesGuids.valueAt( i ); var timeseries : TimelineTimeseriesModel = model.timeseries( timeseriesGuid ); - + for ( var j = 0 ; j < timeseries.fragmentGuids.length ; j++ ) { var fragmentGuid : string = timeseries.fragmentGuids.valueAt( j ); var fragment : TimelineTimeseriesFragmentModel = model.timeseriesFragment( fragmentGuid ); - + // fragments should not overlap if ( fragment.start_PMILLIS - pickBuffer_PMILLIS < ev_time && fragment.end_PMILLIS + pickBuffer_PMILLIS > ev_time ) { // bars are drawn starting at the point and continuing to the next point, so we need to choose the closest index differently var index : number = timeseries.uiHint == 'bars' ? indexAtOrBefore( fragment.times_PMILLIS, ev_time ) : indexNearest( fragment.times_PMILLIS, ev_time ); var value = fragment.data[index]; var time = fragment.times_PMILLIS[index]; - + var dy_PIXEL = ( value - ev_value ) / vppy; var dx_PIXEL = ( time - ev_time ) / vppx; - var d_PIXEL = Math.sqrt( dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL ); - + var d_PIXEL = Math.sqrt( dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL ); + var filter = function( ) : boolean { if ( timeseries.uiHint == 'bars' ) { return ( timeseries.baseline < ev_value && ev_value < value ) || @@ -366,7 +366,7 @@ module Webglimpse { return d_PIXEL < pickBuffer_PIXEL; } } - + if ( ( !best_PIXEL || d_PIXEL < best_PIXEL ) && filter( ) ) { best_PIXEL = d_PIXEL; @@ -377,14 +377,14 @@ module Webglimpse { } } } - + return { fragment: bestFragment, index: bestIndex }; }; - + var getNearestFragmentEvent = function( ev : PointerEvent ) { return getNearestFragment( ev.paneViewport, ev.i, ev.j ); } - + // choose the closest data point to the mouse cursor position and fire an event when it changes rowContentPane.mouseMove.on( function( ev : PointerEvent ) { if ( ! hasval( timeseriesDragMode ) ) { @@ -393,27 +393,27 @@ module Webglimpse { } } ); selection.hoveredTimeseries.changed.on( redraw ); - + rowContentPane.mouseExit.on( function( ) { selection.hoveredTimeseries.clearValue( ); } ); - + rowContentPane.mouseDown.on( function( ev : PointerEvent ) { if ( isLeftMouseDown( ev.mouseEvent ) ) { timeseriesDragMode = chooseTimeseriesDragMode( ui, selection.hoveredTimeseries.fragment ); } } ); - + rowContentPane.mouseMove.on( function( ev : PointerEvent ) { - + if ( hasval( timeseriesDragMode ) ) { var x : number = timeAtPointer_PMILLIS( ev ); var y : number = dataAxis.vAtFrac( yFrac( ev ) ); - + var fragment = selection.hoveredTimeseries.fragment; var fragment_time = fragment.times_PMILLIS; - if ( timeseriesDragMode === 'y' ) { + if ( timeseriesDragMode === 'y' ) { fragment.setData( selection.hoveredTimeseries.index, y ); } else if ( timeseriesDragMode === 'xy' ) { @@ -424,34 +424,34 @@ module Webglimpse { } } } ); - + // Finish event-drag // rowContentPane.mouseUp.on( function( ev : PointerEvent ) { timeseriesDragMode = null; } ); - + rowContentPane.dispose.on( function( ) { - + rowUi.removePane( keyPrefix+'content' ); rowUi.removePane( keyPrefix+'overlay' ); rowUi.removePane( keyPrefix+'underlay' ); rowUi.removePane( keyPrefix+'y-axis' ); - + dataAxis.limitsChanged.off( redraw ); - + row.timeseriesGuids.valueAdded.off( redraw ); row.timeseriesGuids.valueMoved.off( redraw ); row.timeseriesGuids.valueRemoved.off( redraw ); - + row.timeseriesGuids.valueAdded.off( addRedraw ); row.timeseriesGuids.valueRemoved.off( removeRedraw ); - + selection.hoveredTimeseries.changed.off( redraw ); - + row.attrsChanged.off( updateRowHeight ); - + row.timeseriesGuids.forEach( function( timeseriesGuid : string ) { var timeseries = model.timeseries( timeseriesGuid ); timeseries.attrsChanged.off( redraw ); @@ -459,19 +459,19 @@ module Webglimpse { timeseries.fragmentGuids.valueRemoved.off( redraw ); } ); } ); - + return underlayPane; } } - + export function newTimeseriesPainterFactory( options? : TimelineTimeseriesPainterOptions ) : TimelineTimeseriesPainterFactory { // Painter Factory return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi ) : Painter { - + var selection : TimelineSelectionModel = ui.selection; var defaultColor = hasval( options ) && hasval( options.timelineFgColor ) ? options.timelineFgColor : white; var defaultThickness = hasval( options ) && hasval( options.timelineThickness ) ? options.timelineThickness : 1; - + var modelview_line_VERTSHADER = concatLines( ' uniform mat4 u_modelViewMatrix; ', ' attribute vec4 a_Position; ', @@ -498,9 +498,9 @@ module Webglimpse { ' } ', ' ' ); - + var program = new Program( modelview_pointsize_VERTSHADER, solid_FRAGSHADER ); - + var u_Color = new UniformColor( program, 'u_Color' ); var u_modelViewMatrix = new UniformMatrix4f( program, 'u_modelViewMatrix' ); var a_Position = new Attribute( program, 'a_Position' ); @@ -513,21 +513,21 @@ module Webglimpse { var u_lpPointSize = new Uniform1f( lineProgram, 'u_PointSize' ); var a_lpDistance = new Attribute( lineProgram, 'a_Distance' ); var u_lpDash = new Uniform1f( lineProgram, 'u_Dash' ); - + var axis = new Axis2D( timeAxis, dataAxis ); - + var xys = new Float32Array( 0 ); var dists = new Float32Array( 0 ); var xysBuffer = newDynamicBuffer( ); var distBuffer = newDynamicBuffer( ); - + // Painter return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - + gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); gl.enable( GL.BLEND ); - - for ( var i = 0 ; i < rowModel.timeseriesGuids.length ; i++ ) { + + for ( var i = 0 ; i < rowModel.timeseriesGuids.length ; i++ ) { // collect fragments and sort them by time var totalSize = 0; var sortedFragments = new Array( ); @@ -536,12 +536,12 @@ module Webglimpse { for ( var j = 0 ; j < timeseries.fragmentGuids.length ; j++ ) { var timeseriesFragmentGuid = timeseries.fragmentGuids.valueAt(j); var fragment = model.timeseriesFragment( timeseriesFragmentGuid ); - + sortedFragments.push( fragment ); totalSize += fragment.times_PMILLIS.length; } sortedFragments.sort( ( a,b ) => { return a.start_PMILLIS - b.start_PMILLIS; } ); - + if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { // enable the shader @@ -549,16 +549,16 @@ module Webglimpse { u_lpmodelViewMatrix.setData( gl, glOrthoAxis( axis ) ); var size = totalSize * 2; - + xys = ensureCapacityFloat32( xys, size ); dists = ensureCapacityFloat32( dists, totalSize ); - + var index = 0; for ( var j = 0 ; j < sortedFragments.length ; j++ ) { var fragment = sortedFragments[j]; var data : number[] = fragment.data; var times_PMILLIS : number[] = fragment.times_PMILLIS; - + for ( var k = 0 ; k < data.length ; k++,index+=2 ) { xys[index] = timeAxis.vAtTime( times_PMILLIS[k] ); xys[index+1] = data[k]; @@ -572,36 +572,36 @@ module Webglimpse { } } } - + var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; u_lpColor.setData( gl, lineColor ); - + var dash = hasval( timeseries.dash ) ? timeseries.dash : 0; u_lpDash.setData(gl, dash); - + var lineThickness = hasval( timeseries.lineThickness ) ? timeseries.lineThickness : defaultThickness; gl.lineWidth( lineThickness ); - + xysBuffer.setData( xys.subarray( 0, index ) ); a_lpPosition.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); distBuffer.setData( dists.subarray( 0, totalSize) ); a_lpDistance.setDataAndEnable( gl, distBuffer, 1, GL.FLOAT ); - + if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { // draw the lines gl.drawArrays( GL.LINE_STRIP, 0, size / 2 ); } - + // point size works in WebKit and actually works in Minefield as well even though // VERTEX_PROGRAM_POINT_SIZE and POINT_SMOOTH aren't defined if ( timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' ) { - + var pointColor = hasval( timeseries.pointColor ) ? timeseries.pointColor : defaultColor; u_Color.setData( gl, pointColor ); - + u_PointSize.setData( gl, timeseries.pointSize ); - + gl.drawArrays( GL.POINTS, 0, size / 2 ); } lineProgram.endUse( gl ); @@ -615,33 +615,33 @@ module Webglimpse { // least 2 data points to draw any bars if ( totalSize >= 2 ) { var baseline : number = timeseries.baseline; - + var size = (totalSize-1) * 12; xys = ensureCapacityFloat32( xys, size ); - + var index = 0; for ( var j = 0 ; j < sortedFragments.length ; j++ ) { var fragment = sortedFragments[j]; var data : number[] = fragment.data; var times_PMILLIS : number[] = fragment.times_PMILLIS; - + for ( var k = 0 ; k < data.length-1 ; k++ ) { var x1 = timeAxis.vAtTime( times_PMILLIS[k] ); var y1 = data[k]; - + var x2 = timeAxis.vAtTime( times_PMILLIS[k+1] ); var y2 = data[k+1]; - + index = putQuadXys( xys, index, x1, x2, y1, baseline ); } } - + var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; u_Color.setData( gl, lineColor ); - + xysBuffer.setData( xys.subarray( 0, index ) ); a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - + gl.drawArrays( GL.TRIANGLES, 0, size / 2 ); } program.endUse( gl ); @@ -652,115 +652,115 @@ module Webglimpse { u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); var baseline : number = timeseries.baseline; - + var size = totalSize * 4; - + // the last data point defines the right edge of the bar // but it does not have its own bar drawn xys = ensureCapacityFloat32( xys, size ); - + var index = 0; for ( var j = 0 ; j < sortedFragments.length ; j++ ) { var fragment = sortedFragments[j]; var data : number[] = fragment.data; var times_PMILLIS : number[] = fragment.times_PMILLIS; - + for ( var k = 0 ; k < data.length ; k++,index+=4 ) { var x1 = timeAxis.vAtTime( times_PMILLIS[k] ); var y1 = data[k]; - + xys[index] = x1; xys[index+1] = baseline; - + xys[index+2] = x1; xys[index+3] = y1; } } - + var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; u_Color.setData( gl, lineColor ); - + xysBuffer.setData( xys.subarray( 0, index ) ); a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - + gl.drawArrays( GL.TRIANGLE_STRIP, 0, size / 2 ); - + program.endUse( gl ); } - + // highlight hovered point if ( selection.hoveredTimeseries.fragment && timeseries.fragmentGuids.hasValue( selection.hoveredTimeseries.fragment.fragmentGuid ) ) { // enable the shader program.use( gl ); u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); - + if ( timeseries.uiHint == 'area' || timeseries.uiHint == 'lines' || timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { var size = 8; xys = ensureCapacityFloat32( xys, size ); - + var vppx : number = timeAxis.vSize / viewport.w; var vppy : number = dataAxis.vSize / viewport.h; - + var highlightSize = hasval( timeseries.pointSize ) ? timeseries.pointSize : 5; - + var bufferx = ( highlightSize / 2 ) * vppx; var buffery = ( highlightSize / 2 ) * vppy; - + var fragment = selection.hoveredTimeseries.fragment; var y = selection.hoveredTimeseries.data; var x = timeAxis.vAtTime( selection.hoveredTimeseries.times_PMILLIS ); - + xys[0] = x-bufferx; xys[1] = y-buffery; xys[2] = x+bufferx; xys[3] = y-buffery; xys[4] = x+bufferx; xys[5] = y+buffery; xys[6] = x-bufferx; xys[7] = y+buffery; - + var color = hasval( timeseries.pointColor ) ? timeseries.pointColor : defaultColor; u_Color.setData( gl, darker( color, 0.8 ) ); - + xysBuffer.setData( xys.subarray( 0, size ) ); a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - + gl.drawArrays( GL.LINE_LOOP, 0, size / 2 ); } else if ( timeseries.uiHint == 'bars' ) { var size = 8; xys = ensureCapacityFloat32( xys, size ); - + var fragment = selection.hoveredTimeseries.fragment; var index = selection.hoveredTimeseries.index; - + if ( index < fragment.data.length ) { var x1 = timeAxis.vAtTime( fragment.times_PMILLIS[index] ); var y1 = fragment.data[index]; - + var x2 = timeAxis.vAtTime( fragment.times_PMILLIS[index+1] ); var y2 = fragment.data[index+1]; - + xys[0] = x1; xys[1] = y1; xys[2] = x2; xys[3] = y1; xys[4] = x2; xys[5] = baseline; xys[6] = x1; xys[7] = baseline; - + var color = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; u_Color.setData( gl, darker( color, 0.8 ) ); - + xysBuffer.setData( xys.subarray( 0, size ) ); a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - + gl.drawArrays( GL.LINE_LOOP, 0, size / 2 ); } } program.endUse( gl ); } } - + // disable shader and attribute buffers a_Position.disable( gl ); a_lpDistance.disable( gl ); } - } + } } -} + diff --git a/src/webglimpse/timeline/timeline_ui.ts b/src/webglimpse/timeline/timeline_ui.ts index 1e8851b..6359bf8 100644 --- a/src/webglimpse/timeline/timeline_ui.ts +++ b/src/webglimpse/timeline/timeline_ui.ts @@ -27,13 +27,13 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface TimelineUiOptions { allowEventMultiSelection? : boolean; } - + export class TimelineUi { private _input : TimelineInput; private _selection : TimelineSelectionModel; @@ -47,7 +47,7 @@ module Webglimpse { private _imageStatus : StringMap; private _imageCache : StringMap; - + private _dispose : Notification; private _panes : OrderedSet; @@ -55,12 +55,12 @@ module Webglimpse { constructor( model : TimelineModel, options : TimelineUiOptions = { } ) { this._dispose = new Notification( ); this._input = new TimelineInput( ); - + var getPaneId = function( pane ) { var paneId = pane['webglimpse_PaneId'] return hasval( paneId ) ? paneId : getObjectId( pane ); } - + this._panes = new OrderedSet( [], getPaneId ); this._selection = new TimelineSelectionModel( ); @@ -84,12 +84,12 @@ module Webglimpse { this._eventStyles = new OrderedSet( [], (s)=>s.styleGuid ); this._annotationStyles = new OrderedSet( [], (s)=>s.styleGuid ); - + this._millisPerPx = new SimpleModel( 1000 ); this._imageStatus = {}; this._imageCache = {}; - + this._dispose.on( function( ) { model.groups.valueAdded.off( addGroupUi ); model.groups.valueRemoved.off( removeGroupUi ); @@ -129,7 +129,7 @@ module Webglimpse { eventStyle( styleGuid : string ) : TimelineEventStyleUi { return ( ( hasval( styleGuid ) && this._eventStyles.valueFor( styleGuid ) ) || timelineEventStyle_DEFAULT ); } - + get annotationStyles( ) : OrderedSet { return this._annotationStyles; } @@ -158,25 +158,25 @@ module Webglimpse { } return this._imageCache[ url ]; } - + get panes( ) : OrderedSet { return this._panes; } - + addPane( paneId : string, pane : Pane ) { pane['webglimpse_PaneId'] = paneId; this._panes.removeId( paneId ); this._panes.add( pane ); } - + removePane( paneId : string ) { this._panes.removeId( paneId ); } - + getPane( paneId : string ) : Pane { return this._panes.valueFor( paneId ); } - + get dispose( ) { return this._dispose; } } @@ -206,12 +206,12 @@ module Webglimpse { this._rowGuid = rowGuid; this._paneFactoryChanged = new Notification( ); this._paneFactory = null; - + var getPaneId = function( pane ) { var paneId = pane['webglimpse_PaneId'] return hasval( paneId ) ? paneId : getObjectId( pane ); } - + this._panes = new OrderedSet( [], getPaneId ); } @@ -233,21 +233,21 @@ module Webglimpse { this._paneFactoryChanged.fire( ); } } - + get panes( ) : OrderedSet { return this._panes; } - + addPane( paneId : string, pane : Pane ) { pane['webglimpse_PaneId'] = paneId; this._panes.removeId( paneId ); this._panes.add( pane ); } - + removePane( paneId : string ) { this._panes.removeId( paneId ); } - + getPane( paneId : string ) : Pane { return this._panes.valueFor( paneId ); } @@ -292,33 +292,33 @@ module Webglimpse { export class TimelineSelectionModel { private _mousePos = new XyModel( ); - + private _hoveredY = new SimpleModel( ); private _hoveredTime_PMILLIS = new SimpleModel( ); private _selectedInterval = new TimeIntervalModel( 0, 0 ); - + private _hoveredRow = new SimpleModel( ); - + private _hoveredEvent = new SimpleModel( ); private _selectedEvents = new OrderedSet( [], (e)=>e.eventGuid ); private _hoveredTimeseries = new TimelineTimeseriesFragmentSelectionModel( ); - + private _hoveredAnnotation = new SimpleModel( ); - + get mousePos( ) : XyModel { return this._mousePos; } - + get hoveredY( ) : SimpleModel { return this._hoveredY; } get hoveredTime_PMILLIS( ) : SimpleModel { return this._hoveredTime_PMILLIS; } get selectedInterval( ) : TimeIntervalModel { return this._selectedInterval; } - + get hoveredRow( ) : SimpleModel { return this._hoveredRow; } - + get hoveredEvent( ) : SimpleModel { return this._hoveredEvent; } get selectedEvents( ) : OrderedSet { return this._selectedEvents; } - + get hoveredTimeseries( ) : TimelineTimeseriesFragmentSelectionModel { return this._hoveredTimeseries; } - + get hoveredAnnotation( ) : SimpleModel { return this._hoveredAnnotation; } } @@ -327,13 +327,13 @@ module Webglimpse { private _fragment : TimelineTimeseriesFragmentModel; private _index : number; private _changed : Notification; - + constructor( fragment : TimelineTimeseriesFragmentModel = null, index : number = -1 ) { this._fragment = fragment; this._index = index; this._changed = new Notification( ); } - + setValue( fragment : TimelineTimeseriesFragmentModel, index : number ) { if ( fragment !== this._fragment || index !== this._index ) { this._fragment = fragment; @@ -341,15 +341,15 @@ module Webglimpse { this._changed.fire( ); } } - + clearValue( ) { this.setValue( null, -1 ); } - + get fragment( ) : TimelineTimeseriesFragmentModel { return this._fragment; } get index( ) : number { return this._index; } get changed( ) : Notification { return this._changed; } - + get times_PMILLIS( ) : number { if ( this._fragment ) { return this._fragment.times_PMILLIS[ this._index ]; @@ -400,7 +400,7 @@ module Webglimpse { this._changed.fire( ); } } - + set cursor_PMILLIS( cursor_PMILLIS : number ) { if ( cursor_PMILLIS !== this._cursor_PMILLIS ) { this._cursor_PMILLIS = cursor_PMILLIS; @@ -412,7 +412,7 @@ module Webglimpse { if ( start_PMILLIS !== this._start_PMILLIS || end_PMILLIS !== this._end_PMILLIS || ( cursor_PMILLIS && cursor_PMILLIS != this._cursor_PMILLIS ) ) { - + this._start_PMILLIS = start_PMILLIS; this._end_PMILLIS = end_PMILLIS; this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS; @@ -423,7 +423,7 @@ module Webglimpse { overlaps( start_PMILLIS : number, end_PMILLIS : number ) : boolean { return ( this._start_PMILLIS <= end_PMILLIS && start_PMILLIS <= this._end_PMILLIS ); } - + contains( time_PMILLIS : number ) : boolean { return ( this._start_PMILLIS <= time_PMILLIS && time_PMILLIS <= this._end_PMILLIS ); } @@ -450,9 +450,9 @@ module Webglimpse { function attachTimelineInputToSelection( input : TimelineInput, selection : TimelineSelectionModel, options : TimelineUiOptions ) { - + var allowEventMultiSelection = ( hasval( options ) && hasval( options.allowEventMultiSelection ) ? options.allowEventMultiSelection : true ); - + // Mouse-pos & Time // input.mouseMove.on( function( ev : PointerEvent ) { @@ -473,7 +473,7 @@ module Webglimpse { input.eventHover.on( function( event : TimelineEventModel ) { selection.hoveredEvent.value = event; } ); - + if ( options.allowEventMultiSelection ) { input.mouseDown.on( function( ev : PointerEvent ) { if ( isLeftMouseDown( ev.mouseEvent ) ) { @@ -514,4 +514,3 @@ module Webglimpse { } ); } } -} \ No newline at end of file diff --git a/src/webglimpse/util/binary_tree.ts b/src/webglimpse/util/binary_tree.ts index 902bec2..955375d 100644 --- a/src/webglimpse/util/binary_tree.ts +++ b/src/webglimpse/util/binary_tree.ts @@ -27,8 +27,8 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { - + + // AA Binary Tree // // see: http://user.it.uu.se/~arnea/ps/simp.pdf @@ -52,44 +52,44 @@ module Webglimpse { // Supports O(log n) insertion and deletion and O(1) size retrieval. // export class BinaryTree { - + private _root : TreeNode; private _comp : Comparator; private _size : number; - + constructor( comparator : Comparator ) { this._root = null; this._comp = comparator; this._size = 0; } - + // Inserts the value into the tree. Nothing is inserted if the value already exists insert( value : V ) { this._root = this.insert0( value, this._root ); } - + // Removes the value from the tree (if it exists) remove( value : V ) { this._root = this.remove0( value, this._root ); } - + // Removes all values from the tree (size will be 0) removeAll( ) { this._root = null; this._size = 0; } - + contains( value : V ) : boolean { return this.contains0( value, this._root ) !== null; } - + // Gets the actual value stored in the tree or null if it does not exist. // Normally this is not useful. This method is provided for trees which store additional // data in their values besides their sort order. getValue( value : V ) : V { return this.contains0( value, this._root ); } - + get size( ) : number { return this._size; } @@ -97,57 +97,57 @@ module Webglimpse { get isEmpty( ) : boolean { return ( this._size === 0 ); } - + // Returns the lowest element greater than or equal to the given value, or null if no such element exists ceiling( value : V ) : V { return this.higher0( value, this._root, true ); } - + // Returns the greatest element less than or equal to the given value, or null if no such element exists floor( value : V ) : V { return this.lower0( value, this._root, true ); } - + // Returns the greatest element strictly less than the given value, or null if no such element exists lower( value : V ) : V { return this.lower0( value, this._root, false ); } - + // Returns the lowest element strictly greater than the given value, or null if no such element exists higher( value : V ) : V { return this.higher0( value, this._root, false ); } - + // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) headSet( value : V, inclusive : boolean = true ) : V[] { var results : V[] = new Array( ); this.head0( value, inclusive, this._root, results ); return results; } - + // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) tailSet( value : V, inclusive : boolean = false ) : V[] { var results : V[] = new Array( ); this.tail0( value, inclusive, this._root, results ); return results; } - + // Returns all elements between the provided values (sorted from low to high) subSet( low : V, high : V, lowInclusive : boolean = true, highInclusive : boolean = false ) : V[] { var results : V[] = new Array( ); this.sub0( low, high, lowInclusive, highInclusive, this._root, results ); return results; } - + // Returns all elements in the tree (sorted from low to high) toArray( ) : V[] { var results : V[] = new Array( ); this.addAll0( this._root, results ); return results; } - + iterator( ) : Iterator { - + // find the first node by traversing left links down the tree var node : TreeNode = this._root; var down : boolean; @@ -157,11 +157,11 @@ module Webglimpse { node = node.left; } down = node.right != null; - + return { next: function( ) : V { var value = node.value; - + // down indicates we should follow the right link if ( down && node != null && node.right != null ) { node = node.right; @@ -176,7 +176,7 @@ module Webglimpse { node = stack.pop( ); down = true; } - + return value; }, hasNext: function( ) : boolean { @@ -184,16 +184,16 @@ module Webglimpse { } } } - + compare( node1 : V, node2 : V ) : number { return this._comp.compare( node1, node2 ); } - + private contains0( value : V, node : TreeNode ) : V { if ( node == null ) { return null; } - + var comp : number = this.compare( value, node.value ); if ( comp > 0 ) { return this.contains0( value, node.right ); @@ -205,12 +205,12 @@ module Webglimpse { return node.value; } } - + private lower0( value : V, node : TreeNode, inclusive : boolean ) : V { if ( node == null ) { return null; } - + var comp : number = this.compare( value, node.value ); var candidate : V; if ( comp > 0 ) { @@ -232,12 +232,12 @@ module Webglimpse { return node.value; } } - + private higher0( value : V, node : TreeNode, inclusive : boolean ) : V { if ( node == null ) { return null; } - + var comp : number = this.compare( value, node.value ); var candidate : V; if ( comp < 0 ) { @@ -259,35 +259,35 @@ module Webglimpse { return node.value; } } - + private sub0( low : V, high : V, lowInclusive : boolean, highInclusive : boolean, node : TreeNode, results : V[] ) { if ( node == null ) { return; } - + // low end of range is above node value var compLow : number = this.compare( low, node.value ); if ( compLow > 0 || ( compLow == 0 && !lowInclusive ) ) { return this.sub0( low, high, lowInclusive, highInclusive, node.right, results ); } - + // high end of range is below node value var compHigh : number = this.compare( high, node.value ); if ( compHigh < 0 || ( compHigh == 0 && !highInclusive ) ) { return this.sub0( low, high, lowInclusive, highInclusive, node.left, results ); } - + // value is within range this.sub0( low, high, lowInclusive, highInclusive, node.left, results ); results.push( node.value ); this.sub0( low, high, lowInclusive, highInclusive, node.right, results ); } - + private head0( value : V, inclusive : boolean, node : TreeNode, results : V[] ) { if ( node == null ) { return; } - + var comp : number = this.compare( value, node.value ); if ( comp < 0 || ( comp == 0 && inclusive ) ) { this.head0( value, inclusive, node.left, results ); @@ -298,12 +298,12 @@ module Webglimpse { this.head0( value, inclusive, node.right, results ); } } - + private tail0( value : V, inclusive : boolean, node : TreeNode, results : V[] ) { if ( node == null ) { return; } - + var comp : number = this.compare( value, node.value ); if ( comp > 0 || ( comp == 0 && inclusive ) ) { this.addAll0( node.left, results ); @@ -314,27 +314,27 @@ module Webglimpse { this.tail0( value, inclusive, node.left, results ); } } - + private addAll0( node : TreeNode, results : V[] ) { if ( node == null ) { return; } - + this.addAll0( node.left, results ); results.push( node.value ); this.addAll0( node.right, results ); } - + // 1) turn deletion of internal node into deletion of leaf node by swapping with closest successor or predecessor // (which will always be in level 1) // 2) lower level of nodes whose children are two levels below them (not allowed by invariants 2 and 3) // also lower level of nodes who are now leaf nodes (level > 1 not allowed by invariant 1) // 3) skew and split the entire level - private remove0( value : V, node : TreeNode ) : TreeNode { + private remove0( value : V, node : TreeNode ) : TreeNode { if ( node == null ) { return node; } - + // find and remove the node var comp : number = this.compare( value, node.value ); if ( comp < 0 ) { @@ -349,7 +349,7 @@ module Webglimpse { } else if ( node.left == null ) { var lower = node.getSuccessor( ); - node.right = this.remove0( lower.value, node.right ); + node.right = this.remove0( lower.value, node.right ); node.value = lower.value; } else { @@ -359,7 +359,7 @@ module Webglimpse { } this._size -= 1; } - + // rebalance the tree node = this.decreaseLevel0( node ); @@ -368,13 +368,13 @@ module Webglimpse { if ( node.right != null ) { node.right.right = this.skew0( node.right.right ); } - + node = this.split0( node ); node.right = this.split0( node.right ); - + return node; } - + // return the level of the node, or 0 if null private level0( node : TreeNode ) { if ( node == null ) { @@ -384,21 +384,21 @@ module Webglimpse { return node.level; } } - + // lower the level of nodes which violate invariants 1, 2, and/or 3 private decreaseLevel0( node : TreeNode ) : TreeNode { var correctLevel = Math.min( this.level0( node.left ), this.level0( node.right ) ) + 1; - + if ( correctLevel < node.level ) { node.level = correctLevel; if ( node.right != null && correctLevel < node.right.level ) { node.right.level = correctLevel; } } - + return node; } - + // 1) insert the value as you would in a binary tree // 2) walk back to the root performing skew() then split() operations // returns an updated version of the provided node (after the insert) @@ -407,7 +407,7 @@ module Webglimpse { this._size += 1; return this.newTreeNode0( value ); } - + // find the appropriate spot and insert the node var comp : number = this.compare( value, node.value ); if ( comp < 0 ) { @@ -416,25 +416,25 @@ module Webglimpse { else if ( comp > 0 ) { node.right = this.insert0( value, node.right ); } - + // always perform a skew then split to rebalance tree // (if no balancing is necessary, these operations will return the node unchanged) node = this.skew0( node ); node = this.split0( node ); - + return node; } - + newTreeNode0( value : V ) { return new TreeNode( value ); } - + private skew0( node : TreeNode ) { if ( node == null ) { - return null; + return null; } else if ( node.left == null ) { - return node; + return node; } else if ( node.left.level == node.level ) { // swap the pointers of the horizontal (same level value) left links @@ -447,7 +447,7 @@ module Webglimpse { return node; } } - + private split0( node : TreeNode ) { if ( node == null ) { return null; @@ -465,64 +465,64 @@ module Webglimpse { return right; } else { - return node; + return node; } } } - - - - + + + + export class TreeNode { private _level : number; private _right : TreeNode; private _left : TreeNode; private _value : V; - + constructor( value : V, level : number = 1, left : TreeNode = null, right : TreeNode = null ) { - this._level = level; + this._level = level; this._right = right; this._left = left; this._value = value; } - + get level( ) : number { - return this._level; + return this._level; } - + get right( ) : TreeNode { - return this._right; + return this._right; } - + get left( ) : TreeNode { - return this._left; + return this._left; } - + get value( ) : V { - return this._value; + return this._value; } - + set right( node : TreeNode ) { - this._right = node; + this._right = node; } - + set left( node : TreeNode ) { - this._left = node; + this._left = node; } - + set level( level : number ) { this._level = level; } - + set value( value : V ) { this._value = value; } - + isLeaf( ) : boolean { return this.right == null && this.left == null; } - + getSuccessor( ) : TreeNode { var node : TreeNode = this.right; while ( node != null && node.left != null ) { @@ -530,7 +530,7 @@ module Webglimpse { } return node; } - + getPredecessor( ) : TreeNode { var node : TreeNode = this.left; while ( node != null && node.right != null ) { @@ -538,42 +538,41 @@ module Webglimpse { } return node; } - + toString( ) : string { - return this.value.toString( ) + ':' + this.level.toString( ); + return this.value.toString( ) + ':' + this.level.toString( ); } } - + export interface Iterator { hasNext( ) : boolean; next( ) : V; } - + // follows Java Comparator interface contract: // positive if node1 > node2 // 0 if node1 = node2 // negative if node1 < node2 export interface Comparator { - compare( node1 : V, node2 : V ) : number; + compare( node1 : V, node2 : V ) : number; } - + export class StringComparator implements Comparator { compare( value1 : string, value2 : string ) : number { - return value1.toLocaleLowerCase( ).localeCompare( value2.toLocaleLowerCase( ) ); + return value1.toLocaleLowerCase( ).localeCompare( value2.toLocaleLowerCase( ) ); } } - + export class NumberComparator implements Comparator { compare( value1 : number, value2 : number ) : number { return value1 - value2; } } - + export function createStringTree( ) : BinaryTree { return new BinaryTree( new StringComparator( ) ); } - + export function createNumberTree( ) : BinaryTree { return new BinaryTree( new NumberComparator( ) ); } -} \ No newline at end of file diff --git a/src/webglimpse/util/cache.ts b/src/webglimpse/util/cache.ts index 295a20e..2c7f502 100644 --- a/src/webglimpse/util/cache.ts +++ b/src/webglimpse/util/cache.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface CacheHelper { @@ -144,4 +144,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/util/multikey_cache.ts b/src/webglimpse/util/multikey_cache.ts index 7d004fd..e8e35ca 100644 --- a/src/webglimpse/util/multikey_cache.ts +++ b/src/webglimpse/util/multikey_cache.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface MultiKeyCacheHelper { @@ -200,4 +200,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/util/notification.ts b/src/webglimpse/util/notification.ts index 7402426..1c25df3 100644 --- a/src/webglimpse/util/notification.ts +++ b/src/webglimpse/util/notification.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export interface Listener { @@ -91,7 +91,7 @@ module Webglimpse { this._listeners.removeValue( listener ); } } - + dispose( ) { this._listeners.removeAll( ); } @@ -142,7 +142,7 @@ module Webglimpse { this._listeners.removeValue( listener ); } } - + dispose( ) { this._listeners.removeAll( ); } @@ -193,7 +193,7 @@ module Webglimpse { this._listeners.removeValue( listener ); } } - + dispose( ) { this._listeners.removeAll( ); } @@ -244,7 +244,7 @@ module Webglimpse { this._listeners.removeValue( listener ); } } - + dispose( ) { this._listeners.removeAll( ); } @@ -271,4 +271,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/util/ordered_set.ts b/src/webglimpse/util/ordered_set.ts index 14807e2..27d9f57 100644 --- a/src/webglimpse/util/ordered_set.ts +++ b/src/webglimpse/util/ordered_set.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + function requireString( s : string ) : string { @@ -593,4 +593,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/util/sorted_arrays.ts b/src/webglimpse/util/sorted_arrays.ts index 06be48c..b2937a9 100644 --- a/src/webglimpse/util/sorted_arrays.ts +++ b/src/webglimpse/util/sorted_arrays.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // XXX: These probably belong in their own namespace @@ -48,7 +48,7 @@ module Webglimpse { b = pivot - 1; } else { - // This is a little sloppy if either value is NaN, or if one is +0.0 and the other is -0.0 + // This is a little sloppy if either value is NaN, or if one is +0.0 and the other is -0.0 return pivot; } } @@ -81,10 +81,10 @@ module Webglimpse { export function indexAfter( vs : number[], x : number ) : number { var i = indexOf( vs, x ); - + // Exact value not found if ( i < 0 ) return ( -i - 1 ); - + // If the exact value was found, find the value's last occurrence var n = vs.length; for ( var j = i + 1; j < n; j++ ) { @@ -97,10 +97,10 @@ module Webglimpse { export function indexAtOrAfter( vs : number[], x : number ) : number { var i = indexOf( vs, x ); - + // Exact value not found if ( i < 0 ) return ( -i - 1 ); - + // If the exact value was found, find the value's first occurrence var n = vs.length; for ( var j = i; j > 0; j-- ) { @@ -122,4 +122,3 @@ module Webglimpse { } -} \ No newline at end of file diff --git a/src/webglimpse/util/sorted_multimap.ts b/src/webglimpse/util/sorted_multimap.ts index f61b866..f1134f1 100644 --- a/src/webglimpse/util/sorted_multimap.ts +++ b/src/webglimpse/util/sorted_multimap.ts @@ -27,19 +27,19 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { - + + // A sorted map which allows multiple string values per key (K) export class SortedMultimap { - + private _tree : BinaryTree>; private _idFn : IdFunction; - + constructor( comparator : Comparator, idFn : IdFunction = getObjectId ) { this._tree = new BinaryTree>( this.createContainerComparator( comparator ) ); this._idFn = idFn; } - + private createContainerComparator( comparator : Comparator ) : Comparator> { return { compare : function( container1 : Container, container2 : Container ) : number { @@ -47,37 +47,37 @@ module Webglimpse { } } } - + // Inserts the value into the tree. Nothing is inserted if the value already exists insert( key : K, value : V ) { var wrappedKey = new Container( key ); var values : Container = this._tree.getValue( wrappedKey ); - + if ( values === null ) { values = wrappedKey; this._tree.insert( values ); } - + values.add( value, this._idFn ); } - + remove( key : K, value : V ) { var wrappedKey = new Container( key ); var values : Container = this._tree.getValue( wrappedKey ); - + if ( values === null ) return; - + values.remove( value, this._idFn ); - + if ( values.size === 0 ) { this._tree.remove( values ); } } - + contains( key : K, value : V ) { var wrappedKey = new Container( key ); var values : Container = this._tree.getValue( wrappedKey ); - + if ( values === null ) { return false; } @@ -85,37 +85,37 @@ module Webglimpse { return values.contains( value, this._idFn ); } } - + // Returns the lowest element greater than or equal to the given value, or null if no such element exists ceiling( key : K ) : V[] { return this.unwrap( this._tree.ceiling( this.wrap( key ) ) ); } - + // Returns the greatest element less than or equal to the given value, or null if no such element exists floor( key : K ) : V[] { return this.unwrap( this._tree.floor( this.wrap( key ) ) ); } - + // Returns the greatest element strictly less than the given value, or null if no such element exists lower( key : K ) : V[] { return this.unwrap( this._tree.lower( this.wrap( key ) ) ); } - + // Returns the lowest element strictly greater than the given value, or null if no such element exists higher( key : K ) : V[] { return this.unwrap( this._tree.higher( this.wrap( key ) ) ); } - + // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) headSet( key : K, inclusive : boolean = true ) : V[] { return this.unwrapArray( this._tree.headSet( this.wrap( key ), inclusive ) ); } - + // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) tailSet( key : K, inclusive : boolean = false ) : V[] { return this.unwrapArray( this._tree.tailSet( this.wrap( key ), inclusive ) ); } - + // Returns all elements between the provided values (sorted from low to high) subSet( low : K, high : K, lowInclusive : boolean = true, highInclusive : boolean = false ) : V[] { var wrappedLow = new Container( low ); @@ -123,23 +123,23 @@ module Webglimpse { var values : Container[] = this._tree.subSet( wrappedLow, wrappedHigh, lowInclusive, highInclusive ); return this.unwrapArray( values ); } - + // Returns all keys in the tree (sorted from low to high) toArray( ) : V[] { return this.unwrapArray( this._tree.toArray( ) ); } - + iterator( ) : Iterator { - + var iter : Iterator> = this._tree.iterator( ); var currentArray : V[] = null; var currentIndex : number = 0; - + return { next: function( ) : V { - + var value : V; - + if ( currentArray == null || currentIndex >= currentArray.length ) { currentArray = iter.next( ).toArray( ); currentIndex = 0; @@ -148,9 +148,9 @@ module Webglimpse { else { value = currentArray[currentIndex]; } - + currentIndex += 1; - + return value; }, hasNext: function( ) : boolean { @@ -158,11 +158,11 @@ module Webglimpse { } } } - + private wrap( key : K ) : Container { return new Container( key ); } - + private unwrap( values : Container ) : V[] { if ( values === null ) { return []; @@ -171,7 +171,7 @@ module Webglimpse { return values.toArray( ); } } - + private unwrapArray( values : Container[] ) : V[] { var unwrappedValues : V[] = new Array( ); values.forEach( function( value : Container ) { @@ -179,58 +179,57 @@ module Webglimpse { unwrappedValues.push( value ); }); } ); - + return unwrappedValues; } } - + export class SortedStringMultimap extends SortedMultimap { constructor( comparator : Comparator ) { super( comparator, (value)=>value ); } } - + // a container which stores a set of values (V) associated with a sorted key (K) // OrderedSet or even BinaryTree could be used here instead // more sophisticated set implementation: http://stackoverflow.com/questions/7958292/mimicking-sets-in-javascript class Container { - + private _key : K; private _values : StringMap; - + constructor( key : K ) { this._key = key; this._values = {}; } - + get size( ) : number { return this.toArray( ).length; } - + get key( ) : K { return this._key; } - + get values( ) : StringMap { return this._values; } - + toArray( ) : V[] { return Object.keys(this._values).map(key => this._values[key]); } - + contains( value : V, idFn : IdFunction ) : boolean { // safer than 'value in this._values' because of potential conflict with built in properties/methods return Object.prototype.hasOwnProperty.call( this._values, idFn( value ) ); } - + add( value : V, idFn : IdFunction ) { this._values[ idFn( value ) ] = value; } - + remove( value : V, idFn : IdFunction ) { delete this._values[ idFn( value ) ]; } } - -} \ No newline at end of file + diff --git a/src/webglimpse/util/split.ts b/src/webglimpse/util/split.ts index 40fa3a2..485d713 100644 --- a/src/webglimpse/util/split.ts +++ b/src/webglimpse/util/split.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + export function initSplitContainer( container : HTMLElement ) : Notification { @@ -254,4 +254,4 @@ module Webglimpse { } -} + diff --git a/src/webglimpse/util/util.ts b/src/webglimpse/util/util.ts index be54ac2..c5708ea 100644 --- a/src/webglimpse/util/util.ts +++ b/src/webglimpse/util/util.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { + // Alias for more readable access to static constants export var GL = WebGLRenderingContext; @@ -135,7 +135,7 @@ module Webglimpse { export interface StringMap { [ key : string ] : V; } - + export interface IdFunction { ( value : V ) : string; } @@ -215,4 +215,4 @@ module Webglimpse { } -} + From 64c4f04e7309969699b61cdbc096c273049167a4 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 28 Mar 2018 14:24:59 -0700 Subject: [PATCH 10/69] Use ng-packagr to build. Updated 3rd party libraries. Removed Webglimpse namespace. Each file is now a module; added imports to each file. Fixed piles of typescript errors. Should now be importable in typescript from npm package. --- Gruntfile.js | 383 -- ng-package.json | 14 + package.json | 74 +- src/examples/defs/jquery.d.ts | 28 +- src/examples/defs/jqueryui.d.ts | 18 +- src/examples/plot/plot.ts | 123 +- src/examples/scroll/scroll.ts | 109 +- src/examples/timeline/timeline.ts | 1137 +++--- src/public_api.ts | 64 + src/reference.ts | 78 - src/webglimpse/bounds.ts | 190 +- src/webglimpse/buffer.ts | 199 +- src/webglimpse/color.ts | 173 +- src/webglimpse/core.ts | 1223 +++--- src/webglimpse/defs/moment.d.ts | 327 -- src/webglimpse/gradient.ts | 97 +- src/webglimpse/label.ts | 196 +- src/webglimpse/layout/card_layout.ts | 112 +- src/webglimpse/layout/column_layout.ts | 236 +- src/webglimpse/layout/corner_layout.ts | 87 +- src/webglimpse/layout/inset_layout.ts | 174 +- src/webglimpse/layout/overlay_layout.ts | 96 +- src/webglimpse/layout/row_layout.ts | 314 +- src/webglimpse/matrix.ts | 44 +- src/webglimpse/misc.ts | 584 +-- src/webglimpse/painter/border_painter.ts | 256 +- src/webglimpse/plot/axis.ts | 310 +- src/webglimpse/plot/edge_axis_painter.ts | 746 ++-- src/webglimpse/plot/heatmap_painter.ts | 273 +- src/webglimpse/plot/line_painter.ts | 115 +- src/webglimpse/plot/plot_layout.ts | 123 +- src/webglimpse/scroll.ts | 439 +-- src/webglimpse/shader.ts | 450 +-- src/webglimpse/text.ts | 916 ++--- src/webglimpse/texture.ts | 470 +-- src/webglimpse/time.ts | 48 +- src/webglimpse/timeline/time_axis.ts | 83 +- src/webglimpse/timeline/time_axis_painter.ts | 1378 +++---- src/webglimpse/timeline/time_grid_painter.ts | 100 +- .../timeline/timeline_annotation_painter.ts | 212 +- .../timeline/timeline_annotation_style.ts | 315 +- .../timeline/timeline_cursor_painter.ts | 347 +- .../timeline/timeline_event_style.ts | 138 +- .../timeline/timeline_events_row.ts | 3357 +++++++++-------- src/webglimpse/timeline/timeline_lanes.ts | 861 ++--- src/webglimpse/timeline/timeline_layout.ts | 168 +- src/webglimpse/timeline/timeline_model.ts | 3048 +++++++-------- src/webglimpse/timeline/timeline_pane.ts | 2352 ++++++------ src/webglimpse/timeline/timeline_row.ts | 47 +- src/webglimpse/timeline/timeline_styles.ts | 259 +- .../timeline/timeline_timeseries_row.ts | 1251 +++--- src/webglimpse/timeline/timeline_ui.ts | 778 ++-- src/webglimpse/util/binary_tree.ts | 884 ++--- src/webglimpse/util/cache.ts | 162 +- src/webglimpse/util/multikey_cache.ts | 254 +- src/webglimpse/util/notification.ts | 362 +- src/webglimpse/util/ordered_set.ts | 901 ++--- src/webglimpse/util/sorted_arrays.ts | 126 +- src/webglimpse/util/sorted_multimap.ts | 305 +- src/webglimpse/util/split.ts | 347 +- src/webglimpse/util/util.ts | 280 +- tsconfig.json | 11 - 62 files changed, 14078 insertions(+), 14474 deletions(-) delete mode 100644 Gruntfile.js create mode 100644 ng-package.json create mode 100644 src/public_api.ts delete mode 100644 src/reference.ts delete mode 100644 src/webglimpse/defs/moment.d.ts delete mode 100644 tsconfig.json diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index d3ef9dc..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,383 +0,0 @@ -'use strict'; - -module.exports = function ( grunt ) { - - var _ = require( 'lodash' ); - - var licenseText = grunt.file.read( 'HEADER' ).replace( /\n$/, '' ); - var sourceHeader = '/*\n' + licenseText.replace( /^/mg, ' * ' ).replace( / *$/mg, '' ) + '\n */'; - var mungedSourceHeader = '\n' + licenseText.replace( /^/mg, '* ' ).replace( / *$/mg, '' ) + '\n'; - - var releaseVersion = '1.9.2'; - var releaseDate = grunt.template.today( 'UTC:yyyy-mm-dd HH:MM:ss Z' ); - var releaseText = [ - 'Web Glimpse v' + releaseVersion, - 'Released: ' + releaseDate, - 'https://glimpse.metsci.com/webglimpse/', - '' - ].join( '\n' ); - var releaseHeader = '/*!\n' + ( releaseText + '\n' + licenseText ).replace( /^/mg, ' * ' ).replace( / *$/mg, '' ) + '\n */'; - - - - // - // Common - // - - var commonConfig = { - - ts: { - options: { - target: 'es5', - comments: true, - sourceRoot: '.' - } - }, - - clean: { - build: [ 'build/grunt' ], - misc: [ 'tscommand*.tmp.txt' ] - } - - }; - - var commonTasks = { }; - - - - // - // Dev - // - - var devConfig = { - - ts: { - dev: { - src: [ 'src/**/*.ts' ], - reference: 'src/reference.ts', - out: 'build/grunt/dev/webglimpse-dev.js' - } - }, - - watch: { - dev: { - files: [ 'src/**/*.ts' ], - tasks: [ 'ts:dev' ] - } - }, - - connect: { - dev: { - options: { - hostname: 'localhost', - port: 8000, - base: [ 'build/grunt/dev', 'src' ] - } - } - }, - - clean: { - dev: [ 'build/grunt/dev' ] - } - - }; - - var devTasks = { - build: [ - 'ts:dev' - ], - serve: [ - 'build', - 'connect:dev', - 'watch:dev' - ] - }; - - - - // - // Release - // - - var releaseConfig = { - - copy: { - release_sources: { - expand: true, - cwd: 'src/', - src: [ '**' ], - dest: 'build/grunt/release/' - }, - release_package: { - src: './package.json', - dest: 'build/grunt/release/' - }, - release_license: { - src: 'LICENSE', - dest: 'build/grunt/release/' - }, - release_changelog: { - src: 'CHANGELOG', - dest: 'build/grunt/release/' - }, - release_webglimpse_defs: { - expand: true, - cwd: 'build/grunt/release/tmp/', - src: 'webglimpse.d.ts', - dest: 'build/grunt/release/' - } - }, - - ts: { - release_webglimpse: { - src: [ 'build/grunt/release/webglimpse/**/*.ts' ], - reference: 'build/grunt/release/reference.ts', - out: 'build/grunt/release/tmp/webglimpse.js', - options: { - declaration: true - } - }, - release_plot_example: { - src: [ - 'build/grunt/release/webglimpse/defs/**/*.d.ts', - 'build/grunt/release/webglimpse.d.ts', - 'build/grunt/release/examples/defs/**/*.d.ts', - 'build/grunt/release/examples/plot/**/*.ts' - ], - outDir: 'build/grunt/release/examples/plot/tmp/' - }, - release_scroll_example: { - src: [ - 'build/grunt/release/webglimpse/defs/**/*.d.ts', - 'build/grunt/release/webglimpse.d.ts', - 'build/grunt/release/examples/defs/**/*.d.ts', - 'build/grunt/release/examples/scroll/**/*.ts' - ], - outDir: 'build/grunt/release/examples/scroll/tmp/' - }, - release_timeline_example: { - src: [ - 'build/grunt/release/webglimpse/defs/**/*.d.ts', - 'build/grunt/release/webglimpse.d.ts', - 'build/grunt/release/examples/defs/**/*.d.ts', - 'build/grunt/release/examples/timeline/**/*.ts' - ], - outDir: 'build/grunt/release/examples/timeline/tmp/' - } - }, - - uglify: { - release_webglimpse: { - options: { - mangle: false, - compress: false, - beautify: true, - preserveComments: function( node, comment ) { - return ( comment.value !== mungedSourceHeader ); - }, - banner: releaseHeader, - sourceMap: true, - sourceMapIn: 'build/grunt/release/tmp/webglimpse.js.map' - }, - files: { - 'build/grunt/release/webglimpse.js': [ 'build/grunt/release/tmp/webglimpse.js' ] - } - }, - release_plot_example: { - options: { - mangle: false, - compress: false, - beautify: true, - preserveComments: function( node, comment ) { - return ( comment.value !== mungedSourceHeader ); - }, - banner: releaseHeader, - sourceMap: true, - sourceMapIn: 'build/grunt/release/examples/plot/tmp/plot.js.map' - }, - files: { - 'build/grunt/release/examples/plot/plot.js': [ 'build/grunt/release/examples/plot/tmp/plot.js' ] - } - }, - release_scroll_example: { - options: { - mangle: false, - compress: false, - beautify: true, - preserveComments: function( node, comment ) { - return ( comment.value !== mungedSourceHeader ); - }, - banner: releaseHeader, - sourceMap: true, - sourceMapIn: 'build/grunt/release/examples/scroll/tmp/scroll.js.map' - }, - files: { - 'build/grunt/release/examples/scroll/scroll.js': [ 'build/grunt/release/examples/scroll/tmp/scroll.js' ] - } - }, - release_timeline_example: { - options: { - mangle: false, - compress: false, - beautify: true, - preserveComments: function( node, comment ) { - return ( comment.value !== mungedSourceHeader ); - }, - banner: releaseHeader, - sourceMap: true, - sourceMapIn: 'build/grunt/release/examples/timeline/tmp/timeline.js.map' - }, - files: { - 'build/grunt/release/examples/timeline/timeline.js': [ 'build/grunt/release/examples/timeline/tmp/timeline.js' ] - } - } - }, - - replace: { - release_reference: { - // Remove examples from reference.ts - src: [ 'build/grunt/release/reference.ts' ], - dest: 'build/grunt/release/reference.ts', - replacements: [ { - from: /\/\/\/\s*/g, - to: '' - }, { - from: /\/\/\s*Examples/g, - to: '' - } ] - }, - release_html: { - src: [ 'build/grunt/release/**/*.html' ], - overwrite: true, - replacements: [ { - from: //g, - to: '/g, - to: '-->' - }, { - from: /' - }, { - from: /-->/g, - to: '' - } ] - }, - release_webglimpse_defs: { - // Remove ref tags from webglimpse.d.ts - src: [ 'build/grunt/release/webglimpse.d.ts' ], - overwrite: true, - replacements: [ { - from: /\/\/\/\s*/g, - to: '' - } ] - } - }, - - connect: { - release: { - options: { - hostname: 'localhost', - port: 8001, - base: [ 'build/grunt/release' ], - keepalive: true - } - } - }, - - clean: { - release_webglimpse_tmp: [ 'build/grunt/release/tmp' ], - release_plot_example_tmp: [ 'build/grunt/release/examples/plot/tmp' ], - release_scroll_example_tmp: [ 'build/grunt/release/examples/scroll/tmp' ], - release_timeline_example_tmp: [ 'build/grunt/release/examples/timeline/tmp' ], - release: [ 'build/grunt/release' ] - } - - }; - - var releaseTasks = { - release: [ - // Clean - 'clean:release', - // Copy all, and modify copies - 'copy:release_sources', - 'copy:release_package', - 'copy:release_license', - 'copy:release_changelog', - 'replace:release_reference', - // Compile webglimpse, and modify generated - 'ts:release_webglimpse', - 'uglify:release_webglimpse', - 'copy:release_webglimpse_defs', - 'replace:release_webglimpse_defs', - 'clean:release_webglimpse_tmp', - // Compile examples, and modify generated - 'ts:release_plot_example', - 'ts:release_scroll_example', - 'ts:release_timeline_example', - 'uglify:release_plot_example', - 'uglify:release_scroll_example', - 'uglify:release_timeline_example', - 'clean:release_plot_example_tmp', - 'clean:release_scroll_example_tmp', - 'clean:release_timeline_example_tmp', - 'replace:release_html' - ], - serve_release: [ - 'release', - 'connect:release' - ] - }; - - - - // - // Util - // - - var utilConfig = { - - copy: { - prepend_source_headers: { - cwd: 'src/', - src: [ '**/*.ts', '!**/*.d.ts', '!reference.ts' ], - dest: 'src/', - expand: true, - options: { - process: function( content ) { - var hasHeader = ( content.substring( 0, sourceHeader.length ) === sourceHeader ); - return ( hasHeader ? content : sourceHeader + '\n' + content ); - } - } - } - } - - }; - - var utilTasks = { - add_headers: [ - 'copy:prepend_source_headers' - ] - }; - - - - // - // Grunt - // - - require( 'load-grunt-tasks' )( grunt ); - - grunt.initConfig( _.merge( commonConfig, devConfig, releaseConfig, utilConfig ) ); - - var tasks = _.merge( commonTasks, devTasks, releaseTasks, utilTasks ); - for ( var taskName in tasks ) { - if ( tasks.hasOwnProperty( taskName ) ) { - grunt.registerTask( taskName, tasks[ taskName ] ); - } - } - - grunt.registerTask( 'default', [ 'build' ] ); - -}; - diff --git a/ng-package.json b/ng-package.json new file mode 100644 index 0000000..ec1c9de --- /dev/null +++ b/ng-package.json @@ -0,0 +1,14 @@ +{ + "$schema": "./node_modules/ng-packagr/package.schema.json", + "ngPackage": { + "lib": { + "entryFile": "public_api.ts", + "externals": { + "moment": "moment" + }, + "umdModuleIds": { + "moment": "moment" + } + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 2f3c31c..7f9d13b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "webglimpse", "version": "1.9.2", "description": "Webglimpse is a data visualization library for the web.", - "repository":{ + "repository": { "type": "git", "url": "https://github.com/skaughtx0r/webglimpse" }, @@ -14,18 +14,66 @@ "webgl" ], "main": "webglimpse.js", - "typings": "webglimpse.d.ts", + "scripts": { + "ng": "ng", + "start": "ng serve", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "build": "ng-packagr -p ng-package.json", + "docs": "node_modules/.bin/compodoc -p tsconfig.json -d docs --theme readthedocs", + "serve-docs": "node_modules/.bin/compodoc -s -d docs" + }, + "peerDependencies": { + "@angular/core": "^5.2.0", + "@angular/animations": "^5.2.0", + "@angular/common": "^5.2.0", + "@angular/compiler": "^5.2.0", + "@angular/forms": "^5.2.0", + "@angular/http": "^5.2.0", + "@angular/platform-browser": "^5.2.0", + "@angular/platform-browser-dynamic": "^5.2.0", + "@angular/router": "^5.2.0", + "core-js": "^2.4.1", + "rxjs": "^5.5.6", + "zone.js": "^0.8.14" + }, + "dependencies": { + "moment": "^2.21.0" + }, "devDependencies": { - "typescript": "1.0.1", - "grunt": "~0.4.2", - "grunt-ts": "~1.7.2", - "grunt-contrib-watch": "~0.5.3", - "grunt-contrib-connect": "~0.6.0", - "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-copy": "~0.5.0", - "grunt-contrib-uglify": "~0.6.0", - "grunt-text-replace": "~0.3.10", - "load-grunt-tasks": "~0.3.0", - "lodash": "~2.4.1" + "@angular/animations": "^5.2.0", + "@angular/cli": "^1.7.0", + "@angular/common": "^5.2.0", + "@angular/compiler": "^5.2.0", + "@angular/compiler-cli": "^5.2.0", + "@angular/core": "^5.2.0", + "@angular/forms": "^5.2.0", + "@angular/http": "^5.2.0", + "@angular/language-service": "^5.2.0", + "@angular/platform-browser": "^5.2.0", + "@angular/platform-browser-dynamic": "^5.2.0", + "@angular/router": "^5.2.0", + "@compodoc/compodoc": "^1.0.8", + "@types/jasmine": "~2.5.53", + "@types/jasminewd2": "~2.0.2", + "@types/node": "~6.0.60", + "codelyzer": "^4.0.1", + "core-js": "^2.4.1", + "jasmine-core": "~2.6.2", + "jasmine-spec-reporter": "~4.1.0", + "karma": "~1.7.0", + "karma-chrome-launcher": "~2.1.1", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", + "ng-packagr": "^2.0.0", + "protractor": "~5.1.2", + "rxjs": "^5.5.6", + "ts-node": "~3.2.0", + "tslint": "~5.7.0", + "typescript": "~2.4.2", + "zone.js": "^0.8.14" } } diff --git a/src/examples/defs/jquery.d.ts b/src/examples/defs/jquery.d.ts index e0018f6..5e334fa 100644 --- a/src/examples/defs/jquery.d.ts +++ b/src/examples/defs/jquery.d.ts @@ -33,7 +33,7 @@ interface JQueryAjaxSettings { /** * A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless of the type of request. */ - beforeSend? (jqXHR: JQueryXHR, settings: JQueryAjaxSettings): any; + beforeSend?(jqXHR: JQueryXHR, settings: JQueryAjaxSettings): any; /** * If set to false, it will force requested pages not to be cached by the browser. Note: Setting cache to false will only work correctly with HEAD and GET requests. It works by appending "_={timestamp}" to the GET parameters. The parameter is not needed for other types of requests, except in IE8 when a POST is made to a URL that has already been requested by a GET. */ @@ -41,7 +41,7 @@ interface JQueryAjaxSettings { /** * A function to be called when the request finishes (after success and error callbacks are executed). The function gets passed two arguments: The jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object and a string categorizing the status of the request ("success", "notmodified", "error", "timeout", "abort", or "parsererror"). As of jQuery 1.5, the complete setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event. */ - complete? (jqXHR: JQueryXHR, textStatus: string): any; + complete?(jqXHR: JQueryXHR, textStatus: string): any; /** * An object of string/regular-expression pairs that determine how jQuery will parse the response, given its content type. (version added: 1.5) */ @@ -71,7 +71,7 @@ interface JQueryAjaxSettings { /** * A function to be used to handle the raw response data of XMLHttpRequest.This is a pre-filtering function to sanitize the response. You should return the sanitized data. The function accepts two arguments: The raw data returned from the server and the 'dataType' parameter. */ - dataFilter? (data: any, ty: any): any; + dataFilter?(data: any, ty: any): any; /** * The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string). */ @@ -79,7 +79,7 @@ interface JQueryAjaxSettings { /** * A function to be called if the request fails. The function receives three arguments: The jqXHR (in jQuery 1.4.x, XMLHttpRequest) object, a string describing the type of error that occurred and an optional exception object, if one occurred. Possible values for the second argument (besides null) are "timeout", "error", "abort", and "parsererror". When an HTTP error occurs, errorThrown receives the textual portion of the HTTP status, such as "Not Found" or "Internal Server Error." As of jQuery 1.5, the error setting can accept an array of functions. Each function will be called in turn. Note: This handler is not called for cross-domain script and cross-domain JSONP requests. This is an Ajax Event. */ - error? (jqXHR: JQueryXHR, textStatus: string, errorThrow: string): any; + error?(jqXHR: JQueryXHR, textStatus: string, errorThrow: string): any; /** * Whether to trigger global Ajax event handlers for this request. The default is true. Set to false to prevent the global handlers like ajaxStart or ajaxStop from being triggered. This can be used to control various Ajax Events. */ @@ -127,7 +127,7 @@ interface JQueryAjaxSettings { /** * A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event. */ - success? (data: any, textStatus: string, jqXHR: JQueryXHR): any; + success?(data: any, textStatus: string, jqXHR: JQueryXHR): any; /** * Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period. */ @@ -326,7 +326,7 @@ interface JQuerySupport { opacity?: boolean; optDisabled?: boolean; optSelected?: boolean; - scriptEval? (): boolean; + scriptEval?(): boolean; style?: boolean; submitBubbles?: boolean; tbody?: boolean; @@ -345,7 +345,7 @@ interface JQueryParam { */ interface JQueryEventConstructor { (name: string, eventProperties?: any): JQueryEventObject; - new (name: string, eventProperties?: any): JQueryEventObject; + new(name: string, eventProperties?: any): JQueryEventObject; } /** @@ -399,11 +399,11 @@ interface JQueryStatic { ajaxSettings: JQueryAjaxSettings; - /** - * Set default values for future Ajax requests. Its use is not recommended. - * - * @param options A set of key/value pairs that configure the default Ajax request. All options are optional. - */ + /** + * Set default values for future Ajax requests. Its use is not recommended. + * + * @param options A set of key/value pairs that configure the default Ajax request. All options are optional. + */ ajaxSetup(options: JQueryAjaxSettings): void; /** @@ -628,7 +628,7 @@ interface JQueryStatic { map(array: any, callback: (elementOfArray: any, indexInArray: any) => any): any; merge(first: T[], second: T[]): T[]; - merge(first: T[], second: U[]): any[]; + merge(first: T[], second: U[]): any[]; noop(): any; @@ -783,7 +783,7 @@ interface JQuery { * @param attributes An object of attribute-value pairs to set. */ attr(attributes: Object): JQuery; - + /** * Determine whether any of the matched elements are assigned the given class. * diff --git a/src/examples/defs/jqueryui.d.ts b/src/examples/defs/jqueryui.d.ts index ebf7458..541de5a 100644 --- a/src/examples/defs/jqueryui.d.ts +++ b/src/examples/defs/jqueryui.d.ts @@ -413,12 +413,12 @@ declare module JQueryUI { } interface SelectableEvents { - selected? (event: Event, ui: { selected?: Element; }): void; - selecting? (event: Event, ui: { selecting?: Element; }): void; - start? (event: Event, ui: any): void; - stop? (event: Event, ui: any): void; - unselected? (event: Event, ui: { unselected: Element; }): void; - unselecting? (event: Event, ui: { unselecting: Element; }): void; + selected?(event: Event, ui: { selected?: Element; }): void; + selecting?(event: Event, ui: { selecting?: Element; }): void; + start?(event: Event, ui: any): void; + stop?(event: Event, ui: any): void; + unselected?(event: Event, ui: { unselected: Element; }): void; + unselecting?(event: Event, ui: { unselecting: Element; }): void; } interface Selectable extends Widget, SelectableOptions, SelectableEvents { @@ -836,9 +836,9 @@ interface JQuery { datepicker(): JQuery; datepicker(methodName: 'destroy'): void; - datepicker(methodName: 'dialog', date?: Date, onSelect?: ( date : string, datepicker: any ) => void , pos?: any): void; - datepicker(methodName: 'dialog', date?: string, onSelect?: ( date : string, datepicker: any ) => void , pos?: any): void; - datepicker(methodName: 'dialog', date?: string, onSelect?: ( date : string, datepicker: any ) => void , options?: JQueryUI.DatepickerOptions, pos?: any): void; + datepicker(methodName: 'dialog', date?: Date, onSelect?: (date: string, datepicker: any) => void, pos?: any): void; + datepicker(methodName: 'dialog', date?: string, onSelect?: (date: string, datepicker: any) => void, pos?: any): void; + datepicker(methodName: 'dialog', date?: string, onSelect?: (date: string, datepicker: any) => void, options?: JQueryUI.DatepickerOptions, pos?: any): void; datepicker(methodName: 'getDate'): Date; datepicker(methodName: 'hide'): void; datepicker(methodName: 'isDisabled'): boolean; diff --git a/src/examples/plot/plot.ts b/src/examples/plot/plot.ts index 37c3624..04ede74 100644 --- a/src/examples/plot/plot.ts +++ b/src/examples/plot/plot.ts @@ -27,92 +27,99 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { newDrawable, Pane } from '../../webglimpse/core'; +import { rgb, black, green, yellow, cyan, magenta } from '../../webglimpse/color'; +import { newAxis2D, attachAxisMouseListeners2D, attachAxisMouseListeners1D } from '../../webglimpse/plot/axis'; +import { newBackgroundPainter, Side } from '../../webglimpse/misc'; +import { newBorderPainter } from '../../webglimpse/painter/border_painter'; +import { newEdgeAxisPainter } from '../../webglimpse/plot/edge_axis_painter'; +import { newPlotLayout } from '../../webglimpse/plot/plot_layout'; +import { jet, reverseBone } from '../../webglimpse/gradient'; +export function runPlotExample(container: Node) { - export function runPlotExample( container : Node ) { + // DOM Setup + // - // DOM Setup - // + var canvas = document.createElement('canvas'); + canvas.id = 'exampleCanvas'; + canvas.style.padding = '0'; + container.appendChild(canvas); - var canvas = document.createElement( 'canvas' ); - canvas.id = 'exampleCanvas'; - canvas.style.padding = '0'; - container.appendChild( canvas ); + var drawable = newDrawable(canvas); - var drawable = newDrawable( canvas ); + var updateCanvasSize = function () { + canvas.width = $(canvas).width(); + canvas.height = $(canvas).height(); + drawable.redraw(); + }; + $(window).resize(updateCanvasSize); + updateCanvasSize(); - var updateCanvasSize = function( ) { - canvas.width = $( canvas ).width( ); - canvas.height = $( canvas ).height( ); - drawable.redraw( ); - }; - $( window ).resize( updateCanvasSize ); - updateCanvasSize( ); + // Settings + // - // Settings - // + var bgColor = rgb(0.965, 0.957, 0.949); + var textColor = black; + var tickColor = black; - var bgColor = rgb( 0.965, 0.957, 0.949 ); - var textColor = black; - var tickColor = black; + var xyAxis = newAxis2D(-1, 7, -1000, 5000); + var xAxis = xyAxis.xAxis; + var yAxis = xyAxis.yAxis; - var xyAxis = newAxis2D( -1, 7, -1000, 5000 ); - var xAxis = xyAxis.xAxis; - var yAxis = xyAxis.yAxis; + xyAxis.onLimitsChanged(drawable.redraw); - xyAxis.onLimitsChanged( drawable.redraw ); + // Panes & Painters + // - // Panes & Painters - // + var centerPane = new Pane(null); + centerPane.addPainter(newBackgroundPainter(bgColor)); + centerPane.addPainter(newBorderPainter(tickColor)); + attachAxisMouseListeners2D(centerPane, xyAxis); - var centerPane = new Pane( null ); - centerPane.addPainter( newBackgroundPainter( bgColor ) ); - centerPane.addPainter( newBorderPainter( tickColor ) ); - attachAxisMouseListeners2D( centerPane, xyAxis ); + var topPane = new Pane(null); + topPane.addPainter(newBackgroundPainter(green)); + topPane.addPainter(newEdgeAxisPainter(xAxis, Side.TOP, { label: 'Top', textColor: textColor, tickColor: tickColor, tickSize: 12, gradientFill: jet, showBorder: true })); + attachAxisMouseListeners1D(topPane, xAxis, false); - var topPane = new Pane( null ); - topPane.addPainter( newBackgroundPainter( green ) ); - topPane.addPainter( newEdgeAxisPainter( xAxis, Side.TOP, { label: 'Top', textColor: textColor, tickColor: tickColor, tickSize : 12, gradientFill : jet, showBorder: true } ) ); - attachAxisMouseListeners1D( topPane, xAxis, false ); + var leftPane = new Pane(null); + leftPane.addPainter(newBackgroundPainter(yellow)); + leftPane.addPainter(newEdgeAxisPainter(yAxis, Side.LEFT, { label: 'Y', textColor: textColor, tickColor: tickColor, tickSize: 12, gradientFill: reverseBone, showBorder: true })); + attachAxisMouseListeners1D(leftPane, yAxis, true); - var leftPane = new Pane( null ); - leftPane.addPainter( newBackgroundPainter( yellow ) ); - leftPane.addPainter( newEdgeAxisPainter( yAxis, Side.LEFT, { label: 'Y', textColor: textColor, tickColor: tickColor, tickSize : 12, gradientFill : reverseBone, showBorder: true } ) ); - attachAxisMouseListeners1D( leftPane, yAxis, true ); + var bottomPane = new Pane(null); + bottomPane.addPainter(newBackgroundPainter(cyan)); + bottomPane.addPainter(newEdgeAxisPainter(xAxis, Side.BOTTOM, { label: 'X', textColor: textColor, tickColor: tickColor, tickSize: 12, gradientFill: reverseBone, showBorder: true })); + attachAxisMouseListeners1D(bottomPane, xAxis, false); - var bottomPane = new Pane( null ); - bottomPane.addPainter( newBackgroundPainter( cyan ) ); - bottomPane.addPainter( newEdgeAxisPainter( xAxis, Side.BOTTOM, { label: 'X', textColor: textColor, tickColor: tickColor, tickSize : 12, gradientFill : reverseBone, showBorder: true } ) ); - attachAxisMouseListeners1D( bottomPane, xAxis, false ); + var rightPane = new Pane(null); + rightPane.addPainter(newBackgroundPainter(magenta)); + rightPane.addPainter(newEdgeAxisPainter(yAxis, Side.RIGHT, { label: 'Right', textColor: textColor, tickColor: tickColor, tickSize: 12, gradientFill: jet, showBorder: true })); + attachAxisMouseListeners1D(rightPane, yAxis, true); - var rightPane = new Pane( null ); - rightPane.addPainter( newBackgroundPainter( magenta ) ); - rightPane.addPainter( newEdgeAxisPainter( yAxis, Side.RIGHT, { label: 'Right', textColor: textColor, tickColor: tickColor, tickSize : 12, gradientFill : jet, showBorder: true } ) ); - attachAxisMouseListeners1D( rightPane, yAxis, true ); + var plotPane = new Pane(newPlotLayout()); + plotPane.addPane(topPane, Side.TOP); + plotPane.addPane(leftPane, Side.LEFT); + plotPane.addPane(rightPane, Side.RIGHT); + plotPane.addPane(bottomPane, Side.BOTTOM); + plotPane.addPane(centerPane, null); - var plotPane = new Pane( newPlotLayout( ) ); - plotPane.addPane( topPane, Side.TOP ); - plotPane.addPane( leftPane, Side.LEFT ); - plotPane.addPane( rightPane, Side.RIGHT ); - plotPane.addPane( bottomPane, Side.BOTTOM ); - plotPane.addPane( centerPane, null ); + // Show + // - // Show - // + drawable.setContentPane(plotPane); + drawable.redraw(); - drawable.setContentPane( plotPane ); - drawable.redraw( ); - - } +} diff --git a/src/examples/scroll/scroll.ts b/src/examples/scroll/scroll.ts index f689fc2..176631c 100644 --- a/src/examples/scroll/scroll.ts +++ b/src/examples/scroll/scroll.ts @@ -1,3 +1,12 @@ +import { createTextTextureFactory } from '../../webglimpse/text'; +import { newDrawable, Pane } from '../../webglimpse/core'; +import { newRowLayout } from '../../webglimpse/layout/row_layout'; +import { newVerticalScrollLayout, newVerticalScrollbar } from '../../webglimpse/scroll'; +import { newBackgroundPainter, fixedSize, newTexturePainter } from '../../webglimpse/misc'; +import { newInsetPane, newInsets } from '../../webglimpse/layout/inset_layout'; +import { white, black, green, blue, cyan } from '../../webglimpse/color'; +import { newColumnLayout } from '../../webglimpse/layout/column_layout'; + /* * Copyright (c) 2014, Metron, Inc. * All rights reserved. @@ -30,79 +39,79 @@ - export function runScrollExample( container : Node ) { +export function runScrollExample(container: Node) { - // DOM Setup - // + // DOM Setup + // - var canvas = document.createElement( 'canvas' ); - canvas.id = 'exampleCanvas'; - canvas.style.padding = '0'; - container.appendChild( canvas ); + var canvas = document.createElement('canvas'); + canvas.id = 'exampleCanvas'; + canvas.style.padding = '0'; + container.appendChild(canvas); - var drawable = newDrawable( canvas ); + var drawable = newDrawable(canvas); - var updateCanvasSize = function( ) { - canvas.width = $( canvas ).width( ); - canvas.height = $( canvas ).height( ); - drawable.redraw( ); - }; - $( window ).resize( updateCanvasSize ); - updateCanvasSize( ); + var updateCanvasSize = function () { + canvas.width = $(canvas).width(); + canvas.height = $(canvas).height(); + drawable.redraw(); + }; + $(window).resize(updateCanvasSize); + updateCanvasSize(); - // Scroll-pane Setup - // + // Scroll-pane Setup + // - var rowsPane = new Pane( newRowLayout( ) ); + var rowsPane = new Pane(newRowLayout()); - var scrollLayout = newVerticalScrollLayout( ); - var scrollable = new Pane( scrollLayout, false ); - scrollable.addPainter( newBackgroundPainter( white ) ); - scrollable.addPane( newInsetPane( rowsPane, newInsets( 12, 10 ), white ), 0 ); + var scrollLayout = newVerticalScrollLayout(); + var scrollable = new Pane(scrollLayout, false); + scrollable.addPainter(newBackgroundPainter(white)); + scrollable.addPane(newInsetPane(rowsPane, newInsets(12, 10), white), 0); - var scrollbar = newVerticalScrollbar( scrollLayout, drawable ); + var scrollbar = newVerticalScrollbar(scrollLayout, drawable); - var scrollPane = new Pane( newColumnLayout( false ), false ); - scrollPane.addPane( scrollbar, 0, { width: 16 } ); - scrollPane.addPane( scrollable, 1 ); + var scrollPane = new Pane(newColumnLayout(false), false); + scrollPane.addPane(scrollbar, 0, { width: 16 }); + scrollPane.addPane(scrollable, 1); - drawable.setContentPane( scrollPane ); - drawable.redraw( ); + drawable.setContentPane(scrollPane); + drawable.redraw(); - // Example Content - // + // Example Content + // - var numRows = 500; - var rowBgColors = [ black, green, blue, cyan ]; - var rowFgColors = [ white, black, white, black ]; + var numRows = 500; + var rowBgColors = [black, green, blue, cyan]; + var rowFgColors = [white, black, white, black]; - var createTextTexture = createTextTextureFactory( '20px verdana,sans-serif' ); - for ( var r = 0; r < numRows; r++ ) { - var row = new Pane( { updatePrefSize: fixedSize( null, 50 ) } ); - row.addPainter( newBackgroundPainter( rowBgColors[ r % rowBgColors.length ] ) ); + var createTextTexture = createTextTextureFactory('20px verdana,sans-serif'); + for (var r = 0; r < numRows; r++) { + var row = new Pane({ updatePrefSize: fixedSize(null, 50) }); + row.addPainter(newBackgroundPainter(rowBgColors[r % rowBgColors.length])); - var text = r.toFixed( 0 ); - if ( r === 0 ) text += ' first'; - if ( r === numRows-1 ) text += ' last'; + var text = r.toFixed(0); + if (r === 0) text += ' first'; + if (r === numRows - 1) text += ' last'; - var labelTexture = createTextTexture( rowFgColors[ r % rowFgColors.length ], text ); - row.addPainter( newTexturePainter( labelTexture, 0, 0.5, { xAnchor: 0, yAnchor: labelTexture.yAnchor( 0.5 ) } ) ); + var labelTexture = createTextTexture(rowFgColors[r % rowFgColors.length], text); + row.addPainter(newTexturePainter(labelTexture, 0, 0.5, { xAnchor: 0, yAnchor: labelTexture.yAnchor(0.5) })); - setTimeout( ( function( row : Pane, r : number ) { - return function( ) { - rowsPane.addPane( row, r ); - drawable.redraw( ); - }; - } )( row, r ), 10*r ); - } + setTimeout((function (row: Pane, r: number) { + return function () { + rowsPane.addPane(row, r); + drawable.redraw(); + }; + })(row, r), 10 * r); + } - } +} diff --git a/src/examples/timeline/timeline.ts b/src/examples/timeline/timeline.ts index f0ab68b..ef22b99 100644 --- a/src/examples/timeline/timeline.ts +++ b/src/examples/timeline/timeline.ts @@ -27,658 +27,675 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { newDrawable, Pane, PointerEvent, Drawable } from '../../webglimpse/core'; +import { TimeAxis1D } from '../../webglimpse/timeline/time_axis'; +import { TimelinePaneOptions, newTimelinePane, TimelinePane } from '../../webglimpse/timeline/timeline_pane'; +import { white, rgb, gray, rgba } from '../../webglimpse/color'; +import { rowPaneFactoryChooser_THIN } from '../../webglimpse/timeline/timeline_styles'; +import { TimelineModel, TimelineRowModel, TimelineTimeseriesFragmentModel, TimelineEventModel, TimelineGroupModel, Timeline, timelineMergeNewBeforeOld } from '../../webglimpse/timeline/timeline_model'; +import { TimelineUi, TimelineRowUi } from '../../webglimpse/timeline/timeline_ui'; +import { newCornerLayout } from '../../webglimpse/layout/corner_layout'; +import { Side, fixedSize, newBlendingBackgroundPainter } from '../../webglimpse/misc'; +import { newInsetPane, newInsets } from '../../webglimpse/layout/inset_layout'; +import { TimelineEventStyle, TimelineEventStyleUi } from '../../webglimpse/timeline/timeline_event_style'; +import { TimelineAnnotationStyle, TimelineAnnotationStyleUi } from '../../webglimpse/timeline/timeline_annotation_style'; +import { hoursToMillis } from '../../webglimpse/time'; +import { Axis1D, Axis2D, attachAxisMouseListeners1D } from '../../webglimpse/plot/axis'; +import { TimelineRowPaneOptions } from '../../webglimpse/timeline/timeline_row'; +import { reverseBone, jet, getGradientTexture } from '../../webglimpse/gradient'; +import { newColumnLayout } from '../../webglimpse/layout/column_layout'; +import { newHeatmapPainter } from '../../webglimpse/plot/heatmap_painter'; +import { newEdgeAxisPainter } from '../../webglimpse/plot/edge_axis_painter'; +import { isNumber, hasval, parseTime_PMILLIS } from '../../webglimpse/util/util'; + + +interface ExampleTooltip { + show(html: string, i: number, j: number); + move(i: number, j: number); + hide(); +} + + +function newExampleTooltip(): ExampleTooltip { + var div = document.createElement('div'); + div.classList.add('exampleTooltip'); + div.style.position = 'absolute'; + div.style.zIndex = '1'; + div.style.visibility = 'hidden'; + document.body.appendChild(div); + + return { + show: function (html: string, i: number, j: number) { + div.innerHTML = html; + div.style.left = (i) + 'px'; + div.style.bottom = (j - div.clientHeight) + 'px'; + div.style.visibility = 'visible'; + }, + move: function (i: number, j: number) { + div.style.left = (i) + 'px'; + div.style.bottom = (j - div.clientHeight) + 'px'; + }, + hide: function () { + div.style.visibility = 'hidden'; + } + }; +} + + +export function runTimelineExample(container: Node) { + + + // DOM Setup + // + + var canvas = document.createElement('canvas'); + canvas.id = 'exampleCanvas'; + canvas.style.padding = '0'; + container.appendChild(canvas); + + var drawable = newDrawable(canvas); + + var updateCanvasSize = function () { + // Make the canvas extend to the bottom of the browser viewport + // (can't just set CSS height to 100%, because of the toolbar) + $(canvas).height($(window).height() - canvas.getBoundingClientRect().top); + + canvas.width = $(canvas).width(); + canvas.height = $(canvas).height(); + drawable.redraw(); + }; + $(window).resize(updateCanvasSize); + updateCanvasSize(); + + // Timeline Setup + // + + var timeAxis = new TimeAxis1D(parseTime_PMILLIS('2014-01-01T00:00:00Z'), parseTime_PMILLIS('2014-01-01T12:00:00Z')); + timeAxis.limitsChanged.on(drawable.redraw); + + var timelineOptions: TimelinePaneOptions = { + + selectedIntervalMode: 'single', + topTimeZone: '-0500', + fgColor: white, + rowLabelColor: white, + groupLabelColor: white, + axisLabelColor: white, + bgColor: rgb(0.098, 0.165, 0.243), + rowBgColor: rgb(0.020, 0.086, 0.165), + rowAltBgColor: rgb(0.020, 0.086, 0.165), + gridColor: gray(0.5), + selectedIntervalFillColor: rgba(0, 0.6, 0.8, 0.157), + selectedIntervalBorderColor: rgb(0, 0.2, 1.0), + allowEventMultiSelection: true, + rowPaneFactoryChooser: rowPaneFactoryChooser_THIN + + }; + var model = new TimelineModel(); + var ui = new TimelineUi(model, { allowEventMultiSelection: true }); + var timelinePane = newTimelinePane(drawable, timeAxis, model, timelineOptions, ui); + var selection = ui.selection; + selection.selectedInterval.setInterval(parseTime_PMILLIS('2014-01-01T08:30:00Z'), parseTime_PMILLIS('2014-01-01T08:50:00Z')); + + var contentPane = new Pane(newCornerLayout(Side.LEFT, Side.TOP)); + contentPane.addPane(timelinePane); + drawable.setContentPane(newInsetPane(contentPane, newInsets(12, 10, 2), timelineOptions.bgColor)); + drawable.redraw(); + + // Load UI styles + // + + $.getJSON('timelineUi.json', function (uiStyles: { eventStyles: TimelineEventStyle[]; annotationStyles: TimelineAnnotationStyle[] }) { + uiStyles.eventStyles.forEach(function (s) { + ui.eventStyles.add(new TimelineEventStyleUi(s)); + }); + uiStyles.annotationStyles.forEach(function (s) { + ui.annotationStyles.add(new TimelineAnnotationStyleUi(s)); + }); + }); - interface ExampleTooltip { - show( html : string, i : number, j : number ); - move( i : number, j : number ); - hide( ); - } - - - function newExampleTooltip( ) : ExampleTooltip { - var div = document.createElement( 'div' ); - div.classList.add( 'exampleTooltip' ); - div.style.position = 'absolute'; - div.style.zIndex = '1'; - div.style.visibility = 'hidden'; - document.body.appendChild( div ); - - return { - show: function( html : string, i : number, j : number ) { - div.innerHTML = html; - div.style.left = ( i ) + 'px'; - div.style.bottom = ( j - div.clientHeight ) + 'px'; - div.style.visibility = 'visible'; - }, - move: function( i : number, j : number ) { - div.style.left = ( i ) + 'px'; - div.style.bottom = ( j - div.clientHeight ) + 'px'; - }, - hide: function( ) { - div.style.visibility = 'hidden'; - } - }; - } - - - export function runTimelineExample( container : Node ) { - - - // DOM Setup - // - - var canvas = document.createElement( 'canvas' ); - canvas.id = 'exampleCanvas'; - canvas.style.padding = '0'; - container.appendChild( canvas ); - - var drawable = newDrawable( canvas ); - - var updateCanvasSize = function( ) { - // Make the canvas extend to the bottom of the browser viewport - // (can't just set CSS height to 100%, because of the toolbar) - $( canvas ).height( $( window ).height( ) - canvas.getBoundingClientRect( ).top ); + // Example Toolbar Actions + // - canvas.width = $( canvas ).width( ); - canvas.height = $( canvas ).height( ); - drawable.redraw( ); - }; - $( window ).resize( updateCanvasSize ); - updateCanvasSize( ); - - // Timeline Setup - // - - var timeAxis = new TimeAxis1D( parseTime_PMILLIS( '2014-01-01T00:00:00Z' ), parseTime_PMILLIS( '2014-01-01T12:00:00Z' ) ); - timeAxis.limitsChanged.on( drawable.redraw ); - - var timelineOptions : TimelinePaneOptions = { - - selectedIntervalMode: 'single', - topTimeZone: '-0500', - fgColor: white, - rowLabelColor: white, - groupLabelColor: white, - axisLabelColor: white, - bgColor: rgb( 0.098, 0.165, 0.243 ), - rowBgColor: rgb( 0.020, 0.086, 0.165 ), - rowAltBgColor: rgb( 0.020, 0.086, 0.165 ), - gridColor: gray( 0.5 ), - selectedIntervalFillColor: rgba( 0, 0.6, 0.8, 0.157 ), - selectedIntervalBorderColor: rgb( 0, 0.2, 1.0 ), - allowEventMultiSelection: true, - rowPaneFactoryChooser: rowPaneFactoryChooser_THIN + // step in 1 hour increments + var timeStep = hoursToMillis(1); + var selectedInterval = selection.selectedInterval; - }; - var model = new TimelineModel( ); - var ui = new TimelineUi( model, { allowEventMultiSelection : true } ); - var timelinePane = newTimelinePane( drawable, timeAxis, model, timelineOptions, ui ); - var selection = ui.selection; - selection.selectedInterval.setInterval( parseTime_PMILLIS( '2014-01-01T08:30:00Z' ), parseTime_PMILLIS( '2014-01-01T08:50:00Z' ) ); - - var contentPane = new Pane( newCornerLayout( Side.LEFT, Side.TOP ) ); - contentPane.addPane( timelinePane ); - drawable.setContentPane( newInsetPane( contentPane, newInsets( 12, 10, 2 ), timelineOptions.bgColor ) ); - drawable.redraw( ); - - // Load UI styles - // - - $.getJSON( 'timelineUi.json', function( uiStyles : { eventStyles : TimelineEventStyle[]; annotationStyles : TimelineAnnotationStyle[] } ) { - uiStyles.eventStyles.forEach( function( s ) { - ui.eventStyles.add( new TimelineEventStyleUi( s ) ); - } ); - uiStyles.annotationStyles.forEach( function( s ) { - ui.annotationStyles.add( new TimelineAnnotationStyleUi( s ) ); - } ); - } ); - - - - // Example Toolbar Actions - // - - // step in 1 hour increments - var timeStep = hoursToMillis( 1 ); - var selectedInterval = selection.selectedInterval; - - var a = document.getElementById( 'selected-time-step-backward' ); - a.onclick = function( ) { - selectedInterval.pan( -timeStep ); - // if the time selection scrolls off the screen, jump the axis to keep it visible - if ( selectedInterval.start_PMILLIS < timeAxis.tMin_PMILLIS ) { - var tSize_MILLIS = timeAxis.tSize_MILLIS; - timeAxis.tMin_PMILLIS = selectedInterval.start_PMILLIS; - timeAxis.tMax_PMILLIS = timeAxis.tMin_PMILLIS + tSize_MILLIS; - } - drawable.redraw( ); - }; + var a = document.getElementById('selected-time-step-backward'); + a.onclick = function () { + selectedInterval.pan(-timeStep); + // if the time selection scrolls off the screen, jump the axis to keep it visible + if (selectedInterval.start_PMILLIS < timeAxis.tMin_PMILLIS) { + var tSize_MILLIS = timeAxis.tSize_MILLIS; + timeAxis.tMin_PMILLIS = selectedInterval.start_PMILLIS; + timeAxis.tMax_PMILLIS = timeAxis.tMin_PMILLIS + tSize_MILLIS; + } + drawable.redraw(); + }; + + var a = document.getElementById('selected-time-step-forward'); + a.onclick = function () { + selectedInterval.pan(timeStep); + // if the time selection scrolls off the screen, jump the axis to keep it visible + if (selectedInterval.end_PMILLIS > timeAxis.tMax_PMILLIS) { + var tSize_MILLIS = timeAxis.tSize_MILLIS; + timeAxis.tMax_PMILLIS = selectedInterval.end_PMILLIS; + timeAxis.tMin_PMILLIS = timeAxis.tMax_PMILLIS - tSize_MILLIS; + } + drawable.redraw(); + }; - var a = document.getElementById( 'selected-time-step-forward' ); - a.onclick = function( ) { - selectedInterval.pan( timeStep ); - // if the time selection scrolls off the screen, jump the axis to keep it visible - if ( selectedInterval.end_PMILLIS > timeAxis.tMax_PMILLIS ) { - var tSize_MILLIS = timeAxis.tSize_MILLIS; - timeAxis.tMax_PMILLIS = selectedInterval.end_PMILLIS; - timeAxis.tMin_PMILLIS = timeAxis.tMax_PMILLIS - tSize_MILLIS; - } - drawable.redraw( ); - }; + var a = document.getElementById('selected-time-decrease'); + a.onclick = function () { + var newDuration_MILLIS = Math.max(selectedInterval.duration_MILLIS - timeStep, timeStep); + selectedInterval.start_PMILLIS = selectedInterval.end_PMILLIS - newDuration_MILLIS; + drawable.redraw(); + }; - var a = document.getElementById( 'selected-time-decrease' ); - a.onclick = function( ) { - var newDuration_MILLIS = Math.max( selectedInterval.duration_MILLIS - timeStep, timeStep ); - selectedInterval.start_PMILLIS = selectedInterval.end_PMILLIS - newDuration_MILLIS; - drawable.redraw( ); - }; + var a = document.getElementById('selected-time-increase'); + a.onclick = function () { + var newDuration_MILLIS = Math.max(selectedInterval.duration_MILLIS + timeStep, timeStep); + selectedInterval.start_PMILLIS = selectedInterval.end_PMILLIS - newDuration_MILLIS; + drawable.redraw(); + }; - var a = document.getElementById( 'selected-time-increase' ); - a.onclick = function( ) { - var newDuration_MILLIS = Math.max( selectedInterval.duration_MILLIS + timeStep, timeStep ); - selectedInterval.start_PMILLIS = selectedInterval.end_PMILLIS - newDuration_MILLIS; - drawable.redraw( ); - }; + var a = document.getElementById('selected-time-calendar'); + a.onclick = function () { - var a = document.getElementById( 'selected-time-calendar' ); - a.onclick = function() { + var dateFormat = 'M/D/YYYY'; + var id = 'calendar1'; - var dateFormat = 'M/D/YYYY'; - var id = 'calendar1'; + var calendardiv = document.getElementById(id); + if (!calendardiv) { + calendardiv = document.createElement('div'); - var calendardiv = document.getElementById(id); - if ( !calendardiv ) { - calendardiv = document.createElement( 'div' ); + calendardiv.style.fontSize = '12'; - calendardiv.style.fontSize = '12'; + var rect = a.getBoundingClientRect(); + var position: number[] = [rect.left, rect.bottom - 4]; - var rect = a.getBoundingClientRect(); - var position: number[] = [rect.left, rect.bottom - 4]; + var options = {}; + var callback = function (date, picker) { + var newTime = moment(date, dateFormat).valueOf(); - var options = {}; - var callback = function(date, picker) { - var newTime = moment(date, dateFormat).valueOf(); + var selectionDiff = selectedInterval.end_PMILLIS - selectedInterval.start_PMILLIS; + var axisDiff = timeAxis.tMax_PMILLIS - timeAxis.tMin_PMILLIS; - var selectionDiff = selectedInterval.end_PMILLIS - selectedInterval.start_PMILLIS; - var axisDiff = timeAxis.tMax_PMILLIS - timeAxis.tMin_PMILLIS; + // jump the selected and axis times + selectedInterval.start_PMILLIS = newTime - selectionDiff; + selectedInterval.end_PMILLIS = newTime; - // jump the selected and axis times - selectedInterval.start_PMILLIS = newTime - selectionDiff; - selectedInterval.end_PMILLIS = newTime; + timeAxis.tMin_PMILLIS = newTime - axisDiff; + timeAxis.tMax_PMILLIS = newTime; - timeAxis.tMin_PMILLIS = newTime - axisDiff; - timeAxis.tMax_PMILLIS = newTime; + drawable.redraw(); + } - drawable.redraw( ); - } + var date = moment(selectedInterval.start_PMILLIS).format(dateFormat); - var date = moment( selectedInterval.start_PMILLIS ).format( dateFormat ); + $(calendardiv).datepicker('dialog', date, callback, options, position); + } + }; - $( calendardiv ).datepicker( 'dialog', date, callback, options, position ); - } - }; + // Link a button to maximize / unmaximize two specific rows - // Link a button to maximize / unmaximize two specific rows + var a = document.getElementById('maximize-button'); + a.onclick = function () { + if (model.root.maximizedRowGuids.hasValue('metsci.timelineExample.row03a')) { + model.root.maximizedRowGuids.removeValue('metsci.timelineExample.row03a'); + } + else { + model.root.maximizedRowGuids.add('metsci.timelineExample.row03a'); + } - var a = document.getElementById( 'maximize-button' ); - a.onclick = function() { - if ( model.root.maximizedRowGuids.hasValue( 'metsci.timelineExample.row03a' ) ) { - model.root.maximizedRowGuids.removeValue( 'metsci.timelineExample.row03a' ); + if (model.root.maximizedRowGuids.hasValue('metsci.timelineExample.dynamicRow02')) { + model.root.maximizedRowGuids.removeValue('metsci.timelineExample.dynamicRow02'); + } + else { + model.root.maximizedRowGuids.add('metsci.timelineExample.dynamicRow02'); + } + }; + + // Toggle row maximize by double clicking on row label + + //add listener for new TimelineRowUi + ui.rowUis.valueAdded.on(function (rowUi: TimelineRowUi) { + // add listener for new Panes + rowUi.panes.valueAdded.on(function (pane: Pane, index: number) { + var id = rowUi.panes.idAt(index); + // test if the new Pane is a maximized row label pane + if (id === 'maximized-label') { + // add a mouse listener to the maximized row label Pane + pane.mouseDown.on(function (event: PointerEvent) { + if (event.clickCount === 2) { + // minimize the double clicked row + model.root.maximizedRowGuids.removeValue(rowUi.rowGuid); + } + }); } - else { - model.root.maximizedRowGuids.add( 'metsci.timelineExample.row03a' ); + // test if the new Pane is a label pane (id ends with '-label') + else if (id.search('-label$') !== -1) { + // add a mouse listener to the row label Pane + pane.mouseDown.on(function (event: PointerEvent) { + if (event.clickCount === 2) { + // maximize the double clicked row + model.root.maximizedRowGuids.add(rowUi.rowGuid); + } + }); } + }); + }); - if ( model.root.maximizedRowGuids.hasValue( 'metsci.timelineExample.dynamicRow02' ) ) { - model.root.maximizedRowGuids.removeValue( 'metsci.timelineExample.dynamicRow02' ); - } - else { - model.root.maximizedRowGuids.add( 'metsci.timelineExample.dynamicRow02' ); - } - }; + // Link a button to pin / unpin some rows to the top/bottom of the timeline - // Toggle row maximize by double clicking on row label - - //add listener for new TimelineRowUi - ui.rowUis.valueAdded.on( function ( rowUi : TimelineRowUi ) { - // add listener for new Panes - rowUi.panes.valueAdded.on( function ( pane : Pane, index : number ) { - var id = rowUi.panes.idAt( index ); - // test if the new Pane is a maximized row label pane - if ( id === 'maximized-label' ) { - // add a mouse listener to the maximized row label Pane - pane.mouseDown.on( function( event : PointerEvent ) { - if ( event.clickCount === 2 ) { - // minimize the double clicked row - model.root.maximizedRowGuids.removeValue( rowUi.rowGuid ); - } - } ); - } - // test if the new Pane is a label pane (id ends with '-label') - else if ( id.search( '-label$' ) !== -1 ) { - // add a mouse listener to the row label Pane - pane.mouseDown.on( function( event : PointerEvent ) { - if ( event.clickCount === 2 ) { - // maximize the double clicked row - model.root.maximizedRowGuids.add( rowUi.rowGuid ); - } - } ); - } - } ); - } ); - - // Link a button to pin / unpin some rows to the top/bottom of the timeline - - var a = document.getElementById( 'pin-button' ); - a.onclick = function() { - if ( model.root.topPinnedRowGuids.hasValue( 'metsci.timelineExample.row01a' ) ) { - model.root.topPinnedRowGuids.removeValue( 'metsci.timelineExample.row01a' ); - } - else { - model.root.topPinnedRowGuids.add( 'metsci.timelineExample.row01a' ); - } + var a = document.getElementById('pin-button'); + a.onclick = function () { + if (model.root.topPinnedRowGuids.hasValue('metsci.timelineExample.row01a')) { + model.root.topPinnedRowGuids.removeValue('metsci.timelineExample.row01a'); + } + else { + model.root.topPinnedRowGuids.add('metsci.timelineExample.row01a'); + } - if ( model.root.topPinnedRowGuids.hasValue( 'metsci.timelineExample.row01b' ) ) { - model.root.topPinnedRowGuids.removeValue( 'metsci.timelineExample.row01b' ); - } - else { - model.root.topPinnedRowGuids.add( 'metsci.timelineExample.row01b' ); - } + if (model.root.topPinnedRowGuids.hasValue('metsci.timelineExample.row01b')) { + model.root.topPinnedRowGuids.removeValue('metsci.timelineExample.row01b'); + } + else { + model.root.topPinnedRowGuids.add('metsci.timelineExample.row01b'); + } - if ( model.root.bottomPinnedRowGuids.hasValue( 'metsci.timelineExample.row03a' ) ) { - model.root.bottomPinnedRowGuids.removeValue( 'metsci.timelineExample.row03a' ); - } - else { - model.root.bottomPinnedRowGuids.add( 'metsci.timelineExample.row03a' ); - } - }; + if (model.root.bottomPinnedRowGuids.hasValue('metsci.timelineExample.row03a')) { + model.root.bottomPinnedRowGuids.removeValue('metsci.timelineExample.row03a'); + } + else { + model.root.bottomPinnedRowGuids.add('metsci.timelineExample.row03a'); + } + }; - // Link a button change the size of a particular row + // Link a button change the size of a particular row - var customRowHeight = 135; - var a = document.getElementById( 'flag-button' ); - a.onclick = function() { - customRowHeight = customRowHeight + 10; - if ( customRowHeight > 200 ) customRowHeight = 135; + var customRowHeight = 135; + var a = document.getElementById('flag-button'); + a.onclick = function () { + customRowHeight = customRowHeight + 10; + if (customRowHeight > 200) customRowHeight = 135; - model.row( 'metsci.timelineExample.row03a' ).rowHeight = customRowHeight; + model.row('metsci.timelineExample.row03a').rowHeight = customRowHeight; - // make sure no-one references the event - model.rows.forEach( function( row : TimelineRowModel ) { - row.eventGuids.removeValue( 'metsci.timelineExample.event01' ); - } ); + // make sure no-one references the event + model.rows.forEach(function (row: TimelineRowModel) { + row.eventGuids.removeValue('metsci.timelineExample.event01'); + }); - // remove the event - model.events.removeId( 'metsci.timelineExample.event01' ); + // remove the event + model.events.removeId('metsci.timelineExample.event01'); - drawable.redraw( ); - }; + drawable.redraw(); + }; - // Example Event-Hover Overlay - // - // Shows overlay div, containing arbitrary html content, when an event is hovered - // - - var tooltip = newExampleTooltip( ); - var iTooltipOffset = +12; - var jTooltipOffset = -12; - - selection.hoveredEvent.changed.on( function( ) { - var hoveredEvent = selection.hoveredEvent.value; - if ( hoveredEvent ) { - var iMouse = selection.mousePos.x; - var jMouse = selection.mousePos.y; - if ( isNumber( iMouse ) && isNumber( jMouse ) ) { - - // Generate application-specific html content, based on which event is hovered - var html = hoveredEvent.label; - - tooltip.show( html, iMouse+iTooltipOffset, jMouse+jTooltipOffset ); - } - else { - tooltip.hide( ); - } - } - else { - tooltip.hide( ); - } - } ); + // Example Event-Hover Overlay + // + // Shows overlay div, containing arbitrary html content, when an event is hovered + // + + var tooltip = newExampleTooltip(); + var iTooltipOffset = +12; + var jTooltipOffset = -12; - selection.mousePos.changed.on( function( ) { + selection.hoveredEvent.changed.on(function () { + var hoveredEvent = selection.hoveredEvent.value; + if (hoveredEvent) { var iMouse = selection.mousePos.x; var jMouse = selection.mousePos.y; - if ( isNumber( iMouse ) && isNumber( jMouse ) ) { - tooltip.move( iMouse+iTooltipOffset, jMouse+jTooltipOffset ); + if (isNumber(iMouse) && isNumber(jMouse)) { + + // Generate application-specific html content, based on which event is hovered + var html = hoveredEvent.label; + + tooltip.show(html, iMouse + iTooltipOffset, jMouse + jTooltipOffset); } else { - tooltip.hide( ); + tooltip.hide(); } - } ); + } + else { + tooltip.hide(); + } + }); - // Example Timeseries-Hover Overlay - // - // Shows overlay div, containing arbitrary html content, when a timeseries point is hovered - // + selection.mousePos.changed.on(function () { + var iMouse = selection.mousePos.x; + var jMouse = selection.mousePos.y; + if (isNumber(iMouse) && isNumber(jMouse)) { + tooltip.move(iMouse + iTooltipOffset, jMouse + jTooltipOffset); + } + else { + tooltip.hide(); + } + }); - var hoveredFragment : TimelineTimeseriesFragmentModel; + // Example Timeseries-Hover Overlay + // + // Shows overlay div, containing arbitrary html content, when a timeseries point is hovered + // - var updateTimeseriesTooltip = function( ) { + var hoveredFragment: TimelineTimeseriesFragmentModel; - // unattach any old data change listener - if ( hasval( hoveredFragment ) ) { - hoveredFragment.dataChanged.off( updateTimeseriesTooltip ); - } + var updateTimeseriesTooltip = function () { + + // unattach any old data change listener + if (hasval(hoveredFragment)) { + hoveredFragment.dataChanged.off(updateTimeseriesTooltip); + } - hoveredFragment = selection.hoveredTimeseries.fragment; + hoveredFragment = selection.hoveredTimeseries.fragment; - if ( hasval( hoveredFragment ) ) { + if (hasval(hoveredFragment)) { - // attach listener to newly selected fragment to update toolip when fragment data changes - hoveredFragment.dataChanged.on( updateTimeseriesTooltip ); + // attach listener to newly selected fragment to update toolip when fragment data changes + hoveredFragment.dataChanged.on(updateTimeseriesTooltip); - var iMouse = selection.mousePos.x; - var jMouse = selection.mousePos.y; - if ( isNumber( iMouse ) && isNumber( jMouse ) ) { + var iMouse = selection.mousePos.x; + var jMouse = selection.mousePos.y; + if (isNumber(iMouse) && isNumber(jMouse)) { - // Generate application-specific html content, based on which event is hovered - var html = '' + selection.hoveredTimeseries.data.toFixed(2); + // Generate application-specific html content, based on which event is hovered + var html = '' + selection.hoveredTimeseries.data.toFixed(2); - tooltip.show( html, iMouse+iTooltipOffset, jMouse+jTooltipOffset ); - } - else { - tooltip.hide( ); - } + tooltip.show(html, iMouse + iTooltipOffset, jMouse + jTooltipOffset); } else { - tooltip.hide( ); + tooltip.hide(); } - }; - - selection.hoveredTimeseries.changed.on( updateTimeseriesTooltip ); - + } + else { + tooltip.hide(); + } + }; - // Example Input Listeners - // - // Fill these in with application-specific input-handling code - // + selection.hoveredTimeseries.changed.on(updateTimeseriesTooltip); - selection.hoveredAnnotation.changed.on( function( ) { - if ( hasval( selection.hoveredAnnotation.value ) ) - { - // Do something with the hovered annotation - } - }); - selection.hoveredTimeseries.changed.on( function( ) { - if ( hasval( selection.hoveredTimeseries.fragment ) ) - { - // Do something with the time and data value of the selected timeseries point - var dataValue = selection.hoveredTimeseries.data; - var time_PMILLIS = selection.hoveredTimeseries.times_PMILLIS; - } - } ); - - selection.mousePos.changed.on( function( ) { - // Handle mouse position - var iMouse = selection.mousePos.x; // null if the mouse is outside the timeline - var jMouse = selection.mousePos.y; // null if the mouse is outside the timeline - } ); - - selection.hoveredTime_PMILLIS.changed.on( function( ) { - // Handle hovered time - var hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; - } ); - - selection.selectedInterval.changed.on( function( ) { - // Handle selected time interval - var selectionStart_PMILLIS = selection.selectedInterval.start_PMILLIS; - var selectionEnd_PMILLIS = selection.selectedInterval.end_PMILLIS; - } ); - - selection.hoveredRow.changed.on( function( ) { - // Handle row hovered - var hoveredRow = selection.hoveredRow.value; - } ); - - selection.hoveredEvent.changed.on( function( ) { - // Handle event hovered - var hoveredEvent = selection.hoveredEvent.value; - } ); - - selection.selectedEvents.valueAdded.on( function( event : TimelineEventModel ) { - // Handle event selected - } ); - - selection.selectedEvents.valueRemoved.on( function( event : TimelineEventModel ) { - // Handle event de-selected - } ); - - - // Example Dynamic Data - // - // Populate the timeline model with a dynamically generated group, row, and custom painters - // - - var group4 = { - groupGuid: 'metsci.timelineExample.group04', - label: 'Group #4', - rowGuids: [] - }; - model.groups.add( new TimelineGroupModel( group4 ) ); - model.root.groupGuids.add( group4.groupGuid ); + // Example Input Listeners + // + // Fill these in with application-specific input-handling code + // - var row = { - rowGuid: 'metsci.timelineExample.dynamicRow01', - label: 'Broadband', - eventGuids: [] - }; - model.rows.add( new TimelineRowModel( row ) ); - model.group( group4.groupGuid ).rowGuids.add( row.rowGuid ); + selection.hoveredAnnotation.changed.on(function () { + if (hasval(selection.hoveredAnnotation.value)) { + // Do something with the hovered annotation + } + }); - var row = { - rowGuid: 'metsci.timelineExample.dynamicRow02', - label: 'Heatmap', - eventGuids: [] - }; - model.rows.add( new TimelineRowModel( row ) ); - model.group( group4.groupGuid ).rowGuids.add( row.rowGuid ); - - // create an empty timeseries fragment and listen for changes to its data - // the fragment will be filled later with data loaded from timeline.json - - var fragment3 = new TimelineTimeseriesFragmentModel( { fragmentGuid: 'metsci.timelineExample.fragment03' } ); - model.timeseriesFragments.add( fragment3 ); - - // print the new data value when fragment3 changes - // also, ensure that fragment1 data values never exceed 20 - fragment3.dataChanged.on( function( startIndex : number, endIndex : number ) { - for ( var i = startIndex ; i < endIndex ; i++ ) { - if ( fragment3.data[i] > 20 ) { - fragment3.setData( i, 20 ); - } + selection.hoveredTimeseries.changed.on(function () { + if (hasval(selection.hoveredTimeseries.fragment)) { + // Do something with the time and data value of the selected timeseries point + var dataValue = selection.hoveredTimeseries.data; + var time_PMILLIS = selection.hoveredTimeseries.times_PMILLIS; + } + }); + + selection.mousePos.changed.on(function () { + // Handle mouse position + var iMouse = selection.mousePos.x; // null if the mouse is outside the timeline + var jMouse = selection.mousePos.y; // null if the mouse is outside the timeline + }); + + selection.hoveredTime_PMILLIS.changed.on(function () { + // Handle hovered time + var hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; + }); + + selection.selectedInterval.changed.on(function () { + // Handle selected time interval + var selectionStart_PMILLIS = selection.selectedInterval.start_PMILLIS; + var selectionEnd_PMILLIS = selection.selectedInterval.end_PMILLIS; + }); + + selection.hoveredRow.changed.on(function () { + // Handle row hovered + var hoveredRow = selection.hoveredRow.value; + }); + + selection.hoveredEvent.changed.on(function () { + // Handle event hovered + var hoveredEvent = selection.hoveredEvent.value; + }); + + selection.selectedEvents.valueAdded.on(function (event: TimelineEventModel) { + // Handle event selected + }); + + selection.selectedEvents.valueRemoved.on(function (event: TimelineEventModel) { + // Handle event de-selected + }); + + + // Example Dynamic Data + // + // Populate the timeline model with a dynamically generated group, row, and custom painters + // + + var group4 = { + groupGuid: 'metsci.timelineExample.group04', + label: 'Group #4', + rowGuids: [] + }; + model.groups.add(new TimelineGroupModel(group4)); + model.root.groupGuids.add(group4.groupGuid); + + var row = { + rowGuid: 'metsci.timelineExample.dynamicRow01', + label: 'Broadband', + eventGuids: [] + }; + model.rows.add(new TimelineRowModel(row)); + model.group(group4.groupGuid).rowGuids.add(row.rowGuid); + + var row = { + rowGuid: 'metsci.timelineExample.dynamicRow02', + label: 'Heatmap', + eventGuids: [] + }; + model.rows.add(new TimelineRowModel(row)); + model.group(group4.groupGuid).rowGuids.add(row.rowGuid); + + // create an empty timeseries fragment and listen for changes to its data + // the fragment will be filled later with data loaded from timeline.json + + var fragment3 = new TimelineTimeseriesFragmentModel({ fragmentGuid: 'metsci.timelineExample.fragment03' }); + model.timeseriesFragments.add(fragment3); + + // print the new data value when fragment3 changes + // also, ensure that fragment1 data values never exceed 20 + fragment3.dataChanged.on(function (startIndex: number, endIndex: number) { + for (var i = startIndex; i < endIndex; i++) { + if (fragment3.data[i] > 20) { + fragment3.setData(i, 20); } - } ); - - // Example Custom Row - // - // Create a heatmap row with data loaded form a json file - // - - $.getJSON( 'heatmapData.json', function( json : any ) { - - // pull heat map data fields out of the returned json object - var angleMin = json.minY; - var angleMax = json.maxY; - var timeMin = timeAxis.vAtTime( parseTime_PMILLIS( json.minX ) ); - var timeMax = timeAxis.vAtTime( parseTime_PMILLIS( json.maxX ) ); - var ySize = json.sizeY; - var xSize = json.sizeX; - - var array = new Float32Array( xSize * ySize ); - for ( var x = 0 ; x < xSize ; x++ ) { - for ( var y = 0 ; y < ySize ; y++ ) { - array[ y * xSize + x ] = json.data[y][x]; - } + } + }); + + // Example Custom Row + // + // Create a heatmap row with data loaded form a json file + // + + $.getJSON('heatmapData.json', function (json: any) { + + // pull heat map data fields out of the returned json object + var angleMin = json.minY; + var angleMax = json.maxY; + var timeMin = timeAxis.vAtTime(parseTime_PMILLIS(json.minX)); + var timeMax = timeAxis.vAtTime(parseTime_PMILLIS(json.maxX)); + var ySize = json.sizeY; + var xSize = json.sizeX; + + var array = new Float32Array(xSize * ySize); + for (var x = 0; x < xSize; x++) { + for (var y = 0; y < ySize; y++) { + array[y * xSize + x] = json.data[y][x]; } + } - var createHeatmapPlotPane = function( drawable : Drawable, timeAxis : TimeAxis1D, yAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { - var axisColor = options.timelineFgColor; + var createHeatmapPlotPane = function (drawable: Drawable, timeAxis: TimeAxis1D, yAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane { + var axisColor = options.timelineFgColor; - var height = options.isMaximized ? null : 270; + var height = options.isMaximized ? null : 270; - // setup axes - var colorAxis = new Axis1D( -0.7, 0.3 ); - colorAxis.limitsChanged.on( drawable.redraw ); + // setup axes + var colorAxis = new Axis1D(-0.7, 0.3); + colorAxis.limitsChanged.on(drawable.redraw); - yAxis.setVRange( 0, 180 ); - yAxis.limitsChanged.on( drawable.redraw ); + yAxis.setVRange(0, 180); + yAxis.limitsChanged.on(drawable.redraw); - var rowAxis = new Axis2D( timeAxis, yAxis ); + var rowAxis = new Axis2D(timeAxis, yAxis); - var spacerPane = new Pane( { updatePrefSize: fixedSize( null, height ) }, false ); + var spacerPane = new Pane({ updatePrefSize: fixedSize(null, height) }, false); - var yAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); - attachAxisMouseListeners1D( yAxisPane, yAxis, true ); + var yAxisPane = new Pane({ updatePrefSize: fixedSize(40, height) }); + attachAxisMouseListeners1D(yAxisPane, yAxis, true); - var colorAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); - attachAxisMouseListeners1D( colorAxisPane, colorAxis, true ); + var colorAxisPane = new Pane({ updatePrefSize: fixedSize(40, height) }); + attachAxisMouseListeners1D(colorAxisPane, colorAxis, true); - var colorInsetPane = newInsetPane( colorAxisPane, newInsets( 10, 10, 10, 10 ), null, false ); - colorInsetPane.addPainter( newBlendingBackgroundPainter( rgba( 0, 0, 0, 0.6 ) ) ); + var colorInsetPane = newInsetPane(colorAxisPane, newInsets(10, 10, 10, 10), null, false); + colorInsetPane.addPainter(newBlendingBackgroundPainter(rgba(0, 0, 0, 0.6))); - // build arguments to newHeatmapPainter( ) - var data = { array : array, xSize : xSize, ySize : ySize, xMin : timeMin, xMax : timeMax, yMin : angleMin, yMax : angleMax }; - var colorGradient = reverseBone; - var colorScale = getGradientTexture( colorGradient ); + // build arguments to newHeatmapPainter( ) + var data = { array: array, xSize: xSize, ySize: ySize, xMin: timeMin, xMax: timeMax, yMin: angleMin, yMax: angleMax }; + var colorGradient = reverseBone; + var colorScale = getGradientTexture(colorGradient); - // construct Pane and Painters - var plotPane = new Pane( newColumnLayout( ), false ); - plotPane.addPainter( newHeatmapPainter( rowAxis, colorAxis, data, colorScale, { blend: true } ) ); - plotPane.addPainter( newEdgeAxisPainter( yAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 5, font: '9px verdana,sans-serif' } ) ); - colorAxisPane.addPainter( newEdgeAxisPainter( colorAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 10, showBorder : true, gradientFill : colorGradient, font: '9px verdana,sans-serif' } ) ); - plotPane.addPane( yAxisPane, 0 ); - plotPane.addPane( spacerPane, 1 ); - plotPane.addPane( colorInsetPane, 2 ); + // construct Pane and Painters + var plotPane = new Pane(newColumnLayout(), false); + plotPane.addPainter(newHeatmapPainter(rowAxis, colorAxis, data, colorScale, { blend: true })); + plotPane.addPainter(newEdgeAxisPainter(yAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 5, font: '9px verdana,sans-serif' })); + colorAxisPane.addPainter(newEdgeAxisPainter(colorAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 10, showBorder: true, gradientFill: colorGradient, font: '9px verdana,sans-serif' })); + plotPane.addPane(yAxisPane, 0); + plotPane.addPane(spacerPane, 1); + plotPane.addPane(colorInsetPane, 2); - return plotPane; - } + return plotPane; + } - // Override content of an existing row - ui.rowUi( 'metsci.timelineExample.dynamicRow01' ).paneFactory = createHeatmapPlotPane; - }); + // Override content of an existing row + ui.rowUi('metsci.timelineExample.dynamicRow01').paneFactory = createHeatmapPlotPane; + }); - // Another Example Custom Row - // - // Create a heatmap row with programmatically generated data - // + // Another Example Custom Row + // + // Create a heatmap row with programmatically generated data + // - var createHeatmapPlotPane = function( drawable : Drawable, timeAxis : TimeAxis1D, yAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { - var axisColor = options.timelineFgColor; + var createHeatmapPlotPane = function (drawable: Drawable, timeAxis: TimeAxis1D, yAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane { + var axisColor = options.timelineFgColor; - var height = options.isMaximized ? null : 270; + var height = options.isMaximized ? null : 270; - // setup axes - var colorAxis = new Axis1D( 0, 30 ); - colorAxis.limitsChanged.on( drawable.redraw ); + // setup axes + var colorAxis = new Axis1D(0, 30); + colorAxis.limitsChanged.on(drawable.redraw); - yAxis.setVRange( -400, 400 ); - yAxis.limitsChanged.on( drawable.redraw ); + yAxis.setVRange(-400, 400); + yAxis.limitsChanged.on(drawable.redraw); - var rowAxis = new Axis2D( timeAxis, yAxis ); + var rowAxis = new Axis2D(timeAxis, yAxis); - var spacerPane = new Pane( { updatePrefSize: fixedSize( null, height ) }, false ); + var spacerPane = new Pane({ updatePrefSize: fixedSize(null, height) }, false); - var yAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); - attachAxisMouseListeners1D( yAxisPane, yAxis, true ); + var yAxisPane = new Pane({ updatePrefSize: fixedSize(40, height) }); + attachAxisMouseListeners1D(yAxisPane, yAxis, true); - var colorAxisPane = new Pane( { updatePrefSize: fixedSize( 40, height ) } ); - attachAxisMouseListeners1D( colorAxisPane, colorAxis, true ); + var colorAxisPane = new Pane({ updatePrefSize: fixedSize(40, height) }); + attachAxisMouseListeners1D(colorAxisPane, colorAxis, true); - var colorInsetPane = newInsetPane( colorAxisPane, newInsets( 10, 10, 10, 10 ), null, false ); - colorInsetPane.addPainter( newBlendingBackgroundPainter( rgba( 0, 0, 0, 0.6 ) ) ); + var colorInsetPane = newInsetPane(colorAxisPane, newInsets(10, 10, 10, 10), null, false); + colorInsetPane.addPainter(newBlendingBackgroundPainter(rgba(0, 0, 0, 0.6))); - // set heat map min/max bounds (in time and y axis value) + // set heat map min/max bounds (in time and y axis value) - var yMin = -1000; - var yMax = 1000; - var timeMin = timeAxis.vAtTime( parseTime_PMILLIS( '2013-12-31T21:00:00Z' ) ); - var timeMax = timeAxis.vAtTime( parseTime_PMILLIS( '2014-01-02T06:19:00Z' ) ); + var yMin = -1000; + var yMax = 1000; + var timeMin = timeAxis.vAtTime(parseTime_PMILLIS('2013-12-31T21:00:00Z')); + var timeMax = timeAxis.vAtTime(parseTime_PMILLIS('2014-01-02T06:19:00Z')); - // fill heat map data array - var xSize = 1000; - var ySize = 300; - var w = 2 * Math.PI / 60; - var fr = 0; - var array = new Float32Array( xSize * ySize ); - for ( var x = 0 ; x < xSize ; x++ ) { - for ( var y = 0 ; y < ySize ; y++ ) { - var x0 = 2 * Math.PI * x / xSize; - var x1 = 2 * Math.PI * y / ySize; - var value = 30 * Math.abs( Math.sin( x0 + w * fr ) ) * ( Math.sin( x0 - w * fr ) * Math.sin( 8 * x0 + w * fr ) * Math.cos( -8 * x1 - w * fr ) +Math.abs( Math.sin( 24 * x1 ) ) / 3 ); - array[ y * xSize + x ] = value; - } + // fill heat map data array + var xSize = 1000; + var ySize = 300; + var w = 2 * Math.PI / 60; + var fr = 0; + var array = new Float32Array(xSize * ySize); + for (var x = 0; x < xSize; x++) { + for (var y = 0; y < ySize; y++) { + var x0 = 2 * Math.PI * x / xSize; + var x1 = 2 * Math.PI * y / ySize; + var value = 30 * Math.abs(Math.sin(x0 + w * fr)) * (Math.sin(x0 - w * fr) * Math.sin(8 * x0 + w * fr) * Math.cos(-8 * x1 - w * fr) + Math.abs(Math.sin(24 * x1)) / 3); + array[y * xSize + x] = value; } + } - // build arguments to newHeatmapPainter( ) - var data = { array : array, xSize : xSize, ySize : ySize, xMin : timeMin, xMax : timeMax, yMin : yMin, yMax : yMax }; - var colorGradient = jet; - var colorScale = getGradientTexture( colorGradient ); + // build arguments to newHeatmapPainter( ) + var data = { array: array, xSize: xSize, ySize: ySize, xMin: timeMin, xMax: timeMax, yMin: yMin, yMax: yMax }; + var colorGradient = jet; + var colorScale = getGradientTexture(colorGradient); - // construct Pane and Painters - var plotPane = new Pane( newColumnLayout( ), false ); - plotPane.addPainter( newHeatmapPainter( rowAxis, colorAxis, data, colorScale, { blend: true } ) ); - plotPane.addPainter( newEdgeAxisPainter( yAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 5, font: '9px verdana,sans-serif' } ) ); - colorAxisPane.addPainter( newEdgeAxisPainter( colorAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 10, showBorder : true, gradientFill : colorGradient, font: '9px verdana,sans-serif' } ) ); - plotPane.addPane( yAxisPane, 0 ); - plotPane.addPane( spacerPane, 1 ); - plotPane.addPane( colorInsetPane, 2 ); + // construct Pane and Painters + var plotPane = new Pane(newColumnLayout(), false); + plotPane.addPainter(newHeatmapPainter(rowAxis, colorAxis, data, colorScale, { blend: true })); + plotPane.addPainter(newEdgeAxisPainter(yAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 5, font: '9px verdana,sans-serif' })); + colorAxisPane.addPainter(newEdgeAxisPainter(colorAxis, Side.RIGHT, { showLabel: false, textColor: axisColor, tickColor: axisColor, tickSpacing: 34, tickSize: 10, showBorder: true, gradientFill: colorGradient, font: '9px verdana,sans-serif' })); + plotPane.addPane(yAxisPane, 0); + plotPane.addPane(spacerPane, 1); + plotPane.addPane(colorInsetPane, 2); - return plotPane; + return plotPane; - } + } - // Override content of an existing row - ui.rowUi( 'metsci.timelineExample.dynamicRow02' ).paneFactory = createHeatmapPlotPane; - - // Example JSON Event loading - // - // Fetch timeline data from the server, and merge it into the existing timeline model - // - $.getJSON( 'timelineData.json', function( newTimeline : Timeline ) { - model.merge( newTimeline, timelineMergeNewBeforeOld ); - - // once the timeline has been loaded, add listeners to some of the Panes - var pane = ui.rowUi( 'metsci.timelineExample.row03a' ).getPane( 'y-axis' ); - var clickListener = function( ev : PointerEvent ) { - console.log( 'y-axis click: ' + ev.clickCount ); - }; - pane.mouseDown.on( clickListener ); - } ); - - // Example function for reloading TimelinePane with new TimelinePaneOptions. Takes care of - // removing the TimelinePane from its parent pane, disposing of its listeners/resources, - // creating a new TimelinePane, and reattaching it to the parent Pane. The new TimelinePane - // is returned. - // - // In this example, this function would be called as follows: - // - // timelinePane = reloadTimeline( contentPane, timelinePane, timelineOptions ); - // - var reloadTimeline = function( parentPane : Pane, oldTimelinePane : TimelinePane, newOptions : TimelinePaneOptions ) : TimelinePane { - - // remove the old TimelinePane from the parent Pane, dispose of it, and create a new TimelinePane - parentPane.removePane( oldTimelinePane ); - oldTimelinePane.dispose.fire( ); - var reloadedTimelinePane = newTimelinePane( drawable, timeAxis, model, timelineOptions, oldTimelinePane.ui ); - parentPane.addPane( reloadedTimelinePane ); - - // update the drawable - drawable.redraw( ); - - // return the newly created Pane - return reloadedTimelinePane; - } + // Override content of an existing row + ui.rowUi('metsci.timelineExample.dynamicRow02').paneFactory = createHeatmapPlotPane; + + // Example JSON Event loading + // + // Fetch timeline data from the server, and merge it into the existing timeline model + // + $.getJSON('timelineData.json', function (newTimeline: Timeline) { + model.merge(newTimeline, timelineMergeNewBeforeOld); + + // once the timeline has been loaded, add listeners to some of the Panes + var pane = ui.rowUi('metsci.timelineExample.row03a').getPane('y-axis'); + var clickListener = function (ev: PointerEvent) { + console.log('y-axis click: ' + ev.clickCount); + }; + pane.mouseDown.on(clickListener); + }); + + // Example function for reloading TimelinePane with new TimelinePaneOptions. Takes care of + // removing the TimelinePane from its parent pane, disposing of its listeners/resources, + // creating a new TimelinePane, and reattaching it to the parent Pane. The new TimelinePane + // is returned. + // + // In this example, this function would be called as follows: + // + // timelinePane = reloadTimeline( contentPane, timelinePane, timelineOptions ); + // + var reloadTimeline = function (parentPane: Pane, oldTimelinePane: TimelinePane, newOptions: TimelinePaneOptions): TimelinePane { + + // remove the old TimelinePane from the parent Pane, dispose of it, and create a new TimelinePane + parentPane.removePane(oldTimelinePane); + oldTimelinePane.dispose.fire(); + var reloadedTimelinePane = newTimelinePane(drawable, timeAxis, model, timelineOptions, oldTimelinePane.ui); + parentPane.addPane(reloadedTimelinePane); + + // update the drawable + drawable.redraw(); + + // return the newly created Pane + return reloadedTimelinePane; } +} diff --git a/src/public_api.ts b/src/public_api.ts new file mode 100644 index 0000000..450a74c --- /dev/null +++ b/src/public_api.ts @@ -0,0 +1,64 @@ +// Util + +export * from './webglimpse/util/util'; +export * from './webglimpse/util/cache'; +export * from './webglimpse/util/multikey_cache'; +export * from './webglimpse/bounds'; +export * from './webglimpse/color'; +export * from './webglimpse/matrix'; +export * from './webglimpse/util/ordered_set'; +export * from './webglimpse/util/notification'; +export * from './webglimpse/util/sorted_arrays'; +export * from './webglimpse/util/binary_tree'; +export * from './webglimpse/util/sorted_multimap'; +export * from './webglimpse/util/split'; + + +// WebGL + +export * from './webglimpse/buffer'; +export * from './webglimpse/shader'; +export * from './webglimpse/texture'; +export * from './webglimpse/text'; + + +// Core + +export * from './webglimpse/core'; +export * from './webglimpse/misc'; +export * from './webglimpse/label'; +export * from './webglimpse/scroll'; +export * from './webglimpse/layout/inset_layout'; +export * from './webglimpse/layout/corner_layout'; +export * from './webglimpse/layout/row_layout'; +export * from './webglimpse/layout/column_layout'; +export * from './webglimpse/layout/overlay_layout'; +export * from './webglimpse/layout/card_layout'; +export * from './webglimpse/painter/border_painter'; +export * from './webglimpse/plot/axis'; +export * from './webglimpse/plot/plot_layout'; +export * from './webglimpse/plot/edge_axis_painter'; +export * from './webglimpse/plot/line_painter'; +export * from './webglimpse/gradient'; +export * from './webglimpse/plot/heatmap_painter'; + + +// Time + +export * from './webglimpse/time'; +export * from './webglimpse/timeline/time_axis'; +export * from './webglimpse/timeline/time_axis_painter'; +export * from './webglimpse/timeline/time_grid_painter'; +export * from './webglimpse/timeline/timeline_model'; +export * from './webglimpse/timeline/timeline_layout'; +export * from './webglimpse/timeline/timeline_cursor_painter'; +export * from './webglimpse/timeline/timeline_annotation_painter'; +export * from './webglimpse/timeline/timeline_annotation_style'; +export * from './webglimpse/timeline/timeline_event_style'; +export * from './webglimpse/timeline/timeline_ui'; +export * from './webglimpse/timeline/timeline_row'; +export * from './webglimpse/timeline/timeline_lanes'; +export * from './webglimpse/timeline/timeline_events_row'; +export * from './webglimpse/timeline/timeline_timeseries_row'; +export * from './webglimpse/timeline/timeline_styles'; +export * from './webglimpse/timeline/timeline_pane'; diff --git a/src/reference.ts b/src/reference.ts deleted file mode 100644 index 76b6680..0000000 --- a/src/reference.ts +++ /dev/null @@ -1,78 +0,0 @@ -// Util - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - - -// WebGL - -/// -/// -/// -/// - - -// Core - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - - -// Time - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - - - -// Examples - -/// -/// -/// -/// -/// - -//grunt-start -//grunt-end \ No newline at end of file diff --git a/src/webglimpse/bounds.ts b/src/webglimpse/bounds.ts index 0640b07..1b9ad02 100644 --- a/src/webglimpse/bounds.ts +++ b/src/webglimpse/bounds.ts @@ -27,118 +27,118 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { xFrac, yFrac } from './core'; +import { clamp } from './util/util'; + +export class BoundsUnmodifiable { + private bounds: Bounds; + + constructor(bounds: Bounds) { this.bounds = bounds; } + + get iStart(): number { return this.bounds.iStart; } + get jStart(): number { return this.bounds.jStart; } + get iEnd(): number { return this.bounds.iEnd; } + get jEnd(): number { return this.bounds.jEnd; } + + get i(): number { return this.bounds.i; } + get j(): number { return this.bounds.j; } + get w(): number { return this.bounds.w; } + get h(): number { return this.bounds.h; } + + xFrac(i: number): number { return this.bounds.xFrac(i); } + yFrac(j: number): number { return this.bounds.yFrac(j); } + contains(i: number, j: number): boolean { return this.bounds.contains(i, j); } +} + + +export class Bounds { + private _iStart: number; + private _jStart: number; + private _iEnd: number; + private _jEnd: number; + private _unmod: BoundsUnmodifiable; + + constructor() { + this._iStart = 0; + this._jStart = 0; + this._iEnd = 0; + this._jEnd = 0; + this._unmod = new BoundsUnmodifiable(this); + } + get iStart(): number { return this._iStart; } + get jStart(): number { return this._jStart; } + get iEnd(): number { return this._iEnd; } + get jEnd(): number { return this._jEnd; } + get i(): number { return this._iStart; } + get j(): number { return this._jStart; } + get w(): number { return this._iEnd - this._iStart; } + get h(): number { return this._jEnd - this._jStart; } - export class BoundsUnmodifiable { - private bounds : Bounds; - - constructor( bounds : Bounds ) { this.bounds = bounds; } + get unmod(): BoundsUnmodifiable { return this._unmod; } - get iStart( ) : number { return this.bounds.iStart; } - get jStart( ) : number { return this.bounds.jStart; } - get iEnd( ) : number { return this.bounds.iEnd; } - get jEnd( ) : number { return this.bounds.jEnd; } + xFrac(i: number): number { + return (i - this._iStart) / (this._iEnd - this._iStart); + } - get i( ) : number { return this.bounds.i; } - get j( ) : number { return this.bounds.j; } - get w( ) : number { return this.bounds.w; } - get h( ) : number { return this.bounds.h; } + yFrac(j: number): number { + return (j - this._jStart) / (this._jEnd - this._jStart); + } - xFrac( i : number ) : number { return this.bounds.xFrac( i ); } - yFrac( j : number ) : number { return this.bounds.yFrac( j ); } - contains( i : number, j : number ) : boolean { return this.bounds.contains( i, j ); } + contains(i: number, j: number): boolean { + return (this._iStart <= i && i < this._iEnd && this._jStart <= j && j < this._jEnd); } + setEdges(iStart: number, iEnd: number, jStart: number, jEnd: number) { + this._iStart = iStart; + this._jStart = jStart; + this._iEnd = iEnd; + this._jEnd = jEnd; + } - export class Bounds { - private _iStart : number; - private _jStart : number; - private _iEnd : number; - private _jEnd : number; - private _unmod : BoundsUnmodifiable; - - constructor( ) { - this._iStart = 0; - this._jStart = 0; - this._iEnd = 0; - this._jEnd = 0; - this._unmod = new BoundsUnmodifiable( this ); - } - - get iStart( ) : number { return this._iStart; } - get jStart( ) : number { return this._jStart; } - get iEnd( ) : number { return this._iEnd; } - get jEnd( ) : number { return this._jEnd; } - - get i( ) : number { return this._iStart; } - get j( ) : number { return this._jStart; } - get w( ) : number { return this._iEnd - this._iStart; } - get h( ) : number { return this._jEnd - this._jStart; } - - get unmod( ) : BoundsUnmodifiable { return this._unmod; } - - xFrac( i : number ) : number { - return ( i - this._iStart ) / ( this._iEnd - this._iStart ); - } - - yFrac( j : number ) : number { - return ( j - this._jStart ) / ( this._jEnd - this._jStart ); - } - - contains( i : number, j : number ) : boolean { - return ( this._iStart <= i && i < this._iEnd && this._jStart <= j && j < this._jEnd ); - } - - setEdges( iStart : number, iEnd : number, jStart : number, jEnd : number ) { - this._iStart = iStart; - this._jStart = jStart; - this._iEnd = iEnd; - this._jEnd = jEnd; - } - - setRect( i : number, j : number, w : number, h : number ) { - this.setEdges( i, i+w, j, j+h ); - } - - setBounds( bounds : BoundsUnmodifiable ) { - this.setEdges( bounds.iStart, bounds.iEnd, bounds.jStart, bounds.jEnd ); - } - - cropToEdges( iCropStart : number, iCropEnd : number, jCropStart : number, jCropEnd : number ) { - this._iStart = clamp( iCropStart, iCropEnd, this._iStart ); - this._jStart = clamp( jCropStart, jCropEnd, this._jStart ); - this._iEnd = clamp( iCropStart, iCropEnd, this._iEnd ); - this._jEnd = clamp( jCropStart, jCropEnd, this._jEnd ); - } - - cropToRect( iCrop : number, jCrop : number, wCrop : number, hCrop : number ) { - this.cropToEdges( iCrop, iCrop+wCrop, jCrop, jCrop+hCrop ); - } - - cropToBounds( cropBounds : BoundsUnmodifiable ) { - this.cropToEdges( cropBounds.iStart, cropBounds.iEnd, cropBounds.jStart, cropBounds.jEnd ); - } + setRect(i: number, j: number, w: number, h: number) { + this.setEdges(i, i + w, j, j + h); } + setBounds(bounds: BoundsUnmodifiable) { + this.setEdges(bounds.iStart, bounds.iEnd, bounds.jStart, bounds.jEnd); + } - export function newBoundsFromRect( i : number, j : number, w : number, h : number ) : Bounds { - var b = new Bounds( ); - b.setRect( i, j, w, h ); - return b; + cropToEdges(iCropStart: number, iCropEnd: number, jCropStart: number, jCropEnd: number) { + this._iStart = clamp(iCropStart, iCropEnd, this._iStart); + this._jStart = clamp(jCropStart, jCropEnd, this._jStart); + this._iEnd = clamp(iCropStart, iCropEnd, this._iEnd); + this._jEnd = clamp(jCropStart, jCropEnd, this._jEnd); } + cropToRect(iCrop: number, jCrop: number, wCrop: number, hCrop: number) { + this.cropToEdges(iCrop, iCrop + wCrop, jCrop, jCrop + hCrop); + } - export function newBoundsFromEdges( iStart : number, iEnd : number, jStart : number, jEnd : number ) : Bounds { - var b = new Bounds( ); - b.setEdges( iStart, iEnd, jStart, jEnd ); - return b; + cropToBounds(cropBounds: BoundsUnmodifiable) { + this.cropToEdges(cropBounds.iStart, cropBounds.iEnd, cropBounds.jStart, cropBounds.jEnd); } +} - export interface Size { - w : number; - h : number; - } +export function newBoundsFromRect(i: number, j: number, w: number, h: number): Bounds { + let b = new Bounds(); + b.setRect(i, j, w, h); + return b; +} + + +export function newBoundsFromEdges(iStart: number, iEnd: number, jStart: number, jEnd: number): Bounds { + let b = new Bounds(); + b.setEdges(iStart, iEnd, jStart, jEnd); + return b; +} + + +export interface Size { + w: number; + h: number; +} diff --git a/src/webglimpse/buffer.ts b/src/webglimpse/buffer.ts index 038c07d..069ee0e 100644 --- a/src/webglimpse/buffer.ts +++ b/src/webglimpse/buffer.ts @@ -27,141 +27,140 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { StringMap, GL, getObjectId, hasval } from './util/util'; +export interface Buffer { + bind(gl: WebGLRenderingContext, target: number): void; + unbind(gl: WebGLRenderingContext, target: number): void; + dispose(): void; +} +export interface DynamicBuffer extends Buffer { + setData(newData: Float32Array): void; +} - export interface Buffer { - bind( gl : WebGLRenderingContext, target : number ); - unbind( gl : WebGLRenderingContext, target : number ); - dispose( ); - } +export function newStaticBuffer(data: Float32Array): Buffer { + return new StaticBufferImpl(data); +} - export interface DynamicBuffer extends Buffer { - setData( newData : ArrayBuffer ); - } +export function newDynamicBuffer(data: Float32Array = new Float32Array(0)): DynamicBuffer { + return new DynamicBufferImpl(data); +} - export function newStaticBuffer( data : ArrayBuffer ) : Buffer { - return new StaticBufferImpl( data ); - } - export function newDynamicBuffer( data : ArrayBuffer = new Float32Array( 0 ) ) : DynamicBuffer { - return new DynamicBufferImpl( data ); +class BufferEntry { + gl: WebGLRenderingContext; + buffer: WebGLBuffer; + capacity: number = 0; + marker: number = null; + + constructor(gl: WebGLRenderingContext, buffer: WebGLBuffer) { + this.gl = gl; + this.buffer = buffer; } +} +class AbstractBuffer implements Buffer { + private buffers: StringMap = {}; + private currentMarker: number = 0; - class BufferEntry { - gl : WebGLRenderingContext; - buffer : WebGLBuffer; - capacity : number = 0; - marker : number = null; + init(gl: WebGLRenderingContext, target: number): number { + throw new Error('Method is abstract'); + } - constructor( gl : WebGLRenderingContext, buffer : WebGLBuffer ) { - this.gl = gl; - this.buffer = buffer; - } + update(gl: WebGLRenderingContext, target: number, capacity: number): number { + throw new Error('Method is abstract'); } - class AbstractBuffer implements Buffer { - private buffers : StringMap = { }; - private currentMarker : number = 0; + setDirty() { + this.currentMarker++; + } - init( gl : WebGLRenderingContext, target : number ) : number { - throw new Error( 'Method is abstract' ); - } + bind(gl: WebGLRenderingContext, target: number) { + let glId = getObjectId(gl); + if (this.buffers[glId] === undefined) { + let buffer = gl.createBuffer(); + if (!hasval(buffer)) throw new Error('Failed to create buffer'); + this.buffers[glId] = new BufferEntry(gl, buffer); - update( gl : WebGLRenderingContext, target : number, capacity : number ) : number { - throw new Error( 'Method is abstract' ); + gl.bindBuffer(target, this.buffers[glId].buffer); + this.buffers[glId].capacity = this.init(gl, target); + this.buffers[glId].marker = this.currentMarker; } - - setDirty( ) { - this.currentMarker++; + else if (this.buffers[glId].marker !== this.currentMarker) { + gl.bindBuffer(target, this.buffers[glId].buffer); + this.buffers[glId].capacity = this.update(gl, target, this.buffers[glId].capacity); + this.buffers[glId].marker = this.currentMarker; } - - bind( gl : WebGLRenderingContext, target : number ) { - var glId = getObjectId( gl ); - if ( this.buffers[ glId ] === undefined ) { - var buffer = gl.createBuffer( ); - if ( !hasval( buffer ) ) throw new Error( 'Failed to create buffer' ); - this.buffers[ glId ] = new BufferEntry( gl, buffer ); - - gl.bindBuffer( target, this.buffers[ glId ].buffer ); - this.buffers[ glId ].capacity = this.init( gl, target ); - this.buffers[ glId ].marker = this.currentMarker; - } - else if ( this.buffers[ glId ].marker !== this.currentMarker ) { - gl.bindBuffer( target, this.buffers[ glId ].buffer ); - this.buffers[ glId ].capacity = this.update( gl, target, this.buffers[ glId ].capacity ); - this.buffers[ glId ].marker = this.currentMarker; - } - else { - gl.bindBuffer( target, this.buffers[ glId ].buffer ); - } + else { + gl.bindBuffer(target, this.buffers[glId].buffer); } + } - unbind( gl : WebGLRenderingContext, target : number ) { - gl.bindBuffer( target, null ); - } + unbind(gl: WebGLRenderingContext, target: number) { + gl.bindBuffer(target, null); + } - dispose( ) { - // XXX: Not sure this actually works ... may have to make each gl current or something - for ( var glid in this.buffers ) { - if ( this.buffers.hasOwnProperty( glid ) ) { - var en = this.buffers[ glid ]; - en.gl.deleteBuffer( en.buffer ); - } + dispose() { + // XXX: Not sure this actually works ... may have to make each gl current or something + for (let glid in this.buffers) { + if (this.buffers.hasOwnProperty(glid)) { + let en = this.buffers[glid]; + en.gl.deleteBuffer(en.buffer); } - this.buffers = { }; } + this.buffers = {}; } +} - class StaticBufferImpl extends AbstractBuffer { - private _data : ArrayBuffer; +class StaticBufferImpl extends AbstractBuffer { + private _data: Float32Array; - constructor( data : ArrayBuffer ) { - super( ); - this._data = data; - } + constructor(data: Float32Array) { + super(); + this._data = data; + } - init( gl : WebGLRenderingContext, target : number ) : number { - gl.bufferData( target, this._data, GL.STATIC_DRAW ); - return this._data.byteLength; - } + init(gl: WebGLRenderingContext, target: number): number { + gl.bufferData(target, this._data, GL.STATIC_DRAW); + return this._data.byteLength; + } - update( gl : WebGLRenderingContext, target : number, capacity : number ) : number { - throw new Error( 'This buffer is static and should never need to be updated' ); - } + update(gl: WebGLRenderingContext, target: number, capacity: number): number { + throw new Error('This buffer is static and should never need to be updated'); } +} - class DynamicBufferImpl extends AbstractBuffer implements DynamicBuffer { - private _data : ArrayBuffer; +class DynamicBufferImpl extends AbstractBuffer implements DynamicBuffer { + private _data: Float32Array; - constructor( data : ArrayBuffer ) { - super( ); - this._data = data; - } + constructor(data: Float32Array) { + super(); + this._data = data; + } - setData( data : ArrayBuffer ) { - this._data = data; - this.setDirty( ); - } + setData(data: Float32Array) { + this._data = data; + this.setDirty(); + } - init( gl : WebGLRenderingContext, target : number ) : number { - gl.bufferData( target, this._data, GL.DYNAMIC_DRAW ); - return this._data.byteLength; - } + init(gl: WebGLRenderingContext, target: number): number { + gl.bufferData(target, this._data, GL.DYNAMIC_DRAW); + return this._data.byteLength; + } - update( gl : WebGLRenderingContext, target : number, capacity : number ) : number { - if ( this._data.byteLength <= capacity ) { - gl.bufferSubData( target, 0, this._data ); - return capacity; - } - else { - gl.bufferData( target, this._data, GL.DYNAMIC_DRAW ); - return this._data.byteLength; - } + update(gl: WebGLRenderingContext, target: number, capacity: number): number { + if (this._data.byteLength <= capacity) { + gl.bufferSubData(target, 0, this._data); + return capacity; + } + else { + gl.bufferData(target, this._data, GL.DYNAMIC_DRAW); + return this._data.byteLength; } } +} diff --git a/src/webglimpse/color.ts b/src/webglimpse/color.ts index 71559b6..84e16a6 100644 --- a/src/webglimpse/color.ts +++ b/src/webglimpse/color.ts @@ -27,119 +27,118 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { hasval } from './util/util'; +export class Color { + private _r: number; + private _g: number; + private _b: number; + private _a: number; + get r(): number { return this._r; } + get g(): number { return this._g; } + get b(): number { return this._b; } + get a(): number { return this._a; } - export class Color { - private _r : number; - private _g : number; - private _b : number; - private _a : number; + get cssString(): string { + return 'rgba(' + Math.round(255 * this._r) + ',' + Math.round(255 * this._g) + ',' + Math.round(255 * this._b) + ',' + this._a + ')'; + } - get r( ) : number { return this._r; } - get g( ) : number { return this._g; } - get b( ) : number { return this._b; } - get a( ) : number { return this._a; } + get rgbaString(): string { + return '' + Math.round(255 * this._r) + ',' + Math.round(255 * this._g) + ',' + Math.round(255 * this._b) + ',' + Math.round(255 * this._a); + } - get cssString( ) : string { - return 'rgba(' + Math.round( 255*this._r ) + ',' + Math.round( 255*this._g ) + ',' + Math.round( 255*this._b ) + ',' + this._a + ')'; - } + constructor(r: number, g: number, b: number, a: number = 1) { + this._r = r; + this._g = g; + this._b = b; + this._a = a; + } - get rgbaString( ) : string { - return '' + Math.round( 255*this._r ) + ',' + Math.round( 255*this._g ) + ',' + Math.round( 255*this._b ) + ',' + Math.round( 255*this._a ); - } + withAlphaTimes(aFactor: number): Color { + return new Color(this._r, this._g, this._b, aFactor * this._a); + } +} - constructor( r : number, g : number, b : number, a : number = 1 ) { - this._r = r; - this._g = g; - this._b = b; - this._a = a; - } - withAlphaTimes( aFactor : number ) : Color { - return new Color( this._r, this._g, this._b, aFactor * this._a ); - } - } +export function darker(color: Color, factor: number): Color { + return new Color(color.r * factor, color.g * factor, color.b * factor, color.a); +} - export function darker( color : Color, factor : number ) : Color { - return new Color( color.r * factor, color.g * factor, color.b * factor, color.a ); - } +export function rgba(r: number, g: number, b: number, a: number): Color { + return new Color(r, g, b, a); +} - export function rgba( r : number, g : number, b : number, a : number ) : Color { - return new Color( r, g, b, a ); - } +export function rgb(r: number, g: number, b: number): Color { + return new Color(r, g, b, 1); +} - export function rgb( r : number, g : number, b : number ) : Color { - return new Color( r, g, b, 1 ); - } +export function sameColor(c1: Color, c2: Color): boolean { + if (c1 === c2) return true; + if (!hasval(c1) || !hasval(c2)) return false; + return (c1.r === c2.r && c1.g === c2.g && c1.b === c2.b && c1.a === c2.a); +} - export function sameColor( c1 : Color, c2 : Color ) : boolean { - if ( c1 === c2 ) return true; - if ( !hasval( c1 ) || !hasval( c2 ) ) return false; - return ( c1.r === c2.r && c1.g === c2.g && c1.b === c2.b && c1.a === c2.a ); - } +export function parseRgba(rgbaString: string): Color { + let tokens = rgbaString.split(',', 4); + return new Color(parseInt(tokens[0]) / 255, parseInt(tokens[1]) / 255, parseInt(tokens[2]) / 255, parseInt(tokens[3]) / 255); +} - export function parseRgba( rgbaString : string ) : Color { - var tokens = rgbaString.split( ',', 4 ); - return new Color( parseInt(tokens[0])/255, parseInt(tokens[1])/255, parseInt(tokens[2])/255, parseInt(tokens[3])/255 ); +/** + * Creates a Color object based on a CSS color string. Supports the following notations: + * - hex + * - rgb/rgba + * - hsl/hsla + * - named colors + * + * Behavior is undefined for strings that are not in one of the listed notations. + * + * Note that different browsers may use different color values for the named colors. + * + */ +export let parseCssColor = (function () { + let canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + let g = canvas.getContext('2d'); + return function (cssColorString: string): Color { + g.clearRect(0, 0, 1, 1); + g.fillStyle = cssColorString; + g.fillRect(0, 0, 1, 1); + + let rgbaData = g.getImageData(0, 0, 1, 1).data; + let R = rgbaData[0] / 255; + let G = rgbaData[1] / 255; + let B = rgbaData[2] / 255; + let A = rgbaData[3] / 255; + return rgba(R, G, B, A); } +})(); - /** - * Creates a Color object based on a CSS color string. Supports the following notations: - * - hex - * - rgb/rgba - * - hsl/hsla - * - named colors - * - * Behavior is undefined for strings that are not in one of the listed notations. - * - * Note that different browsers may use different color values for the named colors. - * - */ - export var parseCssColor = ( function( ) { - var canvas = document.createElement( 'canvas' ); - canvas.width = 1; - canvas.height = 1; - var g = canvas.getContext( '2d' ); - return function( cssColorString : string ) : Color { - g.clearRect( 0, 0, 1, 1 ); - g.fillStyle = cssColorString; - g.fillRect( 0, 0, 1, 1 ); - - var rgbaData = g.getImageData( 0, 0, 1, 1 ).data; - var R = rgbaData[ 0 ] / 255; - var G = rgbaData[ 1 ] / 255; - var B = rgbaData[ 2 ] / 255; - var A = rgbaData[ 3 ] / 255; - return rgba( R, G, B, A ); - } - } )( ); - - - export function gray( brightness : number ) : Color { - return new Color( brightness, brightness, brightness, 1 ); - } +export function gray(brightness: number): Color { + return new Color(brightness, brightness, brightness, 1); +} - // XXX: Make final +// XXX: Make final - export var black = rgb( 0, 0, 0 ); - export var white = rgb( 1, 1, 1 ); +export let black = rgb(0, 0, 0); +export let white = rgb(1, 1, 1); - export var red = rgb( 1, 0, 0 ); - export var green = rgb( 0, 1, 0 ); - export var blue = rgb( 0, 0, 1 ); +export let red = rgb(1, 0, 0); +export let green = rgb(0, 1, 0); +export let blue = rgb(0, 0, 1); - export var cyan = rgb( 0, 1, 1 ); - export var magenta = rgb( 1, 0, 1 ); - export var yellow = rgb( 1, 1, 0 ); +export let cyan = rgb(0, 1, 1); +export let magenta = rgb(1, 0, 1); +export let yellow = rgb(1, 1, 0); - export var periwinkle = rgb( 0.561, 0.561, 0.961 ); +export let periwinkle = rgb(0.561, 0.561, 0.961); diff --git a/src/webglimpse/core.ts b/src/webglimpse/core.ts index 2e1ab56..001619a 100644 --- a/src/webglimpse/core.ts +++ b/src/webglimpse/core.ts @@ -27,760 +27,763 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { BoundsUnmodifiable, Bounds, Size, newBoundsFromRect } from './bounds'; +import { Notification, Listener, Notification1 } from './util/notification'; +import { OrderedSet } from './util/ordered_set'; +import { alwaysTrue, GL, getObjectId, hasval } from './util/util'; +export interface Painter { + (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable): void; +} - export interface Painter { - ( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ); - } +export interface PointerEvent { + paneViewport: BoundsUnmodifiable; + i: number; + j: number; + wheelSteps?: number; + clickCount?: number; + mouseEvent?: MouseEvent; +} - export interface PointerEvent { - paneViewport : BoundsUnmodifiable; - i : number; - j : number; - wheelSteps? : number; - clickCount? : number; - mouseEvent? : MouseEvent; - } +export function xFrac(ev: PointerEvent) { + return ev.paneViewport.xFrac(ev.i); +} - export function xFrac( ev : PointerEvent ) { - return ev.paneViewport.xFrac( ev.i ); - } +export function yFrac(ev: PointerEvent) { + return ev.paneViewport.yFrac(ev.j); +} - export function yFrac( ev : PointerEvent ) { - return ev.paneViewport.yFrac( ev.j ); - } +export interface LayoutEntry { + layoutArg: any; + layoutOptions: any; + viewport: Bounds; + prefSize: Size; +} - export interface LayoutEntry { - layoutArg : any; - layoutOptions : any; - viewport : Bounds; - prefSize : Size; - } +export interface LayoutPhase1 { + (parentPrefSize: Size, children?: LayoutEntry[]): LayoutPhase1; +} - export interface LayoutPhase1 { - ( parentPrefSize : Size, children : LayoutEntry[] ); - } +export interface LayoutPhase2 { + (children: LayoutEntry[], parentViewport: BoundsUnmodifiable): LayoutPhase2; +} - export interface LayoutPhase2 { - ( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ); - } +export interface Layout { + updatePrefSize?: LayoutPhase1; + updateChildViewports?: LayoutPhase2; +} - export interface Layout { - updatePrefSize? : LayoutPhase1; - updateChildViewports? : LayoutPhase2; - } - - - export interface Mask2D { - ( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean; - } +export interface Mask2D { + (viewport: BoundsUnmodifiable, i: number, j: number): boolean; +} - class PaneChild implements LayoutEntry { - pane : Pane; - layoutArg : any; - layoutOptions : any; - viewport : Bounds; - scissor : Bounds; - prefSize : Size; +class PaneChild implements LayoutEntry { + pane: Pane; + layoutArg: any; + layoutOptions: any; + viewport: Bounds; + scissor: Bounds; + prefSize: Size; - constructor( pane : Pane, layoutArg : any, layoutOptions : any ) { - this.pane = pane; - this.layoutArg = layoutArg; - this.layoutOptions = layoutOptions; - this.viewport = newBoundsFromRect( 0, 0, 0, 0 ); - this.scissor = newBoundsFromRect( 0, 0, 0, 0 ); - this.prefSize = { w: 0, h: 0 }; - } + constructor(pane: Pane, layoutArg: any, layoutOptions: any) { + this.pane = pane; + this.layoutArg = layoutArg; + this.layoutOptions = layoutOptions; + this.viewport = newBoundsFromRect(0, 0, 0, 0); + this.scissor = newBoundsFromRect(0, 0, 0, 0); + this.prefSize = { w: 0, h: 0 }; } +} - export class Pane { - private painters : Painter[]; - private consumesInputEvents : boolean; - private isInside : Mask2D; - - private _mouseCursor : string; - private _mouseCursorChanged : Notification; - private _childMouseCursorListener : Listener; +export class Pane { + private painters: Painter[]; + private consumesInputEvents: boolean; + private isInside: Mask2D; - private children : OrderedSet; - private _layout : Layout; - private _viewport : Bounds; - private _scissor : Bounds; - private _viewportChanged : Notification; + private _mouseCursor: string; + private _mouseCursorChanged: Notification; + private _childMouseCursorListener: Listener; - private _dispose : Notification; + private children: OrderedSet; + private _layout: Layout; + private _viewport: Bounds; + private _scissor: Bounds; + private _viewportChanged: Notification; - constructor( layout : Layout, consumesInputEvents : boolean = true, isInside : Mask2D = alwaysTrue ) { - this.painters = []; - this.consumesInputEvents = consumesInputEvents; - this.isInside = isInside; + private _dispose: Notification; - this._mouseCursor = ( consumesInputEvents ? 'default' : null ); - this._mouseCursorChanged = new Notification( ); - this._childMouseCursorListener = ( ( ) => this._mouseCursorChanged.fire( ) ); + constructor(layout: Layout, consumesInputEvents: boolean = true, isInside: Mask2D = alwaysTrue) { + this.painters = []; + this.consumesInputEvents = consumesInputEvents; + this.isInside = isInside; - this.children = new OrderedSet( [], (paneChild)=>getObjectId(paneChild.pane), false ); - this._layout = layout; - this._viewport = newBoundsFromRect( 0, 0, 0, 0 ); - this._scissor = newBoundsFromRect( 0, 0, 0, 0 ); - this._viewportChanged = new Notification( ); + this._mouseCursor = (consumesInputEvents ? 'default' : null); + this._mouseCursorChanged = new Notification(); + this._childMouseCursorListener = (() => this._mouseCursorChanged.fire()); - this._dispose = new Notification( ); + this.children = new OrderedSet([], (paneChild) => getObjectId(paneChild.pane), false); + this._layout = layout; + this._viewport = newBoundsFromRect(0, 0, 0, 0); + this._scissor = newBoundsFromRect(0, 0, 0, 0); + this._viewportChanged = new Notification(); - this._dispose.on( ( ) => { - this._mouseUp.dispose( ); - this._mouseDown.dispose( ); - this._mouseMove.dispose( ); - this._mouseWheel.dispose( ); - this._mouseEnter.dispose( ); - this._mouseExit.dispose( ); - this._contextMenu.dispose( ); + this._dispose = new Notification(); - // recursively dispose all child panes - for ( var i = 0 ; i < this.children.length ; i++ ) { - this.children.valueAt( i ).pane.dispose.fire( ); - } - } ); - } - - get layout( ) : Layout { - return this.layout; - } + this._dispose.on(() => { + this._mouseUp.dispose(); + this._mouseDown.dispose(); + this._mouseMove.dispose(); + this._mouseWheel.dispose(); + this._mouseEnter.dispose(); + this._mouseExit.dispose(); + this._contextMenu.dispose(); - set layout( layout : Layout ) { - this._layout = layout; - } - - get mouseCursor( ) : string { - return this._mouseCursor; - } - - set mouseCursor( mouseCursor : string ) { - if ( mouseCursor !== this._mouseCursor ) { - this._mouseCursor = mouseCursor; - this._mouseCursorChanged.fire( ); + // recursively dispose all child panes + for (let i = 0; i < this.children.length; i++) { + this.children.valueAt(i).pane.dispose.fire(); } - } - - get mouseCursorChanged( ) : Notification { - return this._mouseCursorChanged; - } + }); + } - addPainter( painter : Painter ) { - this.painters.push( painter ); - } + get layout(): Layout { + return this.layout; + } - addPane( pane : Pane, layoutArg : any = null, layoutOptions : any = { } ) { - this.children.add( new PaneChild( pane, layoutArg, layoutOptions ) ); - pane.mouseCursorChanged.on( this._childMouseCursorListener ); - } + set layout(layout: Layout) { + this._layout = layout; + } - removePane( pane : Pane ) { - this.children.removeValue( this._childFor( pane ) ); - pane.mouseCursorChanged.off( this._childMouseCursorListener ); - } + get mouseCursor(): string { + return this._mouseCursor; + } - layoutArg( pane : Pane ) : any { - return this._childFor( pane ).layoutArg; + set mouseCursor(mouseCursor: string) { + if (mouseCursor !== this._mouseCursor) { + this._mouseCursor = mouseCursor; + this._mouseCursorChanged.fire(); } + } - setLayoutArg( pane : Pane, layoutArg : any ) { - this._childFor( pane ).layoutArg = layoutArg; - } + get mouseCursorChanged(): Notification { + return this._mouseCursorChanged; + } - updateLayoutArgs( updateFn : (layoutArg:any,layoutOptions:any)=>any ) { - for ( var c = 0; c < this.children.length; c++ ) { - var child = this.children.valueAt( c ); - child.layoutArg = updateFn( child.layoutArg, child.layoutOptions ); - } - } + addPainter(painter: Painter) { + this.painters.push(painter); + } - layoutOptions( pane : Pane ) : any { - return this._childFor( pane ).layoutOptions; - } + addPane(pane: Pane, layoutArg: any = null, layoutOptions: any = {}) { + this.children.add(new PaneChild(pane, layoutArg, layoutOptions)); + pane.mouseCursorChanged.on(this._childMouseCursorListener); + } - private _childFor( pane : Pane ) : PaneChild { - return this.children.valueFor( getObjectId( pane ) ); - } + removePane(pane: Pane) { + this.children.removeValue(this._childFor(pane)); + pane.mouseCursorChanged.off(this._childMouseCursorListener); + } + layoutArg(pane: Pane): any { + return this._childFor(pane).layoutArg; + } - // Layout & Paint - // + setLayoutArg(pane: Pane, layoutArg: any) { + this._childFor(pane).layoutArg = layoutArg; + } - updatePrefSizes( result : Size ) { - // Child panes - for ( var c = 0; c < this.children.length; c++ ) { - var child = this.children.valueAt( c ); - child.pane.updatePrefSizes( child.prefSize ); - } - // This pane - if ( hasval( this._layout ) && hasval( this._layout.updatePrefSize ) ) { - this._layout.updatePrefSize( result, this.children.toArray( ) ); - } - else { - result.w = null; - result.h = null; - } + updateLayoutArgs(updateFn: (layoutArg: any, layoutOptions: any) => any) { + for (let c = 0; c < this.children.length; c++) { + let child = this.children.valueAt(c); + child.layoutArg = updateFn(child.layoutArg, child.layoutOptions); } + } - updateBounds( viewport : BoundsUnmodifiable, scissor : BoundsUnmodifiable ) { - // This pane - var viewportChanged = ( viewport.iStart !== this._viewport.iStart || viewport.iEnd !== this._viewport.iEnd || viewport.jStart !== this._viewport.jStart || viewport.jEnd !== this._viewport.jEnd ); - this._viewport.setBounds( viewport ); - this._scissor.setBounds( scissor ); - // Child panes - if ( hasval( this._layout ) && hasval( this._layout.updateChildViewports ) ) { - this._layout.updateChildViewports( this.children.toArray( ), viewport ); - for ( var c = 0; c < this.children.length; c++ ) { - var child = this.children.valueAt( c ); - child.scissor.setBounds( child.viewport.unmod ); - child.scissor.cropToBounds( scissor ); - child.pane.updateBounds( child.viewport.unmod, child.scissor.unmod ); - } - } - else if ( this.children.length > 0 ) { - throw new Error( 'Pane has ' + this.children.length + ' ' + ( this.children.length === 1 ? 'child' : 'children' ) + ', but its layout is ' + this.layout ); - } - // Notify - if ( viewportChanged ) { - this._viewportChanged.fire( ); - } - } + layoutOptions(pane: Pane): any { + return this._childFor(pane).layoutOptions; + } - paint( gl : WebGLRenderingContext ) { - var viewport = this._viewport.unmod; - var scissor = this._scissor.unmod; - if ( scissor.w > 0 && scissor.h > 0 ) { - // This pane - gl.viewport( viewport.i, viewport.j, viewport.w, viewport.h ); - gl.enable( GL.SCISSOR_TEST ); - gl.scissor( scissor.i, scissor.j, scissor.w, scissor.h ); - for ( var p = 0; p < this.painters.length; p++ ) { - this.painters[ p ]( gl, viewport ); - } - // Child panes - for ( var c = 0; c < this.children.length; c++ ) { - this.children.valueAt( c ).pane.paint( gl ); - } - } - } + private _childFor(pane: Pane): PaneChild { + return this.children.valueFor(getObjectId(pane)); + } - get viewport( ) : BoundsUnmodifiable { - return this._viewport.unmod; - } - get scissor( ) : BoundsUnmodifiable { - return this._scissor.unmod; - } + // Layout & Paint + // - get viewportChanged( ) : Notification { - return this._viewportChanged; + updatePrefSizes(result: Size) { + // Child panes + for (let c = 0; c < this.children.length; c++) { + let child = this.children.valueAt(c); + child.pane.updatePrefSizes(child.prefSize); } - - panesAt( i : number, j : number ) : Pane[] { - var result : Pane[] = [ ]; - this._panesAt( i, j, result ); - return result; + // This pane + if (hasval(this._layout) && hasval(this._layout.updatePrefSize)) { + this._layout.updatePrefSize(result, this.children.toArray()); + } + else { + result.w = null; + result.h = null; } + } - private _panesAt( i : number, j : number, result : Pane[] ) : boolean { - if ( this._scissor.contains( i, j ) ) { - for ( var c = this.children.length-1; c >= 0; c-- ) { - var consumed = this.children.valueAt( c ).pane._panesAt( i, j, result ); - if ( consumed ) return true; - } - if ( this.isInside( this._viewport.unmod, i, j ) ) { - result.push( this ); - return this.consumesInputEvents; - } + updateBounds(viewport: BoundsUnmodifiable, scissor: BoundsUnmodifiable) { + // This pane + let viewportChanged = (viewport.iStart !== this._viewport.iStart || viewport.iEnd !== this._viewport.iEnd || viewport.jStart !== this._viewport.jStart || viewport.jEnd !== this._viewport.jEnd); + this._viewport.setBounds(viewport); + this._scissor.setBounds(scissor); + // Child panes + if (hasval(this._layout) && hasval(this._layout.updateChildViewports)) { + this._layout.updateChildViewports(this.children.toArray(), viewport); + for (let c = 0; c < this.children.length; c++) { + let child = this.children.valueAt(c); + child.scissor.setBounds(child.viewport.unmod); + child.scissor.cropToBounds(scissor); + child.pane.updateBounds(child.viewport.unmod, child.scissor.unmod); } - return false; } - - - // Input Handling - // - - private _mouseUp : Notification1 = new Notification1( ); - private _mouseDown : Notification1 = new Notification1( ); - private _mouseMove : Notification1 = new Notification1( ); - private _mouseWheel : Notification1 = new Notification1( ); - private _mouseEnter : Notification1 = new Notification1( ); - private _mouseExit : Notification1 = new Notification1( ); - private _contextMenu : Notification1 = new Notification1( ); - - get mouseUp( ) : Notification1 { return this._mouseUp; } - get mouseDown( ) : Notification1 { return this._mouseDown; } - get mouseMove( ) : Notification1 { return this._mouseMove; } - get mouseWheel( ) : Notification1 { return this._mouseWheel; } - get mouseEnter( ) : Notification1 { return this._mouseEnter; } - get mouseExit( ) : Notification1 { return this._mouseExit; } - get contextMenu( ) : Notification1 { return this._contextMenu; } - - fireMouseUp( i : number, j : number, clickCount : number, mouseEvent : MouseEvent ) : any { - return this._mouseUp.fire( { paneViewport: this._viewport.unmod, i: i, j: j, clickCount: clickCount, mouseEvent: mouseEvent } ); + else if (this.children.length > 0) { + throw new Error('Pane has ' + this.children.length + ' ' + (this.children.length === 1 ? 'child' : 'children') + ', but its layout is ' + this.layout); } - - fireMouseDown( i : number, j : number, clickCount : number, mouseEvent : MouseEvent ) : any { - return this._mouseDown.fire( { paneViewport: this._viewport.unmod, i: i, j: j, clickCount: clickCount, mouseEvent: mouseEvent } ); - } - - fireMouseMove( i : number, j : number, mouseEvent : MouseEvent ) : any { - return this._mouseMove.fire( { paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent } ); + // Notify + if (viewportChanged) { + this._viewportChanged.fire(); } + } - fireMouseWheel( i : number, j : number, wheelSteps : number, mouseEvent : MouseEvent ) : any { - return this._mouseWheel.fire( { paneViewport: this._viewport.unmod, i: i, j: j, wheelSteps: wheelSteps, mouseEvent: mouseEvent } ); + paint(gl: WebGLRenderingContext) { + let viewport = this._viewport.unmod; + let scissor = this._scissor.unmod; + if (scissor.w > 0 && scissor.h > 0) { + // This pane + gl.viewport(viewport.i, viewport.j, viewport.w, viewport.h); + gl.enable(GL.SCISSOR_TEST); + gl.scissor(scissor.i, scissor.j, scissor.w, scissor.h); + for (let p = 0; p < this.painters.length; p++) { + this.painters[p](gl, viewport); + } + // Child panes + for (let c = 0; c < this.children.length; c++) { + this.children.valueAt(c).pane.paint(gl); + } } + } - fireMouseEnter( i : number, j : number, mouseEvent : MouseEvent ) : any { - return this._mouseEnter.fire( { paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent } ); - } + get viewport(): BoundsUnmodifiable { + return this._viewport.unmod; + } - fireMouseExit( i : number, j : number, mouseEvent : MouseEvent ) : any { - return this._mouseExit.fire( { paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent } ); - } + get scissor(): BoundsUnmodifiable { + return this._scissor.unmod; + } - fireContextMenu( i : number, j : number, mouseEvent : MouseEvent ) : any { - return this._contextMenu.fire( { paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent } ); - } + get viewportChanged(): Notification { + return this._viewportChanged; + } - // Disposal - // + panesAt(i: number, j: number): Pane[] { + let result: Pane[] = []; + this._panesAt(i, j, result); + return result; + } - get dispose( ) : Notification { - return this._dispose; + private _panesAt(i: number, j: number, result: Pane[]): boolean { + if (this._scissor.contains(i, j)) { + for (let c = this.children.length - 1; c >= 0; c--) { + let consumed = this.children.valueAt(c).pane._panesAt(i, j, result); + if (consumed) return true; + } + if (this.isInside(this._viewport.unmod, i, j)) { + result.push(this); + return this.consumesInputEvents; + } } + return false; } - export function requireGL( canvasElement : HTMLCanvasElement ) : WebGLRenderingContext { - // Wrapping the getContext calls in try-catch blocks may lose information. However, - // there are two reasons to do so: - // - // 1. We want to try 'experimental-webgl' even if 'webgl' throws an error - // 2. Throwing a custom error should make it easy to show a helpful message - // - // Reason 2 is particularly important on Firefox, where the error thrown by getContext - // has a completely uninformative message. - // + // Input Handling + // - try { - var glA = canvasElement.getContext( 'webgl' ); - if ( glA ) return glA; - } - catch ( e ) { } + private _mouseUp: Notification1 = new Notification1(); + private _mouseDown: Notification1 = new Notification1(); + private _mouseMove: Notification1 = new Notification1(); + private _mouseWheel: Notification1 = new Notification1(); + private _mouseEnter: Notification1 = new Notification1(); + private _mouseExit: Notification1 = new Notification1(); + private _contextMenu: Notification1 = new Notification1(); + + get mouseUp(): Notification1 { return this._mouseUp; } + get mouseDown(): Notification1 { return this._mouseDown; } + get mouseMove(): Notification1 { return this._mouseMove; } + get mouseWheel(): Notification1 { return this._mouseWheel; } + get mouseEnter(): Notification1 { return this._mouseEnter; } + get mouseExit(): Notification1 { return this._mouseExit; } + get contextMenu(): Notification1 { return this._contextMenu; } + + fireMouseUp(i: number, j: number, clickCount: number, mouseEvent: MouseEvent): any { + return this._mouseUp.fire({ paneViewport: this._viewport.unmod, i: i, j: j, clickCount: clickCount, mouseEvent: mouseEvent }); + } - try { - var glB = canvasElement.getContext( 'experimental-webgl' ); - if ( glB ) return glB; - } - catch ( e ) { } + fireMouseDown(i: number, j: number, clickCount: number, mouseEvent: MouseEvent): any { + return this._mouseDown.fire({ paneViewport: this._viewport.unmod, i: i, j: j, clickCount: clickCount, mouseEvent: mouseEvent }); + } - throw new Error( 'WebGLContextCreationError' ); + fireMouseMove(i: number, j: number, mouseEvent: MouseEvent): any { + return this._mouseMove.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent }); } + fireMouseWheel(i: number, j: number, wheelSteps: number, mouseEvent: MouseEvent): any { + return this._mouseWheel.fire({ paneViewport: this._viewport.unmod, i: i, j: j, wheelSteps: wheelSteps, mouseEvent: mouseEvent }); + } - function iMouse( element : HTMLElement, ev : MouseEvent ) : number { - return ( ev.clientX - element.getBoundingClientRect( ).left ); + fireMouseEnter(i: number, j: number, mouseEvent: MouseEvent): any { + return this._mouseEnter.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent }); } + fireMouseExit(i: number, j: number, mouseEvent: MouseEvent): any { + return this._mouseExit.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent }); + } - function jMouse( element : HTMLElement, ev : MouseEvent ) : number { - return ( element.clientHeight - ( ev.clientY - element.getBoundingClientRect( ).top ) ); + fireContextMenu(i: number, j: number, mouseEvent: MouseEvent): any { + return this._contextMenu.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent }); } + // Disposal + // - function mouseWheelSteps( ev : MouseWheelEvent ) : number { - // Firefox puts the scroll amount in the 'detail' field; everybody else puts it in 'wheelDelta' - // Firefox uses positive values for a downward scroll; everybody else uses positive for upward - var raw = ( ev.wheelDelta !== undefined ? ev.wheelDelta : -ev.detail ); - if ( raw > 0 ) { return -1; } - if ( raw < 0 ) { return +1; } - return 0; + get dispose(): Notification { + return this._dispose; } +} - // Button presses for mouse events are reported differently in different browsers: - // The results below are for the following browser versions: - // Chrome Version 40.0.2214.94 (64-bit) - // Firefox 35.0.1 - // IE 11.0.9600.17501 - // - // ‘mousemove’ event with left mouse button down: - // - // Chrome Firefox IE - // MouseEvent.button 0 0 0 - // MouseEvent.buttons 1 1 1 - // MouseEvent.which 1 1 1 - // - // ‘mousemove’ event with no mouse button down: - // - // Chrome Firefox IE - // MouseEvent.button 0 0 0 - // MouseEvent.buttons undefined 0 0 - // MouseEvent.which 0 1 1 + +export function requireGL(canvasElement: HTMLCanvasElement): WebGLRenderingContext { + // Wrapping the getContext calls in try-catch blocks may lose information. However, + // there are two reasons to do so: // + // 1. We want to try 'experimental-webgl' even if 'webgl' throws an error + // 2. Throwing a custom error should make it easy to show a helpful message // - // For more info see: http://stackoverflow.com/questions/3944122/detect-left-mouse-button-press + // Reason 2 is particularly important on Firefox, where the error thrown by getContext + // has a completely uninformative message. // - export function isLeftMouseDown( ev : MouseEvent ) { - // it appears that ev.buttons works across the board now, so ev.buttons === 1 is probably all that is necessary - if ( ev.buttons !== undefined ) { - return ev.buttons === 1; - } - else { - return ev.which === 1; - } + + try { + let glA = canvasElement.getContext('webgl'); + if (glA) return glA; } + catch (e) { } - // detects whether any mouse button is down - export function isMouseDown( ev : MouseEvent ) { - return ev.buttons !== 0; + try { + let glB = canvasElement.getContext('experimental-webgl'); + if (glB) return glB; } + catch (e) { } + + throw new Error('WebGLContextCreationError'); +} + + +function iMouse(element: HTMLElement, ev: MouseEvent): number { + return (ev.clientX - element.getBoundingClientRect().left); +} + + +function jMouse(element: HTMLElement, ev: MouseEvent): number { + return (element.clientHeight - (ev.clientY - element.getBoundingClientRect().top)); +} + + +function mouseWheelSteps(ev: MouseWheelEvent): number { + // Firefox puts the scroll amount in the 'detail' field; everybody else puts it in 'wheelDelta' + // Firefox uses positive values for a downward scroll; everybody else uses positive for upward + let raw = (ev.wheelDelta !== undefined ? ev.wheelDelta : -ev.detail); + if (raw > 0) { return -1; } + if (raw < 0) { return +1; } + return 0; +} + +// Button presses for mouse events are reported differently in different browsers: +// The results below are for the following browser versions: +// Chrome Version 40.0.2214.94 (64-bit) +// Firefox 35.0.1 +// IE 11.0.9600.17501 +// +// ‘mousemove’ event with left mouse button down: +// +// Chrome Firefox IE +// MouseEvent.button 0 0 0 +// MouseEvent.buttons 1 1 1 +// MouseEvent.which 1 1 1 +// +// ‘mousemove’ event with no mouse button down: +// +// Chrome Firefox IE +// MouseEvent.button 0 0 0 +// MouseEvent.buttons undefined 0 0 +// MouseEvent.which 0 1 1 +// +// +// For more info see: http://stackoverflow.com/questions/3944122/detect-left-mouse-button-press +// +export function isLeftMouseDown(ev: MouseEvent) { + // it appears that ev.buttons works across the board now, so ev.buttons === 1 is probably all that is necessary + if (ev.buttons !== undefined) { + return ev.buttons === 1; + } + else { + return ev.which === 1; + } +} - function attachEventListeners( element : HTMLElement, contentPane : Pane ) { +// detects whether any mouse button is down +export function isMouseDown(ev: MouseEvent) { + return ev.buttons !== 0; +} - function detectEntersAndExits( oldPanes : Pane[], newPanes : Pane[], i : number, j : number, mouseEvent : MouseEvent ) { - for ( var n = 0; n < oldPanes.length; n++ ) { - oldPanes[ n ][ 'isHovered' ] = false; - } - for ( var n = 0; n < newPanes.length; n++ ) { - newPanes[ n ][ 'isHovered' ] = true; - } - for ( var n = 0; n < oldPanes.length; n++ ) { - var oldPane = oldPanes[ n ]; - if ( !oldPane[ 'isHovered' ] ) { - oldPane.fireMouseExit( i, j, mouseEvent ); - } - } +function attachEventListeners(element: HTMLElement, contentPane: Pane) { - for ( var n = 0; n < newPanes.length; n++ ) { - newPanes[ n ][ 'wasHovered' ] = false; - } - for ( var n = 0; n < oldPanes.length; n++ ) { - oldPanes[ n ][ 'wasHovered' ] = true; + function detectEntersAndExits(oldPanes: Pane[], newPanes: Pane[], i: number, j: number, mouseEvent: MouseEvent) { + for (let n = 0; n < oldPanes.length; n++) { + oldPanes[n]['isHovered'] = false; + } + for (let n = 0; n < newPanes.length; n++) { + newPanes[n]['isHovered'] = true; + } + for (let n = 0; n < oldPanes.length; n++) { + let oldPane = oldPanes[n]; + if (!oldPane['isHovered']) { + oldPane.fireMouseExit(i, j, mouseEvent); } - for ( var n = 0; n < newPanes.length; n++ ) { - var newPane = newPanes[ n ]; - if ( !newPane[ 'wasHovered' ] ) { - newPane.fireMouseEnter( i, j, mouseEvent ); - } + } + + for (let n = 0; n < newPanes.length; n++) { + newPanes[n]['wasHovered'] = false; + } + for (let n = 0; n < oldPanes.length; n++) { + oldPanes[n]['wasHovered'] = true; + } + for (let n = 0; n < newPanes.length; n++) { + let newPane = newPanes[n]; + if (!newPane['wasHovered']) { + newPane.fireMouseEnter(i, j, mouseEvent); } } + } - // Support for reporting click count. Browsers handle reporting single/double - // clicks differently, so it's generally not a good idea to use both listeners - // at one. That's why it's done this way instead of using the 'dblclick' event. - var multiPressTimeout_MILLIS = 250; - var prevPress_PMILLIS = 0; - var clickCount = 1; + // Support for reporting click count. Browsers handle reporting single/double + // clicks differently, so it's generally not a good idea to use both listeners + // at one. That's why it's done this way instead of using the 'dblclick' event. + let multiPressTimeout_MILLIS = 250; + let prevPress_PMILLIS = 0; + let clickCount = 1; - var currentPanes : Pane[] = []; - var currentMouseCursor : string = null; - var dragging : boolean = false; - var pendingExit : boolean = false; + let currentPanes: Pane[] = []; + let currentMouseCursor: string = null; + let dragging: boolean = false; + let pendingExit: boolean = false; - function refreshMouseCursor( ) { - var newMouseCursor = null; - for ( var n = 0; n < currentPanes.length; n++ ) { - newMouseCursor = currentPanes[ n ].mouseCursor; - if ( hasval( newMouseCursor ) ) break; - } - if ( !hasval( newMouseCursor ) ) { - newMouseCursor = 'default'; - } - if ( newMouseCursor !== currentMouseCursor ) { - element.style.cursor = newMouseCursor; - currentMouseCursor = newMouseCursor; - } + function refreshMouseCursor() { + let newMouseCursor = null; + for (let n = 0; n < currentPanes.length; n++) { + newMouseCursor = currentPanes[n].mouseCursor; + if (hasval(newMouseCursor)) break; + } + if (!hasval(newMouseCursor)) { + newMouseCursor = 'default'; + } + if (newMouseCursor !== currentMouseCursor) { + element.style.cursor = newMouseCursor; + currentMouseCursor = newMouseCursor; } - refreshMouseCursor( ); - contentPane.mouseCursorChanged.on( refreshMouseCursor ); + } + refreshMouseCursor(); + contentPane.mouseCursorChanged.on(refreshMouseCursor); - element.addEventListener( 'mousedown', function( ev : MouseEvent ) { - var press_PMILLIS = ( new Date( ) ).getTime( ); - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + element.addEventListener('mousedown', function (ev: MouseEvent) { + let press_PMILLIS = (new Date()).getTime(); + let i = iMouse(element, ev); + let j = jMouse(element, ev); - if ( press_PMILLIS - prevPress_PMILLIS < multiPressTimeout_MILLIS ) { - clickCount++; - } - else { - clickCount = 1; - } - prevPress_PMILLIS = press_PMILLIS; + if (press_PMILLIS - prevPress_PMILLIS < multiPressTimeout_MILLIS) { + clickCount++; + } + else { + clickCount = 1; + } + prevPress_PMILLIS = press_PMILLIS; - var newPanes = contentPane.panesAt( i, j ); - detectEntersAndExits( currentPanes, newPanes, i, j, ev ); - currentPanes = newPanes; - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseDown( i, j, clickCount, ev ); - } - refreshMouseCursor( ); + let newPanes = contentPane.panesAt(i, j); + detectEntersAndExits(currentPanes, newPanes, i, j, ev); + currentPanes = newPanes; + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseDown(i, j, clickCount, ev); + } + refreshMouseCursor(); - dragging = true; + dragging = true; - // Disable browser-default double-click action, which selects text and messes up subsequent drags - ev.preventDefault( ); - } ); + // Disable browser-default double-click action, which selects text and messes up subsequent drags + ev.preventDefault(); + }); - // Only want NON-DRAG moves from the canvas (e.g. we don't want moves that occur in an overlay div) -- so subscribe to CANVAS's mousemove - element.addEventListener( 'mousemove', function( ev : MouseEvent ) { - if ( !dragging ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + // Only want NON-DRAG moves from the canvas (e.g. we don't want moves that occur in an overlay div) -- so subscribe to CANVAS's mousemove + element.addEventListener('mousemove', function (ev: MouseEvent) { + if (!dragging) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - var newPanes = contentPane.panesAt( i, j ); - detectEntersAndExits( currentPanes, newPanes, i, j, ev ); - currentPanes = newPanes; - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } - refreshMouseCursor( ); + let newPanes = contentPane.panesAt(i, j); + detectEntersAndExits(currentPanes, newPanes, i, j, ev); + currentPanes = newPanes; + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - } ); + refreshMouseCursor(); + } + }); - // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove - window.addEventListener( 'mousemove', function( ev : MouseEvent ) { - if ( dragging ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove + window.addEventListener('mousemove', function (ev: MouseEvent) { + if (dragging) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - } ); + } + }); - element.addEventListener( 'mouseout', function( ev : MouseEvent ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + element.addEventListener('mouseout', function (ev: MouseEvent) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - if ( dragging ) { - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } - pendingExit = true; + if (dragging) { + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - else { - detectEntersAndExits( currentPanes, [], i, j, ev ); - currentPanes = []; - refreshMouseCursor( ); - } - } ); + pendingExit = true; + } + else { + detectEntersAndExits(currentPanes, [], i, j, ev); + currentPanes = []; + refreshMouseCursor(); + } + }); - element.addEventListener( 'mouseover', function( ev : MouseEvent ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + element.addEventListener('mouseover', function (ev: MouseEvent) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - if ( dragging ) { - pendingExit = false; - } - else { - var newPanes = contentPane.panesAt( i, j ); - detectEntersAndExits( currentPanes, newPanes, i, j, ev ); - currentPanes = newPanes; - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } - refreshMouseCursor( ); + if (dragging) { + pendingExit = false; + } + else { + let newPanes = contentPane.panesAt(i, j); + detectEntersAndExits(currentPanes, newPanes, i, j, ev); + currentPanes = newPanes; + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - } ); + refreshMouseCursor(); + } + }); - var endDrag = function( ev : MouseEvent ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + let endDrag = function (ev: MouseEvent) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseUp( i, j, clickCount, ev ); - } + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseUp(i, j, clickCount, ev); + } - dragging = false; + dragging = false; - if ( pendingExit ) { - detectEntersAndExits( currentPanes, [], i, j, ev ); - currentPanes = []; - pendingExit = false; - refreshMouseCursor( ); - } - else { - var newPanes = contentPane.panesAt( i, j ); - detectEntersAndExits( currentPanes, newPanes, i, j, ev ); - currentPanes = newPanes; - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } - refreshMouseCursor( ); + if (pendingExit) { + detectEntersAndExits(currentPanes, [], i, j, ev); + currentPanes = []; + pendingExit = false; + refreshMouseCursor(); + } + else { + let newPanes = contentPane.panesAt(i, j); + detectEntersAndExits(currentPanes, newPanes, i, j, ev); + currentPanes = newPanes; + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - }; + refreshMouseCursor(); + } + }; + + // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window + window.addEventListener('mouseup', function (ev: MouseEvent) { + if (dragging) { + endDrag(ev); + } + }); + + // We don't receive mouse events that happen over another iframe -- even during a drag. If we miss a mouseup that + // should terminate a drag, we end up stuck in dragging mode, which makes for a really lousy user experience. To + // avoid that, whenever the mouse moves, check whether the button is down. If we're still in dragging mode, but + // the button is now up, end the drag. - // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window - window.addEventListener( 'mouseup', function( ev : MouseEvent ) { - if ( dragging ) { - endDrag( ev ); + // If we're dragging, and we see a mousemove with no buttons down, end the drag + let recentDrag: MouseEvent = null; + let handleMissedMouseUp = function (ev: MouseEvent) { + if (dragging) { + if (!isMouseDown(ev) && recentDrag) { + let mouseUp = document.createEvent('MouseEvents'); + mouseUp.initMouseEvent('mouseup', true, true, window, 0, recentDrag.screenX, recentDrag.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, recentDrag.ctrlKey, recentDrag.altKey, recentDrag.shiftKey, recentDrag.metaKey, 0, null); + endDrag(mouseUp); } - } ); - - // We don't receive mouse events that happen over another iframe -- even during a drag. If we miss a mouseup that - // should terminate a drag, we end up stuck in dragging mode, which makes for a really lousy user experience. To - // avoid that, whenever the mouse moves, check whether the button is down. If we're still in dragging mode, but - // the button is now up, end the drag. - - // If we're dragging, and we see a mousemove with no buttons down, end the drag - var recentDrag : MouseEvent = null; - var handleMissedMouseUp = function( ev : MouseEvent ) { - if ( dragging ) { - if ( !isMouseDown( ev ) && recentDrag ) { - var mouseUp = document.createEvent( 'MouseEvents' ); - mouseUp.initMouseEvent( 'mouseup', true, true, window, 0, recentDrag.screenX, recentDrag.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, recentDrag.ctrlKey, recentDrag.altKey, recentDrag.shiftKey, recentDrag.metaKey, 0, null ); - endDrag( mouseUp ); + recentDrag = ev; + } + }; + window.addEventListener('mousemove', handleMissedMouseUp); + let w = window; + while (w.parent !== w) { + try { + w.parent.addEventListener('mousemove', handleMissedMouseUp); + w = w.parent; + } + catch (e) { + // Cross-origin security may prevent us from adding a listener to a window other than our own -- in that case, + // the least bad option is to terminate drags on exit from the highest accessible window + w.addEventListener('mouseout', function (ev: MouseEvent) { + if (dragging) { + let mouseUp = document.createEvent('MouseEvents'); + mouseUp.initMouseEvent('mouseup', true, true, window, 0, ev.screenX, ev.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, ev.ctrlKey, ev.altKey, ev.shiftKey, ev.metaKey, 0, null); + endDrag(mouseUp); } - recentDrag = ev; - } - }; - window.addEventListener( 'mousemove', handleMissedMouseUp ); - var w = window; - while ( w.parent !== w ) { - try { - w.parent.addEventListener( 'mousemove', handleMissedMouseUp ); - w = w.parent; - } - catch ( e ) { - // Cross-origin security may prevent us from adding a listener to a window other than our own -- in that case, - // the least bad option is to terminate drags on exit from the highest accessible window - w.addEventListener( 'mouseout', function( ev : MouseEvent ) { - if ( dragging ) { - var mouseUp = document.createEvent( 'MouseEvents' ); - mouseUp.initMouseEvent( 'mouseup', true, true, window, 0, ev.screenX, ev.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, ev.ctrlKey, ev.altKey, ev.shiftKey, ev.metaKey, 0, null ); - endDrag( mouseUp ); - } - } ); - break; - } + }); + break; } + } - // Firefox uses event type 'DOMMouseScroll' for mouse-wheel events; everybody else uses 'mousewheel' - var handleMouseWheel = function( ev : MouseWheelEvent ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + // Firefox uses event type 'DOMMouseScroll' for mouse-wheel events; everybody else uses 'mousewheel' + let handleMouseWheel = function (ev: MouseWheelEvent) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - if ( dragging ) { - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } + if (dragging) { + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - else { - var newPanes = contentPane.panesAt( i, j ); - detectEntersAndExits( currentPanes, newPanes, i, j, ev ); - currentPanes = newPanes; - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } + } + else { + let newPanes = contentPane.panesAt(i, j); + detectEntersAndExits(currentPanes, newPanes, i, j, ev); + currentPanes = newPanes; + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } + } - var wheelSteps = mouseWheelSteps( ev ); - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseWheel( i, j, wheelSteps, ev ); - } - }; - element.addEventListener( 'mousewheel', handleMouseWheel ); - element.addEventListener( 'DOMMouseScroll', handleMouseWheel, false ); + let wheelSteps = mouseWheelSteps(ev); + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseWheel(i, j, wheelSteps, ev); + } + }; + element.addEventListener('mousewheel', handleMouseWheel); + element.addEventListener('DOMMouseScroll', handleMouseWheel, false); - element.addEventListener( 'contextmenu', function( ev : MouseEvent ) { - var i = iMouse( element, ev ); - var j = jMouse( element, ev ); + element.addEventListener('contextmenu', function (ev: MouseEvent) { + let i = iMouse(element, ev); + let j = jMouse(element, ev); - if ( dragging ) { - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } + if (dragging) { + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } - else { - var newPanes = contentPane.panesAt( i, j ); - detectEntersAndExits( currentPanes, newPanes, i, j, ev ); - currentPanes = newPanes; - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireMouseMove( i, j, ev ); - } - refreshMouseCursor( ); + } + else { + let newPanes = contentPane.panesAt(i, j); + detectEntersAndExits(currentPanes, newPanes, i, j, ev); + currentPanes = newPanes; + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireMouseMove(i, j, ev); } + refreshMouseCursor(); + } - for ( var n = 0; n < currentPanes.length; n++ ) { - currentPanes[ n ].fireContextMenu( i, j, ev ); - } + for (let n = 0; n < currentPanes.length; n++) { + currentPanes[n].fireContextMenu(i, j, ev); + } - // Disable browser-default context menu - ev.preventDefault( ); - } ); - } + // Disable browser-default context menu + ev.preventDefault(); + }); +} - export interface Drawable { - setContentPane( pane : Pane ); - redraw( ); +export interface Drawable { + setContentPane(pane: Pane): void; + redraw(): void; - getPrefSize( ) : Size; - prefSizeChanged( ) : Notification1; - } + getPrefSize(): Size; + prefSizeChanged(): Notification1; +} - export function newDrawable( canvas : HTMLCanvasElement ) : Drawable { - var contentPane : Pane = null; - var contentPrefSizeNotification = new Notification1( ); - var contentPrefSize = { w: null, h: null }; - var contentViewport = newBoundsFromRect( 0, 0, 0, 0 ); - var gl = requireGL( canvas ); - var pendingRequestId = null; - return { - setContentPane: function( pane : Pane ) { - if ( hasval( contentPane ) ) { - // XXX: Detach listeners from old contentPane - } - contentPane = pane; - attachEventListeners( canvas, contentPane ); - }, - redraw: function( ) { - if ( !hasval( pendingRequestId ) ) { - pendingRequestId = window.requestAnimationFrame( function( ) { - if ( hasval( contentPane ) ) { - - var oldPrefSize = { w: contentPrefSize.w, h: contentPrefSize.h }; - - contentPane.updatePrefSizes( contentPrefSize ); - contentViewport.setRect( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight ); - contentPane.updateBounds( contentViewport.unmod, contentViewport.unmod ); - contentPane.paint( gl ); - - // XXX: Trigger an enter/exit check somehow (fake a mouse-event?) - } - pendingRequestId = null; - - if ( oldPrefSize.w !== contentPrefSize.w || oldPrefSize.h !== contentPrefSize.h ) { - contentPrefSizeNotification.fire ( { w: contentPrefSize.w, h: contentPrefSize.h } ); - } - } ); - } - }, - getPrefSize: function( ) { - return { w: contentPrefSize.w, h: contentPrefSize.h }; - }, - prefSizeChanged: function( ) : Notification1 { - return contentPrefSizeNotification; +export function newDrawable(canvas: HTMLCanvasElement): Drawable { + let contentPane: Pane = null; + let contentPrefSizeNotification = new Notification1(); + let contentPrefSize = { w: null, h: null }; + let contentViewport = newBoundsFromRect(0, 0, 0, 0); + let gl = requireGL(canvas); + let pendingRequestId = null; + return { + setContentPane: function (pane: Pane) { + if (hasval(contentPane)) { + // XXX: Detach listeners from old contentPane } - }; - } + contentPane = pane; + attachEventListeners(canvas, contentPane); + }, + redraw: function () { + if (!hasval(pendingRequestId)) { + pendingRequestId = window.requestAnimationFrame(function () { + let oldPrefSize = { w: null, h: null } + if (hasval(contentPane)) { + + let oldPrefSize = { w: contentPrefSize.w, h: contentPrefSize.h }; + + contentPane.updatePrefSizes(contentPrefSize); + contentViewport.setRect(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); + contentPane.updateBounds(contentViewport.unmod, contentViewport.unmod); + contentPane.paint(gl); + + // XXX: Trigger an enter/exit check somehow (fake a mouse-event?) + } + pendingRequestId = null; + + if (oldPrefSize.w !== contentPrefSize.w || oldPrefSize.h !== contentPrefSize.h) { + contentPrefSizeNotification.fire({ w: contentPrefSize.w, h: contentPrefSize.h }); + } + }); + } + }, + getPrefSize: function () { + return { w: contentPrefSize.w, h: contentPrefSize.h }; + }, + prefSizeChanged: function (): Notification1 { + return contentPrefSizeNotification; + } + }; +} diff --git a/src/webglimpse/defs/moment.d.ts b/src/webglimpse/defs/moment.d.ts deleted file mode 100644 index f913ab6..0000000 --- a/src/webglimpse/defs/moment.d.ts +++ /dev/null @@ -1,327 +0,0 @@ -// Type definitions for Moment.js 2.5.0 -// Project: https://github.com/timrwood/moment -// Definitions by: Michael Lakerveld -// 2.4.0 Aaron King -// 2.5.0 Hiroki Horiuchi -// DefinitelyTyped: https://github.com/borisyankov/DefinitelyTyped - - -interface MomentInput { - years?: number; - y?: number; - months?: number; - M?: number; - weeks?: number; - w?: number; - days?: number; - d?: number; - hours?: number; - h?: number; - minutes?: number; - m?: number; - seconds?: number; - s?: number; - milliseconds?: number; - ms?: number; -} - - -interface Duration { - - humanize(): string; - - milliseconds(): number; - asMilliseconds(): number; - - seconds(): number; - asSeconds(): number; - - minutes(): number; - asMinutes(): number; - - hours(): number; - asHours(): number; - - days(): number; - asDays(): number; - - months(): number; - asMonths(): number; - - years(): number; - asYears(): number; - -} - -interface Moment { - - format(format: string): string; - format(): string; - - fromNow(withoutSuffix?: boolean): string; - - startOf(soort: string): Moment; - endOf(soort: string): Moment; - - add(input: MomentInput): Moment; - add(soort: string, aantal: number): Moment; - add(duration: Duration): Moment; - subtract(input: MomentInput): Moment; - subtract(soort: string, aantal: number): Moment; - - calendar(): string; - clone(): Moment; - - valueOf(): number; - - local(): Moment; // current date/time in local mode - - utc(): Moment; // current date/time in UTC mode - - isValid(): boolean; - - year(y: number): Moment; - year(): number; - quarter(): number; - month(M: number): Moment; - month(M: string): Moment; - month(): number; - day(d: number): Moment; - day(d: string): Moment; - day(): number; - date(d: number): Moment; - date(): number; - hours(h: number): Moment; - hours(): number; - minutes(m: number): Moment; - minutes(): number; - seconds(s: number): Moment; - seconds(): number; - milliseconds(ms: number): Moment; - milliseconds(): number; - weekday(): number; - weekday(d: number): Moment; - isoWeekday(): number; - isoWeekday(d: number): Moment; - weekYear(): number; - weekYear(d: number): Moment; - isoWeekYear(): number; - isoWeekYear(d: number): Moment; - week(): number; - week(d: number): Moment; - weeks(): number; - weeks(d: number): Moment; - isoWeek(): number; - isoWeek(d: number): Moment; - isoWeeks(): number; - isoWeeks(d: number): Moment; - - from(f: Moment): string; - from(f: Moment, suffix: boolean): string; - from(d: Date): string; - from(s: string): string; - from(date: number[]): string; - - diff(b: Moment): number; - diff(b: Moment, soort: string): number; - diff(b: Moment, soort: string, round: boolean): number; - - toDate(): Date; - toISOString(): string; - unix(): number; - - isLeapYear(): boolean; - zone(): number; - zone(b: number): Moment; - zone(b: string): Moment; - daysInMonth(): number; - isDST(): boolean; - - isBefore(): boolean; - isBefore(b: Moment): boolean; - isBefore(b: string): boolean; - isBefore(b: Number): boolean; - isBefore(b: Date): boolean; - isBefore(b: number[]): boolean; - isBefore(b: Moment, granularity: string): boolean; - isBefore(b: String, granularity: string): boolean; - isBefore(b: Number, granularity: string): boolean; - isBefore(b: Date, granularity: string): boolean; - isBefore(b: number[], granularity: string): boolean; - - isAfter(): boolean; - isAfter(b: Moment): boolean; - isAfter(b: string): boolean; - isAfter(b: Number): boolean; - isAfter(b: Date): boolean; - isAfter(b: number[]): boolean; - isAfter(b: Moment, granularity: string): boolean; - isAfter(b: String, granularity: string): boolean; - isAfter(b: Number, granularity: string): boolean; - isAfter(b: Date, granularity: string): boolean; - isAfter(b: number[], granularity: string): boolean; - - isSame(b: Moment): boolean; - isSame(b: string): boolean; - isSame(b: Number): boolean; - isSame(b: Date): boolean; - isSame(b: number[]): boolean; - isSame(b: Moment, granularity: string): boolean; - isSame(b: String, granularity: string): boolean; - isSame(b: Number, granularity: string): boolean; - isSame(b: Date, granularity: string): boolean; - isSame(b: number[], granularity: string): boolean; - - lang(language: string): void; - lang(reset: boolean): void; - lang(): string; - - max(date: Date): Moment; - max(date: number): Moment; - max(date: any[]): Moment; - max(date: string): Moment; - max(date: string, format: string): Moment; - max(clone: Moment): Moment; - - min(date: Date): Moment; - min(date: number): Moment; - min(date: any[]): Moment; - min(date: string): Moment; - min(date: string, format: string): Moment; - min(clone: Moment): Moment; - - get(unit: string): number; - set(unit: string, value: number): Moment; - -} - -interface MomentCalendar { - - lastDay: any; - sameDay: any; - nextDay: any; - lastWeek: any; - nextWeek: any; - sameElse: any; - -} - -interface MomentLanguage { - - months?: any; - monthsShort?: any; - weekdays?: any; - weekdaysShort?: any; - weekdaysMin?: any; - longDateFormat?: MomentLongDateFormat; - relativeTime?: MomentRelativeTime; - meridiem?: (hour: number, minute: number, isLowercase: boolean) => string; - calendar?: MomentCalendar; - ordinal?: (num: number) => string; - -} - -interface MomentLongDateFormat { - - L: string; - LL: string; - LLL: string; - LLLL: string; - LT: string; - l?: string; - ll?: string; - lll?: string; - llll?: string; - lt?: string; - -} - -interface MomentRelativeTime { - - future: any; - past: any; - s: any; - m: any; - mm: any; - h: any; - hh: any; - d: any; - dd: any; - M: any; - MM: any; - y: any; - yy: any; - -} - -interface MomentStatic { - - (): Moment; - (date: number): Moment; - (date: number[]): Moment; - (date: string, format?: string, strict?: boolean): Moment; - (date: string, format?: string, language?: string, strict?: boolean): Moment; - (date: string, formats: string[], strict?: boolean): Moment; - (date: string, formats: string[], language?: string, strict?: boolean): Moment; - (date: Date): Moment; - (date: Moment): Moment; - (date: Object): Moment; - - utc(): Moment; - utc(date: number): Moment; - utc(date: number[]): Moment; - utc(date: string, format?: string, strict?: boolean): Moment; - utc(date: string, format?: string, language?: string, strict?: boolean): Moment; - utc(date: string, formats: string[], strict?: boolean): Moment; - utc(date: string, formats: string[], language?: string, strict?: boolean): Moment; - utc(date: Date): Moment; - utc(date: Moment): Moment; - utc(date: Object): Moment; - - unix(timestamp: number): Moment; - - isMoment(): boolean; - isMoment(m: any): boolean; - lang(language: string): any; - lang(language: string, definition: MomentLanguage): any; - longDateFormat: any; - relativeTime: any; - meridiem: (hour: number, minute: number, isLowercase: boolean) => string; - calendar: any; - ordinal: (num: number) => string; - - duration(milliseconds: Number): Duration; - duration(num: Number, soort: string): Duration; - duration(input: MomentInput): Duration; - duration(object: any): Duration; - duration(): Duration; - - parseZone(date: string): Moment; - - months(): string[]; - months(index: number): string; - months(format: string): string[]; - months(format: string, index: number): string; - monthsShort(): string[]; - monthsShort(index: number): string; - monthsShort(format: string): string[]; - monthsShort(format: string, index: number): string; - weekdays(): string[]; - weekdays(index: number): string; - weekdays(format: string): string[]; - weekdays(format: string, index: number): string; - weekdaysShort(): string[]; - weekdaysShort(index: number): string; - weekdaysShort(format: string): string[]; - weekdaysShort(format: string, index: number): string; - weekdaysMin(): string[]; - weekdaysMin(index: number): string; - weekdaysMin(format: string): string[]; - weekdaysMin(format: string, index: number): string; - - normalizeUnits(unit: string): string; - - invalid(parsingFlags?: Object): Moment; -} - -declare var moment: MomentStatic; diff --git a/src/webglimpse/gradient.ts b/src/webglimpse/gradient.ts index 2f4b9a9..4baa9c5 100644 --- a/src/webglimpse/gradient.ts +++ b/src/webglimpse/gradient.ts @@ -27,68 +27,65 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Texture, FloatDataTexture2D } from './texture'; +// value: a number from 0-1 +// out: four component RGBA array indicating the gradient color for the input fraction +export interface Gradient { + (value: number): number[]; +} - // value: a number from 0-1 - // out: four component RGBA array indicating the gradient color for the input fraction - export interface Gradient { - ( value : number ) : number[]; - } - - // fills an array with jet colorscale values - // webgl does not support 1D textures, so a 2D texture must be used - export function jet( value : number ) : number[] { +// fills an array with jet colorscale values +// webgl does not support 1D textures, so a 2D texture must be used +export function jet(value: number): number[] { - var x = 4.0 * value; + let x = 4.0 * value; - var r = clamp( 1.5 - Math.abs( x - 3.0 ), 0, 1 ); - var g = clamp( 1.5 - Math.abs( x - 2.0 ), 0, 1 ); - var b = clamp( 1.5 - Math.abs( x - 1.0 ), 0, 1 ); + let r = clamp(1.5 - Math.abs(x - 3.0), 0, 1); + let g = clamp(1.5 - Math.abs(x - 2.0), 0, 1); + let b = clamp(1.5 - Math.abs(x - 1.0), 0, 1); - return [ r, g, b, 1.0 ]; - } + return [r, g, b, 1.0]; +} - export function reverseBone( value : number ) : number[] { - - var x = 1 - 0.875 * value; - if ( value < 0.375 ) - { - return [ x, x, x - value / 3, 1 ]; - } - else if ( value < 0.75 ) - { - return [ x, x + 0.125 - value / 3, x - 0.125, 1 ]; - } - else - { - return [ x + 0.375 - value * 0.5, x - 0.125, x - 0.125, 1 ]; - } +export function reverseBone(value: number): number[] { + let x = 1 - 0.875 * value; + if (value < 0.375) { + return [x, x, x - value / 3, 1]; + } + else if (value < 0.75) { + return [x, x + 0.125 - value / 3, x - 0.125, 1]; + } + else { + return [x + 0.375 - value * 0.5, x - 0.125, x - 0.125, 1]; } - export function getGradientTexture( gradient : Gradient, size : number = 1024 ) : Texture { - var array = new Float32Array( size * 4 ); +} - for ( var v = 0 ; v < size ; v++ ) { - var color = gradient( v / size ); +export function getGradientTexture(gradient: Gradient, size: number = 1024): Texture { + let array = new Float32Array(size * 4); - array[ 4*v + 0 ] = color[0]; - array[ 4*v + 1 ] = color[1]; - array[ 4*v + 2 ] = color[2]; - array[ 4*v + 3 ] = color[3]; - } + for (let v = 0; v < size; v++) { + let color = gradient(v / size); - return new FloatDataTexture2D( size, 1, array ); + array[4 * v + 0] = color[0]; + array[4 * v + 1] = color[1]; + array[4 * v + 2] = color[2]; + array[4 * v + 3] = color[3]; } - function clamp( n : number, min : number, max : number ) : number { - if ( n < min ) { - return min; - } - else if ( n > max ) { - return max; - } - else { - return n; - } + return new FloatDataTexture2D(size, 1, array); +} + +function clamp(n: number, min: number, max: number): number { + if (n < min) { + return min; + } + else if (n > max) { + return max; + } + else { + return n; } +} diff --git a/src/webglimpse/label.ts b/src/webglimpse/label.ts index 3089ea1..1aa9f0d 100644 --- a/src/webglimpse/label.ts +++ b/src/webglimpse/label.ts @@ -27,130 +27,134 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import {Color, sameColor} from './color'; +import {TextTextureFactory, TextTexture2D, createTextTextureFactory} from './text'; +import {Size, BoundsUnmodifiable} from './bounds'; +import {TextureRenderer} from './texture'; +import {GL, hasval} from './util/util'; +import {xFrac, yFrac, LayoutPhase1} from './core'; + +export class Label { + private _font: string; + private _fgColor: Color; + private _bgColor: Color; + private _text: string; + private _textureFactory: TextTextureFactory; + private _texture: TextTexture2D; + + constructor(text?: string, font?: string, fgColor?: Color, bgColor?: Color) { + this._font = font; + this._text = text; + this._fgColor = fgColor; + this._bgColor = bgColor; + } + get font(): string { + return this._font; + } - - export class Label { - private _font : string; - private _fgColor : Color; - private _bgColor : Color; - private _text : string; - private _textureFactory : TextTextureFactory; - private _texture : TextTexture2D; - - constructor( text? : string, font? : string, fgColor? : Color, bgColor? : Color ) { + set font(font: string) { + if (this._font !== font) { this._font = font; - this._text = text; - this._fgColor = fgColor; - this._bgColor = bgColor; - } - - get font( ) : string { - return this._font; - } - - set font( font : string ) { - if ( this._font !== font ) { - this._font = font; - this._textureFactory = null; - if ( this._texture ) { - this._texture.dispose( ); - this._texture = null; - } + this._textureFactory = null; + if (this._texture) { + this._texture.dispose(); + this._texture = null; } } + } - // retained for backwards compatibility, should use fgColor - get color( ) : Color { - return this._fgColor; - } + // retained for backwards compatibility, should use fgColor + get color(): Color { + return this._fgColor; + } - // retained for backwards compatibility, should use fgColor - set color( fgColor : Color ) { - if ( !sameColor( this._fgColor, fgColor ) ) { - this._fgColor = fgColor; - if ( this._texture ) { - this._texture.dispose( ); - this._texture = null; - } + // retained for backwards compatibility, should use fgColor + set color(fgColor: Color) { + if (!sameColor(this._fgColor, fgColor)) { + this._fgColor = fgColor; + if (this._texture) { + this._texture.dispose(); + this._texture = null; } } + } - get fgColor( ) : Color { - return this._fgColor; - } + get fgColor(): Color { + return this._fgColor; + } - set fgColor( fgColor : Color ) { - if ( !sameColor( this._fgColor, fgColor ) ) { - this._fgColor = fgColor; - if ( this._texture ) { - this._texture.dispose( ); - this._texture = null; - } + set fgColor(fgColor: Color) { + if (!sameColor(this._fgColor, fgColor)) { + this._fgColor = fgColor; + if (this._texture) { + this._texture.dispose(); + this._texture = null; } } + } - get bgColor( ) : Color { - return this._bgColor; - } + get bgColor(): Color { + return this._bgColor; + } - set bgColor( bgColor : Color ) { - if ( !sameColor( this._bgColor, bgColor ) ) { - this._bgColor = bgColor; - } + set bgColor(bgColor: Color) { + if (!sameColor(this._bgColor, bgColor)) { + this._bgColor = bgColor; } + } - get text( ) : string { - return this._text; - } + get text(): string { + return this._text; + } - set text( text : string ) { - if ( this._text !== text ) { - this._text = text; - if ( this._texture ) { - this._texture.dispose( ); - this._texture = null; - } + set text(text: string) { + if (this._text !== text) { + this._text = text; + if (this._texture) { + this._texture.dispose(); + this._texture = null; } } + } - get texture( ) : TextTexture2D { - if ( !this._textureFactory ) { - this._textureFactory = ( this._font ? createTextTextureFactory( this._font ) : null ); - } - if ( !this._texture ) { - this._texture = ( this._fgColor && this._text ? this._textureFactory( this._fgColor, this._text ) : null ); - } - return this._texture; + get texture(): TextTexture2D { + if (!this._textureFactory) { + this._textureFactory = (this._font ? createTextTextureFactory(this._font) : null); + } + if (!this._texture) { + this._texture = (this._fgColor && this._text ? this._textureFactory(this._fgColor, this._text) : null); } + return this._texture; } +} - export function fitToLabel( label : Label ) { - return function( parentPrefSize : Size ) { - var texture = label.texture; - parentPrefSize.w = ( texture ? texture.w : 0 ); - parentPrefSize.h = ( texture ? texture.h : 0 ); - }; - } +export function fitToLabel(label: Label): LayoutPhase1 { + return function (parentPrefSize: Size): void { + let texture = label.texture; + parentPrefSize.w = (texture ? texture.w : 0); + parentPrefSize.h = (texture ? texture.h : 0); + }; +} - export function newLabelPainter( label : Label, xFrac : number, yFrac : number, xAnchor? : number, yAnchor? : number, rotation_CCWRAD? : number ) { - var textureRenderer = new TextureRenderer( ); - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { +export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnchor?: number, yAnchor?: number, rotation_CCWRAD?: number) { + let textureRenderer = new TextureRenderer(); + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - if ( hasval( label.bgColor ) ) { - gl.clearColor( label.bgColor.r, label.bgColor.g, label.bgColor.b, label.bgColor.a ); - gl.clear( GL.COLOR_BUFFER_BIT ); - } + if (hasval(label.bgColor)) { + gl.clearColor(label.bgColor.r, label.bgColor.g, label.bgColor.b, label.bgColor.a); + gl.clear(GL.COLOR_BUFFER_BIT); + } - var texture = label.texture; - if ( texture ) { - textureRenderer.begin( gl, viewport ); - textureRenderer.draw( gl, texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: texture.yAnchor( yAnchor ), rotation_CCWRAD: rotation_CCWRAD } ); - textureRenderer.end( gl ); - } - }; - } + let texture = label.texture; + if (texture) { + textureRenderer.begin(gl, viewport); + textureRenderer.draw(gl, texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: texture.yAnchor(yAnchor), rotation_CCWRAD: rotation_CCWRAD }); + textureRenderer.end(gl); + } + }; +} diff --git a/src/webglimpse/layout/card_layout.ts b/src/webglimpse/layout/card_layout.ts index f1394db..50edaf1 100644 --- a/src/webglimpse/layout/card_layout.ts +++ b/src/webglimpse/layout/card_layout.ts @@ -27,78 +27,80 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Layout, LayoutEntry } from '../core'; +import { Size, BoundsUnmodifiable } from '../bounds'; +import { hasval } from '../util/util'; +/** + * A layout similar to overlay_layout except only one child pane is visible at a time. + * That child pane has its size set to the size of the parent pane. The other children panes + * are made invisible until they are the active pane. + * + * The layoutArg for each child is a boolean, true if it should be the active pane. One is chosen + * arbitrarily if multiple panes have true layoutArg. + */ +export function newCardLayout(): Layout { - /** - * A layout similar to overlay_layout except only one child pane is visible at a time. - * That child pane has its size set to the size of the parent pane. The other children panes - * are made invisible until they are the active pane. - * - * The layoutArg for each child is a boolean, true if it should be the active pane. One is chosen - * arbitrarily if multiple panes have true layoutArg. - */ - export function newCardLayout( ): Layout { - - return { + return { - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - var activeChild : LayoutEntry; + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + let activeChild: LayoutEntry; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - var isActive = child.layoutArg; - if ( isActive ) { - activeChild = child; - } + for (let c = 0; c < children.length; c++) { + let child = children[c]; + let isActive = child.layoutArg; + if (isActive) { + activeChild = child; } + } - if ( hasval( activeChild ) ) { + if (hasval(activeChild)) { - var childPrefSize = activeChild.prefSize; + let childPrefSize = activeChild.prefSize; - var childPrefWidth = childPrefSize.w; - if ( hasval( childPrefWidth ) ) { - parentPrefSize.w = childPrefWidth; - } - else { - parentPrefSize.w = null; - } + let childPrefWidth = childPrefSize.w; + if (hasval(childPrefWidth)) { + parentPrefSize.w = childPrefWidth; + } + else { + parentPrefSize.w = null; + } - var childPrefHeight = childPrefSize.h; - if ( hasval( childPrefHeight ) ) { - parentPrefSize.h = childPrefHeight; - } - else { - parentPrefSize.h = null; - } + let childPrefHeight = childPrefSize.h; + if (hasval(childPrefHeight)) { + parentPrefSize.h = childPrefHeight; } else { - parentPrefSize.w = 0; - parentPrefSize.h = 0; + parentPrefSize.h = null; } - }, + } + else { + parentPrefSize.w = 0; + parentPrefSize.h = 0; + } + }, - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - var activeChildIndex : number; + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + let activeChildIndex: number; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - var isActive = child.layoutArg; - if ( isActive ) { - activeChildIndex = c; - } + for (let c = 0; c < children.length; c++) { + let child = children[c]; + let isActive = child.layoutArg; + if (isActive) { + activeChildIndex = c; } + } - for ( var c = 0; c < children.length; c++ ) { - if ( c === activeChildIndex ) { - children[ c ].viewport.setBounds( parentViewport ); - } - else { - children[ c ].viewport.setEdges( 0, 0, 0, 0 ); - } + for (let c = 0; c < children.length; c++) { + if (c === activeChildIndex) { + children[c].viewport.setBounds(parentViewport); + } + else { + children[c].viewport.setEdges(0, 0, 0, 0); } } + } - }; - } + }; +} diff --git a/src/webglimpse/layout/column_layout.ts b/src/webglimpse/layout/column_layout.ts index 2ac6ff9..6ff4970 100644 --- a/src/webglimpse/layout/column_layout.ts +++ b/src/webglimpse/layout/column_layout.ts @@ -27,148 +27,150 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { LayoutEntry, Layout } from '../core'; +import { Size, BoundsUnmodifiable } from '../bounds'; +import { hasval, isNumber } from '../util/util'; +function childWidth(child: LayoutEntry): number { + let usePrefWidth = (!hasval(child.layoutOptions) || child.layoutOptions.width === undefined || child.layoutOptions.width === 'pref'); + return (usePrefWidth ? child.prefSize.w : child.layoutOptions.width); +} - function childWidth( child : LayoutEntry ) : number { - var usePrefWidth = ( !hasval( child.layoutOptions ) || child.layoutOptions.width === undefined || child.layoutOptions.width === 'pref' ); - return ( usePrefWidth ? child.prefSize.w : child.layoutOptions.width ); - } +export function newColumnLayout(leftToRight: boolean = true): Layout { - export function newColumnLayout( leftToRight : boolean = true ) : Layout { + return { - return { - - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - var childrenToPlace = [ ]; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - if ( isNumber( child.layoutArg ) && !( child.layoutOptions && child.layoutOptions.hide ) ) { - childrenToPlace.push( child ); - } + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + let childrenToPlace = []; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { + childrenToPlace.push(child); } + } - var hMax = 0; - var wSum = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - - var honorChildHeight = !( child.layoutOptions && child.layoutOptions.ignoreHeight ); - if ( honorChildHeight ) { - var h = child.prefSize.h; - if ( hasval( hMax ) && hasval( h ) ) { - hMax = Math.max( hMax, h ); - } - else { - hMax = null; - } - } + let hMax = 0; + let wSum = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; - var w = childWidth( child ); - if ( hasval( wSum ) && hasval( w ) ) { - wSum += w; - } - else { - wSum = null; - } - } - parentPrefSize.w = wSum; - parentPrefSize.h = hMax; - }, - - - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - var childrenToPlace = [ ]; - var childrenToHide = [ ]; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - if ( isNumber( child.layoutArg ) && !( child.layoutOptions && child.layoutOptions.hide ) ) { - childrenToPlace.push( child ); + let honorChildHeight = !(child.layoutOptions && child.layoutOptions.ignoreHeight); + if (honorChildHeight) { + let h = child.prefSize.h; + if (hasval(hMax) && hasval(h)) { + hMax = Math.max(hMax, h); } else { - childrenToHide.push( child ); + hMax = null; } } - // Use the original index to make the sort stable - var indexProp = 'webglimpse_columnLayout_index'; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - child[ indexProp ] = c; + let w = childWidth(child); + if (hasval(wSum) && hasval(w)) { + wSum += w; } + else { + wSum = null; + } + } + parentPrefSize.w = wSum; + parentPrefSize.h = hMax; + }, + + + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + let childrenToPlace = []; + let childrenToHide = []; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { + childrenToPlace.push(child); + } + else { + childrenToHide.push(child); + } + } - childrenToPlace.sort( function( a : LayoutEntry, b : LayoutEntry ) { - var orderDiff = a.layoutArg - b.layoutArg; - return ( orderDiff !== 0 ? orderDiff : ( a[ indexProp ] - b[ indexProp ] ) ); - } ); - - var numFlexible = 0; - var totalFlexWidth = parentViewport.w; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var w = childWidth( childrenToPlace[ c ] ); - if ( hasval( w ) ) { - totalFlexWidth -= w; + // Use the original index to make the sort stable + let indexProp = 'webglimpse_columnLayout_index'; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; + child[indexProp] = c; + } + + childrenToPlace.sort(function (a: LayoutEntry, b: LayoutEntry) { + let orderDiff = a.layoutArg - b.layoutArg; + return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp])); + }); + + let numFlexible = 0; + let totalFlexWidth = parentViewport.w; + for (let c = 0; c < childrenToPlace.length; c++) { + let w = childWidth(childrenToPlace[c]); + if (hasval(w)) { + totalFlexWidth -= w; + } + else { + numFlexible++; + } + } + let flexWidth = totalFlexWidth / numFlexible; + + if (leftToRight) { + let jStart = parentViewport.jStart; + let jEnd = parentViewport.jEnd; + let iStart = parentViewport.iStart; + let iRemainder = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; + + let iEnd: number; + let w = childWidth(child); + if (hasval(w)) { + iEnd = iStart + w; } else { - numFlexible++; + let iEnd0 = iStart + flexWidth + iRemainder; + iEnd = Math.round(iEnd0); + iRemainder = iEnd0 - iEnd; } + + child.viewport.setEdges(iStart, iEnd, jStart, jEnd); + iStart = iEnd; } - var flexWidth = totalFlexWidth / numFlexible; - - if ( leftToRight ) { - var jStart = parentViewport.jStart; - var jEnd = parentViewport.jEnd; - var iStart = parentViewport.iStart; - var iRemainder = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - - var iEnd : number; - var w = childWidth( child ); - if ( hasval( w ) ) { - iEnd = iStart + w; - } - else { - var iEnd0 = iStart + flexWidth + iRemainder; - iEnd = Math.round( iEnd0 ); - iRemainder = iEnd0 - iEnd; - } - - child.viewport.setEdges( iStart, iEnd, jStart, jEnd ); - iStart = iEnd; + } + else { + let jStart = parentViewport.jStart; + let jEnd = parentViewport.jEnd; + let iEnd = parentViewport.iEnd; + let iRemainder = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; + + let iStart: number; + let w = childWidth(child); + if (hasval(w)) { + iStart = iEnd - w; } - } - else { - var jStart = parentViewport.jStart; - var jEnd = parentViewport.jEnd; - var iEnd = parentViewport.iEnd; - var iRemainder = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - - var iStart : number; - var w = childWidth( child ); - if ( hasval( w ) ) { - iStart = iEnd - w; - } - else { - var iStart0 = iEnd - flexWidth - iRemainder; - iStart = Math.round( iStart0 ); - iRemainder = iStart - iStart0; - } - - child.viewport.setEdges( iStart, iEnd, jStart, jEnd ); - iEnd = iStart; + else { + let iStart0 = iEnd - flexWidth - iRemainder; + iStart = Math.round(iStart0); + iRemainder = iStart - iStart0; } - } - for ( var c = 0; c < childrenToHide.length; c++ ) { - childrenToHide[ c ].viewport.setEdges( 0, 0, 0, 0 ); + child.viewport.setEdges(iStart, iEnd, jStart, jEnd); + iEnd = iStart; } } + for (let c = 0; c < childrenToHide.length; c++) { + childrenToHide[c].viewport.setEdges(0, 0, 0, 0); + } + } + - }; - } + }; +} diff --git a/src/webglimpse/layout/corner_layout.ts b/src/webglimpse/layout/corner_layout.ts index 345deba..4142e93 100644 --- a/src/webglimpse/layout/corner_layout.ts +++ b/src/webglimpse/layout/corner_layout.ts @@ -27,56 +27,59 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Side } from '../misc'; +import { Layout, LayoutEntry } from '../core'; +import { Size, BoundsUnmodifiable } from '../bounds'; +import { hasval } from '../util/util'; +export function newCornerLayout(hSide: Side, vSide: Side): Layout { + return { + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + if (children.length === 1) { + let childPrefSize = children[0].prefSize; + parentPrefSize.w = childPrefSize.w; + parentPrefSize.h = childPrefSize.h; + } + else if (children.length > 1) { + throw new Error('Corner layout only works with 1 child, but pane has ' + this.children.length + ' children'); + } + }, + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + if (children.length === 1) { + let child = children[0]; - export function newCornerLayout( hSide : Side, vSide : Side ) : Layout { - return { - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - if ( children.length === 1 ) { - var childPrefSize = children[ 0 ].prefSize; - parentPrefSize.w = childPrefSize.w; - parentPrefSize.h = childPrefSize.h; + let iStart; + let iEnd; + let w = child.prefSize.w; + if (hSide === Side.RIGHT) { + iEnd = parentViewport.iEnd; + iStart = (hasval(w) ? Math.max(iEnd - w, parentViewport.iStart) : parentViewport.iStart); } - else if ( children.length > 1 ) { - throw new Error( 'Corner layout only works with 1 child, but pane has ' + this.children.length + ' children' ); + else { + iStart = parentViewport.iStart; + iEnd = (hasval(w) ? Math.min(iStart + w, parentViewport.iEnd) : parentViewport.iEnd); } - }, - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - if ( children.length === 1 ) { - var child = children[ 0 ]; - - var iStart; - var iEnd; - var w = child.prefSize.w; - if ( hSide === Side.RIGHT ) { - iEnd = parentViewport.iEnd; - iStart = ( hasval( w ) ? Math.max( iEnd-w, parentViewport.iStart ) : parentViewport.iStart ); - } - else { - iStart = parentViewport.iStart; - iEnd = ( hasval( w ) ? Math.min( iStart+w, parentViewport.iEnd ) : parentViewport.iEnd ); - } - var jStart; - var jEnd; - var h = child.prefSize.h; - if ( vSide === Side.BOTTOM ) { - jStart = parentViewport.jStart; - jEnd = ( hasval( h ) ? Math.min( jStart+h, parentViewport.jEnd ) : parentViewport.jEnd ); - } - else { - jEnd = parentViewport.jEnd; - jStart = ( hasval( h ) ? Math.max( jEnd-h, parentViewport.jStart ) : parentViewport.jStart ); - } - - child.viewport.setEdges( iStart, iEnd, jStart, jEnd ); + let jStart; + let jEnd; + let h = child.prefSize.h; + if (vSide === Side.BOTTOM) { + jStart = parentViewport.jStart; + jEnd = (hasval(h) ? Math.min(jStart + h, parentViewport.jEnd) : parentViewport.jEnd); } - else if ( children.length > 1 ) { - throw new Error( 'Corner layout only works with 1 child, but pane has ' + this.children.length + ' children' ); + else { + jEnd = parentViewport.jEnd; + jStart = (hasval(h) ? Math.max(jEnd - h, parentViewport.jStart) : parentViewport.jStart); } + + child.viewport.setEdges(iStart, iEnd, jStart, jEnd); + } + else if (children.length > 1) { + throw new Error('Corner layout only works with 1 child, but pane has ' + this.children.length + ' children'); } - }; - } + } + }; +} diff --git a/src/webglimpse/layout/inset_layout.ts b/src/webglimpse/layout/inset_layout.ts index 4946183..74cc0fe 100644 --- a/src/webglimpse/layout/inset_layout.ts +++ b/src/webglimpse/layout/inset_layout.ts @@ -27,97 +27,101 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - export interface Insets { - top : number; - right : number; - bottom : number; - left : number; +import { Layout, LayoutEntry, Pane } from '../core'; +import { Size, BoundsUnmodifiable } from '../bounds'; +import { Color } from '../color'; +import { newBackgroundPainter } from '../misc'; +import { hasval } from '../util/util'; + + +export interface Insets { + top: number; + right: number; + bottom: number; + left: number; +} + + +export function newInsets(...insets: number[]): Insets { + switch (insets.length) { + + case 1: + return { + top: insets[0], + right: insets[0], + bottom: insets[0], + left: insets[0] + }; + + case 2: + return { + top: insets[0], + right: insets[1], + bottom: insets[0], + left: insets[1] + }; + + case 3: + return { + top: insets[0], + right: insets[1], + bottom: insets[2], + left: insets[1] + }; + + case 4: + return { + top: insets[0], + right: insets[1], + bottom: insets[2], + left: insets[3] + }; + + default: + throw new Error('Expected 1, 2, 3, or 4 args, but found ' + insets.length); } +} - export function newInsets( ...insets : number[] ) : Insets { - switch ( insets.length ) { - - case 1: - return { - top: insets[ 0 ], - right: insets[ 0 ], - bottom: insets[ 0 ], - left: insets[ 0 ] - }; - - case 2: - return { - top: insets[ 0 ], - right: insets[ 1 ], - bottom: insets[ 0 ], - left: insets[ 1 ] - }; - - case 3: - return { - top: insets[ 0 ], - right: insets[ 1 ], - bottom: insets[ 2 ], - left: insets[ 1 ] - }; - - case 4: - return { - top: insets[ 0 ], - right: insets[ 1 ], - bottom: insets[ 2 ], - left: insets[ 3 ] - }; - - default: - throw new Error( 'Expected 1, 2, 3, or 4 args, but found ' + insets.length ); - } - } - - - export function newInsetLayout( insets : Insets ) : Layout { - return { - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - if ( children.length === 0 ) { - parentPrefSize.w = insets.left + insets.right; - parentPrefSize.h = insets.top + insets.bottom; - } - else if ( children.length === 1 ) { - var childPrefSize = children[ 0 ].prefSize; - parentPrefSize.w = ( hasval( childPrefSize.w ) ? childPrefSize.w + insets.left + insets.right : null ); - parentPrefSize.h = ( hasval( childPrefSize.h ) ? childPrefSize.h + insets.top + insets.bottom : null ); - } - else if ( children.length > 1 ) { - throw new Error( 'Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children' ); - } - }, - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - if ( children.length === 1 ) { - var childViewport = children[ 0 ].viewport; - childViewport.setEdges( parentViewport.iStart + insets.left, - parentViewport.iEnd - insets.right, - parentViewport.jStart + insets.bottom, - parentViewport.jEnd - insets.top ); - } - else if ( children.length > 1 ) { - throw new Error( 'Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children' ); - } +export function newInsetLayout(insets: Insets): Layout { + return { + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + if (children.length === 0) { + parentPrefSize.w = insets.left + insets.right; + parentPrefSize.h = insets.top + insets.bottom; } - }; - } + else if (children.length === 1) { + let childPrefSize = children[0].prefSize; + parentPrefSize.w = (hasval(childPrefSize.w) ? childPrefSize.w + insets.left + insets.right : null); + parentPrefSize.h = (hasval(childPrefSize.h) ? childPrefSize.h + insets.top + insets.bottom : null); + } + else if (children.length > 1) { + throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children'); + } + }, + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + if (children.length === 1) { + let childViewport = children[0].viewport; + childViewport.setEdges(parentViewport.iStart + insets.left, + parentViewport.iEnd - insets.right, + parentViewport.jStart + insets.bottom, + parentViewport.jEnd - insets.top); + } + else if (children.length > 1) { + throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children'); + } + } + }; +} - export function newInsetPane( pane : Pane, insets : Insets, bgColor : Color = null, consumeInputEvents : boolean = true ) : Pane { - var insetPane = new Pane( newInsetLayout( insets ), consumeInputEvents ); - if ( hasval( bgColor ) ) { - insetPane.addPainter( newBackgroundPainter( bgColor ) ); - } - insetPane.addPane( pane ); - return insetPane; +export function newInsetPane(pane: Pane, insets: Insets, bgColor: Color = null, consumeInputEvents: boolean = true): Pane { + let insetPane = new Pane(newInsetLayout(insets), consumeInputEvents); + if (hasval(bgColor)) { + insetPane.addPainter(newBackgroundPainter(bgColor)); } + insetPane.addPane(pane); + return insetPane; +} diff --git a/src/webglimpse/layout/overlay_layout.ts b/src/webglimpse/layout/overlay_layout.ts index ccf21c0..ef52c34 100644 --- a/src/webglimpse/layout/overlay_layout.ts +++ b/src/webglimpse/layout/overlay_layout.ts @@ -27,63 +27,65 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Layout, LayoutEntry } from '../core'; +import { Size, BoundsUnmodifiable } from '../bounds'; +import { isEmpty, hasval } from '../util/util'; +/** + * Simple layout which sets the sizes of all child panes to the size of the parent pane + * (causing all the children to 'overlay' each other and the parent). + */ +export function newOverlayLayout(): Layout { - /** - * Simple layout which sets the sizes of all child panes to the size of the parent pane - * (causing all the children to 'overlay' each other and the parent). - */ - export function newOverlayLayout( ): Layout { - - return { + return { - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - var underlays : LayoutEntry[] = []; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - var isUnderlay = child.layoutArg; - if ( isUnderlay ) { - underlays.push( child ); - } + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + let underlays: LayoutEntry[] = []; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + let isUnderlay = child.layoutArg; + if (isUnderlay) { + underlays.push(child); } + } - if ( !isEmpty( underlays ) ) { - var maxChildPrefWidth = 0; - var maxChildPrefHeight = 0; - for ( var c = 0; c < underlays.length; c++ ) { - var childPrefSize = underlays[ c ].prefSize; + if (!isEmpty(underlays)) { + let maxChildPrefWidth = 0; + let maxChildPrefHeight = 0; + for (let c = 0; c < underlays.length; c++) { + let childPrefSize = underlays[c].prefSize; - var childPrefWidth = childPrefSize.w; - if ( hasval( maxChildPrefWidth ) && hasval( childPrefWidth ) ) { - maxChildPrefWidth = Math.max( maxChildPrefWidth, childPrefWidth ); - } - else { - maxChildPrefWidth = null; - } + let childPrefWidth = childPrefSize.w; + if (hasval(maxChildPrefWidth) && hasval(childPrefWidth)) { + maxChildPrefWidth = Math.max(maxChildPrefWidth, childPrefWidth); + } + else { + maxChildPrefWidth = null; + } - var childPrefHeight = childPrefSize.h; - if ( hasval( maxChildPrefHeight ) && hasval( childPrefHeight ) ) { - maxChildPrefHeight = Math.max( maxChildPrefHeight, childPrefHeight ); - } - else { - maxChildPrefHeight = null; - } + let childPrefHeight = childPrefSize.h; + if (hasval(maxChildPrefHeight) && hasval(childPrefHeight)) { + maxChildPrefHeight = Math.max(maxChildPrefHeight, childPrefHeight); + } + else { + maxChildPrefHeight = null; } - parentPrefSize.w = maxChildPrefWidth; - parentPrefSize.h = maxChildPrefHeight; - } - else { - parentPrefSize.w = 0; - parentPrefSize.h = 0; } - }, + parentPrefSize.w = maxChildPrefWidth; + parentPrefSize.h = maxChildPrefHeight; + } + else { + parentPrefSize.w = 0; + parentPrefSize.h = 0; + } + }, - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - for ( var c = 0; c < children.length; c++ ) { - children[ c ].viewport.setBounds( parentViewport ); - } + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + for (let c = 0; c < children.length; c++) { + children[c].viewport.setBounds(parentViewport); } + } - }; - } + }; +} diff --git a/src/webglimpse/layout/row_layout.ts b/src/webglimpse/layout/row_layout.ts index 6787483..644d6e1 100644 --- a/src/webglimpse/layout/row_layout.ts +++ b/src/webglimpse/layout/row_layout.ts @@ -27,187 +27,189 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - // 'pref' indicates the child's height should be its preferred height - // 'pref-max' indicates the child's height should be at most its preferred height, but should be made smaller - // (treated as a flex with child.layoutOptions.height === null) if their is insufficient room in the - // parentViewport to accommodate all children at their set size - // - // This layout is essentially a generalization of timeline_layout.ts. If you use a row_layout with the center element set to pref-max - // you get the same effect as timeline_layout). - function childHeight( child : LayoutEntry ) : number { - var usePrefHeight = ( !hasval( child.layoutOptions ) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max' ); - return ( usePrefHeight ? child.prefSize.h : child.layoutOptions.height ); +import { LayoutEntry, Layout } from '../core'; +import { BoundsUnmodifiable, Size } from '../bounds'; +import { hasval, isNumber } from '../util/util'; + + +// 'pref' indicates the child's height should be its preferred height +// 'pref-max' indicates the child's height should be at most its preferred height, but should be made smaller +// (treated as a flex with child.layoutOptions.height === null) if their is insufficient room in the +// parentViewport to accommodate all children at their set size +// +// This layout is essentially a generalization of timeline_layout.ts. If you use a row_layout with the center element set to pref-max +// you get the same effect as timeline_layout). +function childHeight(child: LayoutEntry): number { + let usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max'); + return (usePrefHeight ? child.prefSize.h : child.layoutOptions.height); +} + +// see above, like childHeight( ) but don't count 'pref-max' +function childHeightOverfull(child: LayoutEntry): number { + let usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref'); + + if (usePrefHeight) { + return child.prefSize.h; } - - // see above, like childHeight( ) but don't count 'pref-max' - function childHeightOverfull( child : LayoutEntry ) : number { - var usePrefHeight = ( !hasval( child.layoutOptions ) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' ); - - if ( usePrefHeight ) { - return child.prefSize.h; - } - else if ( child.layoutOptions.height == 'pref-max' ) { - return null; - } - else { - return child.layoutOptions.height; - } + else if (child.layoutOptions.height === 'pref-max') { + return null; } - - interface FlexData { - numFlexible : number; - totalHeight : number; - totalFlexHeight : number; - flexHeight : number; - childHeight : ( child : LayoutEntry ) => number; + else { + return child.layoutOptions.height; } - - function calculateFlexData( childrenToPlace : LayoutEntry[], parentViewport : BoundsUnmodifiable, childHeight : ( child : LayoutEntry ) => number ) : FlexData { - var numFlexible = 0; - var totalHeight = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var h = childHeight( childrenToPlace[ c ] ); - if ( hasval( h ) ) { - totalHeight += h; - } - else { - numFlexible++; - } +} + +interface FlexData { + numFlexible: number; + totalHeight: number; + totalFlexHeight: number; + flexHeight: number; + childHeight: (child: LayoutEntry) => number; +} + +function calculateFlexData(childrenToPlace: LayoutEntry[], parentViewport: BoundsUnmodifiable, childHeight: (child: LayoutEntry) => number): FlexData { + let numFlexible = 0; + let totalHeight = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let h = childHeight(childrenToPlace[c]); + if (hasval(h)) { + totalHeight += h; + } + else { + numFlexible++; } - var totalFlexHeight = parentViewport.h - totalHeight; - var flexHeight = totalFlexHeight / numFlexible; - return { numFlexible : numFlexible, totalHeight : totalHeight, flexHeight : flexHeight, totalFlexHeight : totalFlexHeight, childHeight : childHeight }; } + let totalFlexHeight = parentViewport.h - totalHeight; + let flexHeight = totalFlexHeight / numFlexible; + return { numFlexible: numFlexible, totalHeight: totalHeight, flexHeight: flexHeight, totalFlexHeight: totalFlexHeight, childHeight: childHeight }; +} - export function newRowLayout( topToBottom : boolean = true ) : Layout { +export function newRowLayout(topToBottom: boolean = true): Layout { - return { + return { - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - var childrenToPlace = [ ]; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - if ( isNumber( child.layoutArg ) && !( child.layoutOptions && child.layoutOptions.hide ) ) { - childrenToPlace.push( child ); - } + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + let childrenToPlace = []; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { + childrenToPlace.push(child); } + } - var wMax = 0; - var hSum = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - - var honorChildWidth = !( child.layoutOptions && child.layoutOptions.ignoreWidth ); - if ( honorChildWidth ) { - var w = child.prefSize.w; - if ( hasval( wMax ) && hasval( w ) ) { - wMax = Math.max( wMax, w ); - } - else { - wMax = null; - } - } + let wMax = 0; + let hSum = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; - var h = childHeight( child ); - if ( hasval( hSum ) && hasval( h ) ) { - hSum += h; - } - else { - hSum = null; - } - } - parentPrefSize.w = wMax; - parentPrefSize.h = hSum; - }, - - - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - var childrenToPlace = [ ]; - var childrenToHide = [ ]; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - if ( isNumber( child.layoutArg ) && !( child.layoutOptions && child.layoutOptions.hide ) ) { - childrenToPlace.push( child ); + let honorChildWidth = !(child.layoutOptions && child.layoutOptions.ignoreWidth); + if (honorChildWidth) { + let w = child.prefSize.w; + if (hasval(wMax) && hasval(w)) { + wMax = Math.max(wMax, w); } else { - childrenToHide.push( child ); + wMax = null; } } - // Use the original index to make the sort stable - var indexProp = 'webglimpse_rowLayout_index'; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - child[ indexProp ] = c; + let h = childHeight(child); + if (hasval(hSum) && hasval(h)) { + hSum += h; } + else { + hSum = null; + } + } + parentPrefSize.w = wMax; + parentPrefSize.h = hSum; + }, + + + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + let childrenToPlace = []; + let childrenToHide = []; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { + childrenToPlace.push(child); + } + else { + childrenToHide.push(child); + } + } - childrenToPlace.sort( function( a : LayoutEntry, b : LayoutEntry ) { - var orderDiff = a.layoutArg - b.layoutArg; - return ( orderDiff !== 0 ? orderDiff : ( a[ indexProp ] - b[ indexProp ] ) ); - } ); + // Use the original index to make the sort stable + let indexProp = 'webglimpse_rowLayout_index'; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; + child[indexProp] = c; + } - // calculate assuming sufficient space - var flexData = calculateFlexData( children, parentViewport, childHeight ); + childrenToPlace.sort(function (a: LayoutEntry, b: LayoutEntry) { + let orderDiff = a.layoutArg - b.layoutArg; + return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp])); + }); - // recalculate allowing 'pref-max' children to shrink if insufficient space - if ( flexData.totalHeight > parentViewport.h ) { - flexData = calculateFlexData( children, parentViewport, childHeightOverfull ); - } + // calculate assuming sufficient space + let flexData = calculateFlexData(children, parentViewport, childHeight); + + // recalculate allowing 'pref-max' children to shrink if insufficient space + if (flexData.totalHeight > parentViewport.h) { + flexData = calculateFlexData(children, parentViewport, childHeightOverfull); + } - if ( topToBottom ) { - var iStart = parentViewport.iStart; - var iEnd = parentViewport.iEnd; - var jEnd = parentViewport.jEnd; - var jRemainder = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - - var jStart : number; - var h = flexData.childHeight( child ); - if ( hasval( h ) ) { - jStart = jEnd - h; - } - else { - var jStart0 = jEnd - flexData.flexHeight - jRemainder; - jStart = Math.round( jStart0 ); - jRemainder = jStart - jStart0; - } - - child.viewport.setEdges( iStart, iEnd, jStart, jEnd ); - jEnd = jStart; + if (topToBottom) { + let iStart = parentViewport.iStart; + let iEnd = parentViewport.iEnd; + let jEnd = parentViewport.jEnd; + let jRemainder = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; + + let jStart: number; + let h = flexData.childHeight(child); + if (hasval(h)) { + jStart = jEnd - h; } - } - else { - var iStart = parentViewport.iStart; - var iEnd = parentViewport.iEnd; - var jStart = parentViewport.jStart; - var jRemainder = 0; - for ( var c = 0; c < childrenToPlace.length; c++ ) { - var child = childrenToPlace[ c ]; - - var jEnd : number; - var h = flexData.childHeight( child ); - if ( hasval( h ) ) { - jEnd = jStart + h; - } - else { - var jEnd0 = jStart + flexData.flexHeight + jRemainder; - jEnd = Math.round( jEnd0 ); - jRemainder = jEnd0 - jEnd; - } - - child.viewport.setEdges( iStart, iEnd, jStart, jEnd ); - jStart = jEnd; + else { + let jStart0 = jEnd - flexData.flexHeight - jRemainder; + jStart = Math.round(jStart0); + jRemainder = jStart - jStart0; } + + child.viewport.setEdges(iStart, iEnd, jStart, jEnd); + jEnd = jStart; } + } + else { + let iStart = parentViewport.iStart; + let iEnd = parentViewport.iEnd; + let jStart = parentViewport.jStart; + let jRemainder = 0; + for (let c = 0; c < childrenToPlace.length; c++) { + let child = childrenToPlace[c]; + + let jEnd: number; + let h = flexData.childHeight(child); + if (hasval(h)) { + jEnd = jStart + h; + } + else { + let jEnd0 = jStart + flexData.flexHeight + jRemainder; + jEnd = Math.round(jEnd0); + jRemainder = jEnd0 - jEnd; + } - for ( var c = 0; c < childrenToHide.length; c++ ) { - childrenToHide[ c ].viewport.setEdges( 0, 0, 0, 0 ); + child.viewport.setEdges(iStart, iEnd, jStart, jEnd); + jStart = jEnd; } } - }; - } + + for (let c = 0; c < childrenToHide.length; c++) { + childrenToHide[c].viewport.setEdges(0, 0, 0, 0); + } + } + }; +} diff --git a/src/webglimpse/matrix.ts b/src/webglimpse/matrix.ts index 8c58639..c729ebe 100644 --- a/src/webglimpse/matrix.ts +++ b/src/webglimpse/matrix.ts @@ -27,30 +27,30 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { BoundsUnmodifiable } from './bounds'; +import { Axis2D } from './plot/axis'; +// see: http://www.cs.rit.edu/usr/local/pub/wrc/graphics/doc/opengl/books/blue/glOrtho.html +// see: http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho +export function glOrtho(left: number, right: number, bottom: number, top: number, near: number, far: number): Float32Array { + let tx = (right + left) / (right - left); + let ty = (top + bottom) / (top - bottom); + let tz = (far + near) / (far - near); - // see: http://www.cs.rit.edu/usr/local/pub/wrc/graphics/doc/opengl/books/blue/glOrtho.html - // see: http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho - export function glOrtho( left : number, right : number, bottom : number, top : number, near : number, far : number ) : Float32Array { + // GL ES (and therefore WebGL) requires matrices to be column-major + return new Float32Array([ + 2 / (right - left), 0, 0, 0, + 0, 2 / (top - bottom), 0, 0, + 0, 0, -2 / (far - near), 0, + -tx, -ty, -tz, 1 + ]); +} - var tx = ( right + left ) / ( right - left ); - var ty = ( top + bottom ) / ( top - bottom ); - var tz = ( far + near ) / ( far - near ); +export function glOrthoViewport(viewport: BoundsUnmodifiable): Float32Array { + return glOrtho(-0.5, viewport.w - 0.5, -0.5, viewport.h - 0.5, -1, 1); +} - // GL ES (and therefore WebGL) requires matrices to be column-major - return new Float32Array( [ - 2 / ( right - left ), 0, 0, 0, - 0, 2 / ( top - bottom ), 0, 0, - 0, 0, -2 / ( far - near ), 0, - -tx, -ty, -tz, 1 - ] ); - } - - export function glOrthoViewport( viewport : BoundsUnmodifiable ) : Float32Array { - return glOrtho( -0.5, viewport.w-0.5, -0.5, viewport.h-0.5, -1, 1 ); - } - - export function glOrthoAxis( axis : Axis2D ) : Float32Array { - return glOrtho( axis.xAxis.vMin, axis.xAxis.vMax, axis.yAxis.vMin, axis.yAxis.vMax, -1, 1 ); - } +export function glOrthoAxis(axis: Axis2D): Float32Array { + return glOrtho(axis.xAxis.vMin, axis.xAxis.vMax, axis.yAxis.vMin, axis.yAxis.vMax, -1, 1); +} diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index 89f0bcc..bc9df1b 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -27,368 +27,374 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Painter, xFrac, yFrac, Pane } from './core'; +import { BoundsUnmodifiable, Size } from './bounds'; +import { Color, sameColor } from './color'; +import { Program, UniformColor, Attribute } from './shader'; +import { newDynamicBuffer } from './buffer'; +import { GL, concatLines, hasval } from './util/util'; +import { Texture2D, TextureDrawOptions, TextureRenderer } from './texture'; +import { Notification } from './util/notification'; + +export function newGroupPainter(...painters: Painter[]): Painter { + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable): void { + for (let n = 0; n < painters.length; n++) { + painters[n](gl, viewport); + } + }; +} +export function newBlendingBackgroundPainter(color: Color): Painter { - export function newGroupPainter( ...painters : Painter[] ) : Painter { - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - for ( var n = 0; n < painters.length; n++ ) { - painters[ n ]( gl, viewport ); - } - }; - } + let program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_XyNdc = new Attribute(program, 'a_XyNdc'); + let numVertices = 4; + let xy_NDC = new Float32Array(2 * numVertices); + let xyBuffer_NDC = newDynamicBuffer(); - export function newBlendingBackgroundPainter( color : Color ) : Painter { + return function (gl: WebGLRenderingContext): void { + if (color.a >= 1) { + gl.disable(GL.BLEND); + } + else { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + } - var program = new Program( xyNdc_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_XyNdc = new Attribute( program, 'a_XyNdc' ); + program.use(gl); + u_Color.setData(gl, color); - var numVertices = 4; - var xy_NDC = new Float32Array( 2*numVertices ); - var xyBuffer_NDC = newDynamicBuffer( ); + xy_NDC[0] = -1; + xy_NDC[1] = 1; + xy_NDC[2] = -1; + xy_NDC[3] = -1; + xy_NDC[4] = 1; + xy_NDC[5] = 1; + xy_NDC[6] = 1; + xy_NDC[7] = -1; - return function( gl : WebGLRenderingContext ) { - if ( color.a >= 1 ) { - gl.disable( GL.BLEND ); - } - else { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - } + xyBuffer_NDC.setData(xy_NDC); + a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT); - program.use( gl ); - u_Color.setData( gl, color ); + gl.drawArrays(GL.TRIANGLE_STRIP, 0, numVertices); - xy_NDC[0] = -1; - xy_NDC[1] = 1; - xy_NDC[2] = -1; - xy_NDC[3] = -1; - xy_NDC[4] = 1; - xy_NDC[5] = 1; - xy_NDC[6] = 1; - xy_NDC[7] = -1; + a_XyNdc.disable(gl); + program.endUse(gl); + }; +} - xyBuffer_NDC.setData( xy_NDC ); - a_XyNdc.setDataAndEnable( gl, xyBuffer_NDC, 2, GL.FLOAT ); +export class Background { - gl.drawArrays( GL.TRIANGLE_STRIP, 0, numVertices ); + private _color: Color; - a_XyNdc.disable( gl ); - program.endUse( gl ); - }; + constructor(color?: Color) { + this._color = color; } - export class Background { - - private _color : Color; + get color(): Color { + return this._color; + } - constructor( color? : Color ) { + set color(color: Color) { + if (!sameColor(this._color, color)) { this._color = color; } - - get color( ) : Color { - return this._color; - } - - set color( color : Color ) { - if ( !sameColor( this._color, color ) ) { - this._color = color; - } - } - - newPainter( ) { - var background : Background = this; - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( hasval( background.color ) ) { - gl.clearColor( background.color.r, background.color.g, background.color.b, background.color.a ); - gl.clear( GL.COLOR_BUFFER_BIT ); - } - }; - } } - - export function newBackgroundPainter( color : Color ) : Painter { - return function( gl : WebGLRenderingContext ) { - gl.clearColor( color.r, color.g, color.b, color.a ); - gl.clear( GL.COLOR_BUFFER_BIT ); + newPainter() { + let background: Background = this; + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + if (hasval(background.color)) { + gl.clearColor(background.color.r, background.color.g, background.color.b, background.color.a); + gl.clear(GL.COLOR_BUFFER_BIT); + } }; } +} - export function newTexturePainter( texture : Texture2D, xFrac : number, yFrac : number, options : TextureDrawOptions ) { - var textureRenderer = new TextureRenderer( ); - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - textureRenderer.begin( gl, viewport ); - textureRenderer.draw( gl, texture, xFrac, yFrac, options ); - textureRenderer.end( gl ); - }; - } +export function newBackgroundPainter(color: Color): Painter { + return function (gl: WebGLRenderingContext) { + gl.clearColor(color.r, color.g, color.b, color.a); + gl.clear(GL.COLOR_BUFFER_BIT); + }; +} - export function newSolidPane( color : Color ) : Pane { - var pane = new Pane( null ); - pane.addPainter( newBackgroundPainter( color ) ); - return pane; - } +export function newTexturePainter(texture: Texture2D, xFrac: number, yFrac: number, options: TextureDrawOptions) { + let textureRenderer = new TextureRenderer(); + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + textureRenderer.begin(gl, viewport); + textureRenderer.draw(gl, texture, xFrac, yFrac, options); + textureRenderer.end(gl); + }; +} - export function fitToTexture( texture : Texture2D ) { - return function( parentPrefSize : Size ) { - parentPrefSize.w = texture.w; - parentPrefSize.h = texture.h; - }; - } +export function newSolidPane(color: Color): Pane { + let pane = new Pane(null); + pane.addPainter(newBackgroundPainter(color)); + return pane; +} - export function fixedSize( w : number, h : number ) { - return function( parentPrefSize : Size ) { - parentPrefSize.w = w; - parentPrefSize.h = h; - }; - } +export function fitToTexture(texture: Texture2D) { + return function (parentPrefSize: Size) { + parentPrefSize.w = texture.w; + parentPrefSize.h = texture.h; + }; +} - /** - * Takes (x,y) in NDC (Normalized Device Coords), in attribute a_XyNdc - */ - export var xyNdc_VERTSHADER = concatLines( - ' ', - ' attribute vec2 a_XyNdc; ', - ' ', - ' void main( ) { ', - ' gl_Position = vec4( a_XyNdc, 0.0, 1.0 ); ', - ' } ', - ' ' - ); - - - /** - * Takes (x,y) as fractions of the viewport, in attribute a_XyFrac - */ - export var xyFrac_VERTSHADER = concatLines( - ' ', - ' attribute vec2 a_XyFrac; ', - ' ', - ' void main( ) { ', - ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', - ' } ', - ' ' - ); - - - export var solid_FRAGSHADER = concatLines( - ' ', - ' precision lowp float; ', - ' uniform vec4 u_Color; ', - ' ', - ' void main( ) { ', - ' gl_FragColor = u_Color; ', - ' } ', - ' ' - ); - - - export var dash_FRAGSHADER = concatLines( - ' precision highp float; ', - ' uniform mat4 u_modelViewMatrix; ', - ' varying float v_Distance; ', - ' uniform float u_Dash; ', - ' uniform vec4 u_Color; ', - ' ', - ' void main( ) { ', - ' float v = floor(2.0 * fract(v_Distance * (u_Dash * (10.0 * u_modelViewMatrix[0][0])))); ', - ' if(v > 0.5) ', - ' discard; ', - ' else ', - ' gl_FragColor = u_Color; ', - ' } ', - ' ' - ); - - - export var varyingColor_FRAGSHADER = concatLines( - ' ', - ' precision lowp float; ', - ' varying vec4 v_Color; ', - ' ', - ' void main( ) { ', - ' gl_FragColor = v_Color; ', - ' } ', - ' ' - ); - - - export var modelview_VERTSHADER = concatLines( - ' uniform mat4 u_modelViewMatrix; ', - ' attribute vec4 a_Position; ', - ' ', - ' void main( ) { ', - ' gl_Position = u_modelViewMatrix * a_Position ; ', - ' } ', - ' ' - ); - - - export var nearestPixelCenter_GLSLFUNC = concatLines( - ' ', - ' float nearestPixelCenter( float frac, float pixelSize ) { ', - ' return ( floor( frac*pixelSize + 1e-4 ) + 0.5 ) / pixelSize; ', - ' } ', - ' ' - ); - - - export enum Side { - TOP, BOTTOM, RIGHT, LEFT - } +export function fixedSize(w: number, h: number) { + return function (parentPrefSize: Size) { + parentPrefSize.w = w; + parentPrefSize.h = h; + }; +} - /** - * Converts viewport-fraction to NDC (Normalized Device Coords) - */ - export function fracToNdc( frac : number ) : number { - return -1 + 2*frac; - } +/** + * Takes (x,y) in NDC (Normalized Device Coords), in attribute a_XyNdc + */ +export let xyNdc_VERTSHADER = concatLines( + ' ', + ' attribute vec2 a_XyNdc; ', + ' ', + ' void main( ) { ', + ' gl_Position = vec4( a_XyNdc, 0.0, 1.0 ); ', + ' } ', + ' ' +); + + +/** + * Takes (x,y) as fractions of the viewport, in attribute a_XyFrac + */ +export let xyFrac_VERTSHADER = concatLines( + ' ', + ' attribute vec2 a_XyFrac; ', + ' ', + ' void main( ) { ', + ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', + ' } ', + ' ' +); + + +export let solid_FRAGSHADER = concatLines( + ' ', + ' precision lowp float; ', + ' uniform vec4 u_Color; ', + ' ', + ' void main( ) { ', + ' gl_FragColor = u_Color; ', + ' } ', + ' ' +); + + +export let dash_FRAGSHADER = concatLines( + ' precision highp float; ', + ' uniform mat4 u_modelViewMatrix; ', + ' varying float v_Distance; ', + ' uniform float u_Dash; ', + ' uniform vec4 u_Color; ', + ' ', + ' void main( ) { ', + ' float v = floor(2.0 * fract(v_Distance * (u_Dash * (10.0 * u_modelViewMatrix[0][0])))); ', + ' if(v > 0.5) ', + ' discard; ', + ' else ', + ' gl_FragColor = u_Color; ', + ' } ', + ' ' +); + + +export let varyingColor_FRAGSHADER = concatLines( + ' ', + ' precision lowp float; ', + ' varying vec4 v_Color; ', + ' ', + ' void main( ) { ', + ' gl_FragColor = v_Color; ', + ' } ', + ' ' +); + + +export let modelview_VERTSHADER = concatLines( + ' uniform mat4 u_modelViewMatrix; ', + ' attribute vec4 a_Position; ', + ' ', + ' void main( ) { ', + ' gl_Position = u_modelViewMatrix * a_Position ; ', + ' } ', + ' ' +); + + +export let nearestPixelCenter_GLSLFUNC = concatLines( + ' ', + ' float nearestPixelCenter( float frac, float pixelSize ) { ', + ' return ( floor( frac*pixelSize + 1e-4 ) + 0.5 ) / pixelSize; ', + ' } ', + ' ' +); + + +export enum Side { + TOP, BOTTOM, RIGHT, LEFT +} + + +/** + * Converts viewport-fraction to NDC (Normalized Device Coords) + */ +export function fracToNdc(frac: number): number { + return -1 + 2 * frac; +} - export function nearestPixel( viewportFrac : number, viewportSize : number, imageAnchor : number, imageSize : number ) : number { - var anchor = ( imageAnchor * imageSize ) % 1.0; - return ( Math.floor( viewportFrac*viewportSize - anchor + 0.5 + 1e-4 ) + anchor ) / viewportSize; - } +export function nearestPixel(viewportFrac: number, viewportSize: number, imageAnchor: number, imageSize: number): number { + let anchor = (imageAnchor * imageSize) % 1.0; + return (Math.floor(viewportFrac * viewportSize - anchor + 0.5 + 1e-4) + anchor) / viewportSize; +} - export function putQuadXys( xys : Float32Array, index : number, xLeft : number, xRight : number, yTop : number, yBottom : number ) : number { - var n = index; - n = putUpperLeftTriangleXys( xys, n, xLeft, xRight, yTop, yBottom ); - n = putLowerRightTriangleXys( xys, n, xLeft, xRight, yTop, yBottom ); - return n; - } +export function putQuadXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number { + let n = index; + n = putUpperLeftTriangleXys(xys, n, xLeft, xRight, yTop, yBottom); + n = putLowerRightTriangleXys(xys, n, xLeft, xRight, yTop, yBottom); + return n; +} - export function putUpperLeftTriangleXys( xys : Float32Array, index : number, xLeft : number, xRight : number, yTop : number, yBottom : number ) : number { - var n = index; - xys[ n++ ] = xLeft; xys[ n++ ] = yTop; - xys[ n++ ] = xRight; xys[ n++ ] = yTop; - xys[ n++ ] = xLeft; xys[ n++ ] = yBottom; - return n; - } +export function putUpperLeftTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number { + let n = index; + xys[n++] = xLeft; xys[n++] = yTop; + xys[n++] = xRight; xys[n++] = yTop; + xys[n++] = xLeft; xys[n++] = yBottom; + return n; +} - export function putLowerRightTriangleXys( xys : Float32Array, index : number, xLeft : number, xRight : number, yTop : number, yBottom : number ) : number { - var n = index; - xys[ n++ ] = xLeft; xys[ n++ ] = yBottom; - xys[ n++ ] = xRight; xys[ n++ ] = yTop; - xys[ n++ ] = xRight; xys[ n++ ] = yBottom; - return n; - } +export function putLowerRightTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number { + let n = index; + xys[n++] = xLeft; xys[n++] = yBottom; + xys[n++] = xRight; xys[n++] = yTop; + xys[n++] = xRight; xys[n++] = yBottom; + return n; +} - export function putUpperRightTriangleXys( xys : Float32Array, index : number, xLeft : number, xRight : number, yTop : number, yBottom : number ) : number { - var n = index; - xys[ n++ ] = xLeft; xys[ n++ ] = yTop; - xys[ n++ ] = xRight; xys[ n++ ] = yTop; - xys[ n++ ] = xRight; xys[ n++ ] = yBottom; - return n; - } +export function putUpperRightTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number { + let n = index; + xys[n++] = xLeft; xys[n++] = yTop; + xys[n++] = xRight; xys[n++] = yTop; + xys[n++] = xRight; xys[n++] = yBottom; + return n; +} - export function putLowerLeftTriangleXys( xys : Float32Array, index : number, xLeft : number, xRight : number, yTop : number, yBottom : number ) : number { - var n = index; - xys[ n++ ] = xLeft; xys[ n++ ] = yBottom; - xys[ n++ ] = xLeft; xys[ n++ ] = yTop; - xys[ n++ ] = xRight; xys[ n++ ] = yBottom; - return n; - } +export function putLowerLeftTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number { + let n = index; + xys[n++] = xLeft; xys[n++] = yBottom; + xys[n++] = xLeft; xys[n++] = yTop; + xys[n++] = xRight; xys[n++] = yBottom; + return n; +} - export function putQuadRgbas( rgbas : Float32Array, index : number, color : Color ) : number { - return putRgbas( rgbas, index, color, 6 ); - } +export function putQuadRgbas(rgbas: Float32Array, index: number, color: Color): number { + return putRgbas(rgbas, index, color, 6); +} - export function putRgbas( rgbas : Float32Array, index : number, color : Color, count : number ) : number { - var n = index; - for ( var v = 0; v < count; v++ ) { - rgbas[ n++ ] = color.r; rgbas[ n++ ] = color.g; rgbas[ n++ ] = color.b; rgbas[ n++ ] = color.a; - } - return n; +export function putRgbas(rgbas: Float32Array, index: number, color: Color, count: number): number { + let n = index; + for (let v = 0; v < count; v++) { + rgbas[n++] = color.r; rgbas[n++] = color.g; rgbas[n++] = color.b; rgbas[n++] = color.a; } + return n; +} - export function clearSelection( ) { - var selection = window.getSelection( ); - if ( selection ) { - if ( selection[ 'removeAllRanges' ] ) { - selection[ 'removeAllRanges' ]( ); - } - else if ( selection[ 'empty' ] ) { - selection[ 'empty' ]( ); - } +export function clearSelection() { + let selection = window.getSelection(); + if (selection) { + if (selection['removeAllRanges']) { + selection['removeAllRanges'](); + } + else if (selection['empty']) { + selection['empty'](); } } +} - export class SimpleModel { - private _value : V; - private _changed : Notification; +export class SimpleModel { + private _value: V; + private _changed: Notification; - constructor( value : V = null ) { - this._value = value; - this._changed = new Notification( ); - } + constructor(value: V = null) { + this._value = value; + this._changed = new Notification(); + } - get value( ) : V { return this._value; } - get changed( ) : Notification { return this._changed; } + get value(): V { return this._value; } + get changed(): Notification { return this._changed; } - set value( value : V ) { - if ( value !== this._value ) { - this._value = value; - this._changed.fire( ); - } + set value(value: V) { + if (value !== this._value) { + this._value = value; + this._changed.fire(); } } +} - export class XyModel { - private _x : number; - private _y : number; - private _changed : Notification; +export class XyModel { + private _x: number; + private _y: number; + private _changed: Notification; - constructor( x? : number, y? : number ) { - this._x = x; - this._y = y; - this._changed = new Notification( ); - } + constructor(x?: number, y?: number) { + this._x = x; + this._y = y; + this._changed = new Notification(); + } - get x( ) : number { return this._x; } - get y( ) : number { return this._y; } - get changed( ) : Notification { return this._changed; } + get x(): number { return this._x; } + get y(): number { return this._y; } + get changed(): Notification { return this._changed; } - set x( x : number ) { - if ( x !== this._x ) { - this._x = x; - this._changed.fire( ); - } + set x(x: number) { + if (x !== this._x) { + this._x = x; + this._changed.fire(); } + } - set y( y : number ) { - if ( y !== this._y ) { - this._y = y; - this._changed.fire( ); - } + set y(y: number) { + if (y !== this._y) { + this._y = y; + this._changed.fire(); } + } - setXy( x : number, y : number ) { - if ( x !== this._x || y !== this._y ) { - this._x = x; - this._y = y; - this._changed.fire( ); - } + setXy(x: number, y: number) { + if (x !== this._x || y !== this._y) { + this._x = x; + this._y = y; + this._changed.fire(); } } +} diff --git a/src/webglimpse/painter/border_painter.ts b/src/webglimpse/painter/border_painter.ts index 3559efa..ce0fad5 100644 --- a/src/webglimpse/painter/border_painter.ts +++ b/src/webglimpse/painter/border_painter.ts @@ -27,130 +27,136 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - export interface BorderOptions { - drawTop? : boolean; - drawLeft? : boolean; - drawRight? : boolean; - drawBottom? : boolean; - thickness? : number; - } - - - export function newBorderPainter( color : Color, options? : BorderOptions ) : Painter { - if ( !hasval( options ) ) options = { }; - if ( !hasval( options.drawTop ) ) options.drawTop = true; - if ( !hasval( options.drawLeft ) ) options.drawLeft = true; - if ( !hasval( options.drawRight ) ) options.drawRight = true; - if ( !hasval( options.drawBottom ) ) options.drawBottom = true; - if ( !hasval( options.thickness ) ) options.thickness = 1; - - var simple = ( options.thickness === 1 && color.a >= 1 ); - return ( simple ? newSimpleBorderPainter( color, options ) : newFullBorderPainter( color, options ) ); - } - - - function newFullBorderPainter( color : Color, options : BorderOptions ) : Painter { - var drawTop = options.drawTop; - var drawLeft = options.drawLeft; - var drawRight = options.drawRight; - var drawBottom = options.drawBottom; - var thickness = options.thickness; - - var program = new Program( xyNdc_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_XyNdc = new Attribute( program, 'a_XyNdc' ); - - var numVertices = ( drawTop ? 6 : 0 ) + ( drawLeft ? 6 : 0 ) + ( drawRight ? 6 : 0 ) + ( drawBottom ? 6 : 0 ); - var xy_NDC = new Float32Array( 2*numVertices ); - var xyBuffer_NDC = newDynamicBuffer( ); - - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( color.a >= 1 ) { - gl.disable( GL.BLEND ); - } - else { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - } - - program.use( gl ); - u_Color.setData( gl, color ); - - var w_NDC = 2*thickness / viewport.w; - var h_NDC = 2*thickness / viewport.h; - var index = 0; - if ( drawTop ) index = putQuadXys( xy_NDC, index, -1, ( drawRight ? +1-w_NDC : +1 ), +1, +1-h_NDC ); - if ( drawRight ) index = putQuadXys( xy_NDC, index, +1-w_NDC, +1, +1, ( drawBottom ? -1+h_NDC : -1 ) ); - if ( drawBottom ) index = putQuadXys( xy_NDC, index, ( drawLeft ? -1+w_NDC : -1 ), +1, -1+h_NDC, -1 ); - if ( drawLeft ) index = putQuadXys( xy_NDC, index, -1, -1+w_NDC, ( drawTop ? +1-h_NDC : +1 ), -1 ); - - xyBuffer_NDC.setData( xy_NDC ); - a_XyNdc.setDataAndEnable( gl, xyBuffer_NDC, 2, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLES, 0, numVertices ); - - a_XyNdc.disable( gl ); - program.endUse( gl ); - }; - } - - - function newSimpleBorderPainter( color : Color, options : BorderOptions ) : Painter { - var drawTop = options.drawTop; - var drawLeft = options.drawLeft; - var drawRight = options.drawRight; - var drawBottom = options.drawBottom; - - var program = new Program( xyNdc_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_XyNdc = new Attribute( program, 'a_XyNdc' ); - - var numVertices = ( drawTop ? 2 : 0 ) + ( drawLeft ? 2 : 0 ) + ( drawRight ? 2 : 0 ) + ( drawBottom ? 2 : 0 ); - var xy_NDC = new Float32Array( 2*numVertices ); - var xyBuffer_NDC = newDynamicBuffer( ); - - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - gl.disable( GL.BLEND ); - - program.use( gl ); - u_Color.setData( gl, color ); - - var left_NDC = fracToNdc( 0.5 / viewport.w ); - var bottom_NDC = fracToNdc( 0.5 / viewport.h ); - var right_NDC = fracToNdc( ( viewport.w - 0.5 ) / viewport.w ); - var top_NDC = fracToNdc( ( viewport.h - 0.5 ) / viewport.h ); - - var n = 0; - if ( drawTop ) { - xy_NDC[ n++ ] = -1; xy_NDC[ n++ ] = top_NDC; - xy_NDC[ n++ ] = +1; xy_NDC[ n++ ] = top_NDC; - } - if ( drawRight ) { - xy_NDC[ n++ ] = right_NDC; xy_NDC[ n++ ] = +1; - xy_NDC[ n++ ] = right_NDC; xy_NDC[ n++ ] = -1; - } - if ( drawBottom ) { - xy_NDC[ n++ ] = +1; xy_NDC[ n++ ] = bottom_NDC; - xy_NDC[ n++ ] = -1; xy_NDC[ n++ ] = bottom_NDC; - } - if ( drawLeft ) { - xy_NDC[ n++ ] = left_NDC; xy_NDC[ n++ ] = -1; - xy_NDC[ n++ ] = left_NDC; xy_NDC[ n++ ] = +1; - } - - xyBuffer_NDC.setData( xy_NDC ); - a_XyNdc.setDataAndEnable( gl, xyBuffer_NDC, 2, GL.FLOAT ); - - // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 - gl.lineWidth( 1 ); - gl.drawArrays( GL.LINES, 0, numVertices ); - - a_XyNdc.disable( gl ); - program.endUse( gl ); - }; - } +import { Color } from '../color'; +import { Painter } from '../core'; +import { Program, UniformColor, Attribute } from '../shader'; +import { xyNdc_VERTSHADER, solid_FRAGSHADER, putQuadXys, fracToNdc } from '../misc'; +import { newDynamicBuffer } from '../buffer'; +import { BoundsUnmodifiable } from '../bounds'; +import { GL, hasval } from '../util/util'; + + +export interface BorderOptions { + drawTop?: boolean; + drawLeft?: boolean; + drawRight?: boolean; + drawBottom?: boolean; + thickness?: number; +} + + +export function newBorderPainter(color: Color, options?: BorderOptions): Painter { + if (!hasval(options)) options = {}; + if (!hasval(options.drawTop)) options.drawTop = true; + if (!hasval(options.drawLeft)) options.drawLeft = true; + if (!hasval(options.drawRight)) options.drawRight = true; + if (!hasval(options.drawBottom)) options.drawBottom = true; + if (!hasval(options.thickness)) options.thickness = 1; + + let simple = (options.thickness === 1 && color.a >= 1); + return (simple ? newSimpleBorderPainter(color, options) : newFullBorderPainter(color, options)); +} + + +function newFullBorderPainter(color: Color, options: BorderOptions): Painter { + let drawTop = options.drawTop; + let drawLeft = options.drawLeft; + let drawRight = options.drawRight; + let drawBottom = options.drawBottom; + let thickness = options.thickness; + + let program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_XyNdc = new Attribute(program, 'a_XyNdc'); + + let numVertices = (drawTop ? 6 : 0) + (drawLeft ? 6 : 0) + (drawRight ? 6 : 0) + (drawBottom ? 6 : 0); + let xy_NDC = new Float32Array(2 * numVertices); + let xyBuffer_NDC = newDynamicBuffer(); + + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + if (color.a >= 1) { + gl.disable(GL.BLEND); + } + else { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + } + + program.use(gl); + u_Color.setData(gl, color); + + let w_NDC = 2 * thickness / viewport.w; + let h_NDC = 2 * thickness / viewport.h; + let index = 0; + if (drawTop) index = putQuadXys(xy_NDC, index, -1, (drawRight ? +1 - w_NDC : +1), +1, +1 - h_NDC); + if (drawRight) index = putQuadXys(xy_NDC, index, +1 - w_NDC, +1, +1, (drawBottom ? -1 + h_NDC : -1)); + if (drawBottom) index = putQuadXys(xy_NDC, index, (drawLeft ? -1 + w_NDC : -1), +1, -1 + h_NDC, -1); + if (drawLeft) index = putQuadXys(xy_NDC, index, -1, -1 + w_NDC, (drawTop ? +1 - h_NDC : +1), -1); + + xyBuffer_NDC.setData(xy_NDC); + a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLES, 0, numVertices); + + a_XyNdc.disable(gl); + program.endUse(gl); + }; +} + + +function newSimpleBorderPainter(color: Color, options: BorderOptions): Painter { + let drawTop = options.drawTop; + let drawLeft = options.drawLeft; + let drawRight = options.drawRight; + let drawBottom = options.drawBottom; + + let program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_XyNdc = new Attribute(program, 'a_XyNdc'); + + let numVertices = (drawTop ? 2 : 0) + (drawLeft ? 2 : 0) + (drawRight ? 2 : 0) + (drawBottom ? 2 : 0); + let xy_NDC = new Float32Array(2 * numVertices); + let xyBuffer_NDC = newDynamicBuffer(); + + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + gl.disable(GL.BLEND); + + program.use(gl); + u_Color.setData(gl, color); + + let left_NDC = fracToNdc(0.5 / viewport.w); + let bottom_NDC = fracToNdc(0.5 / viewport.h); + let right_NDC = fracToNdc((viewport.w - 0.5) / viewport.w); + let top_NDC = fracToNdc((viewport.h - 0.5) / viewport.h); + + let n = 0; + if (drawTop) { + xy_NDC[n++] = -1; xy_NDC[n++] = top_NDC; + xy_NDC[n++] = +1; xy_NDC[n++] = top_NDC; + } + if (drawRight) { + xy_NDC[n++] = right_NDC; xy_NDC[n++] = +1; + xy_NDC[n++] = right_NDC; xy_NDC[n++] = -1; + } + if (drawBottom) { + xy_NDC[n++] = +1; xy_NDC[n++] = bottom_NDC; + xy_NDC[n++] = -1; xy_NDC[n++] = bottom_NDC; + } + if (drawLeft) { + xy_NDC[n++] = left_NDC; xy_NDC[n++] = -1; + xy_NDC[n++] = left_NDC; xy_NDC[n++] = +1; + } + + xyBuffer_NDC.setData(xy_NDC); + a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT); + + // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 + gl.lineWidth(1); + gl.drawArrays(GL.LINES, 0, numVertices); + + a_XyNdc.disable(gl); + program.endUse(gl); + }; +} diff --git a/src/webglimpse/plot/axis.ts b/src/webglimpse/plot/axis.ts index 5cc512d..a15cddc 100644 --- a/src/webglimpse/plot/axis.ts +++ b/src/webglimpse/plot/axis.ts @@ -27,212 +27,214 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Notification, Listener } from '../util/notification'; +import { log10, hasval } from '../util/util'; +import { xFrac, yFrac, Pane, PointerEvent, isLeftMouseDown } from '../core'; +export class Axis1D { + private _vMin: number; + private _vMax: number; + private _limitsChanged = new Notification(); - export class Axis1D { - private _vMin : number; - private _vMax : number; - private _limitsChanged = new Notification( ); - - constructor( vMin : number, vMax : number ) { - this._vMin = vMin; - this._vMax = vMax; - } + constructor(vMin: number, vMax: number) { + this._vMin = vMin; + this._vMax = vMax; + } - get vMin( ) : number { - return this._vMin; - } + get vMin(): number { + return this._vMin; + } - get vMax( ) : number { - return this._vMax; - } + get vMax(): number { + return this._vMax; + } - get limitsChanged( ) : Notification { - return this._limitsChanged; - } + get limitsChanged(): Notification { + return this._limitsChanged; + } - set vMin( vMin : number ) { - this._vMin = vMin; - this._limitsChanged.fire( ); - } + set vMin(vMin: number) { + this._vMin = vMin; + this._limitsChanged.fire(); + } - set vMax( vMax : number ) { - this._vMax = vMax; - this._limitsChanged.fire( ); - } + set vMax(vMax: number) { + this._vMax = vMax; + this._limitsChanged.fire(); + } - setVRange( vMin : number, vMax : number ) { - this._vMin = vMin; - this._vMax = vMax; - this._limitsChanged.fire( ); - } + setVRange(vMin: number, vMax: number) { + this._vMin = vMin; + this._vMax = vMax; + this._limitsChanged.fire(); + } - get vSize( ) : number { - return ( this._vMax - this._vMin ); - } + get vSize(): number { + return (this._vMax - this._vMin); + } - vAtFrac( vFrac : number ) : number { - return ( this._vMin + vFrac*( this._vMax - this._vMin ) ); - } + vAtFrac(vFrac: number): number { + return (this._vMin + vFrac * (this._vMax - this._vMin)); + } - vFrac( v : number ) : number { - return ( v - this._vMin ) / ( this._vMax - this._vMin ); - } + vFrac(v: number): number { + return (v - this._vMin) / (this._vMax - this._vMin); + } - pan( vAmount : number ) { - this._vMin += vAmount; - this._vMax += vAmount; - this._limitsChanged.fire( ); - } + pan(vAmount: number) { + this._vMin += vAmount; + this._vMax += vAmount; + this._limitsChanged.fire(); + } - zoom( factor : number, vAnchor : number ) { - this._vMin = vAnchor - factor*( vAnchor - this._vMin ); - this._vMax = vAnchor + factor*( this._vMax - vAnchor ); - this._limitsChanged.fire( ); - } + zoom(factor: number, vAnchor: number) { + this._vMin = vAnchor - factor * (vAnchor - this._vMin); + this._vMax = vAnchor + factor * (this._vMax - vAnchor); + this._limitsChanged.fire(); } +} - export function getTickInterval( axis : Axis1D, approxNumTicks : number ) : number { - var vMin = Math.min( axis.vMin, axis.vMax ); - var vMax = Math.max( axis.vMin, axis.vMax ); - var approxTickInterval = ( vMax - vMin ) / approxNumTicks; - var prelimTickInterval = Math.pow( 10, Math.round( log10( approxTickInterval ) ) ); - var prelimNumTicks = ( vMax - vMin ) / prelimTickInterval; +export function getTickInterval(axis: Axis1D, approxNumTicks: number): number { + let vMin = Math.min(axis.vMin, axis.vMax); + let vMax = Math.max(axis.vMin, axis.vMax); + let approxTickInterval = (vMax - vMin) / approxNumTicks; + let prelimTickInterval = Math.pow(10, Math.round(log10(approxTickInterval))); + let prelimNumTicks = (vMax - vMin) / prelimTickInterval; - if ( prelimNumTicks >= 5 * approxNumTicks ) return ( prelimTickInterval * 5 ); - if ( prelimNumTicks >= 2 * approxNumTicks ) return ( prelimTickInterval * 2 ); + if (prelimNumTicks >= 5 * approxNumTicks) return (prelimTickInterval * 5); + if (prelimNumTicks >= 2 * approxNumTicks) return (prelimTickInterval * 2); - if ( 5 * prelimNumTicks <= approxNumTicks ) return ( prelimTickInterval / 5 ); - if ( 2 * prelimNumTicks <= approxNumTicks ) return ( prelimTickInterval / 2 ); + if (5 * prelimNumTicks <= approxNumTicks) return (prelimTickInterval / 5); + if (2 * prelimNumTicks <= approxNumTicks) return (prelimTickInterval / 2); - return prelimTickInterval; - } + return prelimTickInterval; +} - export function getTickCount( axis : Axis1D, tickInterval : number ) : number { - return Math.ceil( Math.abs( axis.vSize ) / tickInterval ) + 1; - } +export function getTickCount(axis: Axis1D, tickInterval: number): number { + return Math.ceil(Math.abs(axis.vSize) / tickInterval) + 1; +} - export function getTickPositions( axis : Axis1D, tickInterval : number, tickCount : number, result : Float32Array ) { - var vMin = Math.min( axis.vMin, axis.vMax ); - var vMax = Math.max( axis.vMin, axis.vMax ); +export function getTickPositions(axis: Axis1D, tickInterval: number, tickCount: number, result: Float32Array) { + let vMin = Math.min(axis.vMin, axis.vMax); + let vMax = Math.max(axis.vMin, axis.vMax); - var minTickNumber = Math.floor( vMin / tickInterval ); + let minTickNumber = Math.floor(vMin / tickInterval); - for ( var i = 0; i < tickCount; i++ ) { - result[ i ] = ( minTickNumber + i ) * tickInterval; - } + for (let i = 0; i < tickCount; i++) { + result[i] = (minTickNumber + i) * tickInterval; + } - if ( axis.vMin > axis.vMax ) { - // XXX: Need floor() on tickCount/2? - for ( var i = 0; i < tickCount/2; i++ ) { - var temp = result[ i ]; - result[ i ] = result[ tickCount-1 - i ]; - result[ tickCount-1 - i ] = temp; - } + if (axis.vMin > axis.vMax) { + // XXX: Need floor() on tickCount/2? + for (let i = 0; i < tickCount / 2; i++) { + let temp = result[i]; + result[i] = result[tickCount - 1 - i]; + result[tickCount - 1 - i] = temp; } } +} - export class Axis2D { - private _xAxis : Axis1D; - private _yAxis : Axis1D; +export class Axis2D { + private _xAxis: Axis1D; + private _yAxis: Axis1D; - get xAxis( ) : Axis1D { return this._xAxis; } - get xMin( ) : number { return this._xAxis.vMin; } - get xMax( ) : number { return this._xAxis.vMax; } - xAtFrac( xFrac : number ) : number { return this._xAxis.vAtFrac( xFrac ); } + get xAxis(): Axis1D { return this._xAxis; } + get xMin(): number { return this._xAxis.vMin; } + get xMax(): number { return this._xAxis.vMax; } + xAtFrac(xFrac: number): number { return this._xAxis.vAtFrac(xFrac); } - get yAxis( ) : Axis1D { return this._yAxis; } - get yMin( ) : number { return this._yAxis.vMin; } - get yMax( ) : number { return this._yAxis.vMax; } - yAtFrac( yFrac : number ) : number { return this._yAxis.vAtFrac( yFrac ); } + get yAxis(): Axis1D { return this._yAxis; } + get yMin(): number { return this._yAxis.vMin; } + get yMax(): number { return this._yAxis.vMax; } + yAtFrac(yFrac: number): number { return this._yAxis.vAtFrac(yFrac); } - constructor( xAxis : Axis1D, yAxis : Axis1D ) { - this._xAxis = xAxis; - this._yAxis = yAxis; - } + constructor(xAxis: Axis1D, yAxis: Axis1D) { + this._xAxis = xAxis; + this._yAxis = yAxis; + } - onLimitsChanged( listener : Listener ) { - this._xAxis.limitsChanged.on( listener ); - this._yAxis.limitsChanged.on( listener ); - } + onLimitsChanged(listener: Listener) { + this._xAxis.limitsChanged.on(listener); + this._yAxis.limitsChanged.on(listener); + } - pan( xAmount : number, yAmount : number ) { - this._xAxis.pan( xAmount ); - this._yAxis.pan( yAmount ); - } + pan(xAmount: number, yAmount: number) { + this._xAxis.pan(xAmount); + this._yAxis.pan(yAmount); + } - zoom( factor : number, xAnchor : number, yAnchor : number ) { - this._xAxis.zoom( factor, xAnchor ); - this._yAxis.zoom( factor, yAnchor ); - } + zoom(factor: number, xAnchor: number, yAnchor: number) { + this._xAxis.zoom(factor, xAnchor); + this._yAxis.zoom(factor, yAnchor); } +} - export function newAxis2D( xMin : number, xMax : number, yMin : number, yMax : number ) : Axis2D { - return new Axis2D( new Axis1D( xMin, xMax ), new Axis1D( yMin, yMax ) ); - } +export function newAxis2D(xMin: number, xMax: number, yMin: number, yMax: number): Axis2D { + return new Axis2D(new Axis1D(xMin, xMax), new Axis1D(yMin, yMax)); +} - // XXX: Would be nice if this could be a const - export var axisZoomStep = 1.12; +// XXX: Would be nice if this could be a const +export let axisZoomStep = 1.12; - export function attachAxisMouseListeners1D( pane : Pane, axis : Axis1D, isVertical : boolean ) { - var vGrab : number = null; +export function attachAxisMouseListeners1D(pane: Pane, axis: Axis1D, isVertical: boolean) { + let vGrab: number = null; - pane.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && !hasval( vGrab ) ) { - vGrab = axis.vAtFrac( isVertical ? yFrac( ev ) : xFrac( ev ) ); - } - } ); + pane.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && !hasval(vGrab)) { + vGrab = axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev)); + } + }); - pane.mouseMove.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && hasval( vGrab ) ) { - axis.pan( vGrab - axis.vAtFrac( isVertical ? yFrac( ev ) : xFrac( ev ) ) ); - } - } ); + pane.mouseMove.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && hasval(vGrab)) { + axis.pan(vGrab - axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev))); + } + }); - pane.mouseUp.on( function( ev : PointerEvent ) { - vGrab = null; - } ); + pane.mouseUp.on(function (ev: PointerEvent) { + vGrab = null; + }); - pane.mouseWheel.on( function( ev : PointerEvent ) { - var zoomFactor = Math.pow( axisZoomStep, ev.wheelSteps ); - axis.zoom( zoomFactor, axis.vAtFrac( isVertical ? yFrac( ev ) : xFrac( ev ) ) ); - } ); - } + pane.mouseWheel.on(function (ev: PointerEvent) { + let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + axis.zoom(zoomFactor, axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev))); + }); +} - export function attachAxisMouseListeners2D( pane : Pane, axis : Axis2D ) { - var xGrab : number = null; - var yGrab : number = null; +export function attachAxisMouseListeners2D(pane: Pane, axis: Axis2D) { + let xGrab: number = null; + let yGrab: number = null; - pane.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && !hasval( xGrab ) ) { - xGrab = axis.xAtFrac( xFrac( ev ) ); - yGrab = axis.yAtFrac( yFrac( ev ) ); - } - } ); + pane.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && !hasval(xGrab)) { + xGrab = axis.xAtFrac(xFrac(ev)); + yGrab = axis.yAtFrac(yFrac(ev)); + } + }); - pane.mouseMove.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && hasval( xGrab ) ) { - axis.pan( xGrab - axis.xAtFrac( xFrac( ev ) ), yGrab - axis.yAtFrac( yFrac( ev ) ) ); - } - } ); + pane.mouseMove.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && hasval(xGrab)) { + axis.pan(xGrab - axis.xAtFrac(xFrac(ev)), yGrab - axis.yAtFrac(yFrac(ev))); + } + }); - pane.mouseUp.on( function( ev : PointerEvent ) { - xGrab = null; - yGrab = null; - } ); + pane.mouseUp.on(function (ev: PointerEvent) { + xGrab = null; + yGrab = null; + }); - pane.mouseWheel.on( function( ev : PointerEvent ) { - var zoomFactor = Math.pow( axisZoomStep, ev.wheelSteps ); - axis.zoom( zoomFactor, axis.xAtFrac( xFrac( ev ) ), axis.yAtFrac( yFrac( ev ) ) ); - } ); - } + pane.mouseWheel.on(function (ev: PointerEvent) { + let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + axis.zoom(zoomFactor, axis.xAtFrac(xFrac(ev)), axis.yAtFrac(yFrac(ev))); + }); +} diff --git a/src/webglimpse/plot/edge_axis_painter.ts b/src/webglimpse/plot/edge_axis_painter.ts index 153469b..c30918b 100644 --- a/src/webglimpse/plot/edge_axis_painter.ts +++ b/src/webglimpse/plot/edge_axis_painter.ts @@ -27,389 +27,409 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - export function edgeMarks_VERTSHADER( labelSide : Side ) { - // The shader uses 'a' for the along-axis coord, and 'b' for the across-axis coord - var horizontal = ( labelSide === Side.TOP || labelSide === Side.BOTTOM ); - var bFlip = ( labelSide === Side.LEFT || labelSide === Side.BOTTOM ); - return concatLines( - nearestPixelCenter_GLSLFUNC, - ' ', - ' uniform float u_VMin; ', - ' uniform float u_VSize; ', - ' uniform vec2 u_ViewportSize; ', - ' uniform float u_MarkSize; ', - ' ', - ' attribute vec2 a_VCoord; ', - ' ', - ' void main( ) { ', - ' float aViewportSize = ' + ( horizontal ? 'u_ViewportSize.x' : 'u_ViewportSize.y' ) + '; ', - ' float aFrac = nearestPixelCenter( ( a_VCoord.x - u_VMin ) / u_VSize, aViewportSize ); ', - ' float a = -1.0 + 2.0*( aFrac ); ', - ' ', - ' float bViewportSize = ' + ( horizontal ? 'u_ViewportSize.y' : 'u_ViewportSize.x' ) + '; ', - ' float bFrac = ( a_VCoord.y * u_MarkSize ) / bViewportSize; ', - ' float b = ' + ( bFlip ? '-' : '' ) + '( -1.0 + 2.0*( bFrac ) ); ', - ' ', - ' gl_Position = vec4( ' + ( horizontal ? 'a,b' : 'b,a' ) + ', 0.0, 1.0 ); ', - ' } ', - ' ' - ); - } - - export var gradient_FRAGSHADER = concatLines( - ' ', - ' precision highp float; ', - ' uniform sampler2D u_colorTex; ', - ' ', - ' varying vec2 v_texCoord; ', - ' ', - ' void main( ) { ', - ' vec4 color = texture2D( u_colorTex, v_texCoord ); ', - ' gl_FragColor = color; ', - ' gl_FragColor.a = 1.0; ', - ' } ' +import { Side, nearestPixelCenter_GLSLFUNC, modelview_VERTSHADER, solid_FRAGSHADER } from '../misc'; +import { concatLines, ensureCapacityFloat32, GL, order, hasval, clamp } from '../util/util'; +import { Axis1D, getTickInterval, getTickCount, getTickPositions } from './axis'; +import { Color, black } from '../color'; +import { Gradient, getGradientTexture } from '../gradient'; +import { Painter, yFrac, xFrac } from '../core'; +import { Program, UniformMatrix4f, UniformSampler2D, Attribute, UniformColor, Uniform1f, Uniform2f } from '../shader'; +import { heatmap_VERTSHADER } from './heatmap_painter'; +import { newDynamicBuffer } from '../buffer'; +import { Cache } from '../util/cache'; +import { TextTexture2D, newTextTextureCache } from '../text'; +import { TextureRenderer, TextureDrawOptions, Texture } from '../texture'; +import { BoundsUnmodifiable } from '../bounds'; +import { glOrthoViewport } from '../matrix'; + + +export function edgeMarks_VERTSHADER(labelSide: Side) { + // The shader uses 'a' for the along-axis coord, and 'b' for the across-axis coord + let horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM); + let bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM); + return concatLines( + nearestPixelCenter_GLSLFUNC, + ' ', + ' uniform float u_VMin; ', + ' uniform float u_VSize; ', + ' uniform vec2 u_ViewportSize; ', + ' uniform float u_MarkSize; ', + ' ', + ' attribute vec2 a_VCoord; ', + ' ', + ' void main( ) { ', + ' float aViewportSize = ' + (horizontal ? 'u_ViewportSize.x' : 'u_ViewportSize.y') + '; ', + ' float aFrac = nearestPixelCenter( ( a_VCoord.x - u_VMin ) / u_VSize, aViewportSize ); ', + ' float a = -1.0 + 2.0*( aFrac ); ', + ' ', + ' float bViewportSize = ' + (horizontal ? 'u_ViewportSize.y' : 'u_ViewportSize.x') + '; ', + ' float bFrac = ( a_VCoord.y * u_MarkSize ) / bViewportSize; ', + ' float b = ' + (bFlip ? '-' : '') + '( -1.0 + 2.0*( bFrac ) ); ', + ' ', + ' gl_Position = vec4( ' + (horizontal ? 'a,b' : 'b,a') + ', 0.0, 1.0 ); ', + ' } ', + ' ' ); - - // provides a custom labeler for axis tick marks - // - // value : the tick value to create a label string for - // axis : the axis associated with the tick value - // tickInterval : the requested spacing in pixels between ticks - // precision : number of decimal points which should be used for tick labels - // orderAxis : order( Math.abs( axis.vSize ) ) then rounded to nearest multiple of three (-3, 0, 3, 6...) - // orderFactor : Math.pow( 10, -orderAxis ) - export interface TickLabeler { - ( value : number, axis : Axis1D, tickInterval : number ): string; +} + +export let gradient_FRAGSHADER = concatLines( + ' ', + ' precision highp float; ', + ' uniform sampler2D u_colorTex; ', + ' ', + ' varying vec2 v_texCoord; ', + ' ', + ' void main( ) { ', + ' vec4 color = texture2D( u_colorTex, v_texCoord ); ', + ' gl_FragColor = color; ', + ' gl_FragColor.a = 1.0; ', + ' } ' +); + +// provides a custom labeler for axis tick marks +// +// value : the tick value to create a label string for +// axis : the axis associated with the tick value +// tickInterval : the requested spacing in pixels between ticks +// precision : number of decimal points which should be used for tick labels +// orderAxis : order( Math.abs( axis.vSize ) ) then rounded to nearest multiple of three (-3, 0, 3, 6...) +// orderFactor : Math.pow( 10, -orderAxis ) +export interface TickLabeler { + (value: number, axis: Axis1D, tickInterval: number): string; +} + + +export interface EdgeAxisPainterOptions { + tickSpacing?: number; + label?: string; + units?: string; + shortenLabels?: boolean; + font?: string; + textColor?: Color; + tickColor?: Color; + tickSize?: number; + showLabel?: boolean; + showBorder?: boolean; + gradientFill?: Gradient; + tickLabeler?: TickLabeler; +} + + +export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: EdgeAxisPainterOptions): Painter { + let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 100); + let label = (hasval(options) && hasval(options.label) ? options.label : ''); + let units = (hasval(options) && hasval(options.units) ? options.units : ''); + let shortenLabels = (hasval(options) && hasval(options.shortenLabels) ? options.shortenLabels : true); + let font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); + let textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black); + let tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black); + let tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6); + let showLabel = (hasval(options) && hasval(options.showLabel) ? options.showLabel : true); + let showBorder = (hasval(options) && hasval(options.showBorder) ? options.showBorder : false); + let gradientFill = (hasval(options) && hasval(options.gradientFill) ? options.gradientFill : undefined); + let tickLabeler = (hasval(options) && hasval(options.tickLabeler) ? options.tickLabeler : undefined); + + let tickPositions = new Float32Array(0); + + let gradientProgram = new Program(heatmap_VERTSHADER, gradient_FRAGSHADER); + let gradientProgram_u_modelViewMatrix = new UniformMatrix4f(gradientProgram, 'u_modelViewMatrix'); + let gradientProgram_u_colorTexture = new UniformSampler2D(gradientProgram, 'u_colorTex'); + let gradientProgram_a_vertCoord = new Attribute(gradientProgram, 'a_vertCoord'); + let gradientProgram_a_texCoord = new Attribute(gradientProgram, 'a_texCoord'); + + let gradientColorTexture: Texture = null; + if (gradientFill) { + let gradientColorTexture = getGradientTexture(gradientFill); } - - export interface EdgeAxisPainterOptions { - tickSpacing? : number; - label? : string; - units? : string; - shortenLabels? : boolean; - font? : string; - textColor? : Color; - tickColor? : Color; - tickSize? : number; - showLabel? : boolean; - showBorder? : boolean; - gradientFill?: Gradient; - tickLabeler? : TickLabeler; - } - - - export function newEdgeAxisPainter( axis : Axis1D, labelSide : Side, options? : EdgeAxisPainterOptions ) : Painter { - var tickSpacing = ( hasval( options ) && hasval( options.tickSpacing ) ? options.tickSpacing : 100 ); - var label = ( hasval( options ) && hasval( options.label ) ? options.label : '' ); - var units = ( hasval( options ) && hasval( options.units ) ? options.units : '' ); - var shortenLabels = ( hasval( options ) && hasval( options.shortenLabels ) ? options.shortenLabels : true ); - var font = ( hasval( options ) && hasval( options.font ) ? options.font : '11px verdana,sans-serif' ); - var textColor = ( hasval( options ) && hasval( options.textColor ) ? options.textColor : black ); - var tickColor = ( hasval( options ) && hasval( options.tickColor ) ? options.tickColor : black ); - var tickSize = ( hasval( options ) && hasval( options.tickSize ) ? options.tickSize : 6 ); - var showLabel = ( hasval( options ) && hasval( options.showLabel ) ? options.showLabel : true ); - var showBorder = ( hasval( options ) && hasval( options.showBorder ) ? options.showBorder : false ); - var gradientFill = ( hasval( options ) && hasval( options.gradientFill ) ? options.gradientFill : undefined ); - var tickLabeler = ( hasval( options ) && hasval( options.tickLabeler ) ? options.tickLabeler : undefined ); - - var tickPositions = new Float32Array( 0 ); - - var gradientProgram = new Program( heatmap_VERTSHADER, gradient_FRAGSHADER ); - var gradientProgram_u_modelViewMatrix = new UniformMatrix4f( gradientProgram, 'u_modelViewMatrix' ); - var gradientProgram_u_colorTexture = new UniformSampler2D( gradientProgram, 'u_colorTex' ); - var gradientProgram_a_vertCoord = new Attribute( gradientProgram, 'a_vertCoord' ); - var gradientProgram_a_texCoord = new Attribute( gradientProgram, 'a_texCoord' ); - - if ( gradientFill ) var gradientColorTexture = getGradientTexture( gradientFill ); - - var gradientVertCoords = new Float32Array( 0 ); - var gradientVertCoordsBuffer = newDynamicBuffer( ); - - var gradientTexCoords = new Float32Array( 0 ); - var gradientTexCoordsBuffer = newDynamicBuffer( ); - - var borderProgram = new Program( modelview_VERTSHADER, solid_FRAGSHADER ); - var borderProgram_a_Position = new Attribute( borderProgram, 'a_Position' ); - var borderProgram_u_modelViewMatrix = new UniformMatrix4f( borderProgram, 'u_modelViewMatrix' ); - var borderProgram_u_Color = new UniformColor( borderProgram, 'u_Color' ); - - var borderCoords = new Float32Array( 0 ); - var borderCoordsBuffer = newDynamicBuffer( ); - - var marksProgram = new Program( edgeMarks_VERTSHADER( labelSide ), solid_FRAGSHADER ); - var marksProgram_u_VMin = new Uniform1f( marksProgram, 'u_VMin' ); - var marksProgram_u_VSize = new Uniform1f( marksProgram, 'u_VSize' ); - var marksProgram_u_ViewportSize = new Uniform2f( marksProgram, 'u_ViewportSize' ); - var marksProgram_u_MarkSize = new Uniform1f( marksProgram, 'u_MarkSize' ); - var marksProgram_u_Color = new UniformColor( marksProgram, 'u_Color' ); - var marksProgram_a_VCoord = new Attribute( marksProgram, 'a_VCoord' ); - - var markCoords = new Float32Array( 0 ); - var markCoordsBuffer = newDynamicBuffer( ); - - var textTextures = > newTextTextureCache( font, textColor ); - var textureRenderer = new TextureRenderer( ); - var hTickLabels = textTextures.value( '-0.123456789' ).h; - var isVerticalAxis = ( labelSide === Side.LEFT || labelSide === Side.RIGHT ); - - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - - var sizePixels = isVerticalAxis ? viewport.h : viewport.w; - if ( sizePixels === 0 ) return; - var approxNumTicks = sizePixels / tickSpacing; - var tickInterval = getTickInterval( axis, approxNumTicks ); - var tickCount = getTickCount( axis, tickInterval ); - tickPositions = ensureCapacityFloat32( tickPositions, tickCount ); - getTickPositions( axis, tickInterval, tickCount, tickPositions ); - - - // Border Box and Gradient Fill - // - - //XXX border vertices are fixed in normalized 0-1 viewport coordinates - //XXX they could be calculated ahead of time -- however I had trouble with 'fuzzy' lines when using 0-1 coordinates - if ( showBorder || gradientFill ) { - borderCoords = ensureCapacityFloat32( borderCoords, 10 ); - - var horizontal = ( labelSide === Side.TOP || labelSide === Side.BOTTOM ); - var bFlip = ( labelSide === Side.LEFT || labelSide === Side.BOTTOM ); - var width = viewport.w - 1; - var height = viewport.h - 1; - - borderCoords[0] = horizontal ? 0 : ( bFlip ? width - tickSize : 0 ); - borderCoords[1] = !horizontal ? 0 : ( bFlip ? height - tickSize : 0 ); - - borderCoords[2] = horizontal ? 0 : ( bFlip ? width : tickSize ); - borderCoords[3] = !horizontal ? 0 : ( bFlip ? height : tickSize ); - - borderCoords[4] = horizontal ? width : ( bFlip ? width : tickSize ); - borderCoords[5] = !horizontal ? height : ( bFlip ? height : tickSize ); - - borderCoords[6] = horizontal ? width : ( bFlip ? width - tickSize : 0 ); - borderCoords[7] = !horizontal ? height : ( bFlip ? height - tickSize : 0 ); - - // finish off the box (same as 0, 1 coordinates) - borderCoords[8] = horizontal ? 0 : ( bFlip ? width - tickSize : 0 ); - borderCoords[9] = !horizontal ? 0 : ( bFlip ? height - tickSize : 0 ); - } - - if ( gradientFill ) { - gradientProgram.use( gl ); - gradientProgram_u_modelViewMatrix.setData( gl, glOrthoViewport( viewport ) ); - gradientProgram_u_colorTexture.setDataAndBind( gl, 0, gradientColorTexture ); - - gradientVertCoords = ensureCapacityFloat32( gradientVertCoords, 8 ); - gradientVertCoords[0] = borderCoords[2]; - gradientVertCoords[1] = borderCoords[3]; - gradientVertCoords[2] = borderCoords[0]; - gradientVertCoords[3] = borderCoords[1]; - gradientVertCoords[4] = borderCoords[4]; - gradientVertCoords[5] = borderCoords[5]; - gradientVertCoords[6] = borderCoords[6]; - gradientVertCoords[7] = borderCoords[7]; - gradientVertCoordsBuffer.setData( gradientVertCoords ); - gradientProgram_a_vertCoord.setDataAndEnable( gl, gradientVertCoordsBuffer, 2, GL.FLOAT ); - - // y texture coordinates don't really matter ( we're simulating a 1d texture ) - // using a 1-by-n 2d texture because 1d textures aren't available - gradientTexCoords = ensureCapacityFloat32( gradientTexCoords, 8 ); - gradientTexCoords[0] = 0; - gradientTexCoords[1] = 0; - gradientTexCoords[2] = 0; - gradientTexCoords[3] = 0; - gradientTexCoords[4] = 1; - gradientTexCoords[5] = 1; - gradientTexCoords[6] = 1; - gradientTexCoords[7] = 1; - gradientTexCoordsBuffer.setData( gradientTexCoords ); - gradientProgram_a_texCoord.setDataAndEnable( gl, gradientTexCoordsBuffer, 2, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); - - gradientProgram_u_colorTexture.unbind( gl ); - gradientProgram_a_vertCoord.disable( gl ); - gradientProgram_a_texCoord.disable( gl ); - gradientProgram.endUse( gl ); - } - - if ( showBorder ) { - borderProgram.use( gl ); - borderProgram_u_Color.setData( gl, tickColor ); - borderProgram_u_modelViewMatrix.setData( gl, glOrthoViewport( viewport ) ); - - borderCoordsBuffer.setData( borderCoords.subarray( 0, 10 ) ); - borderProgram_a_Position.setDataAndEnable( gl, borderCoordsBuffer, 2, GL.FLOAT ); - - // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 - gl.lineWidth( 1 ); - gl.drawArrays( GL.LINE_STRIP, 0, 5 ); - - borderProgram_a_Position.disable( gl ); - borderProgram.endUse( gl ); - } - - // Tick marks - // - - marksProgram.use( gl ); - marksProgram_u_VMin.setData( gl, axis.vMin ); - marksProgram_u_VSize.setData( gl, axis.vSize ); - marksProgram_u_ViewportSize.setData( gl, viewport.w, viewport.h ); - marksProgram_u_MarkSize.setData( gl, tickSize ); - marksProgram_u_Color.setData( gl, tickColor ); - - markCoords = ensureCapacityFloat32( markCoords, 4*tickCount ); - for ( var n = 0; n < tickCount; n++ ) { - var v = tickPositions[ n ]; - markCoords[ ( 4*n + 0 ) ] = v; - markCoords[ ( 4*n + 1 ) ] = 0; - markCoords[ ( 4*n + 2 ) ] = v; - markCoords[ ( 4*n + 3 ) ] = 1; - } - markCoordsBuffer.setData( markCoords.subarray( 0, 4*tickCount ) ); - marksProgram_a_VCoord.setDataAndEnable( gl, markCoordsBuffer, 2, GL.FLOAT ); + let gradientVertCoords = new Float32Array(0); + let gradientVertCoordsBuffer = newDynamicBuffer(); + + let gradientTexCoords = new Float32Array(0); + let gradientTexCoordsBuffer = newDynamicBuffer(); + + let borderProgram = new Program(modelview_VERTSHADER, solid_FRAGSHADER); + let borderProgram_a_Position = new Attribute(borderProgram, 'a_Position'); + let borderProgram_u_modelViewMatrix = new UniformMatrix4f(borderProgram, 'u_modelViewMatrix'); + let borderProgram_u_Color = new UniformColor(borderProgram, 'u_Color'); + + let borderCoords = new Float32Array(0); + let borderCoordsBuffer = newDynamicBuffer(); + + let marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER); + let marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin'); + let marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize'); + let marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize'); + let marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize'); + let marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color'); + let marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord'); + + let markCoords = new Float32Array(0); + let markCoordsBuffer = newDynamicBuffer(); + + let textTextures = >newTextTextureCache(font, textColor); + let textureRenderer = new TextureRenderer(); + let hTickLabels = textTextures.value('-0.123456789').h; + let isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT); + + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + + let sizePixels = isVerticalAxis ? viewport.h : viewport.w; + if (sizePixels === 0) return; + let approxNumTicks = sizePixels / tickSpacing; + let tickInterval = getTickInterval(axis, approxNumTicks); + let tickCount = getTickCount(axis, tickInterval); + tickPositions = ensureCapacityFloat32(tickPositions, tickCount); + getTickPositions(axis, tickInterval, tickCount, tickPositions); + + + // Border Box and Gradient Fill + // + + // XXX border vertices are fixed in normalized 0-1 viewport coordinates + // XXX they could be calculated ahead of time -- however I had trouble with 'fuzzy' lines when using 0-1 coordinates + if (showBorder || gradientFill) { + borderCoords = ensureCapacityFloat32(borderCoords, 10); + + let horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM); + let bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM); + let width = viewport.w - 1; + let height = viewport.h - 1; + + borderCoords[0] = horizontal ? 0 : (bFlip ? width - tickSize : 0); + borderCoords[1] = !horizontal ? 0 : (bFlip ? height - tickSize : 0); + + borderCoords[2] = horizontal ? 0 : (bFlip ? width : tickSize); + borderCoords[3] = !horizontal ? 0 : (bFlip ? height : tickSize); + + borderCoords[4] = horizontal ? width : (bFlip ? width : tickSize); + borderCoords[5] = !horizontal ? height : (bFlip ? height : tickSize); + + borderCoords[6] = horizontal ? width : (bFlip ? width - tickSize : 0); + borderCoords[7] = !horizontal ? height : (bFlip ? height - tickSize : 0); + + // finish off the box (same as 0, 1 coordinates) + borderCoords[8] = horizontal ? 0 : (bFlip ? width - tickSize : 0); + borderCoords[9] = !horizontal ? 0 : (bFlip ? height - tickSize : 0); + } + + if (gradientFill) { + gradientProgram.use(gl); + gradientProgram_u_modelViewMatrix.setData(gl, glOrthoViewport(viewport)); + gradientProgram_u_colorTexture.setDataAndBind(gl, 0, gradientColorTexture); + + gradientVertCoords = ensureCapacityFloat32(gradientVertCoords, 8); + gradientVertCoords[0] = borderCoords[2]; + gradientVertCoords[1] = borderCoords[3]; + gradientVertCoords[2] = borderCoords[0]; + gradientVertCoords[3] = borderCoords[1]; + gradientVertCoords[4] = borderCoords[4]; + gradientVertCoords[5] = borderCoords[5]; + gradientVertCoords[6] = borderCoords[6]; + gradientVertCoords[7] = borderCoords[7]; + gradientVertCoordsBuffer.setData(gradientVertCoords); + gradientProgram_a_vertCoord.setDataAndEnable(gl, gradientVertCoordsBuffer, 2, GL.FLOAT); + + // y texture coordinates don't really matter ( we're simulating a 1d texture ) + // using a 1-by-n 2d texture because 1d textures aren't available + gradientTexCoords = ensureCapacityFloat32(gradientTexCoords, 8); + gradientTexCoords[0] = 0; + gradientTexCoords[1] = 0; + gradientTexCoords[2] = 0; + gradientTexCoords[3] = 0; + gradientTexCoords[4] = 1; + gradientTexCoords[5] = 1; + gradientTexCoords[6] = 1; + gradientTexCoords[7] = 1; + gradientTexCoordsBuffer.setData(gradientTexCoords); + gradientProgram_a_texCoord.setDataAndEnable(gl, gradientTexCoordsBuffer, 2, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4); + + gradientProgram_u_colorTexture.unbind(gl); + gradientProgram_a_vertCoord.disable(gl); + gradientProgram_a_texCoord.disable(gl); + gradientProgram.endUse(gl); + } + + if (showBorder) { + borderProgram.use(gl); + borderProgram_u_Color.setData(gl, tickColor); + borderProgram_u_modelViewMatrix.setData(gl, glOrthoViewport(viewport)); + + borderCoordsBuffer.setData(borderCoords.subarray(0, 10)); + borderProgram_a_Position.setDataAndEnable(gl, borderCoordsBuffer, 2, GL.FLOAT); // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 - gl.lineWidth( 1 ); - gl.drawArrays( GL.LINES, 0, 2*tickCount ); - - marksProgram_a_VCoord.disable( gl ); - marksProgram.endUse( gl ); - - - // Tick labels - // - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - var orderAxisRaw = order( Math.abs( axis.vSize ) ); - var orderAxis = 0; - if ( orderAxisRaw > 0 ) { - orderAxis = Math.floor( ( orderAxisRaw - 1 ) / 3 ) * 3; + gl.lineWidth(1); + gl.drawArrays(GL.LINE_STRIP, 0, 5); + + borderProgram_a_Position.disable(gl); + borderProgram.endUse(gl); + } + + // Tick marks + // + + marksProgram.use(gl); + marksProgram_u_VMin.setData(gl, axis.vMin); + marksProgram_u_VSize.setData(gl, axis.vSize); + marksProgram_u_ViewportSize.setData(gl, viewport.w, viewport.h); + marksProgram_u_MarkSize.setData(gl, tickSize); + marksProgram_u_Color.setData(gl, tickColor); + + markCoords = ensureCapacityFloat32(markCoords, 4 * tickCount); + for (let n = 0; n < tickCount; n++) { + let v = tickPositions[n]; + markCoords[(4 * n + 0)] = v; + markCoords[(4 * n + 1)] = 0; + markCoords[(4 * n + 2)] = v; + markCoords[(4 * n + 3)] = 1; + } + markCoordsBuffer.setData(markCoords.subarray(0, 4 * tickCount)); + marksProgram_a_VCoord.setDataAndEnable(gl, markCoordsBuffer, 2, GL.FLOAT); + + // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 + gl.lineWidth(1); + gl.drawArrays(GL.LINES, 0, 2 * tickCount); + + marksProgram_a_VCoord.disable(gl); + marksProgram.endUse(gl); + + + // Tick labels + // + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + let orderAxisRaw = order(Math.abs(axis.vSize)); + let orderAxis = 0; + if (orderAxisRaw > 0) { + orderAxis = Math.floor((orderAxisRaw - 1) / 3) * 3; + } + else if (orderAxisRaw < 0) { + orderAxis = (Math.ceil(orderAxisRaw / 3) - 1) * 3; + } + let orderFactor = Math.pow(10, -orderAxis); + let orderTick = order(tickInterval); + let precision = Math.max(0, orderAxis - orderTick); + + textTextures.resetTouches(); + textureRenderer.begin(gl, viewport); + + for (let n = 0; n < tickCount; n++) { + let v = tickPositions[n]; + let vFrac = axis.vFrac(v); + if (vFrac < 0 || vFrac >= 1) continue; + + let tickLabel; + if (tickLabeler) { + // show custom tick value + tickLabel = tickLabeler(v, axis, tickInterval); } - else if ( orderAxisRaw < 0 ) { - orderAxis = ( Math.ceil( orderAxisRaw / 3 ) - 1 ) * 3; + else if (shortenLabels && showLabel) { + // show shortened tick value + tickLabel = Number(v * orderFactor).toFixed(precision); } - var orderFactor = Math.pow( 10, -orderAxis ); - var orderTick = order( tickInterval ); - var precision = Math.max( 0, orderAxis - orderTick ); - - textTextures.resetTouches( ); - textureRenderer.begin( gl, viewport ); - - for ( var n = 0; n < tickCount; n++ ) { - var v = tickPositions[ n ]; - var vFrac = axis.vFrac( v ); - if ( vFrac < 0 || vFrac >= 1 ) continue; - - var tickLabel; - if ( tickLabeler ) { - // show custom tick value - tickLabel = tickLabeler( v, axis, tickInterval ); - } - else if ( shortenLabels && showLabel ) { - // show shortened tick value - tickLabel = Number( v * orderFactor ).toFixed( precision ); - } - else if ( !shortenLabels ) { - // show actual tick value - if ( orderAxisRaw >= 0 ) { - tickLabel = Number( v ).toFixed( 0 ); - } - else { - tickLabel = Number( v ).toFixed( -orderAxisRaw ); - } + else if (!shortenLabels) { + // show actual tick value + if (orderAxisRaw >= 0) { + tickLabel = Number(v).toFixed(0); } else { - // show magnitude inline for each tick - tickLabel = Number( v * orderFactor ).toFixed( precision ) + ( orderAxis === 0 ? '' : 'e' + orderAxis ); + tickLabel = Number(v).toFixed(-orderAxisRaw); } - var textTexture = textTextures.value( tickLabel ); - - var xFrac : number; - var yFrac : number; - if ( labelSide === Side.LEFT || labelSide === Side.RIGHT ) { - var yAnchor = textTexture.yAnchor( 0.43 ); - var j0 = ( vFrac * viewport.h ) - yAnchor*textTexture.h; - var j = clamp( 0, viewport.h - textTexture.h, j0 ); - yFrac = j / viewport.h; - - if ( labelSide === Side.LEFT ) { - xFrac = ( viewport.w - tickSize - 2 - textTexture.w ) / viewport.w; - } - else { - xFrac = ( tickSize + 2 ) / viewport.w; - } + } + else { + // show magnitude inline for each tick + tickLabel = Number(v * orderFactor).toFixed(precision) + (orderAxis === 0 ? '' : 'e' + orderAxis); + } + let textTexture = textTextures.value(tickLabel); + + let xFrac: number; + let yFrac: number; + if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { + let yAnchor = textTexture.yAnchor(0.43); + let j0 = (vFrac * viewport.h) - yAnchor * textTexture.h; + let j = clamp(0, viewport.h - textTexture.h, j0); + yFrac = j / viewport.h; + + if (labelSide === Side.LEFT) { + xFrac = (viewport.w - tickSize - 2 - textTexture.w) / viewport.w; } else { - var wMinus = 0; - if ( v < 0 ) { - var absTickLabel = Number( Math.abs( v ) * orderFactor ).toFixed( precision ); - wMinus = textTexture.w - textTextures.value( absTickLabel ).w; - } - - var xAnchor = 0.45; - var i0 = ( vFrac * viewport.w ) - xAnchor*( textTexture.w - wMinus ) - wMinus; - var i = clamp( 0, viewport.w - textTexture.w, i0 ); - xFrac = i / viewport.w; - - if ( labelSide === Side.BOTTOM ) { - yFrac = ( viewport.h - tickSize - 2 - hTickLabels ) / viewport.h; - } - else { - yFrac = ( tickSize + 2 ) / viewport.h; - } + xFrac = (tickSize + 2) / viewport.w; } - textureRenderer.draw( gl, textTexture, xFrac, yFrac, { xAnchor: 0, yAnchor: 0 } ); } + else { + let wMinus = 0; + if (v < 0) { + let absTickLabel = Number(Math.abs(v) * orderFactor).toFixed(precision); + wMinus = textTexture.w - textTextures.value(absTickLabel).w; + } + let xAnchor = 0.45; + let i0 = (vFrac * viewport.w) - xAnchor * (textTexture.w - wMinus) - wMinus; + let i = clamp(0, viewport.w - textTexture.w, i0); + xFrac = i / viewport.w; - // Axis label - // - - if ( showLabel ) { - var unitsString = units + ( !shortenLabels || orderAxis === 0 ? '' : ' x 10^' + orderAxis.toFixed( 0 ) ); - var axisLabel = label + ( unitsString ? ' (' + unitsString + ')' : '' ); - - if ( axisLabel !== '' ) { - var textTexture = textTextures.value( axisLabel ); - - var xFrac : number; - var yFrac : number; - var textOpts : TextureDrawOptions; - if ( labelSide === Side.LEFT || labelSide === Side.RIGHT ) { - // Using hTickLabels here works out about right, even though the tick-label text is horizontal - var xFrac0 = 0.5 * ( viewport.w - tickSize - 2 - hTickLabels ) / viewport.w; - xFrac = ( labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0 ); - yFrac = 0.5; - textOpts = { xAnchor: textTexture.yAnchor( 0.5 ), - yAnchor: 0.5, - rotation_CCWRAD: 0.5 * Math.PI }; - } - else { - var yFrac0 = 0.5 * ( viewport.h - tickSize - 2 - hTickLabels ) / viewport.h; - yFrac = ( labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0 ); - xFrac = 0.5; - textOpts = { xAnchor: 0.5, - yAnchor: textTexture.yAnchor( 0.5 ), - rotation_CCWRAD: 0 }; - } - textureRenderer.draw( gl, textTexture, xFrac, yFrac, textOpts ); + if (labelSide === Side.BOTTOM) { + yFrac = (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; + } + else { + yFrac = (tickSize + 2) / viewport.h; } } + textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: 0, yAnchor: 0 }); + } + + + // Axis label + // + + if (showLabel) { + let unitsString = units + (!shortenLabels || orderAxis === 0 ? '' : ' x 10^' + orderAxis.toFixed(0)); + let axisLabel = label + (unitsString ? ' (' + unitsString + ')' : ''); + + if (axisLabel !== '') { + let textTexture = textTextures.value(axisLabel); + + let xFrac: number; + let yFrac: number; + let textOpts: TextureDrawOptions; + if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { + // Using hTickLabels here works out about right, even though the tick-label text is horizontal + let xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w; + xFrac = (labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0); + yFrac = 0.5; + textOpts = { + xAnchor: textTexture.yAnchor(0.5), + yAnchor: 0.5, + rotation_CCWRAD: 0.5 * Math.PI + }; + } + else { + let yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; + yFrac = (labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0); + xFrac = 0.5; + textOpts = { + xAnchor: 0.5, + yAnchor: textTexture.yAnchor(0.5), + rotation_CCWRAD: 0 + }; + } + textureRenderer.draw(gl, textTexture, xFrac, yFrac, textOpts); + } + } - // Finish up - // + // Finish up + // - textureRenderer.end( gl ); - textTextures.retainTouched( ); - }; - } + textureRenderer.end(gl); + textTextures.retainTouched(); + }; +} diff --git a/src/webglimpse/plot/heatmap_painter.ts b/src/webglimpse/plot/heatmap_painter.ts index cad5df5..45c5082 100644 --- a/src/webglimpse/plot/heatmap_painter.ts +++ b/src/webglimpse/plot/heatmap_painter.ts @@ -27,138 +27,145 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module Webglimpse { - - export interface HeatmapPainterOptions { - blend? : boolean; - } - - export interface HeatMapData { - // matrix data stored x-major - array : Float32Array; - - // size of the matrix - xSize : number; - ySize : number; - - // bounds of the matrix in axis coordinates - xMin : number; - xMax : number; - yMin : number; - yMax : number; - } - - - export var heatmap_VERTSHADER = concatLines( - ' ', - ' uniform mat4 u_modelViewMatrix; ', - ' attribute vec4 a_vertCoord; ', - ' attribute vec2 a_texCoord; ', - ' varying vec2 v_texCoord; ', - ' ', - ' void main( ) { ', - ' gl_Position = u_modelViewMatrix * a_vertCoord; ', - ' v_texCoord = a_texCoord; ', - ' } ', - ' ' - ); - - - export var heatmap_FRAGSHADER = concatLines( - ' ', - ' precision highp float; ', - ' uniform sampler2D u_dataTex; ', - ' uniform sampler2D u_colorTex; ', - ' uniform float u_dataMin; ', - ' uniform float u_dataMax; ', - ' ', - ' varying vec2 v_texCoord; ', - ' ', - ' void main() ', - ' { ', - ' float dataVal = texture2D( u_dataTex, v_texCoord ).r; ', - ' float normalizedVal = ( dataVal - u_dataMin ) / ( u_dataMax - u_dataMin ); ', - ' clamp( normalizedVal, 0.0, 1.0 ); ', - ' ', - ' vec4 color = texture2D( u_colorTex, vec2( normalizedVal, 0 ) ); ', - ' gl_FragColor = color; ', - ' gl_FragColor.a = 1.0; ', - ' } ' - ); - - /** - * Simple heatmap painter which displays a 2d matrix of static data - */ - export function newHeatmapPainter( axis : Axis2D, colorAxis : Axis1D, data : HeatMapData, colorTexture : Texture, options? : HeatmapPainterOptions ) : Painter { - - var blend = ( hasval( options ) && hasval( options.blend ) ? options.blend : false ); - - // only GL_RGBA is supported with GL_FLOAT texture type in webgl (see texture.ts) - // we we currently need an array 4 times bigger than necessary in order to use FLOATS - // to store the matrix data in a texture - var array = new Float32Array( data.xSize * data.ySize * 4 ); - for ( var x = 0 ; x < data.xSize ; x++ ) { - for ( var y = 0 ; y < data.ySize ; y++ ) { - var index = x * data.ySize + y; - var value = data.array[ index ]; - - array[ 4*index ] = value; - array[ 4*index + 1 ] = value; - array[ 4*index + 2 ] = value; - array[ 4*index + 3 ] = value; - } +import { concatLines, GL, hasval } from '../util/util'; +import { Axis2D, Axis1D } from './axis'; +import { Texture, FloatDataTexture2D } from '../texture'; +import { Painter } from '../core'; +import { Program, UniformMatrix4f, UniformSampler2D, Uniform1f, Attribute } from '../shader'; +import { newStaticBuffer } from '../buffer'; +import { BoundsUnmodifiable } from '../bounds'; +import { glOrthoAxis } from '../matrix'; + + +export interface HeatmapPainterOptions { + blend?: boolean; +} + +export interface HeatMapData { + // matrix data stored x-major + array: Float32Array; + + // size of the matrix + xSize: number; + ySize: number; + + // bounds of the matrix in axis coordinates + xMin: number; + xMax: number; + yMin: number; + yMax: number; +} + + +export let heatmap_VERTSHADER = concatLines( + ' ', + ' uniform mat4 u_modelViewMatrix; ', + ' attribute vec4 a_vertCoord; ', + ' attribute vec2 a_texCoord; ', + ' varying vec2 v_texCoord; ', + ' ', + ' void main( ) { ', + ' gl_Position = u_modelViewMatrix * a_vertCoord; ', + ' v_texCoord = a_texCoord; ', + ' } ', + ' ' +); + + +export let heatmap_FRAGSHADER = concatLines( + ' ', + ' precision highp float; ', + ' uniform sampler2D u_dataTex; ', + ' uniform sampler2D u_colorTex; ', + ' uniform float u_dataMin; ', + ' uniform float u_dataMax; ', + ' ', + ' varying vec2 v_texCoord; ', + ' ', + ' void main() ', + ' { ', + ' float dataVal = texture2D( u_dataTex, v_texCoord ).r; ', + ' float normalizedVal = ( dataVal - u_dataMin ) / ( u_dataMax - u_dataMin ); ', + ' clamp( normalizedVal, 0.0, 1.0 ); ', + ' ', + ' vec4 color = texture2D( u_colorTex, vec2( normalizedVal, 0 ) ); ', + ' gl_FragColor = color; ', + ' gl_FragColor.a = 1.0; ', + ' } ' +); + +/** + * Simple heatmap painter which displays a 2d matrix of static data + */ +export function newHeatmapPainter(axis: Axis2D, colorAxis: Axis1D, data: HeatMapData, colorTexture: Texture, options?: HeatmapPainterOptions): Painter { + + let blend = (hasval(options) && hasval(options.blend) ? options.blend : false); + + // only GL_RGBA is supported with GL_FLOAT texture type in webgl (see texture.ts) + // we we currently need an array 4 times bigger than necessary in order to use FLOATS + // to store the matrix data in a texture + let array = new Float32Array(data.xSize * data.ySize * 4); + for (let x = 0; x < data.xSize; x++) { + for (let y = 0; y < data.ySize; y++) { + let index = x * data.ySize + y; + let value = data.array[index]; + + array[4 * index] = value; + array[4 * index + 1] = value; + array[4 * index + 2] = value; + array[4 * index + 3] = value; } - data.array = array; - - var program = new Program( heatmap_VERTSHADER, heatmap_FRAGSHADER ); - var u_modelViewMatrix = new UniformMatrix4f( program, 'u_modelViewMatrix' ); - var u_dataTexture = new UniformSampler2D( program, 'u_dataTex' ); - var u_colorTexture = new UniformSampler2D( program, 'u_colorTex' ); - var u_dataMin = new Uniform1f( program, 'u_dataMin' ); - var u_dataMax = new Uniform1f( program, 'u_dataMax' ); - var a_vertCoord = new Attribute( program, 'a_vertCoord' ); - var a_texCoord = new Attribute( program, 'a_texCoord' ); - - var texture = new FloatDataTexture2D( data.xSize, data.ySize, data.array ); - - // points in triangle strip - var vertCoordArray = [ data.xMin, data.yMax, data.xMax, data.yMax, data.xMin, data.yMin, data.xMax, data.yMin ]; - var vertCoordFloatArray = new Float32Array( vertCoordArray ); - var vertCoordBuffer = newStaticBuffer( vertCoordFloatArray ); - - // texture coordinates - var texCoordArray = [ 0, 1, 1, 1, 0, 0, 1, 0 ]; - var texCoordFloatArray = new Float32Array( texCoordArray ); - var texCoordBuffer = newStaticBuffer( texCoordFloatArray ); - - var dim = 2; - var vertexCount = 4; - - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - - if ( blend ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - } - - program.use( gl ); - u_dataTexture.setDataAndBind( gl, 0, texture ); - u_colorTexture.setDataAndBind( gl, 1, colorTexture ); - u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); - - u_dataMin.setData( gl, colorAxis.vMin ); - u_dataMax.setData( gl, colorAxis.vMax ); - - a_vertCoord.setDataAndEnable( gl, vertCoordBuffer, dim, GL.FLOAT ); - a_texCoord.setDataAndEnable( gl, texCoordBuffer, dim, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLE_STRIP, 0, vertexCount ); - - a_vertCoord.disable( gl ); - a_texCoord.disable( gl ); - u_dataTexture.unbind( gl ); - u_colorTexture.unbind( gl ); - program.endUse( gl ); - }; } - } \ No newline at end of file + data.array = array; + + let program = new Program(heatmap_VERTSHADER, heatmap_FRAGSHADER); + let u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); + let u_dataTexture = new UniformSampler2D(program, 'u_dataTex'); + let u_colorTexture = new UniformSampler2D(program, 'u_colorTex'); + let u_dataMin = new Uniform1f(program, 'u_dataMin'); + let u_dataMax = new Uniform1f(program, 'u_dataMax'); + let a_vertCoord = new Attribute(program, 'a_vertCoord'); + let a_texCoord = new Attribute(program, 'a_texCoord'); + + let texture = new FloatDataTexture2D(data.xSize, data.ySize, data.array); + + // points in triangle strip + let vertCoordArray = [data.xMin, data.yMax, data.xMax, data.yMax, data.xMin, data.yMin, data.xMax, data.yMin]; + let vertCoordFloatArray = new Float32Array(vertCoordArray); + let vertCoordBuffer = newStaticBuffer(vertCoordFloatArray); + + // texture coordinates + let texCoordArray = [0, 1, 1, 1, 0, 0, 1, 0]; + let texCoordFloatArray = new Float32Array(texCoordArray); + let texCoordBuffer = newStaticBuffer(texCoordFloatArray); + + let dim = 2; + let vertexCount = 4; + + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + + if (blend) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + } + + program.use(gl); + u_dataTexture.setDataAndBind(gl, 0, texture); + u_colorTexture.setDataAndBind(gl, 1, colorTexture); + u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); + + u_dataMin.setData(gl, colorAxis.vMin); + u_dataMax.setData(gl, colorAxis.vMax); + + a_vertCoord.setDataAndEnable(gl, vertCoordBuffer, dim, GL.FLOAT); + a_texCoord.setDataAndEnable(gl, texCoordBuffer, dim, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLE_STRIP, 0, vertexCount); + + a_vertCoord.disable(gl); + a_texCoord.disable(gl); + u_dataTexture.unbind(gl); + u_colorTexture.unbind(gl); + program.endUse(gl); + }; +} \ No newline at end of file diff --git a/src/webglimpse/plot/line_painter.ts b/src/webglimpse/plot/line_painter.ts index db7b25f..14bbd1f 100644 --- a/src/webglimpse/plot/line_painter.ts +++ b/src/webglimpse/plot/line_painter.ts @@ -27,74 +27,81 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - export interface XyLinePainterOptions { - color? : Color; - blend? : boolean; - thickness? : number; +import { Color, black } from '../color'; +import { Axis2D } from './axis'; +import { Painter } from '../core'; +import { Program, UniformColor, UniformMatrix4f } from '../shader'; +import { modelview_VERTSHADER, solid_FRAGSHADER } from '../misc'; +import { newStaticBuffer } from '../buffer'; +import { BoundsUnmodifiable } from '../bounds'; +import { GL, hasval } from '../util/util'; +import { glOrthoAxis } from '../matrix'; + +export interface XyLinePainterOptions { + color?: Color; + blend?: boolean; + thickness?: number; +} + + +/** + * Simple xy line painter which displays static data + */ +export function newXyLinePainter(axis: Axis2D, xCoords: number[], yCoords: number[], options?: XyLinePainterOptions): Painter { + let thickness = (hasval(options) && hasval(options.thickness) ? options.thickness : 4); + let color = (hasval(options) && hasval(options.color) ? options.color : black); + let blend = (hasval(options) && hasval(options.blend) ? options.blend : false); + + let program = new Program(modelview_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); + + let coordArray = []; + for (let i = 0; i < xCoords.length; i++) { + coordArray[2 * i] = xCoords[i]; + coordArray[2 * i + 1] = yCoords[i]; } + let coordFloatArray = new Float32Array(coordArray); + let coordBuffer = newStaticBuffer(coordFloatArray); + let dim = 2; + let count = coordFloatArray.length / dim; + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - /** - * Simple xy line painter which displays static data - */ - export function newXyLinePainter( axis : Axis2D, xCoords : number[], yCoords : number[], options? : XyLinePainterOptions ) : Painter { - var thickness = ( hasval( options ) && hasval( options.thickness ) ? options.thickness : 4 ); - var color = ( hasval( options ) && hasval( options.color ) ? options.color : black ); - var blend = ( hasval( options ) && hasval( options.blend ) ? options.blend : false ); - - var program = new Program( modelview_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var u_modelViewMatrix = new UniformMatrix4f( program, 'u_modelViewMatrix' ); - - var coordArray = []; - for ( var i = 0 ; i < xCoords.length ; i++ ) { - coordArray[2*i] = xCoords[i]; - coordArray[2*i+1] = yCoords[i]; + if (blend) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); } - var coordFloatArray = new Float32Array( coordArray ); - var coordBuffer = newStaticBuffer( coordFloatArray ); - var dim = 2; - var count = coordFloatArray.length / dim; - - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( blend ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - } + // enable the shader + program.use(gl); - // enable the shader - program.use( gl ); + // set color and projection matrix variables + u_Color.setData(gl, color); - // set color and projection matrix variables - u_Color.setData( gl, color ); + // set the projection matrix based on the axis bounds + u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); - // set the projection matrix based on the axis bounds - u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); + // XXX: IE doesn't support lineWidth + gl.lineWidth(thickness); - // XXX: IE doesn't support lineWidth - gl.lineWidth( thickness ); + // enable vertex attribute array corresponding to vPosition variable in shader + gl.enableVertexAttribArray(0); - // enable vertex attribute array corresponding to vPosition variable in shader - gl.enableVertexAttribArray( 0 ); + // bind buffer data to vertex attribute array + coordBuffer.bind(gl, GL.ARRAY_BUFFER); - // bind buffer data to vertex attribute array - coordBuffer.bind( gl, GL.ARRAY_BUFFER ); + // first argument corresponds to the 0 attrib array set above + // second argument indicates two coordinates per vertex + gl.vertexAttribPointer(0, dim, GL.FLOAT, false, 0, 0); - // first argument corresponds to the 0 attrib array set above - // second argument indicates two coordinates per vertex - gl.vertexAttribPointer( 0, dim, GL.FLOAT, false, 0, 0 ); + // draw the lines + gl.drawArrays(GL.LINE_STRIP, 0, count); - // draw the lines - gl.drawArrays( GL.LINE_STRIP, 0, count ); - - coordBuffer.unbind( gl, GL.ARRAY_BUFFER ); - program.endUse( gl ); - } + coordBuffer.unbind(gl, GL.ARRAY_BUFFER); + program.endUse(gl); } +} diff --git a/src/webglimpse/plot/plot_layout.ts b/src/webglimpse/plot/plot_layout.ts index b2a9144..c81c95b 100644 --- a/src/webglimpse/plot/plot_layout.ts +++ b/src/webglimpse/plot/plot_layout.ts @@ -27,78 +27,81 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Layout, LayoutEntry } from '../core'; +import { BoundsUnmodifiable } from '../bounds'; +import { Side } from '../misc'; +import { hasval } from '../util/util'; +export function newPlotLayout(options?: { horizAxisHeight?: number; vertAxisWidth?: number }): Layout { + let horizAxisHeight = (hasval(options) && hasval(options.horizAxisHeight) ? options.horizAxisHeight : 60); + let vertAxisWidth = (hasval(options) && hasval(options.vertAxisWidth) ? options.vertAxisWidth : 70); - export function newPlotLayout( options? : { horizAxisHeight? : number; vertAxisWidth? : number } ) : Layout { - var horizAxisHeight = ( hasval( options ) && hasval( options.horizAxisHeight ) ? options.horizAxisHeight : 60 ); - var vertAxisWidth = ( hasval( options ) && hasval( options.vertAxisWidth ) ? options.vertAxisWidth : 70 ); + return { - return { - - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - var topAxes = [ ]; - var leftAxes = [ ]; - var rightAxes = [ ]; - var bottomAxes = [ ]; - var centers = [ ]; - var others = [ ]; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - switch ( child.layoutArg ) { - case Side.TOP: topAxes.push( child ); break; - case Side.LEFT: leftAxes.push( child ); break; - case Side.RIGHT: rightAxes.push( child ); break; - case Side.BOTTOM: bottomAxes.push( child ); break; - case null: centers.push( child ); break; - default: others.push( child ); break; - } + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + let topAxes = []; + let leftAxes = []; + let rightAxes = []; + let bottomAxes = []; + let centers = []; + let others = []; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + switch (child.layoutArg) { + case Side.TOP: topAxes.push(child); break; + case Side.LEFT: leftAxes.push(child); break; + case Side.RIGHT: rightAxes.push(child); break; + case Side.BOTTOM: bottomAxes.push(child); break; + case null: centers.push(child); break; + default: others.push(child); break; } + } - var numVertAxes = leftAxes.length + rightAxes.length; - var numHorizAxes = topAxes.length + bottomAxes.length; - var centerWidth = Math.max( vertAxisWidth, parentViewport.w - numVertAxes*vertAxisWidth ); - var centerHeight = Math.max( horizAxisHeight, parentViewport.h - numHorizAxes*horizAxisHeight ); - var vertAxisWidth2 = ( numVertAxes === 0 ? 0 : ( parentViewport.w - centerWidth )/numVertAxes ); - var horizAxisHeight2 = ( numHorizAxes === 0 ? 0 : ( parentViewport.h - centerHeight )/numHorizAxes ); + let numVertAxes = leftAxes.length + rightAxes.length; + let numHorizAxes = topAxes.length + bottomAxes.length; + let centerWidth = Math.max(vertAxisWidth, parentViewport.w - numVertAxes * vertAxisWidth); + let centerHeight = Math.max(horizAxisHeight, parentViewport.h - numHorizAxes * horizAxisHeight); + let vertAxisWidth2 = (numVertAxes === 0 ? 0 : (parentViewport.w - centerWidth) / numVertAxes); + let horizAxisHeight2 = (numHorizAxes === 0 ? 0 : (parentViewport.h - centerHeight) / numHorizAxes); - var iCenterStart = parentViewport.iStart + leftAxes.length*vertAxisWidth2; - var iCenterEnd = parentViewport.iEnd - rightAxes.length*vertAxisWidth2; - var jCenterStart = parentViewport.jStart + bottomAxes.length*horizAxisHeight2; - var jCenterEnd = parentViewport.jEnd - topAxes.length*horizAxisHeight2; + let iCenterStart = parentViewport.iStart + leftAxes.length * vertAxisWidth2; + let iCenterEnd = parentViewport.iEnd - rightAxes.length * vertAxisWidth2; + let jCenterStart = parentViewport.jStart + bottomAxes.length * horizAxisHeight2; + let jCenterEnd = parentViewport.jEnd - topAxes.length * horizAxisHeight2; - for ( var c = 0; c < topAxes.length; c++ ) { - var jStart = Math.round( jCenterEnd + c*horizAxisHeight2 ); - var jEnd = ( c === topAxes.length-1 ? parentViewport.jEnd : Math.round( jCenterEnd + (c+1)*horizAxisHeight2 ) ); - topAxes[ c ].viewport.setEdges( iCenterStart, iCenterEnd, jStart, jEnd ); - } + for (let c = 0; c < topAxes.length; c++) { + let jStart = Math.round(jCenterEnd + c * horizAxisHeight2); + let jEnd = (c === topAxes.length - 1 ? parentViewport.jEnd : Math.round(jCenterEnd + (c + 1) * horizAxisHeight2)); + topAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd); + } - for ( var c = 0; c < bottomAxes.length; c++ ) { - var jStart = ( c === bottomAxes.length-1 ? parentViewport.jStart : Math.round( jCenterStart - (c+1)*horizAxisHeight2 ) ); - var jEnd = Math.round( jCenterStart - c*horizAxisHeight2 ); - bottomAxes[ c ].viewport.setEdges( iCenterStart, iCenterEnd, jStart, jEnd ); - } + for (let c = 0; c < bottomAxes.length; c++) { + let jStart = (c === bottomAxes.length - 1 ? parentViewport.jStart : Math.round(jCenterStart - (c + 1) * horizAxisHeight2)); + let jEnd = Math.round(jCenterStart - c * horizAxisHeight2); + bottomAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd); + } - for ( var c = 0; c < leftAxes.length; c++ ) { - var iStart = ( c === leftAxes.length-1 ? parentViewport.iStart : Math.round( iCenterStart - (c+1)*vertAxisWidth2 ) ); - var iEnd = Math.round( iCenterStart - c*vertAxisWidth2 ); - leftAxes[ c ].viewport.setEdges( iStart, iEnd, jCenterStart, jCenterEnd ); - } + for (let c = 0; c < leftAxes.length; c++) { + let iStart = (c === leftAxes.length - 1 ? parentViewport.iStart : Math.round(iCenterStart - (c + 1) * vertAxisWidth2)); + let iEnd = Math.round(iCenterStart - c * vertAxisWidth2); + leftAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd); + } - for ( var c = 0; c < rightAxes.length; c++ ) { - var iStart = Math.round( iCenterEnd + c*vertAxisWidth2 ); - var iEnd = ( c === rightAxes.length-1 ? parentViewport.iEnd : Math.round( iCenterEnd + (c+1)*vertAxisWidth2 ) ); - rightAxes[ c ].viewport.setEdges( iStart, iEnd, jCenterStart, jCenterEnd ); - } + for (let c = 0; c < rightAxes.length; c++) { + let iStart = Math.round(iCenterEnd + c * vertAxisWidth2); + let iEnd = (c === rightAxes.length - 1 ? parentViewport.iEnd : Math.round(iCenterEnd + (c + 1) * vertAxisWidth2)); + rightAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd); + } - for ( var c = 0; c < centers.length; c++ ) { - centers[ c ].viewport.setEdges( iCenterStart, iCenterEnd, jCenterStart, jCenterEnd ); - } + for (let c = 0; c < centers.length; c++) { + centers[c].viewport.setEdges(iCenterStart, iCenterEnd, jCenterStart, jCenterEnd); + } - for ( var c = 0; c < others.length; c++ ) { - others[ c ].viewport.setEdges( 0, 0, 0, 0 ); - } + for (let c = 0; c < others.length; c++) { + others[c].viewport.setEdges(0, 0, 0, 0); } + } - }; - } + }; +} diff --git a/src/webglimpse/scroll.ts b/src/webglimpse/scroll.ts index afa355b..634fbd5 100644 --- a/src/webglimpse/scroll.ts +++ b/src/webglimpse/scroll.ts @@ -27,263 +27,268 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import {Layout, LayoutEntry, Drawable, Pane, Painter, PointerEvent, yFrac, isLeftMouseDown} from './core'; +import {Size, BoundsUnmodifiable} from './bounds'; +import {Color, gray} from './color'; +import {newBackgroundPainter, xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys} from './misc'; +import {Program, UniformColor, Attribute} from './shader'; +import {newDynamicBuffer} from './buffer'; +import {GL, hasval} from './util/util'; + +export interface VerticalScrollLayout extends Layout { + jOffset: number; + hContent: number; + hVisible: number; +} + + +export function newVerticalScrollLayout(): VerticalScrollLayout { + let layout = { + + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + if (children.length === 1) { + let childPrefSize = children[0].prefSize; + + // XXX: Need some way to override the child's pref-height + if (!hasval(childPrefSize.h)) { + throw new Error('Vertical-scroll layout requires child to have a defined pref-height, but its pref-height is ' + childPrefSize.h); + } + parentPrefSize.w = childPrefSize.w; + parentPrefSize.h = childPrefSize.h; + } + else if (children.length > 1) { + throw new Error('Vertical-scroll layout only works with 1 child, but pane has ' + this.children.length + ' children'); + } + }, + jOffset: 0, + hContent: 0, + hVisible: 0, - export interface VerticalScrollLayout extends Layout { - jOffset : number; - hContent : number; - hVisible : number; - } + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + if (children.length === 1) { + let child = children[0]; + let j; + let h = child.prefSize.h; + if (h <= parentViewport.h) { + j = parentViewport.jEnd - h; + } + else { + j = Math.min(parentViewport.j, parentViewport.jEnd - h + Math.max(0, Math.round(layout.jOffset))); + } - export function newVerticalScrollLayout( ) : VerticalScrollLayout { - var layout = { + child.viewport.setRect(parentViewport.i, j, parentViewport.w, h); - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - if ( children.length === 1 ) { - var childPrefSize = children[ 0 ].prefSize; + layout.jOffset = (j + h) - parentViewport.jEnd; + layout.hContent = h; + layout.hVisible = parentViewport.h; + } + else if (children.length > 1) { + throw new Error('Vertical-scroll layout only works with 1 child, but pane has ' + this.children.length + ' children'); + } + } - // XXX: Need some way to override the child's pref-height - if ( !hasval( childPrefSize.h ) ) { - throw new Error( 'Vertical-scroll layout requires child to have a defined pref-height, but its pref-height is ' + childPrefSize.h ); - } + }; + return layout; +} - parentPrefSize.w = childPrefSize.w; - parentPrefSize.h = childPrefSize.h; - } - else if ( children.length > 1 ) { - throw new Error( 'Vertical-scroll layout only works with 1 child, but pane has ' + this.children.length + ' children' ); - } - }, - - jOffset: 0, - hContent: 0, - hVisible: 0, - - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - if ( children.length === 1 ) { - var child = children[ 0 ]; - - var j; - var h = child.prefSize.h; - if ( h <= parentViewport.h ) { - j = parentViewport.jEnd - h; - } - else { - j = Math.min( parentViewport.j, parentViewport.jEnd - h + Math.max( 0, Math.round( layout.jOffset ) ) ); - } - - child.viewport.setRect( parentViewport.i, j, parentViewport.w, h ); - - layout.jOffset = ( j + h ) - parentViewport.jEnd; - layout.hContent = h; - layout.hVisible = parentViewport.h; - } - else if ( children.length > 1 ) { - throw new Error( 'Vertical-scroll layout only works with 1 child, but pane has ' + this.children.length + ' children' ); - } - } - }; - return layout; - } +export interface ScrollbarOptions { + fgColor?: Color; + bgColor?: Color; + borderColor?: Color; + borderThickness?: number; + borderTop?: boolean; + borderLeft?: boolean; + borderRight?: boolean; + borderBottom?: boolean; +} - export interface ScrollbarOptions { - fgColor? : Color; - bgColor? : Color; - borderColor? : Color; - borderThickness? : number; - borderTop? : boolean; - borderLeft? : boolean; - borderRight? : boolean; - borderBottom? : boolean; - } +export function newVerticalScrollbar(scrollLayout: VerticalScrollLayout, drawable: Drawable, options?: ScrollbarOptions): Pane { + let bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : gray(0.9)); + let scrollbar = new Pane(null); + scrollbar.addPainter(newBackgroundPainter(bgColor)); + scrollbar.addPainter(newVerticalScrollbarPainter(scrollLayout, options)); - export function newVerticalScrollbar( scrollLayout : VerticalScrollLayout, drawable : Drawable, options? : ScrollbarOptions ) : Pane { - var bgColor = ( hasval( options ) && hasval( options.bgColor ) ? options.bgColor : gray( 0.9 ) ); + attachVerticalScrollMouseListeners(scrollbar, scrollLayout, drawable); - var scrollbar = new Pane( null ); - scrollbar.addPainter( newBackgroundPainter( bgColor ) ); - scrollbar.addPainter( newVerticalScrollbarPainter( scrollLayout, options ) ); + return scrollbar; +} - attachVerticalScrollMouseListeners( scrollbar, scrollLayout, drawable ); - return scrollbar; - } +export function newVerticalScrollbarPainter(scrollLayout: VerticalScrollLayout, options?: ScrollbarOptions): Painter { + let fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : gray(0.56)); + let borderColor = (hasval(options) && hasval(options.borderColor) ? options.borderColor : gray(0.42)); + let borderThickness = (hasval(options) && hasval(options.borderThickness) ? options.borderThickness : 1); + let borderTop = (hasval(options) && hasval(options.borderTop) ? options.borderTop : true); + let borderLeft = (hasval(options) && hasval(options.borderLeft) ? options.borderLeft : false); + let borderRight = (hasval(options) && hasval(options.borderRight) ? options.borderRight : false); + let borderBottom = (hasval(options) && hasval(options.borderBottom) ? options.borderBottom : true); + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); - export function newVerticalScrollbarPainter( scrollLayout : VerticalScrollLayout, options? : ScrollbarOptions ) : Painter { - var fgColor = ( hasval( options ) && hasval( options.fgColor ) ? options.fgColor : gray( 0.56 ) ); - var borderColor = ( hasval( options ) && hasval( options.borderColor ) ? options.borderColor : gray( 0.42 ) ); - var borderThickness = ( hasval( options ) && hasval( options.borderThickness ) ? options.borderThickness : 1 ); - var borderTop = ( hasval( options ) && hasval( options.borderTop ) ? options.borderTop : true ); - var borderLeft = ( hasval( options ) && hasval( options.borderLeft ) ? options.borderLeft : false ); - var borderRight = ( hasval( options ) && hasval( options.borderRight ) ? options.borderRight : false ); - var borderBottom = ( hasval( options ) && hasval( options.borderBottom ) ? options.borderBottom : true ); + let numFillVertices = 6; + let numBorderVertices = (borderTop ? 6 : 0) + (borderLeft ? 6 : 0) + (borderRight ? 6 : 0) + (borderBottom ? 6 : 0); + let xyFrac = new Float32Array(2 * Math.max(numFillVertices, numBorderVertices)); + let xyFracBuffer = newDynamicBuffer(); - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + let hFrac = scrollLayout.hVisible / scrollLayout.hContent; + if (hFrac < 1) { + let yTop = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset)) / scrollLayout.hContent) * viewport.h + 1e-4); + let yBottom = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset + scrollLayout.hVisible)) / scrollLayout.hContent) * viewport.h + 1e-4); - var numFillVertices = 6; - var numBorderVertices = ( borderTop ? 6 : 0 ) + ( borderLeft ? 6 : 0 ) + ( borderRight ? 6 : 0 ) + ( borderBottom ? 6 : 0 ); - var xyFrac = new Float32Array( 2 * Math.max( numFillVertices, numBorderVertices ) ); - var xyFracBuffer = newDynamicBuffer( ); + let yFracTop = yTop / viewport.h; + let yFracBottom = yBottom / viewport.h; - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - var hFrac = scrollLayout.hVisible / scrollLayout.hContent; - if ( hFrac < 1 ) { - var yTop = Math.round( ( ( scrollLayout.hContent - ( scrollLayout.jOffset ) ) / scrollLayout.hContent )*viewport.h + 1e-4 ); - var yBottom = Math.round( ( ( scrollLayout.hContent - ( scrollLayout.jOffset + scrollLayout.hVisible ) ) / scrollLayout.hContent )*viewport.h + 1e-4 ); + let wBorderFrac = borderThickness / viewport.w; + let hBorderFrac = borderThickness / viewport.h; - var yFracTop = yTop / viewport.h; - var yFracBottom = yBottom / viewport.h; + gl.disable(GL.BLEND); - var wBorderFrac = borderThickness / viewport.w; - var hBorderFrac = borderThickness / viewport.h; + program.use(gl); - gl.disable( GL.BLEND ); - program.use( gl ); + // Fill + // + putQuadXys(xyFrac, 0, 0 + (borderLeft ? wBorderFrac : 0), 1 - (borderRight ? wBorderFrac : 0), yFracTop - (borderTop ? hBorderFrac : 0), yFracBottom + (borderBottom ? hBorderFrac : 0)); + xyFracBuffer.setData(xyFrac.subarray(0, 2 * numFillVertices)); + a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT); + u_Color.setData(gl, fgColor); + gl.drawArrays(GL.TRIANGLES, 0, numFillVertices); - // Fill - // - putQuadXys( xyFrac, 0, 0+(borderLeft?wBorderFrac:0), 1-(borderRight?wBorderFrac:0), yFracTop-(borderTop?hBorderFrac:0), yFracBottom+(borderBottom?hBorderFrac:0) ); - xyFracBuffer.setData( xyFrac.subarray( 0, 2*numFillVertices ) ); - a_XyFrac.setDataAndEnable( gl, xyFracBuffer, 2, GL.FLOAT ); - u_Color.setData( gl, fgColor ); - gl.drawArrays( GL.TRIANGLES, 0, numFillVertices ); + // Border + // + let index = 0; + if (borderTop) index = putQuadXys(xyFrac, index, 0, 1 - (borderRight ? wBorderFrac : 0), yFracTop, yFracTop - hBorderFrac); + if (borderBottom) index = putQuadXys(xyFrac, index, 0 + (borderLeft ? wBorderFrac : 0), 1, yFracBottom + hBorderFrac, yFracBottom); + if (borderRight) index = putQuadXys(xyFrac, index, 1 - wBorderFrac, 1, yFracTop, yFracBottom + (borderBottom ? hBorderFrac : 0)); + if (borderLeft) index = putQuadXys(xyFrac, index, 0, 0 + wBorderFrac, yFracTop - (borderTop ? hBorderFrac : 0), yFracBottom); - // Border - // + xyFracBuffer.setData(xyFrac.subarray(0, 2 * numBorderVertices)); + a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT); + u_Color.setData(gl, borderColor); + gl.drawArrays(GL.TRIANGLES, 0, numBorderVertices); - var index = 0; - if ( borderTop ) index = putQuadXys( xyFrac, index, 0, 1-(borderRight?wBorderFrac:0), yFracTop, yFracTop-hBorderFrac ); - if ( borderBottom ) index = putQuadXys( xyFrac, index, 0+(borderLeft?wBorderFrac:0), 1, yFracBottom+hBorderFrac, yFracBottom ); - if ( borderRight ) index = putQuadXys( xyFrac, index, 1-wBorderFrac, 1, yFracTop, yFracBottom+(borderBottom?hBorderFrac:0) ); - if ( borderLeft ) index = putQuadXys( xyFrac, index, 0, 0+wBorderFrac, yFracTop-(borderTop?hBorderFrac:0), yFracBottom ); - xyFracBuffer.setData( xyFrac.subarray( 0, 2*numBorderVertices ) ); - a_XyFrac.setDataAndEnable( gl, xyFracBuffer, 2, GL.FLOAT ); - u_Color.setData( gl, borderColor ); - gl.drawArrays( GL.TRIANGLES, 0, numBorderVertices ); + a_XyFrac.disable(gl); + program.endUse(gl); + } + }; +} +// mouse listener for scrolling while panning on the timeline itself +export function attachTimelineVerticalScrollMouseListeners(pane: Pane, scrollLayout: VerticalScrollLayout, drawable: Drawable) { - a_XyFrac.disable( gl ); - program.endUse( gl ); - } - }; - } + // Used when dragging inside pane + let grab: number = null; + let jOffset: number = null; - // mouse listener for scrolling while panning on the timeline itself - export function attachTimelineVerticalScrollMouseListeners( pane : Pane, scrollLayout : VerticalScrollLayout, drawable : Drawable ) { + pane.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent)) { + grab = ev.j; + jOffset = scrollLayout.jOffset; + } + }); - // Used when dragging inside pane - var grab : number = null; - var jOffset : number = null; + pane.mouseMove.on(function (ev: PointerEvent) { + if (hasval(grab)) { + scrollLayout.jOffset = jOffset - (grab - ev.j); + drawable.redraw(); + } + }); - pane.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) ) { - grab = ev.j; - jOffset = scrollLayout.jOffset; - } - } ); + pane.mouseUp.on(function (ev: PointerEvent) { + grab = null; + }); +} - pane.mouseMove.on( function( ev : PointerEvent ) { - if ( hasval( grab ) ) { - scrollLayout.jOffset = jOffset - ( grab - ev.j ); - drawable.redraw( ); - } - } ); - - pane.mouseUp.on( function( ev : PointerEvent ) { - grab = null; - } ); - } - - // mouse listener for scrolling while interacting with the scrollbar - export function attachVerticalScrollMouseListeners( scrollbar : Pane, scrollLayout : VerticalScrollLayout, drawable : Drawable ) { - - // Used when dragging the handle - var grab : number = null; - - // Used when scrollbar is pressed-and-held outside the handle - var pageScrollTimer : number = null; - var recentPointerFrac : number = null; - - scrollbar.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && !hasval( grab ) ) { - var topFrac = ( scrollLayout.hContent - scrollLayout.jOffset ) / scrollLayout.hContent; - var fracExtent = scrollLayout.hVisible / scrollLayout.hContent; - var pointerFrac = yFrac( ev ); - if ( topFrac-fracExtent <= pointerFrac && pointerFrac <= topFrac ) { - grab = ( topFrac - pointerFrac ) / fracExtent; - } - else { - // If the mouse is pressed on the scrollbar but outside the handle: - // - // 1. Immediately scroll one page toward the mouse - // 2. Wait 500ms - // 3. If the mouse-button is still down, scroll one page toward the mouse - // 4. Wait 50ms - // 5. Go to Step 3 - // - // (A "page" is 7/8 of the viewport extent.) - // - - var direction = 0; - if ( pointerFrac < topFrac-fracExtent ) direction = +1; - else if ( pointerFrac > topFrac ) direction = -1; - scrollLayout.jOffset += direction * Math.max( 1, 0.875 * scrollLayout.hVisible ); - drawable.redraw( ); - - recentPointerFrac = pointerFrac; - var pageScroll = function( ) { - var topFrac = ( scrollLayout.hContent - scrollLayout.jOffset ) / scrollLayout.hContent; - var fracExtent = scrollLayout.hVisible / scrollLayout.hContent; - var pointerFrac = recentPointerFrac; - - var direction = 0; - if ( pointerFrac < topFrac-fracExtent ) direction = +1; - else if ( pointerFrac > topFrac ) direction = -1; - scrollLayout.jOffset += direction * Math.max( 1, 0.875 * scrollLayout.hVisible ); - drawable.redraw( ); - - pageScrollTimer = setTimeout( pageScroll, 50 ); - }; - pageScrollTimer = setTimeout( pageScroll, 500 ); - } - } - } ); - - scrollbar.mouseMove.on( function( ev : PointerEvent ) { - var pointerFrac = yFrac( ev ); - if ( hasval( grab ) ) { - var fracExtent = scrollLayout.hVisible / scrollLayout.hContent; - var topFrac = pointerFrac + grab*fracExtent; - scrollLayout.jOffset = scrollLayout.hContent - topFrac*scrollLayout.hContent; - drawable.redraw( ); +// mouse listener for scrolling while interacting with the scrollbar +export function attachVerticalScrollMouseListeners(scrollbar: Pane, scrollLayout: VerticalScrollLayout, drawable: Drawable) { + + // Used when dragging the handle + let grab: number = null; + + // Used when scrollbar is pressed-and-held outside the handle + let pageScrollTimer: any = null; + let recentPointerFrac: number = null; + + scrollbar.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && !hasval(grab)) { + let topFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent; + let fracExtent = scrollLayout.hVisible / scrollLayout.hContent; + let pointerFrac = yFrac(ev); + if (topFrac - fracExtent <= pointerFrac && pointerFrac <= topFrac) { + grab = (topFrac - pointerFrac) / fracExtent; } - if ( hasval( pageScrollTimer ) ) { + else { + // If the mouse is pressed on the scrollbar but outside the handle: + // + // 1. Immediately scroll one page toward the mouse + // 2. Wait 500ms + // 3. If the mouse-button is still down, scroll one page toward the mouse + // 4. Wait 50ms + // 5. Go to Step 3 + // + // (A "page" is 7/8 of the viewport extent.) + // + + let direction = 0; + if (pointerFrac < topFrac - fracExtent) direction = +1; + else if (pointerFrac > topFrac) direction = -1; + scrollLayout.jOffset += direction * Math.max(1, 0.875 * scrollLayout.hVisible); + drawable.redraw(); + recentPointerFrac = pointerFrac; + let pageScroll = function () { + let topFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent; + let fracExtent = scrollLayout.hVisible / scrollLayout.hContent; + let pointerFrac = recentPointerFrac; + + let direction = 0; + if (pointerFrac < topFrac - fracExtent) direction = +1; + else if (pointerFrac > topFrac) direction = -1; + scrollLayout.jOffset += direction * Math.max(1, 0.875 * scrollLayout.hVisible); + drawable.redraw(); + + pageScrollTimer = setTimeout(pageScroll, 50); + }; + pageScrollTimer = setTimeout(pageScroll, 500); } - } ); - - scrollbar.mouseUp.on( function( ev : PointerEvent ) { - grab = null; - if ( hasval( pageScrollTimer ) ) { - clearTimeout( pageScrollTimer ); - pageScrollTimer = null; - recentPointerFrac = null; - } - } ); - - } + } + }); + + scrollbar.mouseMove.on(function (ev: PointerEvent) { + let pointerFrac = yFrac(ev); + if (hasval(grab)) { + let fracExtent = scrollLayout.hVisible / scrollLayout.hContent; + let topFrac = pointerFrac + grab * fracExtent; + scrollLayout.jOffset = scrollLayout.hContent - topFrac * scrollLayout.hContent; + drawable.redraw(); + } + if (hasval(pageScrollTimer)) { + recentPointerFrac = pointerFrac; + } + }); + + scrollbar.mouseUp.on(function (ev: PointerEvent) { + grab = null; + if (hasval(pageScrollTimer)) { + clearTimeout(pageScrollTimer); + pageScrollTimer = null; + recentPointerFrac = null; + } + }); + +} diff --git a/src/webglimpse/shader.ts b/src/webglimpse/shader.ts index 2ab5f4d..f7416fa 100644 --- a/src/webglimpse/shader.ts +++ b/src/webglimpse/shader.ts @@ -27,303 +27,305 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { GL, StringMap, getObjectId, hasval } from './util/util'; +import { Color } from './color'; +import { Texture } from './texture'; +import { Buffer } from './buffer'; +function compileShader(gl: WebGLRenderingContext, shaderType: number, glsl: string): WebGLShader { + let shader = gl.createShader(shaderType); + gl.shaderSource(shader, glsl); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, GL.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader)); - function compileShader( gl : WebGLRenderingContext, shaderType : number, glsl : string ) : WebGLShader { - var shader = gl.createShader( shaderType ); - gl.shaderSource( shader, glsl ); + return shader; +} - gl.compileShader( shader ); - if ( !gl.getShaderParameter( shader, GL.COMPILE_STATUS ) ) throw new Error( gl.getShaderInfoLog( shader ) ); - - return shader; +function linkProgram(gl: WebGLRenderingContext, shaders: WebGLShader[]): WebGLProgram { + let program = gl.createProgram(); + for (let i = 0; i < shaders.length; i++) { + gl.attachShader(program, shaders[i]); } - - function linkProgram( gl : WebGLRenderingContext, shaders : WebGLShader[] ) : WebGLProgram { - var program = gl.createProgram( ); - for ( var i = 0; i < shaders.length; i++ ) { - gl.attachShader( program, shaders[ i ] ); - } - try { - gl.linkProgram( program ); - if ( !gl.getProgramParameter( program, GL.LINK_STATUS ) ) throw new Error( gl.getProgramInfoLog( program ) ); - return program; - } - finally { - // It's good GL practice to detach and delete shaders after they have been linked - // into a program, and are no longer needed. However, on some versions of Firefox, - // doing so causes getAttribLocation and getUniformLocation to fail. - // - //for ( var i = 0; i < shaders.length; i++ ) { - // gl.detachShader( program, shaders[ i ] ); - //} - } + try { + gl.linkProgram(program); + if (!gl.getProgramParameter(program, GL.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program)); + return program; } - - function createProgram( gl : WebGLRenderingContext, vertShaderSource : string, fragShaderSource : string ) : WebGLProgram { - var shaders = [ ]; - try { - shaders.push( compileShader( gl, GL.VERTEX_SHADER, vertShaderSource ) ); - shaders.push( compileShader( gl, GL.FRAGMENT_SHADER, fragShaderSource ) ); - return linkProgram( gl, shaders ); - } - finally { - // It's good GL practice to detach and delete shaders after they have been linked - // into a program, and are no longer needed. However, on some versions of Firefox, - // doing so causes getAttribLocation and getUniformLocation to fail. - // - //for ( var i = 0; i < shaders.length; i++ ) { - // gl.deleteShader( shaders[ i ] ); - //} - } + finally { + // It's good GL practice to detach and delete shaders after they have been linked + // into a program, and are no longer needed. However, on some versions of Firefox, + // doing so causes getAttribLocation and getUniformLocation to fail. + // + // for ( var i = 0; i < shaders.length; i++ ) { + // gl.detachShader( program, shaders[ i ] ); + // } } +} + +function createProgram(gl: WebGLRenderingContext, vertShaderSource: string, fragShaderSource: string): WebGLProgram { + let shaders = []; + try { + shaders.push(compileShader(gl, GL.VERTEX_SHADER, vertShaderSource)); + shaders.push(compileShader(gl, GL.FRAGMENT_SHADER, fragShaderSource)); + return linkProgram(gl, shaders); + } + finally { + // It's good GL practice to detach and delete shaders after they have been linked + // into a program, and are no longer needed. However, on some versions of Firefox, + // doing so causes getAttribLocation and getUniformLocation to fail. + // + // for ( var i = 0; i < shaders.length; i++ ) { + // gl.deleteShader( shaders[ i ] ); + // } + } +} - class ProgramEntry { - gl : WebGLRenderingContext; - program : WebGLProgram; +class ProgramEntry { + gl: WebGLRenderingContext; + program: WebGLProgram; - constructor( gl : WebGLRenderingContext, program : WebGLProgram ) { - this.gl = gl; - this.program = program; - } + constructor(gl: WebGLRenderingContext, program: WebGLProgram) { + this.gl = gl; + this.program = program; } +} - export class Program { - private vertShaderSource : string; - private fragShaderSource : string; - private programs : StringMap = { }; +export class Program { + private vertShaderSource: string; + private fragShaderSource: string; + private programs: StringMap = {}; - constructor( vertShaderSource : string, fragShaderSource : string ) { - this.vertShaderSource = vertShaderSource; - this.fragShaderSource = fragShaderSource; - } + constructor(vertShaderSource: string, fragShaderSource: string) { + this.vertShaderSource = vertShaderSource; + this.fragShaderSource = fragShaderSource; + } - // XXX: Would be nice if this weren't public - _program( gl : WebGLRenderingContext ) : WebGLProgram { - var glId = getObjectId( gl ); - if ( this.programs[ glId ] === undefined ) { - var program = createProgram( gl, this.vertShaderSource, this.fragShaderSource ); - this.programs[ glId ] = new ProgramEntry( gl, program ); - } - return this.programs[ glId ].program; + // XXX: Would be nice if this weren't public + _program(gl: WebGLRenderingContext): WebGLProgram { + let glId = getObjectId(gl); + if (this.programs[glId] === undefined) { + let program = createProgram(gl, this.vertShaderSource, this.fragShaderSource); + this.programs[glId] = new ProgramEntry(gl, program); } + return this.programs[glId].program; + } - use( gl : WebGLRenderingContext ) { - gl.useProgram( this._program( gl ) ); - } + use(gl: WebGLRenderingContext) { + gl.useProgram(this._program(gl)); + } - endUse( gl : WebGLRenderingContext ) { - gl.useProgram( null ); - } + endUse(gl: WebGLRenderingContext) { + gl.useProgram(null); + } - dispose( ) { - // XXX: Not sure this actually works ... may have to make each gl current or something - for ( var glid in this.programs ) { - if ( this.programs.hasOwnProperty( glid ) ) { - var en = this.programs[ glid ]; - en.gl.deleteProgram( en.program ); - } + dispose() { + // XXX: Not sure this actually works ... may have to make each gl current or something + for (let glid in this.programs) { + if (this.programs.hasOwnProperty(glid)) { + let en = this.programs[glid]; + en.gl.deleteProgram(en.program); } - this.programs = { }; } + this.programs = {}; } +} - export class Uniform { - private program : Program; - private name : string; - private optional : boolean; - private locations : StringMap = { }; +export class Uniform { + private program: Program; + private name: string; + private optional: boolean; + private locations: StringMap = {}; - constructor( program : Program, name : string, optional : boolean ) { - this.program = program; - this.name = name; - this.optional = optional; - } + constructor(program: Program, name: string, optional: boolean) { + this.program = program; + this.name = name; + this.optional = optional; + } - // XXX: Would be nice if this weren't public - _location( gl : WebGLRenderingContext ) : WebGLUniformLocation { - var glId = getObjectId( gl ); - if ( this.locations[ glId ] === undefined ) { - var location = gl.getUniformLocation( this.program._program( gl ), this.name ); - if ( !this.optional && !hasval( location ) ) throw new Error( 'Uniform \'' + this.name + '\' not found' ); - this.locations[ glId ] = location; - } - return this.locations[ glId ]; + // XXX: Would be nice if this weren't public + _location(gl: WebGLRenderingContext): WebGLUniformLocation { + let glId = getObjectId(gl); + if (this.locations[glId] === undefined) { + let location = gl.getUniformLocation(this.program._program(gl), this.name); + if (!this.optional && !hasval(location)) throw new Error('Uniform \'' + this.name + '\' not found'); + this.locations[glId] = location; } + return this.locations[glId]; } +} - export class Uniform1f extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform1f extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform1f( location, x ); - } + setData(gl: WebGLRenderingContext, x: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform1f(location, x); } +} - export class Uniform2f extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform2f extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number, y : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform2f( location, x, y ); - } + setData(gl: WebGLRenderingContext, x: number, y: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform2f(location, x, y); } +} - export class Uniform3f extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform3f extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number, y : number, z : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform3f( location, x, y, z ); - } + setData(gl: WebGLRenderingContext, x: number, y: number, z: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform3f(location, x, y, z); } +} - export class Uniform4f extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform4f extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number, y : number, z : number, w : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform4f( location, x, y, z, w ); - } + setData(gl: WebGLRenderingContext, x: number, y: number, z: number, w: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform4f(location, x, y, z, w); } +} - export class UniformMatrix4f extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class UniformMatrix4f extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, value : Float32Array, transpose : boolean = false ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniformMatrix4fv( location, transpose, value ); - } + setData(gl: WebGLRenderingContext, value: Float32Array, transpose: boolean = false) { + let location = this._location(gl); + if (hasval(location)) gl.uniformMatrix4fv(location, transpose, value); } +} - export class Uniform1i extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform1i extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform1i( location, x ); - } + setData(gl: WebGLRenderingContext, x: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform1i(location, x); } +} - export class Uniform2i extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform2i extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number, y : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform2i( location, x, y ); - } + setData(gl: WebGLRenderingContext, x: number, y: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform2i(location, x, y); } +} - export class Uniform3i extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform3i extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number, y : number, z : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform3i( location, x, y, z ); - } + setData(gl: WebGLRenderingContext, x: number, y: number, z: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform3i(location, x, y, z); } +} - export class Uniform4i extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class Uniform4i extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, x : number, y : number, z : number, w : number ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform4i( location, x, y, z, w ); - } + setData(gl: WebGLRenderingContext, x: number, y: number, z: number, w: number) { + let location = this._location(gl); + if (hasval(location)) gl.uniform4i(location, x, y, z, w); } +} - export class UniformColor extends Uniform { - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } +export class UniformColor extends Uniform { + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setData( gl : WebGLRenderingContext, color : Color ) { - var location = this._location( gl ); - if ( hasval( location ) ) gl.uniform4f( location, color.r, color.g, color.b, color.a ); - } + setData(gl: WebGLRenderingContext, color: Color) { + let location = this._location(gl); + if (hasval(location)) gl.uniform4f(location, color.r, color.g, color.b, color.a); } +} - export class UniformSampler2D extends Uniform { - private currentTexture : Texture; +export class UniformSampler2D extends Uniform { + private currentTexture: Texture; - constructor( program : Program, name : string, optional : boolean = false ) { - super( program, name, optional ); - } + constructor(program: Program, name: string, optional: boolean = false) { + super(program, name, optional); + } - setDataAndBind( gl : WebGLRenderingContext, textureUnit : number, texture : Texture ) { - var location = this._location( gl ); - if ( hasval( location ) ) { - texture.bind( gl, textureUnit ); - gl.uniform1i( location, textureUnit ); - this.currentTexture = texture; - } + setDataAndBind(gl: WebGLRenderingContext, textureUnit: number, texture: Texture) { + let location = this._location(gl); + if (hasval(location)) { + texture.bind(gl, textureUnit); + gl.uniform1i(location, textureUnit); + this.currentTexture = texture; } + } - unbind( gl : WebGLRenderingContext ) { - if ( hasval( this.currentTexture ) ) { - this.currentTexture.unbind( gl ); - this.currentTexture = null; - } + unbind(gl: WebGLRenderingContext) { + if (hasval(this.currentTexture)) { + this.currentTexture.unbind(gl); + this.currentTexture = null; } } +} - export class Attribute { - private program : Program; - private name : string; - private locations : StringMap = { }; +export class Attribute { + private program: Program; + private name: string; + private locations: StringMap = {}; - constructor( program : Program, name : string ) { - this.program = program; - this.name = name; - } + constructor(program: Program, name: string) { + this.program = program; + this.name = name; + } - // XXX: Would be nice if this weren't public - _location( gl : WebGLRenderingContext ) : number { - var glId = getObjectId( gl ); - if ( this.locations[ glId ] === undefined ) { - var location = gl.getAttribLocation( this.program._program( gl ), this.name ); - if ( location === -1 ) throw new Error( 'Attribute "' + this.name + '" not found' ); - this.locations[ glId ] = location; - } - return this.locations[ glId ]; + // XXX: Would be nice if this weren't public + _location(gl: WebGLRenderingContext): number { + let glId = getObjectId(gl); + if (this.locations[glId] === undefined) { + let location = gl.getAttribLocation(this.program._program(gl), this.name); + if (location === -1) throw new Error('Attribute "' + this.name + '" not found'); + this.locations[glId] = location; } + return this.locations[glId]; + } - setDataAndEnable( gl : WebGLRenderingContext, buffer : Buffer, size : number, type : number, normalized : boolean = false, stride : number = 0, offset : number = 0 ) { - var location = this._location( gl ); - gl.enableVertexAttribArray( location ); - buffer.bind( gl, GL.ARRAY_BUFFER ); - gl.vertexAttribPointer( location, size, type, normalized, stride, offset ); - buffer.unbind( gl, GL.ARRAY_BUFFER ); - } + setDataAndEnable(gl: WebGLRenderingContext, buffer: Buffer, size: number, type: number, normalized: boolean = false, stride: number = 0, offset: number = 0) { + let location = this._location(gl); + gl.enableVertexAttribArray(location); + buffer.bind(gl, GL.ARRAY_BUFFER); + gl.vertexAttribPointer(location, size, type, normalized, stride, offset); + buffer.unbind(gl, GL.ARRAY_BUFFER); + } - disable( gl : WebGLRenderingContext ) { - gl.disableVertexAttribArray( this._location( gl ) ); - } + disable(gl: WebGLRenderingContext) { + gl.disableVertexAttribArray(this._location(gl)); } +} diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index 92c0552..321ea7f 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -27,500 +27,510 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Cache } from './util/cache'; +import { Texture2D, ImageDrawer } from './texture'; +import { Color, black, parseRgba } from './color'; +import { TwoKeyCache, ThreeKeyCache } from './util/multikey_cache'; +import { GL, concatLines, hasval } from './util/util'; +import { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './shader'; +import { Buffer, newStaticBuffer } from './buffer'; +import { BoundsUnmodifiable } from './bounds'; +import { nearestPixel } from './misc'; +import { xFrac, yFrac } from './core'; + +interface Dim2D { + w: number; + h: number; +} + + +let textDim = (function () { + // Use div to figure out how big our texture needs to be + let div = document.createElement('div'); + div.style.setProperty('position', 'absolute'); + div.style.setProperty('padding', '0'); + div.style.setProperty('margin', '0'); + div.style.setProperty('width', 'auto'); + div.style.setProperty('height', 'auto'); + div.style.setProperty('visibility', 'hidden'); + + return function (s: string, font: string): Dim2D { + div.style.setProperty('font', font); + div.textContent = s; + + document.body.appendChild(div); + let width = div.clientWidth; + let height = div.clientHeight; + document.body.removeChild(div); + + return { w: width, h: height }; + }; +})(); + + + +interface FontMetrics { + jTop: number; + jBaseline: number; + jBottom: number; +} + + +function newFontMetricsCache(): Cache { + return new Cache({ + create: function (font: string): FontMetrics { + + let dim = textDim('fMgyj', font); + let w = dim.w; + let h = dim.h; + let canvas = document.createElement('canvas'); + canvas.width = w; + canvas.height = h; + let g = canvas.getContext('2d'); - - - interface Dim2D { - w : number; - h : number; - } - - - var textDim = ( function( ) { - // Use div to figure out how big our texture needs to be - var div = document.createElement( 'div' ); - div.style.setProperty( 'position', 'absolute' ); - div.style.setProperty( 'padding', '0' ); - div.style.setProperty( 'margin', '0' ); - div.style.setProperty( 'width', 'auto' ); - div.style.setProperty( 'height', 'auto' ); - div.style.setProperty( 'visibility', 'hidden' ); - - return function( s : string, font : string ) : Dim2D { - div.style.setProperty( 'font', font ); - div.textContent = s; - - document.body.appendChild( div ); - var width = div.clientWidth; - var height = div.clientHeight; - document.body.removeChild( div ); - - return { w: width, h: height }; - }; - } )( ); - - - - interface FontMetrics { - jTop : number; - jBaseline : number; - jBottom : number; - } - - - function newFontMetricsCache( ) : Cache { - return new Cache( { - create: function( font : string ) : FontMetrics { - - var dim = textDim( 'fMgyj', font ); - var w = dim.w; - var h = dim.h; - var canvas = document.createElement( 'canvas' ); - canvas.width = w; - canvas.height = h; - var g = canvas.getContext( '2d' ); - - g.font = font; - g.textAlign = 'left'; - g.textBaseline = 'top'; - g.fillStyle = 'black'; - - g.clearRect( 0, 0, w, h ); - g.fillText( 'fM', 0, 0 ); - var rgbaData = g.getImageData( 0, 0, w, h ).data; - - var jTop = -1; - for ( var j = 0; j < h && jTop < 0; j++ ) { - for ( var i = 0; i < w && jTop < 0; i++ ) { - var alpha = rgbaData[ ( j*w + i )*4 + 3 ]; - if ( alpha !== 0 ) jTop = j; - } + g.font = font; + g.textAlign = 'left'; + g.textBaseline = 'top'; + g.fillStyle = 'black'; + + g.clearRect(0, 0, w, h); + g.fillText('fM', 0, 0); + let rgbaData = g.getImageData(0, 0, w, h).data; + + let jTop = -1; + for (let j = 0; j < h && jTop < 0; j++) { + for (let i = 0; i < w && jTop < 0; i++) { + let alpha = rgbaData[(j * w + i) * 4 + 3]; + if (alpha !== 0) jTop = j; } + } - var jBaseline = -1; - for ( var j = h-1; j >= 0 && jBaseline < 0; j-- ) { - for ( var i = 0; i < w && jBaseline < 0; i++ ) { - var alpha = rgbaData[ ( j*w + i )*4 + 3 ]; - if ( alpha !== 0 ) jBaseline = j; - } + let jBaseline = -1; + for (let j = h - 1; j >= 0 && jBaseline < 0; j--) { + for (let i = 0; i < w && jBaseline < 0; i++) { + let alpha = rgbaData[(j * w + i) * 4 + 3]; + if (alpha !== 0) jBaseline = j; } + } - g.clearRect( 0, 0, w, h ); - g.fillText( 'gyj', 0, 0 ); - var rgbaData = g.getImageData( 0, 0, w, h ).data; + g.clearRect(0, 0, w, h); + g.fillText('gyj', 0, 0); + rgbaData = g.getImageData(0, 0, w, h).data; - var jBottom = -1; - for ( var j = h-1; j >= 0 && jBottom < 0; j-- ) { - for ( var i = 0; i < w && jBottom < 0; i++ ) { - var alpha = rgbaData[ ( j*w + i )*4 + 3 ]; - if ( alpha !== 0 ) jBottom = j; - } + let jBottom = -1; + for (let j = h - 1; j >= 0 && jBottom < 0; j--) { + for (let i = 0; i < w && jBottom < 0; i++) { + let alpha = rgbaData[(j * w + i) * 4 + 3]; + if (alpha !== 0) jBottom = j; } + } - return { jTop: jTop, jBaseline: jBaseline, jBottom: jBottom }; - }, - dispose: function( ) { } - } ); - } - - - var getRawFontMetrics = ( function( ) { - var cache = newFontMetricsCache( ); - return function( font : string ) : FontMetrics { - return cache.value( font ); - }; - } )( ); - - - var getTextWidth = ( function( ) { - var canvas = document.createElement( 'canvas' ); - canvas.width = 1; - canvas.height = 1; - var g = canvas.getContext( '2d' ); - g.textAlign = 'left'; - g.textBaseline = 'top'; - return function( font : string, text : string ) : number { - g.font = font; - return g.measureText( text ).width; - }; - } )( ); - - - export class TextTexture2D extends Texture2D { - private _jBaseline : number; - - get jBaseline( ) : number { return this._jBaseline; } + return { jTop: jTop, jBaseline: jBaseline, jBottom: jBottom }; + }, + dispose: function () { } + }); +} - constructor( w : number, h : number, jBaseline : number, minFilter : number, magFilter : number, draw : ImageDrawer ) { - super( w, h, minFilter, magFilter, draw ); - this._jBaseline = jBaseline; - } - yAnchor( textFrac : number ) { - // Things tend to look the way you expect if textFrac is interpreted as - // a fraction of the way from the bottom of the baseline pixel up to the - // top of the top pixel - // - var bottom = this.jBaseline + 1; - var h = this.h; - return 1 - ( ( 1 - textFrac )*bottom / h ); - } - } +let getRawFontMetrics = (function () { + let cache = newFontMetricsCache(); + return function (font: string): FontMetrics { + return cache.value(font); + }; +})(); - export function newTextTextureCache( font : string, color : Color ) : Cache { - var createTextTexture = createTextTextureFactory( font ); - return new Cache( { - create: function( text : string ) : TextTexture2D { - return createTextTexture( color, text ); - }, - dispose: function( texture : Texture2D ) { - texture.dispose( ); - } - } ); - } +let getTextWidth = (function () { + let canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + let g = canvas.getContext('2d'); + g.textAlign = 'left'; + g.textBaseline = 'top'; + return function (font: string, text: string): number { + g.font = font; + return g.measureText(text).width; + }; +})(); - export function newTextTextureCache2( font : string ) : TwoKeyCache { - var createTextTexture = createTextTextureFactory( font ); - return new TwoKeyCache( { - create: function( rgbaString : string, text : string ) : TextTexture2D { - var color = parseRgba( rgbaString ); - return createTextTexture( color, text ); - }, - dispose: function( texture : Texture2D ) { - texture.dispose( ); - } - } ); - } +export class TextTexture2D extends Texture2D { + private _jBaseline: number; + get jBaseline(): number { return this._jBaseline; } - export function newTextTextureCache3( ) : ThreeKeyCache { - return new ThreeKeyCache( { - create: function( font : string, rgbaString : string, text : string ) : TextTexture2D { - var createTextTexture = createTextTextureFactory( font ); - var color = parseRgba( rgbaString ); - return createTextTexture( color, text ); - }, - dispose: function( texture : Texture2D ) { - texture.dispose( ); - } - } ); + constructor(w: number, h: number, jBaseline: number, minFilter: number, magFilter: number, draw: ImageDrawer) { + super(w, h, minFilter, magFilter, draw); + this._jBaseline = jBaseline; } - - export interface TextTextureFactory { - ( color : Color, text : string ) : TextTexture2D; + yAnchor(textFrac: number) { + // Things tend to look the way you expect if textFrac is interpreted as + // a fraction of the way from the bottom of the baseline pixel up to the + // top of the top pixel + // + let bottom = this.jBaseline + 1; + let h = this.h; + return 1 - ((1 - textFrac) * bottom / h); } +} - export function createTextTextureFactory( font : string ) : TextTextureFactory { - var rawFontMetrics = getRawFontMetrics( font ); - var jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; - var h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; - - return function( color : Color, text : string ) : TextTexture2D { - var w = getTextWidth( font, text ); - - return new TextTexture2D( w, h, jBaseline, GL.NEAREST, GL.NEAREST, function( g : CanvasRenderingContext2D ) { - // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent - // background -- so we draw white text onto a black background, then infer alpha from - // the pixel color (black = transparent, white = opaque). - // - // We compute alpha as (R+G+B)/3. This grayscales the image the browser drew, effectively - // de-hinting it. - // - - g.fillStyle = 'black'; - g.fillRect( 0, 0, w, h ); - - g.font = font; - g.textAlign = 'left'; - g.textBaseline = 'top'; - g.fillStyle = 'white'; - - g.save( ); - g.translate( 0, -rawFontMetrics.jTop ); - g.fillText( text, 0, 0 ); - g.restore( ); - - var r255 = 255 * color.r; - var g255 = 255 * color.g; - var b255 = 255 * color.b; - var aFactor = color.a / 3; - - var pixels = g.getImageData( 0, 0, w, h ); - for ( var j = 0; j < pixels.height; j++ ) { - for ( var i = 0; i < pixels.width; i++ ) { - var pixelOffset = ( j*pixels.width + i )*4; - var a255 = aFactor * ( pixels.data[pixelOffset+0] + pixels.data[pixelOffset+1] + pixels.data[pixelOffset+2] ); - - pixels.data[ pixelOffset+0 ] = r255; - pixels.data[ pixelOffset+1 ] = g255; - pixels.data[ pixelOffset+2 ] = b255; - pixels.data[ pixelOffset+3 ] = a255; - } - } - - g.putImageData( pixels, 0, 0 ); - } ); +export function newTextTextureCache(font: string, color: Color): Cache { + let createTextTexture = createTextTextureFactory(font); + return new Cache({ + create: function (text: string): TextTexture2D { + return createTextTexture(color, text); + }, + dispose: function (texture: Texture2D) { + texture.dispose(); } - } - - + }); +} + + +export function newTextTextureCache2(font: string): TwoKeyCache { + let createTextTexture = createTextTextureFactory(font); + return new TwoKeyCache({ + create: function (rgbaString: string, text: string): TextTexture2D { + let color = parseRgba(rgbaString); + return createTextTexture(color, text); + }, + dispose: function (texture: Texture2D) { + texture.dispose(); + } + }); +} + + +export function newTextTextureCache3(): ThreeKeyCache { + return new ThreeKeyCache({ + create: function (font: string, rgbaString: string, text: string): TextTexture2D { + let createTextTexture = createTextTextureFactory(font); + let color = parseRgba(rgbaString); + return createTextTexture(color, text); + }, + dispose: function (texture: Texture2D) { + texture.dispose(); + } + }); +} +export interface TextTextureFactory { + (color: Color, text: string): TextTexture2D; +} +export function createTextTextureFactory(font: string): TextTextureFactory { + let rawFontMetrics = getRawFontMetrics(font); + let jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; + let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; + return function (color: Color, text: string): TextTexture2D { + let w = getTextWidth(font, text); - export function newTextHintsCache( font : string ) : Cache { - var rawFontMetrics = getRawFontMetrics( font ); - var jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; - var h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; - - return new Cache( { - - create: function( text : string ) : Texture2D { - var w = getTextWidth( font, text ); - - // XXX: For now, assuming subpixels are horizontal-RGB - - // Draw text triple-sized, to get an alpha for each r,g,b subpixel - var canvas3 = document.createElement( 'canvas' ); - canvas3.width = 3 * w; - canvas3.height = h; - var g3 = canvas3.getContext( '2d' ); - g3.fillStyle = 'black'; - g3.fillRect( 0, 0, canvas3.width, canvas3.height ); - - g3.save( ); - g3.translate( 0, -rawFontMetrics.jTop ); - g3.scale( 3, 1 ); - g3.font = font; - g3.textAlign = 'left'; - g3.textBaseline = 'top'; - g3.fillStyle = 'white'; - g3.fillText( text, 0, 0 ); - g3.restore( ); - var srcRgba = g3.getImageData( 0, 0, canvas3.width, canvas3.height ).data; - - return new Texture2D( w, h, GL.NEAREST, GL.NEAREST, function( g : CanvasRenderingContext2D ) { - var destImage = g.createImageData( w, h ); - var destRgba = destImage.data; - - var weightLeft = 1; - var weightCenter = 2; - var weightRight = 1; - var weightNorm = 1 / ( weightLeft + weightCenter + weightRight ); - - for ( var j = 0; j < h; j++ ) { - for ( var i = 0; i < w; i++ ) { - // Get alpha values for relevant src-pixels: one from just left of the dest-pixel, all - // three from inside the dest-pixel, and one from just right of the dest-pixel. - // - // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent - // background -- so we draw white text onto a black background, then infer alpha from - // the pixel color (black = transparent, white = opaque). - // - // We compute alpha as (R+G+B)/3. This grayscales the image the browser drew, effectively - // de-hinting it so that we can re-hint it ourselves later (during blending, when the - // background color is known). - // - var srcPixelIndex = ( j*3*w + 3*i )*4; - var srcAlphaL = ( i > 0 ? ( srcRgba[srcPixelIndex-4] + srcRgba[srcPixelIndex-3] + srcRgba[srcPixelIndex-2] ) / ( 3 * 255 ) : 0 ); - var srcAlpha0 = ( srcRgba[srcPixelIndex+0] + srcRgba[srcPixelIndex+1] + srcRgba[srcPixelIndex+2] ) / ( 3 * 255 ); - var srcAlpha1 = ( srcRgba[srcPixelIndex+4] + srcRgba[srcPixelIndex+5] + srcRgba[srcPixelIndex+6] ) / ( 3 * 255 ); - var srcAlpha2 = ( srcRgba[srcPixelIndex+8] + srcRgba[srcPixelIndex+9] + srcRgba[srcPixelIndex+10] ) / ( 3 * 255 ); - var srcAlphaR = ( i < w-1 ? ( srcRgba[srcPixelIndex+12] + srcRgba[srcPixelIndex+13] + srcRgba[srcPixelIndex+14] ) / ( 3 * 255 ) : 0 ); - - // Weighted averages to find subpixel alphas - var alphaLeft = weightNorm*( weightLeft*srcAlphaL + weightCenter*srcAlpha0 + weightRight*srcAlpha1 ); - var alphaCenter = weightNorm*( weightLeft*srcAlpha0 + weightCenter*srcAlpha1 + weightRight*srcAlpha2 ); - var alphaRight = weightNorm*( weightLeft*srcAlpha1 + weightCenter*srcAlpha2 + weightRight*srcAlphaR ); - - // Store subpixel alphas in dest-pixel - var destPixelIndex = ( j*w + i )*4; - destRgba[ destPixelIndex + 0 ] = Math.round( 255 * alphaLeft ); - destRgba[ destPixelIndex + 1 ] = Math.round( 255 * alphaCenter ); - destRgba[ destPixelIndex + 2 ] = Math.round( 255 * alphaRight ); - - // Alpha will be used in computing final alpha of blended result -- use the average of - // the subpixel alphas - // - // If alpha is 1, Firefox will interpret it as 100%. Causes some pixels that should be - // very dim to come out very bright. As a workaround, nudge them down to zero. - // - var alphaAvg = Math.round( 255 * ( alphaLeft + alphaCenter + alphaRight ) / 3 ); - destRgba[ destPixelIndex + 3 ] = ( alphaAvg === 1 ? 0 : alphaAvg ); - } - } + return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { + // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent + // background -- so we draw white text onto a black background, then infer alpha from + // the pixel color (black = transparent, white = opaque). + // + // We compute alpha as (R+G+B)/3. This grayscales the image the browser drew, effectively + // de-hinting it. + // - g.putImageData( destImage, 0, 0 ); - } ); - }, + g.fillStyle = 'black'; + g.fillRect(0, 0, w, h); - dispose: function( texture : Texture2D ) { - texture.dispose( ); + g.font = font; + g.textAlign = 'left'; + g.textBaseline = 'top'; + g.fillStyle = 'white'; + + g.save(); + g.translate(0, -rawFontMetrics.jTop); + g.fillText(text, 0, 0); + g.restore(); + + let r255 = 255 * color.r; + let g255 = 255 * color.g; + let b255 = 255 * color.b; + let aFactor = color.a / 3; + + let pixels = g.getImageData(0, 0, w, h); + for (let j = 0; j < pixels.height; j++) { + for (let i = 0; i < pixels.width; i++) { + let pixelOffset = (j * pixels.width + i) * 4; + let a255 = aFactor * (pixels.data[pixelOffset + 0] + pixels.data[pixelOffset + 1] + pixels.data[pixelOffset + 2]); + + pixels.data[pixelOffset + 0] = r255; + pixels.data[pixelOffset + 1] = g255; + pixels.data[pixelOffset + 2] = b255; + pixels.data[pixelOffset + 3] = a255; + } } - } ); + g.putImageData(pixels, 0, 0); + }); } +} + + + + + + + + +export function newTextHintsCache(font: string): Cache { + let rawFontMetrics = getRawFontMetrics(font); + let jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; + let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; + + return new Cache({ + + create: function (text: string): Texture2D { + let w = getTextWidth(font, text); + + // XXX: For now, assuming subpixels are horizontal-RGB + + // Draw text triple-sized, to get an alpha for each r,g,b subpixel + let canvas3 = document.createElement('canvas'); + canvas3.width = 3 * w; + canvas3.height = h; + let g3 = canvas3.getContext('2d'); + g3.fillStyle = 'black'; + g3.fillRect(0, 0, canvas3.width, canvas3.height); + + g3.save(); + g3.translate(0, -rawFontMetrics.jTop); + g3.scale(3, 1); + g3.font = font; + g3.textAlign = 'left'; + g3.textBaseline = 'top'; + g3.fillStyle = 'white'; + g3.fillText(text, 0, 0); + g3.restore(); + let srcRgba = g3.getImageData(0, 0, canvas3.width, canvas3.height).data; + + return new Texture2D(w, h, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { + let destImage = g.createImageData(w, h); + let destRgba = destImage.data; + + let weightLeft = 1; + let weightCenter = 2; + let weightRight = 1; + let weightNorm = 1 / (weightLeft + weightCenter + weightRight); + + for (let j = 0; j < h; j++) { + for (let i = 0; i < w; i++) { + // Get alpha values for relevant src-pixels: one from just left of the dest-pixel, all + // three from inside the dest-pixel, and one from just right of the dest-pixel. + // + // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent + // background -- so we draw white text onto a black background, then infer alpha from + // the pixel color (black = transparent, white = opaque). + // + // We compute alpha as (R+G+B)/3. This grayscales the image the browser drew, effectively + // de-hinting it so that we can re-hint it ourselves later (during blending, when the + // background color is known). + // + let srcPixelIndex = (j * 3 * w + 3 * i) * 4; + let srcAlphaL = (i > 0 ? (srcRgba[srcPixelIndex - 4] + srcRgba[srcPixelIndex - 3] + srcRgba[srcPixelIndex - 2]) / (3 * 255) : 0); + let srcAlpha0 = (srcRgba[srcPixelIndex + 0] + srcRgba[srcPixelIndex + 1] + srcRgba[srcPixelIndex + 2]) / (3 * 255); + let srcAlpha1 = (srcRgba[srcPixelIndex + 4] + srcRgba[srcPixelIndex + 5] + srcRgba[srcPixelIndex + 6]) / (3 * 255); + let srcAlpha2 = (srcRgba[srcPixelIndex + 8] + srcRgba[srcPixelIndex + 9] + srcRgba[srcPixelIndex + 10]) / (3 * 255); + let srcAlphaR = (i < w - 1 ? (srcRgba[srcPixelIndex + 12] + srcRgba[srcPixelIndex + 13] + srcRgba[srcPixelIndex + 14]) / (3 * 255) : 0); + + // Weighted averages to find subpixel alphas + let alphaLeft = weightNorm * (weightLeft * srcAlphaL + weightCenter * srcAlpha0 + weightRight * srcAlpha1); + let alphaCenter = weightNorm * (weightLeft * srcAlpha0 + weightCenter * srcAlpha1 + weightRight * srcAlpha2); + let alphaRight = weightNorm * (weightLeft * srcAlpha1 + weightCenter * srcAlpha2 + weightRight * srcAlphaR); + + // Store subpixel alphas in dest-pixel + let destPixelIndex = (j * w + i) * 4; + destRgba[destPixelIndex + 0] = Math.round(255 * alphaLeft); + destRgba[destPixelIndex + 1] = Math.round(255 * alphaCenter); + destRgba[destPixelIndex + 2] = Math.round(255 * alphaRight); + + // Alpha will be used in computing final alpha of blended result -- use the average of + // the subpixel alphas + // + // If alpha is 1, Firefox will interpret it as 100%. Causes some pixels that should be + // very dim to come out very bright. As a workaround, nudge them down to zero. + // + let alphaAvg = Math.round(255 * (alphaLeft + alphaCenter + alphaRight) / 3); + destRgba[destPixelIndex + 3] = (alphaAvg === 1 ? 0 : alphaAvg); + } + } + g.putImageData(destImage, 0, 0); + }); + }, - export class HintedTextRenderer { - - private textRenderer_VERTSHADER = concatLines( - ' ', - ' uniform vec2 u_XyFrac; ', - ' uniform vec2 u_Anchor; ', - ' uniform vec2 u_ImageSize; ', - ' uniform vec2 u_ViewportSize; ', - ' ', - ' attribute vec2 a_ImageFrac; ', - ' ', - ' varying vec2 v_StCoord; ', - ' ', - ' void main( ) { ', - ' vec2 xy = -1.0 + 2.0*( u_XyFrac + u_ImageSize*( a_ImageFrac - u_Anchor )/u_ViewportSize ); ', - ' gl_Position = vec4( xy, 0.0, 1.0 ); ', - ' ', - ' v_StCoord = vec2( a_ImageFrac.x, 1.0 - a_ImageFrac.y ); ', - ' } ', - ' ' - ); - - private textRenderer_FRAGSHADER = concatLines( - ' ', - ' precision mediump float; ', - ' ', - ' uniform sampler2D u_Hints; ', - ' uniform float u_Alpha; ', - ' ', - ' varying vec2 v_StCoord; ', - ' ', - ' void main( ) { ', - ' gl_FragColor = u_Alpha * texture2D( u_Hints, v_StCoord ); ', - ' } ', - ' ' - ); - - - private program : Program; - private u_XyFrac : Uniform2f; - private u_Anchor : Uniform2f; - private u_ImageSize : Uniform2f; - private u_ViewportSize : Uniform2f; - private u_Alpha : Uniform1f; - private u_Hints : UniformSampler2D; - - private a_ImageFrac : Attribute; - private imageFracData : Buffer; - - private wViewport : number; - private hViewport : number; - - - constructor( ) { - this.program = new Program( this.textRenderer_VERTSHADER, this.textRenderer_FRAGSHADER ); - this.u_XyFrac = new Uniform2f( this.program, 'u_XyFrac' ); - this.u_Anchor = new Uniform2f( this.program, 'u_Anchor' ); - this.u_ImageSize = new Uniform2f( this.program, 'u_ImageSize' ); - this.u_ViewportSize = new Uniform2f( this.program, 'u_ViewportSize' ); - this.u_Alpha = new Uniform1f( this.program, 'u_Alpha' ); - this.u_Hints = new UniformSampler2D( this.program, 'u_Hints' ); - - this.a_ImageFrac = new Attribute( this.program, 'a_ImageFrac' ); - this.imageFracData = newStaticBuffer( new Float32Array( [ 0.0,0.0, 0.0,1.0, 1.0,0.0, 1.0,1.0 ] ) ); - - this.wViewport = 0; - this.hViewport = 0; - } - - begin( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - this.program.use( gl ); - this.u_ViewportSize.setData( gl, viewport.w, viewport.h ); - this.a_ImageFrac.setDataAndEnable( gl, this.imageFracData, 2, GL.FLOAT ); - - this.wViewport = viewport.w; - this.hViewport = viewport.h; + dispose: function (texture: Texture2D) { + texture.dispose(); } - draw( gl : WebGLRenderingContext, hints : Texture2D, xFrac : number, yFrac : number, options? : { xAnchor? : number; - yAnchor? : number; - color? : Color } ) { - var xAnchor = ( hasval( options ) && hasval( options.xAnchor ) ? options.xAnchor : 0.5 ); - var yAnchor = ( hasval( options ) && hasval( options.yAnchor ) ? options.yAnchor : 0.5 ); - var color = ( hasval( options ) && hasval( options.color ) ? options.color : black ); - - // The hints texture stores subpixel alphas in its R,G,B components. For example, a red hint-pixel indicates - // that, at that pixel, the final R component should be color.r (R_hint=1, so red is opaque), but the - // final G and B components should be the G and B from the background pixel (G_hint=0, B_hint=0, so green - // and blue are transparent). - // - // GL does not allow arbitrary blending, but we can use the blending options it does provide to get the effect - // we want. - // - // There are 4 things to keep an eye on: - // - // 1. The RGB part of color, which is put into glBlendColor - // 2. The A part of color, which is sent to the frag-shader (NOT passed to glBlendColor) - // 3. The subpixel alphas, which are sent to the frag-shader in the hints-texture - // 4. The glBlendFunc, which is set up in an unusual way - // - // - // With this setup, we get: - // - // R_final = ( R_frag )*R_foreground + ( 1 - R_frag )*R_background - // G_final = ( G_frag )*G_foreground + ( 1 - G_frag )*G_background - // B_final = ( B_frag )*B_foreground + ( 1 - B_frag )*B_background - // A_final = ( A_frag )*1 + ( 1 - A_frag )*A_background - // - // So R_frag, the output from the frag shader, is a weight that is used to take a weighted average between - // foreground and background colors. - // - // The frag-shader is doing A_foreground*RGBA_hint. Conceptually, R_hint is really a subpixel alpha for the - // red subpixel, so it is helpful to call it A_redhint (and analogously for G and B): - // - // R_frag = A_foreground * A_redhint - // G_frag = A_foreground * A_greenhint - // B_frag = A_foreground * A_bluehint - // - // So the blended RGB is a weighted average of RGB_foreground and RGB_background, with a weighting factor of - // ( A_foreground * A_subpixel ), where A_subpixel is either A_redhint, A_greenhint, or A_bluehint. Basically, - // we have a separate alpha for each subpixel! - // - // - // For the final alpha component, we want: - // - // A_final = ( 1 - (1-A_background)*(1-A_frag) ) - // - // A little algebra shows that to be equivalent to: - // - // A_final = ( A_frag )*1 + ( 1 - A_frag )*A_background - // - // Which is exactly what we get, as long as we pass an alpha of 1 into glBlendColor. - // - // + }); +} + + +export class HintedTextRenderer { + + private textRenderer_VERTSHADER = concatLines( + ' ', + ' uniform vec2 u_XyFrac; ', + ' uniform vec2 u_Anchor; ', + ' uniform vec2 u_ImageSize; ', + ' uniform vec2 u_ViewportSize; ', + ' ', + ' attribute vec2 a_ImageFrac; ', + ' ', + ' varying vec2 v_StCoord; ', + ' ', + ' void main( ) { ', + ' vec2 xy = -1.0 + 2.0*( u_XyFrac + u_ImageSize*( a_ImageFrac - u_Anchor )/u_ViewportSize ); ', + ' gl_Position = vec4( xy, 0.0, 1.0 ); ', + ' ', + ' v_StCoord = vec2( a_ImageFrac.x, 1.0 - a_ImageFrac.y ); ', + ' } ', + ' ' + ); + + private textRenderer_FRAGSHADER = concatLines( + ' ', + ' precision mediump float; ', + ' ', + ' uniform sampler2D u_Hints; ', + ' uniform float u_Alpha; ', + ' ', + ' varying vec2 v_StCoord; ', + ' ', + ' void main( ) { ', + ' gl_FragColor = u_Alpha * texture2D( u_Hints, v_StCoord ); ', + ' } ', + ' ' + ); + + + private program: Program; + private u_XyFrac: Uniform2f; + private u_Anchor: Uniform2f; + private u_ImageSize: Uniform2f; + private u_ViewportSize: Uniform2f; + private u_Alpha: Uniform1f; + private u_Hints: UniformSampler2D; + + private a_ImageFrac: Attribute; + private imageFracData: Buffer; + + private wViewport: number; + private hViewport: number; + + + constructor() { + this.program = new Program(this.textRenderer_VERTSHADER, this.textRenderer_FRAGSHADER); + this.u_XyFrac = new Uniform2f(this.program, 'u_XyFrac'); + this.u_Anchor = new Uniform2f(this.program, 'u_Anchor'); + this.u_ImageSize = new Uniform2f(this.program, 'u_ImageSize'); + this.u_ViewportSize = new Uniform2f(this.program, 'u_ViewportSize'); + this.u_Alpha = new Uniform1f(this.program, 'u_Alpha'); + this.u_Hints = new UniformSampler2D(this.program, 'u_Hints'); + + this.a_ImageFrac = new Attribute(this.program, 'a_ImageFrac'); + this.imageFracData = newStaticBuffer(new Float32Array([0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0])); + + this.wViewport = 0; + this.hViewport = 0; + } - this.u_XyFrac.setData( gl, nearestPixel( xFrac, this.wViewport, xAnchor, hints.w ), nearestPixel( yFrac, this.hViewport, yAnchor, hints.h ) ); - this.u_Anchor.setData( gl, xAnchor, yAnchor ); - this.u_ImageSize.setData( gl, hints.w, hints.h ); - this.u_Alpha.setData( gl, color.a ); - this.u_Hints.setDataAndBind( gl, 0, hints ); + begin(gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + this.program.use(gl); + this.u_ViewportSize.setData(gl, viewport.w, viewport.h); + this.a_ImageFrac.setDataAndEnable(gl, this.imageFracData, 2, GL.FLOAT); - gl.enable( GL.BLEND ); - gl.blendColor( color.r, color.g, color.b, 1 ); - gl.blendFunc( GL.CONSTANT_COLOR, GL.ONE_MINUS_SRC_COLOR ); + this.wViewport = viewport.w; + this.hViewport = viewport.h; + } - gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); - } + draw(gl: WebGLRenderingContext, hints: Texture2D, xFrac: number, yFrac: number, options?: { + xAnchor?: number; + yAnchor?: number; + color?: Color + }) { + let xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5); + let yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5); + let color = (hasval(options) && hasval(options.color) ? options.color : black); + + // The hints texture stores subpixel alphas in its R,G,B components. For example, a red hint-pixel indicates + // that, at that pixel, the final R component should be color.r (R_hint=1, so red is opaque), but the + // final G and B components should be the G and B from the background pixel (G_hint=0, B_hint=0, so green + // and blue are transparent). + // + // GL does not allow arbitrary blending, but we can use the blending options it does provide to get the effect + // we want. + // + // There are 4 things to keep an eye on: + // + // 1. The RGB part of color, which is put into glBlendColor + // 2. The A part of color, which is sent to the frag-shader (NOT passed to glBlendColor) + // 3. The subpixel alphas, which are sent to the frag-shader in the hints-texture + // 4. The glBlendFunc, which is set up in an unusual way + // + // + // With this setup, we get: + // + // R_final = ( R_frag )*R_foreground + ( 1 - R_frag )*R_background + // G_final = ( G_frag )*G_foreground + ( 1 - G_frag )*G_background + // B_final = ( B_frag )*B_foreground + ( 1 - B_frag )*B_background + // A_final = ( A_frag )*1 + ( 1 - A_frag )*A_background + // + // So R_frag, the output from the frag shader, is a weight that is used to take a weighted average between + // foreground and background colors. + // + // The frag-shader is doing A_foreground*RGBA_hint. Conceptually, R_hint is really a subpixel alpha for the + // red subpixel, so it is helpful to call it A_redhint (and analogously for G and B): + // + // R_frag = A_foreground * A_redhint + // G_frag = A_foreground * A_greenhint + // B_frag = A_foreground * A_bluehint + // + // So the blended RGB is a weighted average of RGB_foreground and RGB_background, with a weighting factor of + // ( A_foreground * A_subpixel ), where A_subpixel is either A_redhint, A_greenhint, or A_bluehint. Basically, + // we have a separate alpha for each subpixel! + // + // + // For the final alpha component, we want: + // + // A_final = ( 1 - (1-A_background)*(1-A_frag) ) + // + // A little algebra shows that to be equivalent to: + // + // A_final = ( A_frag )*1 + ( 1 - A_frag )*A_background + // + // Which is exactly what we get, as long as we pass an alpha of 1 into glBlendColor. + // + // + + this.u_XyFrac.setData(gl, nearestPixel(xFrac, this.wViewport, xAnchor, hints.w), nearestPixel(yFrac, this.hViewport, yAnchor, hints.h)); + this.u_Anchor.setData(gl, xAnchor, yAnchor); + this.u_ImageSize.setData(gl, hints.w, hints.h); + this.u_Alpha.setData(gl, color.a); + this.u_Hints.setDataAndBind(gl, 0, hints); + + gl.enable(GL.BLEND); + gl.blendColor(color.r, color.g, color.b, 1); + gl.blendFunc(GL.CONSTANT_COLOR, GL.ONE_MINUS_SRC_COLOR); + + gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4); + } - end( gl : WebGLRenderingContext ) { - this.a_ImageFrac.disable( gl ); - this.u_Hints.unbind( gl ); - this.program.endUse( gl ); - } + end(gl: WebGLRenderingContext) { + this.a_ImageFrac.disable(gl); + this.u_Hints.unbind(gl); + this.program.endUse(gl); } +} diff --git a/src/webglimpse/texture.ts b/src/webglimpse/texture.ts index bc767f4..ad670cc 100644 --- a/src/webglimpse/texture.ts +++ b/src/webglimpse/texture.ts @@ -27,272 +27,276 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { StringMap, GL, concatLines, getObjectId, hasval } from './util/util'; +import { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './shader'; +import { Buffer, newStaticBuffer } from './buffer'; +import { BoundsUnmodifiable } from './bounds'; +import { nearestPixel } from './misc'; +import { xFrac, yFrac } from './core'; + +class TextureEntry { + gl: WebGLRenderingContext; + target: number; + texture: WebGLTexture; + textureUnit: number; + + constructor(gl: WebGLRenderingContext, target: number, texture: WebGLTexture) { + this.gl = gl; + this.target = target; + this.texture = texture; + this.textureUnit = -1; + } +} +export interface TextureHelper { + target(gl: WebGLRenderingContext): number; + init(gl: WebGLRenderingContext, target: number): void; +} - class TextureEntry { - gl : WebGLRenderingContext; - target : number; - texture : WebGLTexture; - textureUnit : number; - - constructor( gl : WebGLRenderingContext, target : number, texture : WebGLTexture ) { - this.gl = gl; - this.target = target; - this.texture = texture; - this.textureUnit = -1; - } - } +export class Texture { + private helper: TextureHelper; + private textures: StringMap; - export interface TextureHelper { - target( gl : WebGLRenderingContext ) : number; - init( gl : WebGLRenderingContext, target : number ); + constructor(helper: TextureHelper) { + this.helper = helper; + this.textures = {}; } - - export class Texture { - private helper : TextureHelper; - private textures : StringMap; - - constructor( helper : TextureHelper ) { - this.helper = helper; - this.textures = { }; + bind(gl: WebGLRenderingContext, textureUnit: number) { + let glId = getObjectId(gl); + if (hasval(this.textures[glId])) { + let en = this.textures[glId]; + gl.activeTexture(GL.TEXTURE0 + textureUnit); + gl.bindTexture(en.target, en.texture); + en.textureUnit = textureUnit; } - - bind( gl : WebGLRenderingContext, textureUnit : number ) { - var glId = getObjectId( gl ); - if ( hasval( this.textures[ glId ] ) ) { - var en = this.textures[ glId ]; - gl.activeTexture( GL.TEXTURE0 + textureUnit ); - gl.bindTexture( en.target, en.texture ); - en.textureUnit = textureUnit; - } - else { - var target = this.helper.target( gl ); - var texture = gl.createTexture( ); - if ( !hasval( texture ) ) throw new Error( 'Failed to create texture' ); - this.textures[ glId ] = new TextureEntry( gl, target, texture ); - - var en = this.textures[ glId ]; - gl.activeTexture( GL.TEXTURE0 + textureUnit ); - gl.bindTexture( en.target, en.texture ); - en.textureUnit = textureUnit; - - this.helper.init( gl, target ); - } + else { + let target = this.helper.target(gl); + let texture = gl.createTexture(); + if (!hasval(texture)) throw new Error('Failed to create texture'); + this.textures[glId] = new TextureEntry(gl, target, texture); + + let en = this.textures[glId]; + gl.activeTexture(GL.TEXTURE0 + textureUnit); + gl.bindTexture(en.target, en.texture); + en.textureUnit = textureUnit; + + this.helper.init(gl, target); } + } - unbind( gl : WebGLRenderingContext ) { - var glId = getObjectId( gl ); - if ( hasval( this.textures[ glId ] ) ) { - var en = this.textures[ glId ]; - gl.activeTexture( GL.TEXTURE0 + en.textureUnit ); - gl.bindTexture( en.target, null ); - en.textureUnit = -1; - } + unbind(gl: WebGLRenderingContext) { + let glId = getObjectId(gl); + if (hasval(this.textures[glId])) { + let en = this.textures[glId]; + gl.activeTexture(GL.TEXTURE0 + en.textureUnit); + gl.bindTexture(en.target, null); + en.textureUnit = -1; } + } - dispose( ) { - // XXX: Not sure this actually works ... may have to make each gl current or something - for ( var glid in this.textures ) { - if ( this.textures.hasOwnProperty( glid ) ) { - var en = this.textures[ glid ]; - en.gl.deleteTexture( en.texture ); - } + dispose() { + // XXX: Not sure this actually works ... may have to make each gl current or something + for (let glid in this.textures) { + if (this.textures.hasOwnProperty(glid)) { + let en = this.textures[glid]; + en.gl.deleteTexture(en.texture); } - this.textures = { }; } + this.textures = {}; } +} - export interface ImageDrawer { - ( context : CanvasRenderingContext2D ); - } +export interface ImageDrawer { + (context: CanvasRenderingContext2D): void; +} - export class FloatDataTexture2D extends Texture { - private _w : number; - private _h : number; +export class FloatDataTexture2D extends Texture { + private _w: number; + private _h: number; - get w( ) : number { return this._w; } - get h( ) : number { return this._h; } + get w(): number { return this._w; } + get h(): number { return this._h; } - constructor( w : number, h : number, array : Float32Array ) { - this._w = w; - this._h = h; + constructor(w: number, h: number, array: Float32Array) { + super({ + target: function (gl: WebGLRenderingContext): number { + return GL.TEXTURE_2D; + }, + init: function (gl: WebGLRenderingContext, target: number) { - super( { - target: function( gl : WebGLRenderingContext ) : number { - return GL.TEXTURE_2D; - }, - init: function( gl : WebGLRenderingContext, target : number ) { + if (!gl.getExtension('OES_texture_float')) { + throw new Error('OES_texture_float extension is required'); + } - if ( !gl.getExtension( 'OES_texture_float' ) ) { - throw new Error( 'OES_texture_float extension is required' ); - } + gl.texParameteri(target, GL.TEXTURE_MAG_FILTER, GL.NEAREST); + gl.texParameteri(target, GL.TEXTURE_MIN_FILTER, GL.NEAREST); + gl.texParameteri(target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); + gl.texParameteri(target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); - gl.texParameteri( target, GL.TEXTURE_MAG_FILTER, GL.NEAREST ); - gl.texParameteri( target, GL.TEXTURE_MIN_FILTER, GL.NEAREST ); - gl.texParameteri( target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE ); - gl.texParameteri( target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE ); + // GL.LUMINANCE isn't supported with GL.FLOAT + gl.texImage2D(target, 0, GL.RGBA, w, h, 0, GL.RGBA, GL.FLOAT, array); + } + }); - // GL.LUMINANCE isn't supported with GL.FLOAT - gl.texImage2D( target, 0, GL.RGBA, w, h, 0, GL.RGBA, GL.FLOAT, array ); - } - } ); - } + this._w = w; + this._h = h; } +} + +export class Texture2D extends Texture { + private _w: number; + private _h: number; + + get w(): number { return this._w; } + get h(): number { return this._h; } + + constructor(w: number, h: number, minFilter: number, magFilter: number, draw: ImageDrawer) { + let canvas = document.createElement('canvas'); + canvas.width = w; + canvas.height = h; + draw(canvas.getContext('2d')); + + super({ + target: function (gl: WebGLRenderingContext): number { + return GL.TEXTURE_2D; + }, + init: function (gl: WebGLRenderingContext, target: number) { + gl.texParameteri(target, GL.TEXTURE_MAG_FILTER, magFilter); + gl.texParameteri(target, GL.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE); + gl.texParameteri(target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE); + gl.texImage2D(target, 0, GL.RGBA, GL.RGBA, GL.UNSIGNED_BYTE, canvas); + } + }); - export class Texture2D extends Texture { - private _w : number; - private _h : number; - - get w( ) : number { return this._w; } - get h( ) : number { return this._h; } - - constructor( w : number, h : number, minFilter : number, magFilter : number, draw : ImageDrawer ) { - this._w = w; - this._h = h; - - var canvas = document.createElement( 'canvas' ); - canvas.width = w; - canvas.height = h; - draw( canvas.getContext( '2d' ) ); - - super( { - target: function( gl : WebGLRenderingContext ) : number { - return GL.TEXTURE_2D; - }, - init: function( gl : WebGLRenderingContext, target : number ) { - gl.texParameteri( target, GL.TEXTURE_MAG_FILTER, magFilter ); - gl.texParameteri( target, GL.TEXTURE_MIN_FILTER, minFilter ); - gl.texParameteri( target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE ); - gl.texParameteri( target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE ); - gl.texImage2D( target, 0, GL.RGBA, GL.RGBA, GL.UNSIGNED_BYTE, canvas ); - } - } ); - } + this._w = w; + this._h = h; } - - - export interface TextureDrawOptions { - xAnchor? : number; - yAnchor? : number; - rotation_CCWRAD? : number; - width? : number; - height? : number; +} + + +export interface TextureDrawOptions { + xAnchor?: number; + yAnchor?: number; + rotation_CCWRAD?: number; + width?: number; + height?: number; +} + + +export class TextureRenderer { + + private textureRenderer_VERTSHADER = concatLines( + ' ', + ' uniform vec2 u_XyFrac; ', + ' uniform vec2 u_Anchor; ', + ' uniform float u_Rotation_CCWRAD; ', + ' uniform vec2 u_ImageSize; ', + ' uniform vec2 u_ViewportSize; ', + ' ', + ' attribute vec2 a_ImageFrac; ', + ' ', + ' varying vec2 v_StCoord; ', + ' ', + ' void main( ) { ', + ' float cosRot = cos( u_Rotation_CCWRAD ); ', + ' float sinRot = sin( u_Rotation_CCWRAD ); ', + ' ', + ' // Column major ', + ' mat2 rotation = mat2( cosRot, sinRot, ', + ' -sinRot, cosRot ); ', + ' ', + ' vec2 xy = -1.0 + 2.0*( u_XyFrac + rotation*( u_ImageSize*( a_ImageFrac - u_Anchor ) ) / u_ViewportSize ); ', + ' gl_Position = vec4( xy, 0.0, 1.0 ); ', + ' ', + ' v_StCoord = vec2( a_ImageFrac.x, 1.0 - a_ImageFrac.y ); ', + ' } ', + ' ' + ); + + private textureRenderer_FRAGSHADER = concatLines( + ' ', + ' precision mediump float; ', + ' ', + ' uniform sampler2D u_Sampler; ', + ' ', + ' varying vec2 v_StCoord; ', + ' ', + ' void main( ) { ', + ' gl_FragColor = texture2D( u_Sampler, v_StCoord ); ', + ' } ', + ' ' + ); + + + private program: Program; + private u_XyFrac: Uniform2f; + private u_Anchor: Uniform2f; + private u_Rotation_CCWRAD: Uniform1f; + private u_ImageSize: Uniform2f; + private u_ViewportSize: Uniform2f; + private u_Sampler: UniformSampler2D; + + private a_ImageFrac: Attribute; + + private imageFracData: Buffer; + + private wViewport: number; + private hViewport: number; + + + constructor() { + this.program = new Program(this.textureRenderer_VERTSHADER, this.textureRenderer_FRAGSHADER); + this.u_XyFrac = new Uniform2f(this.program, 'u_XyFrac'); + this.u_Anchor = new Uniform2f(this.program, 'u_Anchor'); + this.u_Rotation_CCWRAD = new Uniform1f(this.program, 'u_Rotation_CCWRAD'); + this.u_ImageSize = new Uniform2f(this.program, 'u_ImageSize'); + this.u_ViewportSize = new Uniform2f(this.program, 'u_ViewportSize'); + this.u_Sampler = new UniformSampler2D(this.program, 'u_Sampler'); + + this.a_ImageFrac = new Attribute(this.program, 'a_ImageFrac'); + this.imageFracData = newStaticBuffer(new Float32Array([0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0])); + + this.wViewport = 0; + this.hViewport = 0; } + begin(gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); - export class TextureRenderer { - - private textureRenderer_VERTSHADER = concatLines( - ' ', - ' uniform vec2 u_XyFrac; ', - ' uniform vec2 u_Anchor; ', - ' uniform float u_Rotation_CCWRAD; ', - ' uniform vec2 u_ImageSize; ', - ' uniform vec2 u_ViewportSize; ', - ' ', - ' attribute vec2 a_ImageFrac; ', - ' ', - ' varying vec2 v_StCoord; ', - ' ', - ' void main( ) { ', - ' float cosRot = cos( u_Rotation_CCWRAD ); ', - ' float sinRot = sin( u_Rotation_CCWRAD ); ', - ' ', - ' // Column major ', - ' mat2 rotation = mat2( cosRot, sinRot, ', - ' -sinRot, cosRot ); ', - ' ', - ' vec2 xy = -1.0 + 2.0*( u_XyFrac + rotation*( u_ImageSize*( a_ImageFrac - u_Anchor ) ) / u_ViewportSize ); ', - ' gl_Position = vec4( xy, 0.0, 1.0 ); ', - ' ', - ' v_StCoord = vec2( a_ImageFrac.x, 1.0 - a_ImageFrac.y ); ', - ' } ', - ' ' - ); - - private textureRenderer_FRAGSHADER = concatLines( - ' ', - ' precision mediump float; ', - ' ', - ' uniform sampler2D u_Sampler; ', - ' ', - ' varying vec2 v_StCoord; ', - ' ', - ' void main( ) { ', - ' gl_FragColor = texture2D( u_Sampler, v_StCoord ); ', - ' } ', - ' ' - ); - - - private program : Program; - private u_XyFrac : Uniform2f; - private u_Anchor : Uniform2f; - private u_Rotation_CCWRAD : Uniform1f; - private u_ImageSize : Uniform2f; - private u_ViewportSize : Uniform2f; - private u_Sampler : UniformSampler2D; - - private a_ImageFrac : Attribute; - - private imageFracData : Buffer; - - private wViewport : number; - private hViewport : number; - - - constructor( ) { - this.program = new Program( this.textureRenderer_VERTSHADER, this.textureRenderer_FRAGSHADER ); - this.u_XyFrac = new Uniform2f( this.program, 'u_XyFrac' ); - this.u_Anchor = new Uniform2f( this.program, 'u_Anchor' ); - this.u_Rotation_CCWRAD = new Uniform1f( this.program, 'u_Rotation_CCWRAD' ); - this.u_ImageSize = new Uniform2f( this.program, 'u_ImageSize' ); - this.u_ViewportSize = new Uniform2f( this.program, 'u_ViewportSize' ); - this.u_Sampler = new UniformSampler2D( this.program, 'u_Sampler' ); - - this.a_ImageFrac = new Attribute( this.program, 'a_ImageFrac' ); - this.imageFracData = newStaticBuffer( new Float32Array( [ 0.0,0.0, 0.0,1.0, 1.0,0.0, 1.0,1.0 ] ) ); - - this.wViewport = 0; - this.hViewport = 0; - } + this.program.use(gl); + this.u_ViewportSize.setData(gl, viewport.w, viewport.h); + this.a_ImageFrac.setDataAndEnable(gl, this.imageFracData, 2, GL.FLOAT); - begin( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - this.program.use( gl ); - this.u_ViewportSize.setData( gl, viewport.w, viewport.h ); - this.a_ImageFrac.setDataAndEnable( gl, this.imageFracData, 2, GL.FLOAT ); - - this.wViewport = viewport.w; - this.hViewport = viewport.h; - } + this.wViewport = viewport.w; + this.hViewport = viewport.h; + } - draw( gl : WebGLRenderingContext, texture : Texture2D, xFrac : number, yFrac : number, options? : TextureDrawOptions ) { - var xAnchor = ( hasval( options ) && hasval( options.xAnchor ) ? options.xAnchor : 0.5 ); - var yAnchor = ( hasval( options ) && hasval( options.yAnchor ) ? options.yAnchor : 0.5 ); - var rotation_CCWRAD = ( hasval( options ) && hasval( options.rotation_CCWRAD ) ? options.rotation_CCWRAD : 0 ); - var width = ( hasval( options ) && hasval( options.width ) ? options.width : texture.w ); - var height = ( hasval( options ) && hasval( options.height ) ? options.height : texture.h ); - - this.u_XyFrac.setData( gl, nearestPixel( xFrac, this.wViewport, xAnchor, texture.w ), nearestPixel( yFrac, this.hViewport, yAnchor, texture.h ) ); - this.u_Anchor.setData( gl, xAnchor, yAnchor ); - this.u_Rotation_CCWRAD.setData( gl, rotation_CCWRAD ); - this.u_ImageSize.setData( gl, width, height ); - this.u_Sampler.setDataAndBind( gl, 0, texture ); - gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); - } + draw(gl: WebGLRenderingContext, texture: Texture2D, xFrac: number, yFrac: number, options?: TextureDrawOptions) { + let xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5); + let yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5); + let rotation_CCWRAD = (hasval(options) && hasval(options.rotation_CCWRAD) ? options.rotation_CCWRAD : 0); + let width = (hasval(options) && hasval(options.width) ? options.width : texture.w); + let height = (hasval(options) && hasval(options.height) ? options.height : texture.h); + + this.u_XyFrac.setData(gl, nearestPixel(xFrac, this.wViewport, xAnchor, texture.w), nearestPixel(yFrac, this.hViewport, yAnchor, texture.h)); + this.u_Anchor.setData(gl, xAnchor, yAnchor); + this.u_Rotation_CCWRAD.setData(gl, rotation_CCWRAD); + this.u_ImageSize.setData(gl, width, height); + this.u_Sampler.setDataAndBind(gl, 0, texture); + gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4); + } - end( gl : WebGLRenderingContext ) { - this.a_ImageFrac.disable( gl ); - this.u_Sampler.unbind( gl ); - this.program.endUse( gl ); - } + end(gl: WebGLRenderingContext) { + this.a_ImageFrac.disable(gl); + this.u_Sampler.unbind(gl); + this.program.endUse(gl); } +} diff --git a/src/webglimpse/time.ts b/src/webglimpse/time.ts index 677dcbe..1e781c3 100644 --- a/src/webglimpse/time.ts +++ b/src/webglimpse/time.ts @@ -30,36 +30,36 @@ - export function secondsToMillis( value_SECONDS : number ) : number { - return value_SECONDS * 1000; - } +export function secondsToMillis(value_SECONDS: number): number { + return value_SECONDS * 1000; +} - export function millisToSeconds( value_MILLIS : number ) : number { - return value_MILLIS / 1000; - } +export function millisToSeconds(value_MILLIS: number): number { + return value_MILLIS / 1000; +} - export function minutesToMillis( value_MINUTES : number ) : number { - return value_MINUTES * 60000; - } +export function minutesToMillis(value_MINUTES: number): number { + return value_MINUTES * 60000; +} - export function millisToMinutes( value_MILLIS : number ) : number { - return value_MILLIS / 60000; - } +export function millisToMinutes(value_MILLIS: number): number { + return value_MILLIS / 60000; +} - export function hoursToMillis( value_HOURS : number ) : number { - return value_HOURS * 3600000; - } +export function hoursToMillis(value_HOURS: number): number { + return value_HOURS * 3600000; +} - export function millisToHours( value_MILLIS : number ) : number { - return value_MILLIS / 3600000; - } +export function millisToHours(value_MILLIS: number): number { + return value_MILLIS / 3600000; +} - export function daysToMillis( value_DAYS : number ) : number { - return value_DAYS * 86400000; - } +export function daysToMillis(value_DAYS: number): number { + return value_DAYS * 86400000; +} - export function millisToDays( value_MILLIS : number ) : number { - return value_MILLIS / 86400000; - } +export function millisToDays(value_MILLIS: number): number { + return value_MILLIS / 86400000; +} diff --git a/src/webglimpse/timeline/time_axis.ts b/src/webglimpse/timeline/time_axis.ts index ffd1d55..b57f2a4 100644 --- a/src/webglimpse/timeline/time_axis.ts +++ b/src/webglimpse/timeline/time_axis.ts @@ -27,62 +27,63 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Axis1D } from '../plot/axis'; +export class TimeAxis1D extends Axis1D { - export class TimeAxis1D extends Axis1D { + private _epoch_PMILLIS: number; - private _epoch_PMILLIS : number; - - constructor( tMin_PMILLIS : number, tMax_PMILLIS : number ) { - this._epoch_PMILLIS = 0.5*( tMin_PMILLIS + tMax_PMILLIS ); - super( tMin_PMILLIS - this._epoch_PMILLIS, tMax_PMILLIS - this._epoch_PMILLIS ); - } - - get tMin_PMILLIS( ) : number { - return ( this._epoch_PMILLIS + this.vMin ); - } + constructor(tMin_PMILLIS: number, tMax_PMILLIS: number) { + const epoch_PMILLIS = 0.5 * (tMin_PMILLIS + tMax_PMILLIS); + super(tMin_PMILLIS - epoch_PMILLIS, tMax_PMILLIS - epoch_PMILLIS); + this._epoch_PMILLIS = epoch_PMILLIS; + } - get tMax_PMILLIS( ) : number { - return ( this._epoch_PMILLIS + this.vMax ); - } + get tMin_PMILLIS(): number { + return (this._epoch_PMILLIS + this.vMin); + } - set tMin_PMILLIS( tMin_PMILLIS : number ) { - this.vMin = ( tMin_PMILLIS - this._epoch_PMILLIS ); - } + get tMax_PMILLIS(): number { + return (this._epoch_PMILLIS + this.vMax); + } - set tMax_PMILLIS( tMax_PMILLIS : number ) { - this.vMax = ( tMax_PMILLIS - this._epoch_PMILLIS ); - } + set tMin_PMILLIS(tMin_PMILLIS: number) { + this.vMin = (tMin_PMILLIS - this._epoch_PMILLIS); + } - setTRange_PMILLIS( tMin_PMILLIS : number, tMax_PMILLIS : number ) { - this.setVRange( tMin_PMILLIS - this._epoch_PMILLIS, tMax_PMILLIS - this._epoch_PMILLIS ); - } + set tMax_PMILLIS(tMax_PMILLIS: number) { + this.vMax = (tMax_PMILLIS - this._epoch_PMILLIS); + } - get tSize_MILLIS( ) : number { - return this.vSize; - } + setTRange_PMILLIS(tMin_PMILLIS: number, tMax_PMILLIS: number) { + this.setVRange(tMin_PMILLIS - this._epoch_PMILLIS, tMax_PMILLIS - this._epoch_PMILLIS); + } - vAtTime( t_PMILLIS : number ) : number { - return ( t_PMILLIS - this._epoch_PMILLIS ); - } + get tSize_MILLIS(): number { + return this.vSize; + } - tAtFrac_PMILLIS( tFrac : number ) : number { - return ( this._epoch_PMILLIS + this.vAtFrac( tFrac ) ); - } + vAtTime(t_PMILLIS: number): number { + return (t_PMILLIS - this._epoch_PMILLIS); + } - tFrac( t_PMILLIS : number ) : number { - return this.vFrac( t_PMILLIS - this._epoch_PMILLIS ); - } + tAtFrac_PMILLIS(tFrac: number): number { + return (this._epoch_PMILLIS + this.vAtFrac(tFrac)); + } - tPan( tAmount_MILLIS : number ) { - this.pan( tAmount_MILLIS ); - } + tFrac(t_PMILLIS: number): number { + return this.vFrac(t_PMILLIS - this._epoch_PMILLIS); + } - tZoom( factor : number, tAnchor_PMILLIS : number ) { - this.zoom( factor, tAnchor_PMILLIS - this._epoch_PMILLIS ); - } + tPan(tAmount_MILLIS: number) { + this.pan(tAmount_MILLIS); + } + tZoom(factor: number, tAnchor_PMILLIS: number) { + this.zoom(factor, tAnchor_PMILLIS - this._epoch_PMILLIS); } +} + diff --git a/src/webglimpse/timeline/time_axis_painter.ts b/src/webglimpse/timeline/time_axis_painter.ts index c2fbb4f..fc5776a 100644 --- a/src/webglimpse/timeline/time_axis_painter.ts +++ b/src/webglimpse/timeline/time_axis_painter.ts @@ -27,837 +27,857 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - // XXX: Much of this is duplicated from edge_axis_painter - - export class FormatOptions { - tickFormat : string; - prefixFormat : string; - constructor(tick: string, prefix: string) { - this.tickFormat = tick; - this.prefixFormat = prefix; - } - } - - export interface TimeAxisFormatOptions { - hour? : FormatOptions; - day? : FormatOptions; - month? : FormatOptions; - year? : FormatOptions; - } - - export interface TimeAxisPainterOptions { - tickSpacing? : number; - font? : string; - textColor? : Color; - tickColor? : Color; - tickSize? : number; - labelAlign? : number; - referenceDate? : string; - timeAxisFormat? : TimeAxisFormatOptions; - // if true, relative date labels in the future are positive (Day 1) - // if false, relative date labels in the future are negative (Day -1) - isFuturePositive? : boolean; - } - - - export function newTimeAxisPainter( timeAxis : TimeAxis1D, labelSide : Side, displayTimeZone : string, tickTimeZone : string, options? : TimeAxisPainterOptions ) : Painter { - var tickSpacing = ( hasval( options ) && hasval( options.tickSpacing ) ? options.tickSpacing : 60 ); - var font = ( hasval( options ) && hasval( options.font ) ? options.font : '11px verdana,sans-serif' ); - var textColor = ( hasval( options ) && hasval( options.textColor ) ? options.textColor : black ); - var tickColor = ( hasval( options ) && hasval( options.tickColor ) ? options.tickColor : black ); - var tickSize = ( hasval( options ) && hasval( options.tickSize ) ? options.tickSize : 6 ); - var labelAlign = ( hasval( options ) && hasval( options.labelAlign ) ? options.labelAlign : 0.5 ); - var referenceDate_PMILLIS = ( hasval( options ) && hasval( options.referenceDate ) ? parseTime_PMILLIS( options.referenceDate ) : undefined ); - var isFuturePositive = ( hasval( options ) && hasval( options.isFuturePositive ) ? options.isFuturePositive : true ); - var timeAxisFormat = ( hasval( options ) && hasval(options.timeAxisFormat) ? options.timeAxisFormat : undefined ); - - var marksProgram = new Program( edgeMarks_VERTSHADER( labelSide ), solid_FRAGSHADER ); - var marksProgram_u_VMin = new Uniform1f( marksProgram, 'u_VMin' ); - var marksProgram_u_VSize = new Uniform1f( marksProgram, 'u_VSize' ); - var marksProgram_u_ViewportSize = new Uniform2f( marksProgram, 'u_ViewportSize' ); - var marksProgram_u_MarkSize = new Uniform1f( marksProgram, 'u_MarkSize' ); - var marksProgram_u_Color = new UniformColor( marksProgram, 'u_Color' ); - var marksProgram_a_VCoord = new Attribute( marksProgram, 'a_VCoord' ); - - var markCoords = new Float32Array( 0 ); - var markCoordsBuffer = newDynamicBuffer( ); - - var textTextures = > newTextTextureCache( font, textColor ); - var textureRenderer = new TextureRenderer( ); - var hTickLabels = textTextures.value( '-0123456789:.' ).h; - var isVerticalAxis = ( labelSide === Side.LEFT || labelSide === Side.RIGHT ); - - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - - var sizePixels = isVerticalAxis ? viewport.h : viewport.w; - if ( sizePixels === 0 ) return; - - var tickTimes_PMILLIS = getTickTimes_PMILLIS( timeAxis, sizePixels, tickSpacing, tickTimeZone, referenceDate_PMILLIS ); - var tickInterval_MILLIS = getTickInterval_MILLIS( tickTimes_PMILLIS ); - var tickCount = tickTimes_PMILLIS.length; - - - // Tick marks - // - - marksProgram.use( gl ); - marksProgram_u_VMin.setData( gl, timeAxis.vMin ); - marksProgram_u_VSize.setData( gl, timeAxis.vSize ); - marksProgram_u_ViewportSize.setData( gl, viewport.w, viewport.h ); - marksProgram_u_MarkSize.setData( gl, tickSize ); - marksProgram_u_Color.setData( gl, tickColor ); - - markCoords = ensureCapacityFloat32( markCoords, 4*tickCount ); - for ( var n = 0; n < tickCount; n++ ) { - var v = timeAxis.vAtTime( tickTimes_PMILLIS[ n ] ); - markCoords[ ( 4*n + 0 ) ] = v; - markCoords[ ( 4*n + 1 ) ] = 0; - markCoords[ ( 4*n + 2 ) ] = v; - markCoords[ ( 4*n + 3 ) ] = 1; +import { Color, black } from '../color'; +import { TimeAxis1D } from './time_axis'; +import { Side, solid_FRAGSHADER } from '../misc'; +import { Painter, yFrac, xFrac } from '../core'; +import { Program, Uniform1f, Uniform2f, UniformColor, Attribute } from '../shader'; +import { edgeMarks_VERTSHADER } from '../plot/edge_axis_painter'; +import { newDynamicBuffer } from '../buffer'; +import { Cache } from '../util/cache'; +import { TextTexture2D, newTextTextureCache } from '../text'; +import { TextureRenderer, TextureDrawOptions } from '../texture'; +import { BoundsUnmodifiable } from '../bounds'; +import { ensureCapacityFloat32, GL, log10, order, hasval, parseTime_PMILLIS, clamp } from '../util/util'; +import { minutesToMillis, millisToDays, hoursToMillis, daysToMillis, millisToHours, secondsToMillis } from '../time'; +import { Axis1D, getTickInterval, getTickCount, getTickPositions } from '../plot/axis'; +import * as momentNs from 'moment'; +const moment = momentNs; + +// XXX: Much of this is duplicated from edge_axis_painter + +export class FormatOptions { + tickFormat: string; + prefixFormat: string; + constructor(tick: string, prefix: string) { + this.tickFormat = tick; + this.prefixFormat = prefix; + } +} + +export interface TimeAxisFormatOptions { + hour?: FormatOptions; + day?: FormatOptions; + month?: FormatOptions; + year?: FormatOptions; +} + +export interface TimeAxisPainterOptions { + tickSpacing?: number; + font?: string; + textColor?: Color; + tickColor?: Color; + tickSize?: number; + labelAlign?: number; + referenceDate?: string; + timeAxisFormat?: TimeAxisFormatOptions; + // if true, relative date labels in the future are positive (Day 1) + // if false, relative date labels in the future are negative (Day -1) + isFuturePositive?: boolean; +} + + +export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displayTimeZone: string, tickTimeZone: string, options?: TimeAxisPainterOptions): Painter { + let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); + let font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); + let textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black); + let tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black); + let tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6); + let labelAlign = (hasval(options) && hasval(options.labelAlign) ? options.labelAlign : 0.5); + let referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined); + let isFuturePositive = (hasval(options) && hasval(options.isFuturePositive) ? options.isFuturePositive : true); + let timeAxisFormat = (hasval(options) && hasval(options.timeAxisFormat) ? options.timeAxisFormat : undefined); + + let marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER); + let marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin'); + let marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize'); + let marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize'); + let marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize'); + let marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color'); + let marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord'); + + let markCoords = new Float32Array(0); + let markCoordsBuffer = newDynamicBuffer(); + + let textTextures = >newTextTextureCache(font, textColor); + let textureRenderer = new TextureRenderer(); + let hTickLabels = textTextures.value('-0123456789:.').h; + let isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT); + + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + + let sizePixels = isVerticalAxis ? viewport.h : viewport.w; + if (sizePixels === 0) return; + + let tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, sizePixels, tickSpacing, tickTimeZone, referenceDate_PMILLIS); + let tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS); + let tickCount = tickTimes_PMILLIS.length; + + + // Tick marks + // + + marksProgram.use(gl); + marksProgram_u_VMin.setData(gl, timeAxis.vMin); + marksProgram_u_VSize.setData(gl, timeAxis.vSize); + marksProgram_u_ViewportSize.setData(gl, viewport.w, viewport.h); + marksProgram_u_MarkSize.setData(gl, tickSize); + marksProgram_u_Color.setData(gl, tickColor); + + markCoords = ensureCapacityFloat32(markCoords, 4 * tickCount); + for (let n = 0; n < tickCount; n++) { + let v = timeAxis.vAtTime(tickTimes_PMILLIS[n]); + markCoords[(4 * n + 0)] = v; + markCoords[(4 * n + 1)] = 0; + markCoords[(4 * n + 2)] = v; + markCoords[(4 * n + 3)] = 1; + } + markCoordsBuffer.setData(markCoords.subarray(0, 4 * tickCount)); + marksProgram_a_VCoord.setDataAndEnable(gl, markCoordsBuffer, 2, GL.FLOAT); + + // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 + gl.lineWidth(1); + gl.drawArrays(GL.LINES, 0, 2 * tickCount); + + marksProgram_a_VCoord.disable(gl); + marksProgram.endUse(gl); + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + + // Tick labels + // + + let ticks: TickDisplayData = getTickDisplayData(tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive, timeAxisFormat); + + textTextures.resetTouches(); + textureRenderer.begin(gl, viewport); + + for (let n = 0; n < tickCount; n++) { + let tickTime_PMILLIS = tickTimes_PMILLIS[n]; + let tFrac = timeAxis.tFrac(tickTime_PMILLIS); + if (tFrac < 0 || tFrac >= 1) continue; + + let tickLabel: string = ticks.tickFormat(tickTime_PMILLIS); + let textTexture = textTextures.value(tickLabel); + + let xFrac: number; + let yFrac: number; + if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { + let yAnchor = textTexture.yAnchor(0.43); + let j0 = (tFrac * viewport.h) - yAnchor * textTexture.h; + let j = clamp(0, viewport.h - textTexture.h, j0); + yFrac = j / viewport.h; + + if (labelSide === Side.LEFT) { + xFrac = (viewport.w - tickSize - 2 - textTexture.w) / viewport.w; + } + else { + xFrac = (tickSize + 2) / viewport.w; + } } - markCoordsBuffer.setData( markCoords.subarray( 0, 4*tickCount ) ); - marksProgram_a_VCoord.setDataAndEnable( gl, markCoordsBuffer, 2, GL.FLOAT ); - - // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 - gl.lineWidth( 1 ); - gl.drawArrays( GL.LINES, 0, 2*tickCount ); - - marksProgram_a_VCoord.disable( gl ); - marksProgram.endUse( gl ); - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - - // Tick labels - // - - var ticks : TickDisplayData = getTickDisplayData( tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive, timeAxisFormat ); - - textTextures.resetTouches( ); - textureRenderer.begin( gl, viewport ); - - for ( var n = 0; n < tickCount; n++ ) { - var tickTime_PMILLIS = tickTimes_PMILLIS[ n ]; - var tFrac = timeAxis.tFrac( tickTime_PMILLIS ); - if ( tFrac < 0 || tFrac >= 1 ) continue; - - var tickLabel : string = ticks.tickFormat( tickTime_PMILLIS ); - var textTexture = textTextures.value( tickLabel ); - - var xFrac : number; - var yFrac : number; - if ( labelSide === Side.LEFT || labelSide === Side.RIGHT ) { - var yAnchor = textTexture.yAnchor( 0.43 ); - var j0 = ( tFrac * viewport.h ) - yAnchor*textTexture.h; - var j = clamp( 0, viewport.h - textTexture.h, j0 ); - yFrac = j / viewport.h; + else { + let xAnchor = 0.45; + let i0 = (tFrac * viewport.w) - xAnchor * (textTexture.w); + let i = clamp(0, viewport.w - textTexture.w, i0); + xFrac = i / viewport.w; - if ( labelSide === Side.LEFT ) { - xFrac = ( viewport.w - tickSize - 2 - textTexture.w ) / viewport.w; - } - else { - xFrac = ( tickSize + 2 ) / viewport.w; - } + if (labelSide === Side.BOTTOM) { + yFrac = (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; } else { - var xAnchor = 0.45; - var i0 = ( tFrac * viewport.w ) - xAnchor*( textTexture.w ); - var i = clamp( 0, viewport.w - textTexture.w, i0 ); - xFrac = i / viewport.w; - - if ( labelSide === Side.BOTTOM ) { - yFrac = ( viewport.h - tickSize - 2 - hTickLabels ) / viewport.h; - } - else { - yFrac = ( tickSize + 2 ) / viewport.h; - } + yFrac = (tickSize + 2) / viewport.h; } - textureRenderer.draw( gl, textTexture, xFrac, yFrac, { xAnchor: 0, yAnchor: 0 } ); } - - - // Axis label - // - - if ( ticks.timeStructFactory ) { - var timeStructs = createTimeStructs( timeAxis, ticks.timeStructFactory, tickTimeZone, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign ); - for ( var n = 0 ; n < timeStructs.length ; n++ ) { - var timeStruct = timeStructs[ n ]; - var text = ticks.prefixFormat( timeStruct ); - var textTexture = textTextures.value( text ); - - var halfTextFrac = 0.5 * textTexture.w / viewport.w; - var minFrac = timeAxis.tFrac( timeStruct.start_PMILLIS ) - halfTextFrac; - var maxFrac = timeAxis.tFrac( timeStruct.end_PMILLIS ) + halfTextFrac; - var tFrac = clamp( minFrac, maxFrac, timeAxis.tFrac( timeStruct.textCenter_PMILLIS ) ); - if ( tFrac-halfTextFrac < 0 || tFrac+halfTextFrac > 1 ) continue; - - var xFrac : number; - var yFrac : number; - var textOpts : TextureDrawOptions; - if ( labelSide === Side.LEFT || labelSide === Side.RIGHT ) { - // Using hTickLabels here works out about right, even though the tick-label text is horizontal - var xFrac0 = 0.5 * ( viewport.w - tickSize - 2 - hTickLabels ) / viewport.w; - xFrac = ( labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0 ); - yFrac = tFrac; - textOpts = { xAnchor: textTexture.yAnchor( 0.5 ), - yAnchor: 0.5, - rotation_CCWRAD: 0.5 * Math.PI }; - } - else { - var yFrac0 = 0.5 * ( viewport.h - tickSize - 2 - hTickLabels ) / viewport.h; - yFrac = ( labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0 ); - xFrac = tFrac; - textOpts = { xAnchor: 0.5, - yAnchor: textTexture.yAnchor( 0.5 ), - rotation_CCWRAD: 0 }; - } - textureRenderer.draw( gl, textTexture, xFrac, yFrac, textOpts ); + textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: 0, yAnchor: 0 }); + } + + + // Axis label + // + + if (ticks.timeStructFactory) { + let timeStructs = createTimeStructs(timeAxis, ticks.timeStructFactory, tickTimeZone, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign); + for (let n = 0; n < timeStructs.length; n++) { + let timeStruct = timeStructs[n]; + let text = ticks.prefixFormat(timeStruct); + let textTexture = textTextures.value(text); + + let halfTextFrac = 0.5 * textTexture.w / viewport.w; + let minFrac = timeAxis.tFrac(timeStruct.start_PMILLIS) - halfTextFrac; + let maxFrac = timeAxis.tFrac(timeStruct.end_PMILLIS) + halfTextFrac; + let tFrac = clamp(minFrac, maxFrac, timeAxis.tFrac(timeStruct.textCenter_PMILLIS)); + if (tFrac - halfTextFrac < 0 || tFrac + halfTextFrac > 1) continue; + + let xFrac: number; + let yFrac: number; + let textOpts: TextureDrawOptions; + if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { + // Using hTickLabels here works out about right, even though the tick-label text is horizontal + let xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w; + xFrac = (labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0); + yFrac = tFrac; + textOpts = { + xAnchor: textTexture.yAnchor(0.5), + yAnchor: 0.5, + rotation_CCWRAD: 0.5 * Math.PI + }; } + else { + let yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; + yFrac = (labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0); + xFrac = tFrac; + textOpts = { + xAnchor: 0.5, + yAnchor: textTexture.yAnchor(0.5), + rotation_CCWRAD: 0 + }; + } + textureRenderer.draw(gl, textTexture, xFrac, yFrac, textOpts); } + } - // Finish up - // + // Finish up + // - textureRenderer.end( gl ); - textTextures.retainTouched( ); - } + textureRenderer.end(gl); + textTextures.retainTouched(); } +} - function getTickDisplayData( tickInterval_MILLIS : number, referenceDate_PMILLIS : number, displayTimeZone : string, isFuturePositive : boolean, timeAxisFormat : TimeAxisFormatOptions ) : TickDisplayData { - if ( hasval( referenceDate_PMILLIS ) ) { - return getTickDisplayDataRelative( tickInterval_MILLIS, referenceDate_PMILLIS, isFuturePositive ); - } - else { - return getTickDisplayDataAbsolute( tickInterval_MILLIS, displayTimeZone, timeAxisFormat ); - } +function getTickDisplayData(tickInterval_MILLIS: number, referenceDate_PMILLIS: number, displayTimeZone: string, isFuturePositive: boolean, timeAxisFormat: TimeAxisFormatOptions): TickDisplayData { + if (hasval(referenceDate_PMILLIS)) { + return getTickDisplayDataRelative(tickInterval_MILLIS, referenceDate_PMILLIS, isFuturePositive); + } + else { + return getTickDisplayDataAbsolute(tickInterval_MILLIS, displayTimeZone, timeAxisFormat); } +} - function getTickDisplayDataRelative( tickInterval_MILLIS : number, referenceDate_PMILLIS : number, isFuturePositive : boolean ) : TickDisplayData { - if ( tickInterval_MILLIS <= minutesToMillis( 1 ) ) { - var tickFormat : TickFormat = function( tickTime_PMILLIS : number ) : string { - var elapsedTime_MILLIS = Math.abs( tickTime_PMILLIS - referenceDate_PMILLIS ); - var elapsedTime_DAYS = millisToDays( elapsedTime_MILLIS ); - var elapsedTime_DAYS_WHOLE = Math.floor( elapsedTime_DAYS ); - var elapsedTime_HOURS = ( elapsedTime_DAYS - elapsedTime_DAYS_WHOLE ) * 24; - var elapsedTime_HOURS_WHOLE = Math.floor( elapsedTime_HOURS ); - var elapsedTime_MIN = ( elapsedTime_HOURS - elapsedTime_HOURS_WHOLE ) * 60; - var elapsedTime_MIN_WHOLE = Math.floor( elapsedTime_MIN ); - var elapsedTime_SEC = ( elapsedTime_MIN - elapsedTime_MIN_WHOLE ) * 60; - // use round() here instead of floor() because we always expect ticks to be on even second - // boundaries but rounding error will cause us to be somewhat unpredictably above or below - // the nearest even second boundary - var elapsedTime_SEC_WHOLE = Math.round( elapsedTime_SEC ); - // however the above fails when we round up to a whole minute, so special case that - if ( elapsedTime_SEC_WHOLE >= 60 ) - { - elapsedTime_SEC_WHOLE -= 60; - elapsedTime_MIN_WHOLE += 1; - } - if ( elapsedTime_MIN_WHOLE >= 60 ) - { - elapsedTime_MIN_WHOLE = 0; - } +function getTickDisplayDataRelative(tickInterval_MILLIS: number, referenceDate_PMILLIS: number, isFuturePositive: boolean): TickDisplayData { + let tickFormat: TickFormat = null; + let prefixFormat: PrefixFormat = null; + let timeStructFactory: TimeStructFactory = null; - var min : string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; - var sec : string = elapsedTime_SEC_WHOLE < 10 ? '0' + elapsedTime_SEC_WHOLE : '' + elapsedTime_SEC_WHOLE; + if (tickInterval_MILLIS <= minutesToMillis(1)) { + let tickFormat: TickFormat = function (tickTime_PMILLIS: number): string { + let elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS); + let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + let elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; + let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); + let elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60; + let elapsedTime_MIN_WHOLE = Math.floor(elapsedTime_MIN); + let elapsedTime_SEC = (elapsedTime_MIN - elapsedTime_MIN_WHOLE) * 60; + // use round() here instead of floor() because we always expect ticks to be on even second + // boundaries but rounding error will cause us to be somewhat unpredictably above or below + // the nearest even second boundary + let elapsedTime_SEC_WHOLE = Math.round(elapsedTime_SEC); + // however the above fails when we round up to a whole minute, so special case that + if (elapsedTime_SEC_WHOLE >= 60) { + elapsedTime_SEC_WHOLE -= 60; + elapsedTime_MIN_WHOLE += 1; + } + if (elapsedTime_MIN_WHOLE >= 60) { + elapsedTime_MIN_WHOLE = 0; + } - return min + ':' + sec; - }; + let min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; + let sec: string = elapsedTime_SEC_WHOLE < 10 ? '0' + elapsedTime_SEC_WHOLE : '' + elapsedTime_SEC_WHOLE; + + return min + ':' + sec; + }; + + let prefixFormat: PrefixFormat = function (timeStruct: TimeStruct): string { + let center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS; + let elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS; + let negative = (elapsedTime_MILLIS < 0); + let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); + + let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + let elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; + let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); + + return 'Day ' + signString + elapsedTime_DAYS_WHOLE + ' Hour ' + signString + elapsedTime_HOURS_WHOLE; + }; + + let timeStructFactory = function (): TimeStruct { return new TimeStruct() }; + } + else if (tickInterval_MILLIS <= hoursToMillis(12)) { + let tickFormat: TickFormat = function (tickTime_PMILLIS: number): string { + let elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS); + let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + let elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; + let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); + let elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60; + // use round() here instead of floor() because we always expect ticks to be on even minute + // boundaries but rounding error will cause us to be somewhat unpredictably above or below + // the nearest even minute boundary + let elapsedTime_MIN_WHOLE = Math.round(elapsedTime_MIN); + // however the above fails when we round up to a whole hour, so special case that + if (elapsedTime_MIN_WHOLE >= 60) { + elapsedTime_MIN_WHOLE -= 60; + elapsedTime_HOURS_WHOLE += 1; + } + if (elapsedTime_HOURS_WHOLE >= 24) { + elapsedTime_HOURS_WHOLE = 0; + } - var prefixFormat = function( timeStruct : TimeStruct ) : string { - var center_PMILLIS = ( timeStruct.end_PMILLIS - timeStruct.start_PMILLIS ) / 2 + timeStruct.start_PMILLIS; - var elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS; - var negative = ( elapsedTime_MILLIS < 0 ); - var signString = ( negative && isFuturePositive ) || ( !negative && !isFuturePositive) ? "-" : ""; - elapsedTime_MILLIS = Math.abs( elapsedTime_MILLIS ); + let hour: string = elapsedTime_HOURS_WHOLE < 10 ? '0' + elapsedTime_HOURS_WHOLE : '' + elapsedTime_HOURS_WHOLE; + let min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; + + return hour + ':' + min; + }; + + let prefixFormat: PrefixFormat = function (timeStruct: TimeStruct): string { + let center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS; + let elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS; + let negative = (elapsedTime_MILLIS < 0); + let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); + let elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS)); + return 'Day ' + signString + elapsedTime_DAYS; + }; + + let timeStructFactory = function (): TimeStruct { return new TimeStruct() }; + } + else { + let tickFormat: TickFormat = function (tickTime_PMILLIS: number): string { + let elapsedTime_MILLIS = tickTime_PMILLIS - referenceDate_PMILLIS; + let negative = (elapsedTime_MILLIS < 0); + let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); + let elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS)); + return elapsedTime_DAYS === 0 ? '' + elapsedTime_DAYS : signString + elapsedTime_DAYS; + }; + } + + return { prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory: timeStructFactory }; +} + +function getTickDisplayDataAbsolute(tickInterval_MILLIS: number, displayTimeZone: string, timeAxisFormat: TimeAxisFormatOptions): TickDisplayData { + + let tickFormat: TickFormat = null; + let prefixFormat: PrefixFormat = null; + let timeStructFactory: TimeStructFactory = null; + let defaultTickFormat = function (format: string): TickFormat { return function (tickTime_PMILLIS: number): string { return moment(tickTime_PMILLIS).zone(displayTimeZone).format(format) } }; + let defaultPrefixFormat = function (format: string): PrefixFormat { return function (timeStruct: TimeStruct): string { return moment(timeStruct.textCenter_PMILLIS).zone(displayTimeZone).format(format) } }; - var elapsedTime_DAYS = millisToDays( elapsedTime_MILLIS ); - var elapsedTime_DAYS_WHOLE = Math.floor( elapsedTime_DAYS ); - var elapsedTime_HOURS = ( elapsedTime_DAYS - elapsedTime_DAYS_WHOLE ) * 24; - var elapsedTime_HOURS_WHOLE = Math.floor( elapsedTime_HOURS ); + if (tickInterval_MILLIS <= minutesToMillis(1)) { + let formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00'); + let hour = (hasval(timeAxisFormat) && hasval(timeAxisFormat.hour) ? timeAxisFormat.hour : formatOptions); + let tickFormat = defaultTickFormat((hasval(hour.tickFormat) && hour.tickFormat !== '' ? hour.tickFormat : formatOptions.tickFormat)); + let prefixFormat = defaultPrefixFormat((hasval(hour.prefixFormat) && hour.prefixFormat !== '' ? hour.prefixFormat : formatOptions.prefixFormat)); + let timeStructFactory = function (): TimeStruct { return new HourStruct() }; + } + else if (tickInterval_MILLIS <= hoursToMillis(12)) { + let formatOptions = new FormatOptions('HH:mm', 'D MMM YYYY'); + let day = (hasval(timeAxisFormat) && hasval(timeAxisFormat.day) ? timeAxisFormat.day : formatOptions); + let tickFormat = defaultTickFormat((hasval(day.tickFormat) && day.tickFormat !== '' ? day.tickFormat : formatOptions.tickFormat)); + let prefixFormat = defaultPrefixFormat((hasval(day.prefixFormat) && day.prefixFormat !== '' ? day.prefixFormat : formatOptions.prefixFormat)); + let timeStructFactory = function (): TimeStruct { return new DayStruct() }; + } + else if (tickInterval_MILLIS <= daysToMillis(10)) { + let formatOptions = new FormatOptions('D', 'MMM YYYY'); + let month = (hasval(timeAxisFormat) && hasval(timeAxisFormat.month) ? timeAxisFormat.month : formatOptions); + let tickFormat = defaultTickFormat((hasval(month.tickFormat) && month.tickFormat !== '' ? month.tickFormat : formatOptions.tickFormat)); + let prefixFormat = defaultPrefixFormat((hasval(month.prefixFormat) && month.prefixFormat !== '' ? month.prefixFormat : formatOptions.prefixFormat)); + let timeStructFactory = function (): TimeStruct { return new MonthStruct() }; + } + else if (tickInterval_MILLIS <= daysToMillis(60)) { + let formatOptions = new FormatOptions('MMM', 'YYYY'); + let year = (hasval(timeAxisFormat) && hasval(timeAxisFormat.year) ? timeAxisFormat.year : formatOptions); + let tickFormat = defaultTickFormat((hasval(year.tickFormat) && year.tickFormat !== '' ? year.tickFormat : formatOptions.tickFormat)); + let prefixFormat = defaultPrefixFormat((hasval(year.prefixFormat) && year.prefixFormat !== '' ? year.prefixFormat : formatOptions.prefixFormat)); + let timeStructFactory = function (): TimeStruct { return new YearStruct() }; + } + else { + let tickFormat = defaultTickFormat('YYYY'); + } - return 'Day ' + signString + elapsedTime_DAYS_WHOLE + ' Hour ' + signString + elapsedTime_HOURS_WHOLE; - }; + return { prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory: timeStructFactory }; +} - var timeStructFactory = function( ) : TimeStruct { return new TimeStruct( ) }; - } - else if ( tickInterval_MILLIS <= hoursToMillis( 12 ) ) { - var tickFormat : TickFormat = function( tickTime_PMILLIS : number ) : string { - var elapsedTime_MILLIS = Math.abs( tickTime_PMILLIS - referenceDate_PMILLIS ); - var elapsedTime_DAYS = millisToDays( elapsedTime_MILLIS ); - var elapsedTime_DAYS_WHOLE = Math.floor( elapsedTime_DAYS ); - var elapsedTime_HOURS = ( elapsedTime_DAYS - elapsedTime_DAYS_WHOLE ) * 24; - var elapsedTime_HOURS_WHOLE = Math.floor( elapsedTime_HOURS ); - var elapsedTime_MIN = ( elapsedTime_HOURS - elapsedTime_HOURS_WHOLE ) * 60; - // use round() here instead of floor() because we always expect ticks to be on even minute - // boundaries but rounding error will cause us to be somewhat unpredictably above or below - // the nearest even minute boundary - var elapsedTime_MIN_WHOLE = Math.round( elapsedTime_MIN ); - // however the above fails when we round up to a whole hour, so special case that - if ( elapsedTime_MIN_WHOLE >= 60 ) - { - elapsedTime_MIN_WHOLE -= 60; - elapsedTime_HOURS_WHOLE += 1; - } - if ( elapsedTime_HOURS_WHOLE >= 24 ) - { - elapsedTime_HOURS_WHOLE = 0; - } +interface TickDisplayData { + prefixFormat: PrefixFormat; + tickFormat: TickFormat; + timeStructFactory: TimeStructFactory; +} - var hour : string = elapsedTime_HOURS_WHOLE < 10 ? '0' + elapsedTime_HOURS_WHOLE : '' + elapsedTime_HOURS_WHOLE; - var min : string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; +interface PrefixFormat { + (timeStruct: TimeStruct): string; +} - return hour + ':' + min; - }; +interface TickFormat { + (tickTime_PMILLIS: number): string; +} - var prefixFormat = function( timeStruct : TimeStruct ) : string { - var center_PMILLIS = ( timeStruct.end_PMILLIS - timeStruct.start_PMILLIS ) / 2 + timeStruct.start_PMILLIS; - var elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS; - var negative = ( elapsedTime_MILLIS < 0 ); - var signString = ( negative && isFuturePositive ) || ( !negative && !isFuturePositive) ? "-" : ""; - elapsedTime_MILLIS = Math.abs( elapsedTime_MILLIS ); - var elapsedTime_DAYS = Math.floor( millisToDays( elapsedTime_MILLIS ) ); - return 'Day ' + signString + elapsedTime_DAYS; - }; +interface TimeStructFactory { + (): TimeStruct; +} - var timeStructFactory = function( ) : TimeStruct { return new TimeStruct( ) }; - } - else { - var tickFormat : TickFormat = function( tickTime_PMILLIS : number ) : string { - var elapsedTime_MILLIS = tickTime_PMILLIS - referenceDate_PMILLIS; - var negative = ( elapsedTime_MILLIS < 0 ); - var signString = ( negative && isFuturePositive ) || ( !negative && !isFuturePositive) ? "-" : ""; - elapsedTime_MILLIS = Math.abs( elapsedTime_MILLIS ); - var elapsedTime_DAYS = Math.floor( millisToDays( elapsedTime_MILLIS ) ); - return elapsedTime_DAYS === 0 ? '' + elapsedTime_DAYS : signString + elapsedTime_DAYS; - }; - } +class TimeStruct { + public start_PMILLIS: number; + public end_PMILLIS: number; + public viewStart_PMILLIS: number; + public viewEnd_PMILLIS: number; + public textCenter_PMILLIS: number; - return { prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory:timeStructFactory }; + setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + return moment(time_PMILLIS).zone(timeZone); } - function getTickDisplayDataAbsolute( tickInterval_MILLIS : number, displayTimeZone : string, timeAxisFormat : TimeAxisFormatOptions ) : TickDisplayData { - - var defaultTickFormat = function( format : string ) : TickFormat { return function( tickTime_PMILLIS : number ) : string { return moment( tickTime_PMILLIS ).zone( displayTimeZone ).format( format ) } }; - var defaultPrefixFormat = function( format : string ) : PrefixFormat { return function( timeStruct : TimeStruct ) : string { return moment( timeStruct.textCenter_PMILLIS ).zone( displayTimeZone ).format( format ) } }; - - if ( tickInterval_MILLIS <= minutesToMillis( 1 ) ) { - var formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00'); - var hour = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.hour) ? timeAxisFormat.hour : formatOptions ); - var tickFormat = defaultTickFormat( ( hasval(hour.tickFormat) && hour.tickFormat !== '' ? hour.tickFormat : formatOptions.tickFormat ) ); - var prefixFormat = defaultPrefixFormat( ( hasval(hour.prefixFormat) && hour.prefixFormat !== '' ? hour.prefixFormat : formatOptions.prefixFormat ) ); - var timeStructFactory = function( ) : TimeStruct { return new HourStruct( ) }; - } - else if ( tickInterval_MILLIS <= hoursToMillis( 12 ) ) { - var formatOptions = new FormatOptions('HH:mm', 'D MMM YYYY'); - var day = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.day) ? timeAxisFormat.day : formatOptions ); - var tickFormat = defaultTickFormat( ( hasval(day.tickFormat) && day.tickFormat !== '' ? day.tickFormat : formatOptions.tickFormat ) ); - var prefixFormat = defaultPrefixFormat( ( hasval(day.prefixFormat) && day.prefixFormat !== '' ? day.prefixFormat : formatOptions.prefixFormat ) ); - var timeStructFactory = function( ) : TimeStruct { return new DayStruct( ) }; - } - else if ( tickInterval_MILLIS <= daysToMillis( 10 ) ) { - var formatOptions = new FormatOptions('D', 'MMM YYYY'); - var month = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.month) ? timeAxisFormat.month : formatOptions ); - var tickFormat = defaultTickFormat( ( hasval(month.tickFormat) && month.tickFormat !== '' ? month.tickFormat : formatOptions.tickFormat ) ); - var prefixFormat = defaultPrefixFormat( ( hasval(month.prefixFormat) && month.prefixFormat !== '' ? month.prefixFormat : formatOptions.prefixFormat ) ); - var timeStructFactory = function( ) : TimeStruct { return new MonthStruct( ) }; - } - else if ( tickInterval_MILLIS <= daysToMillis( 60 ) ) { - var formatOptions = new FormatOptions('MMM', 'YYYY'); - var year = ( hasval( timeAxisFormat ) && hasval(timeAxisFormat.year) ? timeAxisFormat.year : formatOptions ); - var tickFormat = defaultTickFormat( ( hasval(year.tickFormat) && year.tickFormat !== '' ? year.tickFormat : formatOptions.tickFormat ) ); - var prefixFormat = defaultPrefixFormat( ( hasval(year.prefixFormat) && year.prefixFormat !== '' ? year.prefixFormat : formatOptions.prefixFormat ) ); - var timeStructFactory = function( ) : TimeStruct { return new YearStruct( ) }; - } - else { - var tickFormat = defaultTickFormat( 'YYYY' ); - } - - return { prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory:timeStructFactory }; + incrementTime(m: momentNs.Moment) { } +} - interface TickDisplayData { - prefixFormat : PrefixFormat; - tickFormat : TickFormat; - timeStructFactory : TimeStructFactory; +class YearStruct extends TimeStruct { + setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + let m = moment(time_PMILLIS).zone(timeZone); + m.month(0); + m.date(0); + m.hours(0); + m.minutes(0); + m.seconds(0); + return m; } - interface PrefixFormat { - ( timeStruct : TimeStruct ) : string; + incrementTime(m: momentNs.Moment) { + m.add('years', 1); } +} - interface TickFormat { - ( tickTime_PMILLIS : number ) : string; - } - interface TimeStructFactory { - ( ): TimeStruct; +class MonthStruct extends TimeStruct { + setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + let m = moment(time_PMILLIS).zone(timeZone); + m.date(0); + m.hours(0); + m.minutes(0); + m.seconds(0); + return m; } - class TimeStruct { - public start_PMILLIS : number; - public end_PMILLIS : number; - public viewStart_PMILLIS : number; - public viewEnd_PMILLIS : number; - public textCenter_PMILLIS : number; - - setTime( time_PMILLIS : number, timeZone : string ) : Moment { - return moment( time_PMILLIS ).zone( timeZone ); - } - - incrementTime( m : Moment ) { - } + incrementTime(m: momentNs.Moment) { + m.add('months', 1); } +} - class YearStruct extends TimeStruct { - setTime( time_PMILLIS : number, timeZone : string ) : Moment { - var m = moment( time_PMILLIS ).zone( timeZone ); - m.month( 0 ); - m.date( 0 ); - m.hours( 0 ); - m.minutes( 0 ); - m.seconds( 0 ); - return m; - } - incrementTime( m : Moment ) { - m.add( 'years', 1 ); - } +class DayStruct extends TimeStruct { + setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + let m = moment(time_PMILLIS).zone(timeZone); + m.hours(0); + m.minutes(0); + m.seconds(0); + return m; } - - class MonthStruct extends TimeStruct { - setTime( time_PMILLIS : number, timeZone : string ) : Moment { - var m = moment( time_PMILLIS ).zone( timeZone ); - m.date( 0 ); - m.hours( 0 ); - m.minutes( 0 ); - m.seconds( 0 ); - return m; - } - - incrementTime( m : Moment ) { - m.add( 'months', 1 ); - } + incrementTime(m: momentNs.Moment) { + m.add('days', 1); } +} - class DayStruct extends TimeStruct { - setTime( time_PMILLIS : number, timeZone : string ) : Moment { - var m = moment( time_PMILLIS ).zone( timeZone ); - m.hours( 0 ); - m.minutes( 0 ); - m.seconds( 0 ); - return m; - } - - incrementTime( m : Moment ) { - m.add( 'days', 1 ); - } +class HourStruct extends TimeStruct { + setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + let m = moment(time_PMILLIS).zone(timeZone); + m.minutes(0); + m.seconds(0); + return m; } - - class HourStruct extends TimeStruct { - setTime( time_PMILLIS : number, timeZone : string ) : Moment { - var m = moment( time_PMILLIS ).zone( timeZone ); - m.minutes( 0 ); - m.seconds( 0 ); - return m; - } - - incrementTime( m : Moment ) { - m.add( 'hours', 1 ); - } + incrementTime(m: momentNs.Moment) { + m.add('hours', 1); } +} - function createTimeStructs( timeAxis : TimeAxis1D, factory : TimeStructFactory, timeZone : string, referenceDate_PMILLIS : number, isFuturePositive : boolean, tickTimes_PMILLIS : number[], labelAlign : number ) : TimeStruct[] { - if ( hasval( referenceDate_PMILLIS ) ) { - var tickInterval_MILLIS = getTickInterval_MILLIS( tickTimes_PMILLIS ); +function createTimeStructs(timeAxis: TimeAxis1D, factory: TimeStructFactory, timeZone: string, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { + if (hasval(referenceDate_PMILLIS)) { + let tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS); - if ( tickInterval_MILLIS <= minutesToMillis( 1 ) ) { - return createTimeStructsRelativeHours( timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign ); - } - else { - return createTimeStructsRelativeDays( timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign ); - } + if (tickInterval_MILLIS <= minutesToMillis(1)) { + return createTimeStructsRelativeHours(timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign); } else { - return createTimeStructsAbsolute( timeAxis, factory, timeZone, tickTimes_PMILLIS, labelAlign ); + return createTimeStructsRelativeDays(timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign); } } + else { + return createTimeStructsAbsolute(timeAxis, factory, timeZone, tickTimes_PMILLIS, labelAlign); + } +} - function createTimeStructsRelativeHours( timeAxis : TimeAxis1D, referenceDate_PMILLIS : number, isFuturePositive : boolean, tickTimes_PMILLIS : number[], labelAlign : number ) : TimeStruct[] { - - var dMin_PMILLIS = timeAxis.tMin_PMILLIS; - var dMax_PMILLIS = timeAxis.tMax_PMILLIS; - - var timeStructs : TimeStruct[] = []; - var maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; +function createTimeStructsRelativeHours(timeAxis: TimeAxis1D, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { - var previous_HOURS = null; - var previous_SIGN = null; + let dMin_PMILLIS = timeAxis.tMin_PMILLIS; + let dMax_PMILLIS = timeAxis.tMax_PMILLIS; - for ( var n = 0; n < tickTimes_PMILLIS.length; n++ ) { + let timeStructs: TimeStruct[] = []; + let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; - var elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS; - var negative = ( elapsedTime_MILLIS < 0 ); - var signString = ( negative && isFuturePositive ) || ( !negative && !isFuturePositive) ? "-" : ""; - elapsedTime_MILLIS = Math.abs( elapsedTime_MILLIS ); - var elapsedTime_HOURS = millisToHours( elapsedTime_MILLIS ); - var elapsedTime_HOURS_WHOLE = Math.floor( elapsedTime_HOURS ); + let previous_HOURS = null; + let previous_SIGN = null; - if ( hasval( previous_HOURS ) && elapsedTime_HOURS_WHOLE === previous_HOURS && negative === previous_SIGN ) continue; - previous_HOURS = elapsedTime_HOURS_WHOLE; - previous_SIGN = negative; + for (let n = 0; n < tickTimes_PMILLIS.length; n++) { - var timeStruct = new TimeStruct( ); + let elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS; + let negative = (elapsedTime_MILLIS < 0); + let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); + let elapsedTime_HOURS = millisToHours(elapsedTime_MILLIS); + let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); - if ( negative ) { - timeStruct.end_PMILLIS = hoursToMillis( -elapsedTime_HOURS_WHOLE ) + referenceDate_PMILLIS; - timeStruct.start_PMILLIS = timeStruct.end_PMILLIS - hoursToMillis( 1 ); - } - else { - timeStruct.start_PMILLIS = hoursToMillis( elapsedTime_HOURS_WHOLE ) + referenceDate_PMILLIS; - timeStruct.end_PMILLIS = timeStruct.start_PMILLIS + hoursToMillis( 1 ); - } + if (hasval(previous_HOURS) && elapsedTime_HOURS_WHOLE === previous_HOURS && negative === previous_SIGN) continue; + previous_HOURS = elapsedTime_HOURS_WHOLE; + previous_SIGN = negative; - timeStruct.viewStart_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS ); - timeStruct.viewEnd_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS ); + let timeStruct = new TimeStruct(); - maxViewDuration_MILLIS = Math.max( maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS ); - - timeStructs.push( timeStruct ); + if (negative) { + timeStruct.end_PMILLIS = hoursToMillis(-elapsedTime_HOURS_WHOLE) + referenceDate_PMILLIS; + timeStruct.start_PMILLIS = timeStruct.end_PMILLIS - hoursToMillis(1); + } + else { + timeStruct.start_PMILLIS = hoursToMillis(elapsedTime_HOURS_WHOLE) + referenceDate_PMILLIS; + timeStruct.end_PMILLIS = timeStruct.start_PMILLIS + hoursToMillis(1); } - setTimeStructTextCenter( timeStructs, labelAlign, maxViewDuration_MILLIS ); + timeStruct.viewStart_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS); + timeStruct.viewEnd_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS); - return timeStructs; - } + maxViewDuration_MILLIS = Math.max(maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS); - function createTimeStructsRelativeDays( timeAxis : TimeAxis1D, referenceDate_PMILLIS : number, isFuturePositive : boolean, tickTimes_PMILLIS : number[], labelAlign : number ) : TimeStruct[] { + timeStructs.push(timeStruct); + } - var dMin_PMILLIS = timeAxis.tMin_PMILLIS; - var dMax_PMILLIS = timeAxis.tMax_PMILLIS; + setTimeStructTextCenter(timeStructs, labelAlign, maxViewDuration_MILLIS); - var timeStructs : TimeStruct[] = []; - var maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; + return timeStructs; +} - var previous_DAYS = null; - var previous_SIGN = null; +function createTimeStructsRelativeDays(timeAxis: TimeAxis1D, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { - for ( var n = 0; n < tickTimes_PMILLIS.length; n++ ) { + let dMin_PMILLIS = timeAxis.tMin_PMILLIS; + let dMax_PMILLIS = timeAxis.tMax_PMILLIS; - var elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS; - var negative = ( elapsedTime_MILLIS < 0 ); - var signString = ( negative && isFuturePositive ) || ( !negative && !isFuturePositive) ? "-" : ""; - elapsedTime_MILLIS = Math.abs( elapsedTime_MILLIS ); - var elapsedTime_DAYS = millisToDays( elapsedTime_MILLIS ); - var elapsedTime_DAYS_WHOLE = Math.floor( elapsedTime_DAYS ); + let timeStructs: TimeStruct[] = []; + let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; - if ( hasval( previous_DAYS ) && elapsedTime_DAYS_WHOLE === previous_DAYS && negative === previous_SIGN ) continue; - previous_DAYS = elapsedTime_DAYS_WHOLE; - previous_SIGN = negative; + let previous_DAYS = null; + let previous_SIGN = null; - var timeStruct = new TimeStruct( ); + for (let n = 0; n < tickTimes_PMILLIS.length; n++) { - if ( negative ) { - timeStruct.end_PMILLIS = daysToMillis( -elapsedTime_DAYS_WHOLE ) + referenceDate_PMILLIS; - timeStruct.start_PMILLIS = timeStruct.end_PMILLIS - daysToMillis( 1 ); - } - else { - timeStruct.start_PMILLIS = daysToMillis( elapsedTime_DAYS_WHOLE ) + referenceDate_PMILLIS; - timeStruct.end_PMILLIS = timeStruct.start_PMILLIS + daysToMillis( 1 ); - } + let elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS; + let negative = (elapsedTime_MILLIS < 0); + let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); + let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); - timeStruct.viewStart_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS ); - timeStruct.viewEnd_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS ); + if (hasval(previous_DAYS) && elapsedTime_DAYS_WHOLE === previous_DAYS && negative === previous_SIGN) continue; + previous_DAYS = elapsedTime_DAYS_WHOLE; + previous_SIGN = negative; - maxViewDuration_MILLIS = Math.max( maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS ); + let timeStruct = new TimeStruct(); - timeStructs.push( timeStruct ); + if (negative) { + timeStruct.end_PMILLIS = daysToMillis(-elapsedTime_DAYS_WHOLE) + referenceDate_PMILLIS; + timeStruct.start_PMILLIS = timeStruct.end_PMILLIS - daysToMillis(1); } + else { + timeStruct.start_PMILLIS = daysToMillis(elapsedTime_DAYS_WHOLE) + referenceDate_PMILLIS; + timeStruct.end_PMILLIS = timeStruct.start_PMILLIS + daysToMillis(1); + } + + timeStruct.viewStart_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS); + timeStruct.viewEnd_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS); - setTimeStructTextCenter( timeStructs, labelAlign, maxViewDuration_MILLIS ); + maxViewDuration_MILLIS = Math.max(maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS); - return timeStructs; + timeStructs.push(timeStruct); } - function createTimeStructsAbsolute( timeAxis : TimeAxis1D, factory : TimeStructFactory, timeZone : string, tickTimes_PMILLIS : number[], labelAlign : number ) : TimeStruct[] { - var dMin_PMILLIS = timeAxis.tMin_PMILLIS; - var dMax_PMILLIS = timeAxis.tMax_PMILLIS; + setTimeStructTextCenter(timeStructs, labelAlign, maxViewDuration_MILLIS); - var timeStructs : TimeStruct[] = []; - var maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; + return timeStructs; +} - var previous_PMILLIS : number = null; +function createTimeStructsAbsolute(timeAxis: TimeAxis1D, factory: TimeStructFactory, timeZone: string, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { + let dMin_PMILLIS = timeAxis.tMin_PMILLIS; + let dMax_PMILLIS = timeAxis.tMax_PMILLIS; - for ( var n = 0; n < tickTimes_PMILLIS.length; n++ ) { - var tickTime_PMILLIS = tickTimes_PMILLIS[ n ]; - var timeStruct = factory( ); - var m = timeStruct.setTime( tickTime_PMILLIS, timeZone ); - var start_PMILLIS = m.valueOf( ); + let timeStructs: TimeStruct[] = []; + let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; - // XXX: Floating-point comparison can be unintuitive - if ( hasval( previous_PMILLIS ) && start_PMILLIS === previous_PMILLIS ) continue; - previous_PMILLIS = start_PMILLIS; + let previous_PMILLIS: number = null; - timeStruct.start_PMILLIS = start_PMILLIS; - timeStruct.incrementTime( m ); - timeStruct.end_PMILLIS = m.valueOf( ); - timeStruct.viewStart_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS ); - timeStruct.viewEnd_PMILLIS = clamp( timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS ); + for (let n = 0; n < tickTimes_PMILLIS.length; n++) { + let tickTime_PMILLIS = tickTimes_PMILLIS[n]; + let timeStruct = factory(); + let m = timeStruct.setTime(tickTime_PMILLIS, timeZone); + let start_PMILLIS = m.valueOf(); - maxViewDuration_MILLIS = Math.max( maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS ); + // XXX: Floating-point comparison can be unintuitive + if (hasval(previous_PMILLIS) && start_PMILLIS === previous_PMILLIS) continue; + previous_PMILLIS = start_PMILLIS; - timeStructs.push( timeStruct ); - } + timeStruct.start_PMILLIS = start_PMILLIS; + timeStruct.incrementTime(m); + timeStruct.end_PMILLIS = m.valueOf(); + timeStruct.viewStart_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS); + timeStruct.viewEnd_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS); - setTimeStructTextCenter( timeStructs, labelAlign, maxViewDuration_MILLIS ); + maxViewDuration_MILLIS = Math.max(maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS); - return timeStructs; + timeStructs.push(timeStruct); } - function setTimeStructTextCenter( timeStructs : TimeStruct[], labelAlign : number, maxViewDuration_MILLIS : number ) { - for ( var n = 0; n < timeStructs.length; n++ ) { - var timeStruct = timeStructs[ n ]; - var duration_MILLIS = timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS; - var midpoint_PMILLIS = timeStruct.viewStart_PMILLIS + labelAlign*duration_MILLIS; - var edge_PMILLIS = ( timeStruct.viewStart_PMILLIS === timeStruct.start_PMILLIS ? timeStruct.viewEnd_PMILLIS : timeStruct.viewStart_PMILLIS ); - var edginess = 1 - clamp( 0, 1, duration_MILLIS / maxViewDuration_MILLIS ); - timeStruct.textCenter_PMILLIS = midpoint_PMILLIS + edginess*( edge_PMILLIS - midpoint_PMILLIS ); - } + setTimeStructTextCenter(timeStructs, labelAlign, maxViewDuration_MILLIS); + + return timeStructs; +} + +function setTimeStructTextCenter(timeStructs: TimeStruct[], labelAlign: number, maxViewDuration_MILLIS: number) { + for (let n = 0; n < timeStructs.length; n++) { + let timeStruct = timeStructs[n]; + let duration_MILLIS = timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS; + let midpoint_PMILLIS = timeStruct.viewStart_PMILLIS + labelAlign * duration_MILLIS; + let edge_PMILLIS = (timeStruct.viewStart_PMILLIS === timeStruct.start_PMILLIS ? timeStruct.viewEnd_PMILLIS : timeStruct.viewStart_PMILLIS); + let edginess = 1 - clamp(0, 1, duration_MILLIS / maxViewDuration_MILLIS); + timeStruct.textCenter_PMILLIS = midpoint_PMILLIS + edginess * (edge_PMILLIS - midpoint_PMILLIS); } +} - export function getTickTimes_PMILLIS( timeAxis : TimeAxis1D, sizePixels : number, tickSpacing : number, timeZone : string, referenceDate_PMILLIS : number ) : number[] { - if ( hasval( referenceDate_PMILLIS ) ) { - return getTickTimesRelative_PMILLIS( timeAxis, sizePixels, tickSpacing, referenceDate_PMILLIS ); - } - else - { - return getTickTimesAbsolute_PMILLIS( timeAxis, sizePixels, tickSpacing, timeZone ); - } +export function getTickTimes_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, timeZone: string, referenceDate_PMILLIS: number): number[] { + if (hasval(referenceDate_PMILLIS)) { + return getTickTimesRelative_PMILLIS(timeAxis, sizePixels, tickSpacing, referenceDate_PMILLIS); } + else { + return getTickTimesAbsolute_PMILLIS(timeAxis, sizePixels, tickSpacing, timeZone); + } +} - function getTickTimesRelative_PMILLIS( timeAxis : TimeAxis1D, sizePixels : number, tickSpacing : number, referenceDate_PMILLIS : number ) : number[] { +function getTickTimesRelative_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, referenceDate_PMILLIS: number): number[] { - var dMin_PMILLIS = timeAxis.tMin_PMILLIS; - var dMax_PMILLIS = timeAxis.tMax_PMILLIS; - var approxTickInterval_MILLIS = tickSpacing * ( dMax_PMILLIS - dMin_PMILLIS ) / sizePixels; + let dMin_PMILLIS = timeAxis.tMin_PMILLIS; + let dMax_PMILLIS = timeAxis.tMax_PMILLIS; + let approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels; - if ( approxTickInterval_MILLIS < daysToMillis( 1 ) ) { - return getHourTickTimesRelative_PMILLIS( dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, referenceDate_PMILLIS ); - } - else { - return getDayTickTimesRelative_PMILLIS( dMin_PMILLIS, dMax_PMILLIS, sizePixels, tickSpacing, referenceDate_PMILLIS ); - } + if (approxTickInterval_MILLIS < daysToMillis(1)) { + return getHourTickTimesRelative_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, referenceDate_PMILLIS); } + else { + return getDayTickTimesRelative_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, sizePixels, tickSpacing, referenceDate_PMILLIS); + } +} - function getHourTickTimesRelative_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, approxTickInterval_MILLIS : number, referenceDate_PMILLIS : number ) : number[] { - var tickTimes = getHourTickTimes_PMILLIS( dMin_PMILLIS - referenceDate_PMILLIS, dMax_PMILLIS - referenceDate_PMILLIS, approxTickInterval_MILLIS, 0 ); - - for ( var n = 0; n < tickTimes.length; n++ ) { - tickTimes[n] = tickTimes[n] + referenceDate_PMILLIS; - } +function getHourTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, referenceDate_PMILLIS: number): number[] { + let tickTimes = getHourTickTimes_PMILLIS(dMin_PMILLIS - referenceDate_PMILLIS, dMax_PMILLIS - referenceDate_PMILLIS, approxTickInterval_MILLIS, 0); - return tickTimes; + for (let n = 0; n < tickTimes.length; n++) { + tickTimes[n] = tickTimes[n] + referenceDate_PMILLIS; } - function getDayTickTimesRelative_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, sizePixels : number, tickSpacing : number, referenceDate_PMILLIS : number ) : number[] { - var axis = new Axis1D( millisToDays( dMin_PMILLIS - referenceDate_PMILLIS ), millisToDays( dMax_PMILLIS - referenceDate_PMILLIS ) ); - var approxNumTicks = sizePixels / tickSpacing; - var tickInterval = getTickInterval( axis, approxNumTicks ); - var tickCount = getTickCount( axis, tickInterval ); - var tickPositions = new Float32Array( tickCount ); - getTickPositions( axis, tickInterval, tickCount, tickPositions ); - var tickTimes_PMILLIS = [ ]; - for ( var n = 0; n < tickCount; n++ ) { - tickTimes_PMILLIS.push( daysToMillis( tickPositions[n] ) + referenceDate_PMILLIS ); - } - return tickTimes_PMILLIS; + return tickTimes; +} + +function getDayTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, sizePixels: number, tickSpacing: number, referenceDate_PMILLIS: number): number[] { + let axis = new Axis1D(millisToDays(dMin_PMILLIS - referenceDate_PMILLIS), millisToDays(dMax_PMILLIS - referenceDate_PMILLIS)); + let approxNumTicks = sizePixels / tickSpacing; + let tickInterval = getTickInterval(axis, approxNumTicks); + let tickCount = getTickCount(axis, tickInterval); + let tickPositions = new Float32Array(tickCount); + getTickPositions(axis, tickInterval, tickCount, tickPositions); + let tickTimes_PMILLIS = []; + for (let n = 0; n < tickCount; n++) { + tickTimes_PMILLIS.push(daysToMillis(tickPositions[n]) + referenceDate_PMILLIS); } + return tickTimes_PMILLIS; +} - function getTickTimesAbsolute_PMILLIS( timeAxis : TimeAxis1D, sizePixels : number, tickSpacing : number, timeZone : string ) : number[] { - var dMin_PMILLIS = timeAxis.tMin_PMILLIS; - var dMax_PMILLIS = timeAxis.tMax_PMILLIS; +function getTickTimesAbsolute_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, timeZone: string): number[] { + let dMin_PMILLIS = timeAxis.tMin_PMILLIS; + let dMax_PMILLIS = timeAxis.tMax_PMILLIS; - // NOTE: moment.js reports time zone offset reversed from Java Calendar, thus the negative sign - var mMin = moment( dMin_PMILLIS ).zone( timeZone ); - var zoneOffset_MILLIS = -minutesToMillis( mMin.zone( ) ); + // NOTE: moment.js reports time zone offset reversed from Java Calendar, thus the negative sign + let mMin = moment(dMin_PMILLIS).zone(timeZone); + let zoneOffset_MILLIS = -minutesToMillis(mMin.zone()); - var approxTickInterval_MILLIS = tickSpacing * ( dMax_PMILLIS - dMin_PMILLIS ) / sizePixels; + let approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels; - if ( approxTickInterval_MILLIS > daysToMillis( 60 ) ) { - return getYearTickTimes_PMILLIS( dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone ); - } - else if ( approxTickInterval_MILLIS > daysToMillis( 10 ) ) { - return getMonthTickTimes_PMILLIS( dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone ); - } - else if ( approxTickInterval_MILLIS > daysToMillis( 1 ) ) { - return getDayTickTimes_PMILLIS( dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone ); - } - else { - return getHourTickTimes_PMILLIS( dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, zoneOffset_MILLIS ); - } + if (approxTickInterval_MILLIS > daysToMillis(60)) { + return getYearTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone); + } + else if (approxTickInterval_MILLIS > daysToMillis(10)) { + return getMonthTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone); + } + else if (approxTickInterval_MILLIS > daysToMillis(1)) { + return getDayTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone); + } + else { + return getHourTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, zoneOffset_MILLIS); } +} - function getYearTickTimes_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, approxTickInterval_MILLIS : number, timeZone : string ) : number[] { - var m = moment( dMin_PMILLIS ).zone( timeZone ); +function getYearTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] { + let m = moment(dMin_PMILLIS).zone(timeZone); - var currentYear = m.year( ); - var daysPerYear = 365.25; // assume 365.25 days in every year as a heuristic - var approxTickInterval_YEARS = millisToDays( approxTickInterval_MILLIS ) / daysPerYear; + let currentYear = m.year(); + let daysPerYear = 365.25; // assume 365.25 days in every year as a heuristic + let approxTickInterval_YEARS = millisToDays(approxTickInterval_MILLIS) / daysPerYear; - var yearOrderFactor = 6.0; - var stepYears = getYearStep( approxTickInterval_YEARS * yearOrderFactor ); - var startYear = getRoundedYear( currentYear, stepYears ); + let yearOrderFactor = 6.0; + let stepYears = getYearStep(approxTickInterval_YEARS * yearOrderFactor); + let startYear = getRoundedYear(currentYear, stepYears); - m.year( startYear ).month( 0 ).date( 1 ).hours( 0 ).minutes( 0 ).seconds( 0 ).milliseconds( 0 ); + m.year(startYear).month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); - var tickTimes_PMILLIS = [ ]; - while ( m.valueOf( ) <= dMax_PMILLIS ) { - tickTimes_PMILLIS.push( m.valueOf( ) ); - m.add( 'years', stepYears ); - } - return tickTimes_PMILLIS; + let tickTimes_PMILLIS = []; + while (m.valueOf() <= dMax_PMILLIS) { + tickTimes_PMILLIS.push(m.valueOf()); + m.add('years', stepYears); } + return tickTimes_PMILLIS; +} - function getYearStep( spanYears : number ) : number { - var log10 = Math.log( spanYears ) / Math.LN10; - var order = Math.floor( log10 ); - if ( ( log10 - order ) > ( 1.0 - 1e-12 ) ) order++; +function getYearStep(spanYears: number): number { + let log10 = Math.log(spanYears) / Math.LN10; + let order = Math.floor(log10); + if ((log10 - order) > (1.0 - 1e-12)) order++; - return Math.max( 1, Math.pow( 10, order ) ); - } + return Math.max(1, Math.pow(10, order)); +} - function getRoundedYear( currentYear : number, yearStep : number ) : number { - var numSteps = Math.floor( currentYear / yearStep ); - return numSteps * yearStep; - } +function getRoundedYear(currentYear: number, yearStep: number): number { + let numSteps = Math.floor(currentYear / yearStep); + return numSteps * yearStep; +} - function getMonthTickTimes_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, approxTickInterval_MILLIS : number, timeZone : string ) : number[] { - var m = moment( dMin_PMILLIS ).zone( timeZone ).date( 1 ).hours( 0 ).minutes( 0 ).seconds( 0 ).milliseconds( 0 ); - var tickTimes_PMILLIS = [ ]; - while ( m.valueOf( ) <= dMax_PMILLIS ) { - tickTimes_PMILLIS.push( m.valueOf( ) ); - m.add( 'months', 1 ); - } - return tickTimes_PMILLIS; +function getMonthTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] { + let m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); + let tickTimes_PMILLIS = []; + while (m.valueOf() <= dMax_PMILLIS) { + tickTimes_PMILLIS.push(m.valueOf()); + m.add('months', 1); } + return tickTimes_PMILLIS; +} - function getDayTickTimes_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, approxTickInterval_MILLIS : number, timeZone : string ) : number[] { - var tickInterval_DAYS = calculateTickInterval_DAYS( approxTickInterval_MILLIS ); +function getDayTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] { + let tickInterval_DAYS = calculateTickInterval_DAYS(approxTickInterval_MILLIS); - // initialize calendar off start time and reset fields less than month - var m = moment( dMin_PMILLIS ).zone( timeZone ).date( 1 ).hours( 0 ).minutes( 0 ).seconds( 0 ).milliseconds( 0 ); + // initialize calendar off start time and reset fields less than month + let m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); - var endTime_PMILLIS = dMax_PMILLIS + daysToMillis( tickInterval_DAYS ); - var currentMonth = m.month( ); + let endTime_PMILLIS = dMax_PMILLIS + daysToMillis(tickInterval_DAYS); + let currentMonth = m.month(); - var tickTimes_PMILLIS = [ ]; + let tickTimes_PMILLIS = []; - while ( m.valueOf( ) <= endTime_PMILLIS ) { - // ensure ticks always fall on the first day of the month - var newMonth = m.month( ); - if ( newMonth !== currentMonth ) { - m.date( 1 ); - currentMonth = newMonth; - } - - // prevent display of ticks too close to the end of the month - var maxDom = m.clone( ).endOf( 'month' ).date( ); - var dom = m.date( ); - if ( maxDom - dom + 1 >= tickInterval_DAYS / 2 ) { - tickTimes_PMILLIS.push( m.valueOf( ) ); - } + while (m.valueOf() <= endTime_PMILLIS) { + // ensure ticks always fall on the first day of the month + let newMonth = m.month(); + if (newMonth !== currentMonth) { + m.date(1); + currentMonth = newMonth; + } - m.add( 'days', tickInterval_DAYS ); + // prevent display of ticks too close to the end of the month + let maxDom = m.clone().endOf('month').date(); + let dom = m.date(); + if (maxDom - dom + 1 >= tickInterval_DAYS / 2) { + tickTimes_PMILLIS.push(m.valueOf()); } - return tickTimes_PMILLIS; + m.add('days', tickInterval_DAYS); } + return tickTimes_PMILLIS; +} - function getHourTickTimes_PMILLIS( dMin_PMILLIS : number, dMax_PMILLIS : number, approxTickInterval_MILLIS : number, zoneOffset_MILLIS : number ) : number[] { - var tickInterval_MILLIS = calculateTickInterval_MILLIS( approxTickInterval_MILLIS ); - var ticksSince1970 = Math.floor( ( dMin_PMILLIS + zoneOffset_MILLIS ) / tickInterval_MILLIS ); - var firstTick_PMILLIS = ( ticksSince1970 * tickInterval_MILLIS ) - zoneOffset_MILLIS; - var numTicks = Math.ceil( 1 + ( dMax_PMILLIS - firstTick_PMILLIS ) / tickInterval_MILLIS ); +function getHourTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, zoneOffset_MILLIS: number): number[] { + let tickInterval_MILLIS = calculateTickInterval_MILLIS(approxTickInterval_MILLIS); - var tickTimes_PMILLIS = [ ]; - for ( var n = 0; n < numTicks; n++ ) { - tickTimes_PMILLIS.push( firstTick_PMILLIS + n*tickInterval_MILLIS ); - } - return tickTimes_PMILLIS; + let ticksSince1970 = Math.floor((dMin_PMILLIS + zoneOffset_MILLIS) / tickInterval_MILLIS); + let firstTick_PMILLIS = (ticksSince1970 * tickInterval_MILLIS) - zoneOffset_MILLIS; + let numTicks = Math.ceil(1 + (dMax_PMILLIS - firstTick_PMILLIS) / tickInterval_MILLIS); + + let tickTimes_PMILLIS = []; + for (let n = 0; n < numTicks; n++) { + tickTimes_PMILLIS.push(firstTick_PMILLIS + n * tickInterval_MILLIS); } + return tickTimes_PMILLIS; +} - var tickIntervalRungs_DAYS = [ 2, 3, 4, 5, 8, 10 ]; +let tickIntervalRungs_DAYS = [2, 3, 4, 5, 8, 10]; - function calculateTickInterval_DAYS( approxTickInterval_MILLIS : number ) { - var approxTickInterval_DAYS = millisToDays( approxTickInterval_MILLIS ); - for ( var n = 0 ; n < tickIntervalRungs_DAYS.length ; n++ ) { - if ( approxTickInterval_DAYS <= tickIntervalRungs_DAYS[ n ] ) { - return tickIntervalRungs_DAYS[ n ]; - } - } - return 10; - } - - - var tickIntervalRungs_MILLIS = [ secondsToMillis( 1 ), - secondsToMillis( 2 ), - secondsToMillis( 5 ), - secondsToMillis( 10 ), - secondsToMillis( 15 ), - secondsToMillis( 20 ), - secondsToMillis( 30 ), - minutesToMillis( 1 ), - minutesToMillis( 2 ), - minutesToMillis( 5 ), - minutesToMillis( 10 ), - minutesToMillis( 15 ), - minutesToMillis( 20 ), - minutesToMillis( 30 ), - hoursToMillis( 1 ), - hoursToMillis( 2 ), - hoursToMillis( 3 ), - hoursToMillis( 6 ), - hoursToMillis( 12 ), - daysToMillis( 1 ) ]; - - - function calculateTickInterval_MILLIS( approxTickInterval_MILLIS : number ) : number { - for ( var n = 0; n < tickIntervalRungs_MILLIS.length; n++ ) { - if ( approxTickInterval_MILLIS <= tickIntervalRungs_MILLIS[ n ] ) { - return tickIntervalRungs_MILLIS[ n ]; - } +function calculateTickInterval_DAYS(approxTickInterval_MILLIS: number) { + let approxTickInterval_DAYS = millisToDays(approxTickInterval_MILLIS); + for (let n = 0; n < tickIntervalRungs_DAYS.length; n++) { + if (approxTickInterval_DAYS <= tickIntervalRungs_DAYS[n]) { + return tickIntervalRungs_DAYS[n]; } - return daysToMillis( 1 ); } + return 10; +} - function getTickInterval_MILLIS( tickTimes_PMILLIS : number[] ) : number { - if ( hasval( tickTimes_PMILLIS ) && tickTimes_PMILLIS.length > 1 ) { - return ( tickTimes_PMILLIS[ 1 ] - tickTimes_PMILLIS[ 0 ] ); - } - else { - return secondsToMillis( 1 ); +let tickIntervalRungs_MILLIS = [secondsToMillis(1), +secondsToMillis(2), +secondsToMillis(5), +secondsToMillis(10), +secondsToMillis(15), +secondsToMillis(20), +secondsToMillis(30), +minutesToMillis(1), +minutesToMillis(2), +minutesToMillis(5), +minutesToMillis(10), +minutesToMillis(15), +minutesToMillis(20), +minutesToMillis(30), +hoursToMillis(1), +hoursToMillis(2), +hoursToMillis(3), +hoursToMillis(6), +hoursToMillis(12), +daysToMillis(1)]; + + +function calculateTickInterval_MILLIS(approxTickInterval_MILLIS: number): number { + for (let n = 0; n < tickIntervalRungs_MILLIS.length; n++) { + if (approxTickInterval_MILLIS <= tickIntervalRungs_MILLIS[n]) { + return tickIntervalRungs_MILLIS[n]; } } + return daysToMillis(1); +} + + +function getTickInterval_MILLIS(tickTimes_PMILLIS: number[]): number { + if (hasval(tickTimes_PMILLIS) && tickTimes_PMILLIS.length > 1) { + return (tickTimes_PMILLIS[1] - tickTimes_PMILLIS[0]); + } + else { + return secondsToMillis(1); + } +} diff --git a/src/webglimpse/timeline/time_grid_painter.ts b/src/webglimpse/timeline/time_grid_painter.ts index 4ec7d7f..0a54213 100644 --- a/src/webglimpse/timeline/time_grid_painter.ts +++ b/src/webglimpse/timeline/time_grid_painter.ts @@ -27,64 +27,72 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Color, black } from '../color'; +import { TimeAxis1D } from './time_axis'; +import { Painter } from '../core'; +import { Program, UniformColor, Attribute } from '../shader'; +import { xyFrac_VERTSHADER, solid_FRAGSHADER } from '../misc'; +import { newDynamicBuffer } from '../buffer'; +import { BoundsUnmodifiable } from '../bounds'; +import { ensureCapacityFloat32, GL, hasval, parseTime_PMILLIS } from '../util/util'; +import { getTickTimes_PMILLIS } from './time_axis_painter'; - - export interface TimeGridPainterOptions { - tickSpacing? : number; - gridColor? : Color; - referenceDate? : string; - } +export interface TimeGridPainterOptions { + tickSpacing?: number; + gridColor?: Color; + referenceDate?: string; +} - export function newTimeGridPainter( timeAxis : TimeAxis1D, isVerticalAxis : boolean, timeZone : string, options? : TimeGridPainterOptions ) : Painter { - var tickSpacing = ( hasval( options ) && hasval( options.tickSpacing ) ? options.tickSpacing : 60 ); - var gridColor = ( hasval( options ) && hasval( options.gridColor ) ? options.gridColor : black ); - var referenceDate_PMILLIS = ( hasval( options ) && hasval( options.referenceDate ) ? parseTime_PMILLIS( options.referenceDate ) : undefined ); +export function newTimeGridPainter(timeAxis: TimeAxis1D, isVerticalAxis: boolean, timeZone: string, options?: TimeGridPainterOptions): Painter { + let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); + let gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : black); + let referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined); - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); - var xyFrac = new Float32Array( 0 ); - var xyFracBuffer = newDynamicBuffer( ); + let xyFrac = new Float32Array(0); + let xyFracBuffer = newDynamicBuffer(); - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - var tickTimes_PMILLIS = getTickTimes_PMILLIS( timeAxis, ( isVerticalAxis ? viewport.h : viewport.w ), tickSpacing, timeZone, referenceDate_PMILLIS ); - var tickCount = tickTimes_PMILLIS.length; + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + let tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, (isVerticalAxis ? viewport.h : viewport.w), tickSpacing, timeZone, referenceDate_PMILLIS); + let tickCount = tickTimes_PMILLIS.length; - program.use( gl ); - u_Color.setData( gl, gridColor ); + program.use(gl); + u_Color.setData(gl, gridColor); - xyFrac = ensureCapacityFloat32( xyFrac, 4*tickCount ); - for ( var n = 0; n < tickCount; n++ ) { - var tFrac = timeAxis.tFrac( tickTimes_PMILLIS[ n ] ); - if ( isVerticalAxis ) { - tFrac = ( Math.floor( tFrac*viewport.h ) + 0.5 ) / viewport.h; - xyFrac[ ( 4*n + 0 ) ] = 0; - xyFrac[ ( 4*n + 1 ) ] = tFrac; - xyFrac[ ( 4*n + 2 ) ] = 1; - xyFrac[ ( 4*n + 3 ) ] = tFrac; - } - else { - // Adding epsilon is a crude way to compensate for floating-point error (which is probably introduced up where we compute tFrac) - tFrac = ( Math.floor( tFrac*viewport.w + 1e-4 ) + 0.5 ) / viewport.w; - xyFrac[ ( 4*n + 0 ) ] = tFrac; - xyFrac[ ( 4*n + 1 ) ] = 0; - xyFrac[ ( 4*n + 2 ) ] = tFrac; - xyFrac[ ( 4*n + 3 ) ] = 1; - } + xyFrac = ensureCapacityFloat32(xyFrac, 4 * tickCount); + for (let n = 0; n < tickCount; n++) { + let tFrac = timeAxis.tFrac(tickTimes_PMILLIS[n]); + if (isVerticalAxis) { + tFrac = (Math.floor(tFrac * viewport.h) + 0.5) / viewport.h; + xyFrac[(4 * n + 0)] = 0; + xyFrac[(4 * n + 1)] = tFrac; + xyFrac[(4 * n + 2)] = 1; + xyFrac[(4 * n + 3)] = tFrac; + } + else { + // Adding epsilon is a crude way to compensate for floating-point error (which is probably introduced up where we compute tFrac) + tFrac = (Math.floor(tFrac * viewport.w + 1e-4) + 0.5) / viewport.w; + xyFrac[(4 * n + 0)] = tFrac; + xyFrac[(4 * n + 1)] = 0; + xyFrac[(4 * n + 2)] = tFrac; + xyFrac[(4 * n + 3)] = 1; } - xyFracBuffer.setData( xyFrac.subarray( 0, 4*tickCount ) ); - a_XyFrac.setDataAndEnable( gl, xyFracBuffer, 2, GL.FLOAT ); + } + xyFracBuffer.setData(xyFrac.subarray(0, 4 * tickCount)); + a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT); - // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 - gl.lineWidth( 1 ); - gl.drawArrays( GL.LINES, 0, 2*tickCount ); + // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 + gl.lineWidth(1); + gl.drawArrays(GL.LINES, 0, 2 * tickCount); - a_XyFrac.disable( gl ); - program.endUse( gl ); - } + a_XyFrac.disable(gl); + program.endUse(gl); } +} diff --git a/src/webglimpse/timeline/timeline_annotation_painter.ts b/src/webglimpse/timeline/timeline_annotation_painter.ts index f0be8b7..cdf0069 100644 --- a/src/webglimpse/timeline/timeline_annotation_painter.ts +++ b/src/webglimpse/timeline/timeline_annotation_painter.ts @@ -1,4 +1,3 @@ - /* * Copyright (c) 2014, Metron, Inc. * All rights reserved. @@ -28,118 +27,137 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { TimelineTimeseriesPainterFactory } from './timeline_timeseries_row'; +import { Drawable, Painter, xFrac, yFrac } from '../core'; +import { TimeAxis1D } from './time_axis'; +import { Axis1D } from '../plot/axis'; +import { TimelineModel, TimelineRowModel, TimelineAnnotationModel } from './timeline_model'; +import { TimelineUi } from './timeline_ui'; +import { newTextTextureCache3 } from '../text'; +import { TextureRenderer } from '../texture'; +import { Program, UniformColor, Attribute } from '../shader'; +import { xyFrac_VERTSHADER, solid_FRAGSHADER } from '../misc'; +import { ensureCapacityFloat32, GL, hasval } from '../util/util'; +import { newDynamicBuffer } from '../buffer'; +import { BoundsUnmodifiable } from '../bounds'; +import { TimelineAnnotationStyleUi, TimelineAnnotationIcon } from './timeline_annotation_style'; +import { white } from '../color'; + +export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPainterFactory { + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter { + + let textTextures = newTextTextureCache3(); + let textureRenderer = new TextureRenderer(); + + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_Position = new Attribute(program, 'a_XyFrac'); + + let xys = new Float32Array(0); + xys = ensureCapacityFloat32(xys, 4); + let xysBuffer = newDynamicBuffer(); + + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + textTextures.resetTouches(); + + let xFrac: number = 0; + let yFrac: number = 0; + + for (let i = 0; i < rowModel.annotationGuids.length; i++) { + let annotationGuid: string = rowModel.annotationGuids.valueAt(i); + let annotation: TimelineAnnotationModel = model.annotation(annotationGuid); + let annotationStyle: TimelineAnnotationStyleUi = ui.annotationStyle(annotation.styleGuid); + + let font = hasval(annotationStyle.font) ? annotationStyle.font : '11px verdana,sans-serif'; + let color = hasval(annotationStyle.color) ? annotationStyle.color : white; + + let hTextOffset = hasval(annotationStyle.hTextOffset) ? annotationStyle.hTextOffset : 0; + let vTextOffset = hasval(annotationStyle.vTextOffset) ? annotationStyle.vTextOffset : 0; + + // draw line + if (annotationStyle.uiHint === 'horizontal-line' || annotationStyle.uiHint === 'vertical-line') { + + if (annotationStyle.uiHint === 'horizontal-line') { + let xFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; + let yFrac = dataAxis.vFrac(annotation.y); + + xys[0] = 0; + xys[1] = yFrac; + xys[2] = 1; + xys[3] = yFrac; + } + else if (annotationStyle.uiHint === 'vertical-line') { + let xFrac = timeAxis.tFrac(annotation.time_PMILLIS); + let yFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; + + xys[0] = xFrac; + xys[1] = 0; + xys[2] = xFrac; + xys[3] = 1; + } + program.use(gl); - export function newTimeseriesAnnotationPainterFactory( ) : TimelineTimeseriesPainterFactory { - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi ) : Painter { - - var textTextures = newTextTextureCache3( ); - var textureRenderer = new TextureRenderer( ); - - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_Position = new Attribute( program, 'a_XyFrac' ); - - var xys = new Float32Array( 0 ); - xys = ensureCapacityFloat32( xys, 4 ); - var xysBuffer = newDynamicBuffer( ); - - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - textTextures.resetTouches( ); - - for ( var i = 0 ; i < rowModel.annotationGuids.length ; i++ ) { - var annotationGuid : string = rowModel.annotationGuids.valueAt(i); - var annotation : TimelineAnnotationModel = model.annotation( annotationGuid ); - var annotationStyle : TimelineAnnotationStyleUi = ui.annotationStyle( annotation.styleGuid ); - - var font = hasval( annotationStyle.font ) ? annotationStyle.font : '11px verdana,sans-serif'; - var color = hasval( annotationStyle.color ) ? annotationStyle.color : white; - - var hTextOffset = hasval( annotationStyle.hTextOffset ) ? annotationStyle.hTextOffset : 0; - var vTextOffset = hasval( annotationStyle.vTextOffset ) ? annotationStyle.vTextOffset : 0; - - // draw line - if ( annotationStyle.uiHint === 'horizontal-line' || annotationStyle.uiHint === 'vertical-line' ) { - - if ( annotationStyle.uiHint === 'horizontal-line' ) { - var xFrac = hasval( annotationStyle.align ) ? annotationStyle.align : 1 ; - var yFrac = dataAxis.vFrac( annotation.y ); - - xys[0] = 0; - xys[1] = yFrac; - xys[2] = 1; - xys[3] = yFrac; - } - else if ( annotationStyle.uiHint === 'vertical-line' ) { - var xFrac = timeAxis.tFrac( annotation.time_PMILLIS ); - var yFrac = hasval( annotationStyle.align ) ? annotationStyle.align : 1 ; - - xys[0] = xFrac; - xys[1] = 0; - xys[2] = xFrac; - xys[3] = 1; - } - - program.use( gl ); - - u_Color.setData( gl, color ); + u_Color.setData(gl, color); - xysBuffer.setData( xys.subarray( 0, 4 ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + xysBuffer.setData(xys.subarray(0, 4)); + a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); - gl.drawArrays( GL.LINES, 0, 2 ); + gl.drawArrays(GL.LINES, 0, 2); - program.endUse( gl ); - } - else { - var xFrac = timeAxis.tFrac( annotation.time_PMILLIS ); - var yFrac = dataAxis.vFrac( annotation.y ); - } + program.endUse(gl); + } + else { + let xFrac = timeAxis.tFrac(annotation.time_PMILLIS); + let yFrac = dataAxis.vFrac(annotation.y); + } - textureRenderer.begin( gl, viewport ); + textureRenderer.begin(gl, viewport); - // draw icons - for ( var n = 0; n < annotationStyle.numIcons; n++ ) { - var icon : TimelineAnnotationIcon = annotationStyle.icon( n ); + // draw icons + for (let n = 0; n < annotationStyle.numIcons; n++) { + let icon: TimelineAnnotationIcon = annotationStyle.icon(n); - var xFracOffset = xFrac + ( hasval( icon.hOffset ) ? icon.hOffset : 0 ) / viewport.w; - var yFracOffset = yFrac + ( hasval( icon.vOffset ) ? icon.vOffset : 0 ) / viewport.h; + let xFracOffset = xFrac + (hasval(icon.hOffset) ? icon.hOffset : 0) / viewport.w; + let yFracOffset = yFrac + (hasval(icon.vOffset) ? icon.vOffset : 0) / viewport.h; - var iconTexture = ui.loadImage( icon.url, function( ) { drawable.redraw( ); } ); - if ( iconTexture ) { - var options = { xAnchor: ( hasval( icon.hAlign ) ? icon.hAlign : 0.5 ), - yAnchor: ( hasval( icon.hAlign ) ? icon.hAlign : 0.5 ), - width: icon.displayWidth, - height: icon.displayHeight, - rotation_CCWRAD: 0 }; + let iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); + if (iconTexture) { + let options = { + xAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5), + yAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5), + width: icon.displayWidth, + height: icon.displayHeight, + rotation_CCWRAD: 0 + }; - textureRenderer.draw( gl, iconTexture, xFracOffset, yFracOffset, options ); - } + textureRenderer.draw(gl, iconTexture, xFracOffset, yFracOffset, options); } + } - // draw text label - if ( hasval( annotation.label ) ) { - - var textTexture = textTextures.value( font, color.rgbaString, annotation.label ); + // draw text label + if (hasval(annotation.label)) { - var xFracOffset = xFrac + hTextOffset / viewport.w; - var yFracOffset = yFrac + vTextOffset / viewport.h; + let textTexture = textTextures.value(font, color.rgbaString, annotation.label); - var xAnchor = hasval( annotationStyle.hTextAlign ) ? annotationStyle.hTextAlign : 0; - var yAnchor = textTexture.yAnchor( hasval( annotationStyle.vTextAlign ) ? annotationStyle.vTextAlign : 0.5 ); + let xFracOffset = xFrac + hTextOffset / viewport.w; + let yFracOffset = yFrac + vTextOffset / viewport.h; - textureRenderer.draw( gl, textTexture, xFracOffset, yFracOffset, { xAnchor: xAnchor, yAnchor: yAnchor } ); - } + let xAnchor = hasval(annotationStyle.hTextAlign) ? annotationStyle.hTextAlign : 0; + let yAnchor = textTexture.yAnchor(hasval(annotationStyle.vTextAlign) ? annotationStyle.vTextAlign : 0.5); - textureRenderer.end( gl ); + textureRenderer.draw(gl, textTexture, xFracOffset, yFracOffset, { xAnchor: xAnchor, yAnchor: yAnchor }); } - textTextures.retainTouched( ); - }; + textureRenderer.end(gl); + } + + textTextures.retainTouched(); }; - } + }; +} diff --git a/src/webglimpse/timeline/timeline_annotation_style.ts b/src/webglimpse/timeline/timeline_annotation_style.ts index f4ad689..293df15 100644 --- a/src/webglimpse/timeline/timeline_annotation_style.ts +++ b/src/webglimpse/timeline/timeline_annotation_style.ts @@ -27,164 +27,165 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Color, parseCssColor } from '../color'; +import { hasval } from '../util/util'; + +export interface TimelineAnnotationIcon { + url: string; + displayWidth: number; // horizontal size of icon in pixels + displayHeight: number; // vertical size of icon in pixels + hAlign: number; // relative location of center pixel of icon (0=left side, 1=right side) + vAlign: number; // relative location of center pixel of icon (0=left side, 1=right side) + hOffset: number; // center pixel horizontal offset in pixels + vOffset: number; // center pixel vertical offset in pixels +} + +export interface TimelineAnnotationStyle { + styleGuid: string; + color?: string; + font?: string; // label font + hTextAlign?: number; // relative location of center pixel of text (0=left side, 1=right side) + vTextAlign?: number; // relative location of center pixel of text (0=left side, 1=right side) + hTextOffset?: number; // horizontal offset of the label text in pixels + vTextOffset?: number; // vertical offset of the label text in pixels + align?: number; // for horizontal-line, vertical-line only, relative location of text/icons along + // annotation line (0 = bottom/left, 1=top/right) + uiHint?: string; // one of: point, horizontal-line, vertical-line + icons?: TimelineAnnotationIcon[]; +} + +export class TimelineAnnotationIconUi { + private _url: string; + private _displayWidth: number; + private _displayHeight: number; + private _hAlign: number; + private _vAlign: number; + private _hOffset: number; + private _vOffset: number; + + constructor(icon: TimelineAnnotationIcon) { + this._setAttrs(icon); + } + + private _setAttrs(icon: TimelineAnnotationIcon) { + this._url = icon.url; + this._displayWidth = icon.displayWidth; + this._displayHeight = icon.displayHeight; + this._hAlign = icon.hAlign; + this._vAlign = icon.vAlign; + this._hOffset = icon.hOffset; + this._vOffset = icon.vOffset; + } + + get url(): string { return this._url; } + get displayWidth(): number { return this._displayWidth; } + get displayHeight(): number { return this._displayHeight; } + get hAlign(): number { return this._hAlign; } + get vAlign(): number { return this._vAlign; } + get hOffset(): number { return this._hOffset; } + get vOffset(): number { return this._vOffset; } + + snapshot(): TimelineAnnotationIcon { + return { + url: this._url, + displayWidth: this._displayWidth, + displayHeight: this._displayHeight, + hAlign: this._hAlign, + vAlign: this._vAlign, + hOffset: this._hOffset, + vOffset: this._vOffset + }; + } +} - export interface TimelineAnnotationIcon { - url : string; - displayWidth : number; // horizontal size of icon in pixels - displayHeight : number; // vertical size of icon in pixels - hAlign : number; // relative location of center pixel of icon (0=left side, 1=right side) - vAlign : number; // relative location of center pixel of icon (0=left side, 1=right side) - hOffset : number; // center pixel horizontal offset in pixels - vOffset : number; // center pixel vertical offset in pixels - } - - export interface TimelineAnnotationStyle { - styleGuid : string; - color? : string; - font? : string; // label font - hTextAlign? : number; // relative location of center pixel of text (0=left side, 1=right side) - vTextAlign? : number; // relative location of center pixel of text (0=left side, 1=right side) - hTextOffset? : number; // horizontal offset of the label text in pixels - vTextOffset? : number; // vertical offset of the label text in pixels - align? : number; // for horizontal-line, vertical-line only, relative location of text/icons along - // annotation line (0 = bottom/left, 1=top/right) - uiHint? : string; // one of: point, horizontal-line, vertical-line - icons? : TimelineAnnotationIcon[]; - } - - export class TimelineAnnotationIconUi { - private _url : string; - private _displayWidth : number; - private _displayHeight : number; - private _hAlign : number; - private _vAlign : number; - private _hOffset : number; - private _vOffset : number; - - constructor( icon : TimelineAnnotationIcon ) { - this._setAttrs( icon ); - } - - private _setAttrs( icon : TimelineAnnotationIcon ) { - this._url = icon.url; - this._displayWidth = icon.displayWidth; - this._displayHeight = icon.displayHeight; - this._hAlign = icon.hAlign; - this._vAlign = icon.vAlign; - this._hOffset = icon.hOffset; - this._vOffset = icon.vOffset; - } - - get url( ) : string { return this._url; } - get displayWidth( ) : number { return this._displayWidth; } - get displayHeight( ) : number { return this._displayHeight; } - get hAlign( ) : number { return this._hAlign; } - get vAlign( ) : number { return this._vAlign; } - get hOffset( ) : number { return this._hOffset; } - get vOffset( ) : number { return this._vOffset; } - - snapshot( ) : TimelineAnnotationIcon { - return { - url: this._url, - displayWidth: this._displayWidth, - displayHeight: this._displayHeight, - hAlign: this._hAlign, - vAlign: this._vAlign, - hOffset: this._hOffset, - vOffset: this._vOffset - }; - } - } - - - - export class TimelineAnnotationStyleUi { - private _styleGuid : string; - private _color : Color; - private _font : string; - private _vTextOffset : number; - private _hTextOffset : number; - private _vTextAlign : number; - private _hTextAlign : number; - private _align : number; - private _uiHint : string; - private _icons : TimelineAnnotationIconUi[]; - - constructor( style : TimelineAnnotationStyle ) { - this._styleGuid = style.styleGuid; - this._setAttrs( style ); - } - - get styleGuid( ) : string { - return this._styleGuid; - } - - private _setAttrs( style : TimelineAnnotationStyle ) { - this._color = hasval( style.color ) ? parseCssColor( style.color ) : undefined; - this._font = style.font ; - this._hTextOffset = style.hTextOffset; - this._vTextOffset = style.vTextOffset; - this._hTextAlign = style.hTextAlign; - this._vTextAlign = style.vTextAlign; - this._align = style.align; - this._uiHint = style.uiHint; - this._icons = hasval( style.color ) ? style.icons.map( ( icon )=>{ return new TimelineAnnotationIconUi( icon ); } ) : []; - } - - get numIcons( ) : number { - return this._icons.length; - } - - icon( index : number ) : TimelineAnnotationIconUi { - return this._icons[ index ]; - } - - get color( ) : Color { - return this._color; - } - - get font( ) : string { - return this._font; - } - - get hTextOffset( ) : number { - return this._hTextOffset; - } - - get vTextOffset( ) : number { - return this._vTextOffset; - } - - get hTextAlign( ) : number { - return this._hTextAlign; - } - - get vTextAlign( ) : number { - return this._vTextAlign; - } - - get align( ) : number { - return this._align; - } - - get uiHint( ) : string { - return this._uiHint; - } - - snapshot( ) : TimelineAnnotationStyle { - return { - styleGuid: this._styleGuid, - color: this._color.cssString, - font: this._font, - vTextOffset: this._hTextOffset, - hTextOffset: this._vTextOffset, - vTextAlign: this._hTextAlign, - hTextAlign: this._vTextAlign, - align: this._align, - uiHint: this._uiHint, - icons: this._icons.map( (ui)=>ui.snapshot() ) - }; - } + +export class TimelineAnnotationStyleUi { + private _styleGuid: string; + private _color: Color; + private _font: string; + private _vTextOffset: number; + private _hTextOffset: number; + private _vTextAlign: number; + private _hTextAlign: number; + private _align: number; + private _uiHint: string; + private _icons: TimelineAnnotationIconUi[]; + + constructor(style: TimelineAnnotationStyle) { + this._styleGuid = style.styleGuid; + this._setAttrs(style); + } + + get styleGuid(): string { + return this._styleGuid; + } + + private _setAttrs(style: TimelineAnnotationStyle) { + this._color = hasval(style.color) ? parseCssColor(style.color) : undefined; + this._font = style.font; + this._hTextOffset = style.hTextOffset; + this._vTextOffset = style.vTextOffset; + this._hTextAlign = style.hTextAlign; + this._vTextAlign = style.vTextAlign; + this._align = style.align; + this._uiHint = style.uiHint; + this._icons = hasval(style.color) ? style.icons.map((icon) => { return new TimelineAnnotationIconUi(icon); }) : []; + } + + get numIcons(): number { + return this._icons.length; + } + + icon(index: number): TimelineAnnotationIconUi { + return this._icons[index]; + } + + get color(): Color { + return this._color; + } + + get font(): string { + return this._font; + } + + get hTextOffset(): number { + return this._hTextOffset; + } + + get vTextOffset(): number { + return this._vTextOffset; + } + + get hTextAlign(): number { + return this._hTextAlign; + } + + get vTextAlign(): number { + return this._vTextAlign; + } + + get align(): number { + return this._align; + } + + get uiHint(): string { + return this._uiHint; + } + + snapshot(): TimelineAnnotationStyle { + return { + styleGuid: this._styleGuid, + color: this._color.cssString, + font: this._font, + vTextOffset: this._hTextOffset, + hTextOffset: this._vTextOffset, + vTextAlign: this._hTextAlign, + hTextAlign: this._vTextAlign, + align: this._align, + uiHint: this._uiHint, + icons: this._icons.map((ui) => ui.snapshot()) + }; } +} diff --git a/src/webglimpse/timeline/timeline_cursor_painter.ts b/src/webglimpse/timeline/timeline_cursor_painter.ts index 2eb053f..7234a25 100644 --- a/src/webglimpse/timeline/timeline_cursor_painter.ts +++ b/src/webglimpse/timeline/timeline_cursor_painter.ts @@ -27,207 +27,218 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Color, white } from '../color'; +import { TimelineTimeseriesPainterFactory, TimelineTimeseriesPainterOptions } from './timeline_timeseries_row'; +import { Drawable, Painter } from '../core'; +import { TimeAxis1D } from './time_axis'; +import { Axis1D } from '../plot/axis'; +import { TimelineModel, TimelineRowModel, TimelineTimeseriesFragmentModel } from './timeline_model'; +import { TimelineUi } from './timeline_ui'; +import { Program, UniformColor, Attribute } from '../shader'; +import { xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys } from '../misc'; +import { ensureCapacityFloat32, GL, hasval } from '../util/util'; +import { newDynamicBuffer } from '../buffer'; +import { newTextTextureCache2 } from '../text'; +import { TextureRenderer } from '../texture'; +import { BoundsUnmodifiable } from '../bounds'; +import { indexAtOrBefore, indexAtOrAfter } from '../util/sorted_arrays'; + +export interface TimeseriesCursorPainterOptions { + font?: string; + textColor?: Color; + // number of pixels between box and label text + buffer_px?: number; + // number of significant digits in text labels + textDecimals?: number; + + // color of selection box and crosshair lines + lineColor?: Color; + + // thickness of cursor crosshair lines in pixels + crosshairThickness_px?: number; + + // width/height of selection box (shown at intersection beween crosshairs and timeseries) in pixels + boxSize_px?: number; + // thickness of selection box lines in pixels + boxThickness_px?: number; +} + +export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCursorPainterOptions): TimelineTimeseriesPainterFactory { + + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi, options: TimelineTimeseriesPainterOptions): Painter { + + let textColor = (hasval(cursorOptions) && hasval(cursorOptions.textColor) ? cursorOptions.textColor : white); + let lineColor = (hasval(cursorOptions) && hasval(cursorOptions.lineColor) ? cursorOptions.lineColor : white); + let font = (hasval(cursorOptions) && hasval(cursorOptions.font) ? cursorOptions.font : options.timelineFont); + let buffer_px = (hasval(cursorOptions) && hasval(cursorOptions.buffer_px) ? cursorOptions.buffer_px : 4); + let textDecimals = (hasval(cursorOptions) && hasval(cursorOptions.textDecimals) ? cursorOptions.textDecimals : 2); + let boxSize_px = (hasval(cursorOptions) && hasval(cursorOptions.boxSize_px) ? cursorOptions.boxSize_px : 8); + let crosshairThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.crosshairThickness_px) ? cursorOptions.boxSize_px : 2); + let boxThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.boxThickness_px) ? cursorOptions.boxSize_px : 2); + + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let u_Color = new UniformColor(program, 'u_Color'); + let a_Position = new Attribute(program, 'a_XyFrac'); + + let xys = new Float32Array(0); + xys = ensureCapacityFloat32(xys, 4); + let xysBuffer = newDynamicBuffer(); + + let textTextures = newTextTextureCache2(font); + let textureRenderer = new TextureRenderer(); + + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + + // only draw a cursor if we are the current hovered row + let hoveredRow: TimelineRowModel = ui.selection.hoveredRow.value; + if (!hasval(hoveredRow) || hoveredRow.rowGuid !== rowModel.rowGuid) return; + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + let indexXys = 0; + textTextures.resetTouches(); + + let time = ui.selection.hoveredTime_PMILLIS.value; + let y = ui.selection.hoveredY.value; + + if (!hasval(time) || !hasval(y)) return; + + let wLine = crosshairThickness_px / viewport.w; + let hLine = crosshairThickness_px / viewport.h; + + let wBoxLine = boxThickness_px / viewport.w; + let hBoxLine = boxThickness_px / viewport.h; + + let wBox = boxSize_px / viewport.w; + let hBox = boxSize_px / viewport.h; + + if (hasval(time)) { + + let cursorModel = model.cursor(rowModel.cursorGuid); + + if (hasval(cursorModel)) { + if (hasval(cursorModel.lineColor)) { + lineColor = cursorModel.lineColor; + } + if (hasval(cursorModel.textColor)) { + textColor = cursorModel.textColor; + } - export interface TimeseriesCursorPainterOptions { - font? : string; - textColor? : Color; - // number of pixels between box and label text - buffer_px? : number; - // number of significant digits in text labels - textDecimals? : number; - - // color of selection box and crosshair lines - lineColor? : Color; - - // thickness of cursor crosshair lines in pixels - crosshairThickness_px? : number; - - // width/height of selection box (shown at intersection beween crosshairs and timeseries) in pixels - boxSize_px? : number; - // thickness of selection box lines in pixels - boxThickness_px? : number; - } - - export function newTimeseriesCursorPainterFactory( cursorOptions? : TimeseriesCursorPainterOptions ) : TimelineTimeseriesPainterFactory { - - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi, options : TimelineTimeseriesPainterOptions ) : Painter { - - var textColor = ( hasval( cursorOptions ) && hasval( cursorOptions.textColor ) ? cursorOptions.textColor : white ); - var lineColor = ( hasval( cursorOptions ) && hasval( cursorOptions.lineColor ) ? cursorOptions.lineColor : white ); - var font = ( hasval( cursorOptions ) && hasval( cursorOptions.font ) ? cursorOptions.font : options.timelineFont ); - var buffer_px = ( hasval( cursorOptions ) && hasval( cursorOptions.buffer_px ) ? cursorOptions.buffer_px : 4 ); - var textDecimals = ( hasval( cursorOptions ) && hasval( cursorOptions.textDecimals ) ? cursorOptions.textDecimals : 2 ); - var boxSize_px = ( hasval( cursorOptions ) && hasval( cursorOptions.boxSize_px ) ? cursorOptions.boxSize_px : 8 ); - var crosshairThickness_px = ( hasval( cursorOptions ) && hasval( cursorOptions.crosshairThickness_px ) ? cursorOptions.boxSize_px : 2 ); - var boxThickness_px = ( hasval( cursorOptions ) && hasval( cursorOptions.boxThickness_px ) ? cursorOptions.boxSize_px : 2 ); - - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var u_Color = new UniformColor( program, 'u_Color' ); - var a_Position = new Attribute( program, 'a_XyFrac' ); - - var xys = new Float32Array( 0 ); - xys = ensureCapacityFloat32( xys, 4 ); - var xysBuffer = newDynamicBuffer( ); - - var textTextures = newTextTextureCache2( font ); - var textureRenderer = new TextureRenderer( ); - - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - - // only draw a cursor if we are the current hovered row - var hoveredRow : TimelineRowModel = ui.selection.hoveredRow.value; - if ( !hasval( hoveredRow ) || hoveredRow.rowGuid !== rowModel.rowGuid ) return; - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - var indexXys = 0; - textTextures.resetTouches( ); - - var time = ui.selection.hoveredTime_PMILLIS.value; - var y = ui.selection.hoveredY.value; - - if ( !hasval( time ) || !hasval( y ) ) return; - - var wLine = crosshairThickness_px / viewport.w; - var hLine = crosshairThickness_px / viewport.h; - - var wBoxLine = boxThickness_px / viewport.w; - var hBoxLine = boxThickness_px / viewport.h; - - var wBox = boxSize_px / viewport.w; - var hBox = boxSize_px / viewport.h; - - if ( hasval( time ) ) { - - var cursorModel = model.cursor( rowModel.cursorGuid ); - - if ( hasval( cursorModel) ) - { - if ( hasval( cursorModel.lineColor ) ) - { - lineColor = cursorModel.lineColor; - } - - if ( hasval( cursorModel.textColor ) ) - { - textColor = cursorModel.textColor; - } - - textureRenderer.begin( gl, viewport ); + textureRenderer.begin(gl, viewport); - var timeseriesCount = cursorModel.labeledTimeseriesGuids.length; + let timeseriesCount = cursorModel.labeledTimeseriesGuids.length; - // 36 vertices for crosshairs, 48 vertices per timeseries intersection marker - xys = ensureCapacityFloat32( xys, 2 * ( 36 + timeseriesCount * 48 ) ); + // 36 vertices for crosshairs, 48 vertices per timeseries intersection marker + xys = ensureCapacityFloat32(xys, 2 * (36 + timeseriesCount * 48)); - for ( var i = 0 ; i < cursorModel.labeledTimeseriesGuids.length ; i++ ) { + for (let i = 0; i < cursorModel.labeledTimeseriesGuids.length; i++) { - var timeseriesGuid = cursorModel.labeledTimeseriesGuids.valueAt( i ); - var timeseries = model.timeseries( timeseriesGuid ); + let timeseriesGuid = cursorModel.labeledTimeseriesGuids.valueAt(i); + let timeseries = model.timeseries(timeseriesGuid); - // if the row doesn't contain the timeseries, don't show cursor intersections - if ( !rowModel.timeseriesGuids.hasValue( timeseriesGuid ) ) continue; + // if the row doesn't contain the timeseries, don't show cursor intersections + if (!rowModel.timeseriesGuids.hasValue(timeseriesGuid)) continue; - for ( var j = 0 ; j < timeseries.fragmentGuids.length ; j++ ) { - var fragmentGuid : string = timeseries.fragmentGuids.valueAt( j ); - var fragment : TimelineTimeseriesFragmentModel = model.timeseriesFragment( fragmentGuid ); + for (let j = 0; j < timeseries.fragmentGuids.length; j++) { + let fragmentGuid: string = timeseries.fragmentGuids.valueAt(j); + let fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid); - // fragments should not overlap - if ( fragment.start_PMILLIS < time && fragment.end_PMILLIS > time ) { + // fragments should not overlap + if (fragment.start_PMILLIS < time && fragment.end_PMILLIS > time) { - var value : number; + let value: number; - // bars are drawn starting at the point and continuing to the next point, so we don't interpolate them - if ( timeseries.uiHint == 'bars' ) { - var index : number = indexAtOrBefore( fragment.times_PMILLIS, time ); - value = fragment.data[index]; - } - else { - var index0 : number = indexAtOrBefore( fragment.times_PMILLIS, time ); - var index1 : number = indexAtOrAfter( fragment.times_PMILLIS, time ); + // bars are drawn starting at the point and continuing to the next point, so we don't interpolate them + if (timeseries.uiHint === 'bars') { + let index: number = indexAtOrBefore(fragment.times_PMILLIS, time); + value = fragment.data[index]; + } + else { + let index0: number = indexAtOrBefore(fragment.times_PMILLIS, time); + let index1: number = indexAtOrAfter(fragment.times_PMILLIS, time); - var value0 = fragment.data[index0]; - var time0 = fragment.times_PMILLIS[index0]; + let value0 = fragment.data[index0]; + let time0 = fragment.times_PMILLIS[index0]; - var value1 = fragment.data[index1]; - var time1 = fragment.times_PMILLIS[index1]; + let value1 = fragment.data[index1]; + let time1 = fragment.times_PMILLIS[index1]; - var diff = time1 - time0; - var diff0 = ( time - time0 ) / diff; - var diff1 = 1 - diff0; + let diff = time1 - time0; + let diff0 = (time - time0) / diff; + let diff1 = 1 - diff0; - value = value0 * diff1 + value1 * diff0; - } + value = value0 * diff1 + value1 * diff0; + } - var textTexture = textTextures.value( textColor.rgbaString, value.toFixed( textDecimals ) ); + let textTexture = textTextures.value(textColor.rgbaString, value.toFixed(textDecimals)); - var valueFracY = dataAxis.vFrac( value ); - var valueFracX = timeAxis.tFrac( time ); + let valueFracY = dataAxis.vFrac(value); + let valueFracX = timeAxis.tFrac(time); - var boxLeft = valueFracX - wBox/2; - var boxRight = valueFracX + wBox/2; - var boxTop = valueFracY + hBox/2; - var boxBottom = valueFracY - hBox/2; + let boxLeft = valueFracX - wBox / 2; + let boxRight = valueFracX + wBox / 2; + let boxTop = valueFracY + hBox / 2; + let boxBottom = valueFracY - hBox / 2; - // draw box at value location + // draw box at value location - // left edge - indexXys = putQuadXys( xys, indexXys, boxLeft-wBoxLine/2, boxLeft+wBoxLine/2, boxTop+hBoxLine/2, boxBottom-hBoxLine/2 ); - // right edge - indexXys = putQuadXys( xys, indexXys, boxRight-wBoxLine/2, boxRight+wBoxLine/2, boxTop+hBoxLine/2, boxBottom-hBoxLine/2 ); - // top edge - indexXys = putQuadXys( xys, indexXys, boxLeft+wBoxLine/2, boxRight-wBoxLine/2, boxTop-hBoxLine/2, boxTop+hBoxLine/2 ); - // bottom edge - indexXys = putQuadXys( xys, indexXys, boxLeft+wBoxLine/2, boxRight-wBoxLine/2, boxBottom-hBoxLine/2, boxBottom+hBoxLine/2 ); + // left edge + indexXys = putQuadXys(xys, indexXys, boxLeft - wBoxLine / 2, boxLeft + wBoxLine / 2, boxTop + hBoxLine / 2, boxBottom - hBoxLine / 2); + // right edge + indexXys = putQuadXys(xys, indexXys, boxRight - wBoxLine / 2, boxRight + wBoxLine / 2, boxTop + hBoxLine / 2, boxBottom - hBoxLine / 2); + // top edge + indexXys = putQuadXys(xys, indexXys, boxLeft + wBoxLine / 2, boxRight - wBoxLine / 2, boxTop - hBoxLine / 2, boxTop + hBoxLine / 2); + // bottom edge + indexXys = putQuadXys(xys, indexXys, boxLeft + wBoxLine / 2, boxRight - wBoxLine / 2, boxBottom - hBoxLine / 2, boxBottom + hBoxLine / 2); - // draw text - //XXX 0.6 looks more centered to the eye than 0.5 for numeric text - textureRenderer.draw( gl, textTexture, boxRight+wBoxLine/2+buffer_px/viewport.w, valueFracY, { xAnchor: 0, yAnchor: .6 } ); + // draw text + // XXX 0.6 looks more centered to the eye than 0.5 for numeric text + textureRenderer.draw(gl, textTexture, boxRight + wBoxLine / 2 + buffer_px / viewport.w, valueFracY, { xAnchor: 0, yAnchor: .6 }); - } } } + } - if ( hasval( cursorModel.showCursorText ) ? cursorModel.showCursorText : true ) { - var textTexture = textTextures.value( textColor.rgbaString, y.toFixed( textDecimals ) ); - textureRenderer.draw( gl, textTexture, 1, dataAxis.vFrac( y ) + buffer_px/viewport.h, { xAnchor: 1, yAnchor: 0 } ); - } + if (hasval(cursorModel.showCursorText) ? cursorModel.showCursorText : true) { + let textTexture = textTextures.value(textColor.rgbaString, y.toFixed(textDecimals)); + textureRenderer.draw(gl, textTexture, 1, dataAxis.vFrac(y) + buffer_px / viewport.h, { xAnchor: 1, yAnchor: 0 }); + } - textureRenderer.end( gl ); - textTextures.retainTouched( ); + textureRenderer.end(gl); + textTextures.retainTouched(); - var xLeft = 0; - var xRight = 1; - var yMid = dataAxis.vFrac( y ); - var xMid = timeAxis.tFrac( time ); + let xLeft = 0; + let xRight = 1; + let yMid = dataAxis.vFrac(y); + let xMid = timeAxis.tFrac(time); - // draw horizontal line - if ( hasval( cursorModel.showHorizontalLine ) ? cursorModel.showHorizontalLine : true ) { - indexXys = putQuadXys( xys, indexXys, xLeft, xRight, yMid-hLine/2, yMid+hLine/2 ); - } + // draw horizontal line + if (hasval(cursorModel.showHorizontalLine) ? cursorModel.showHorizontalLine : true) { + indexXys = putQuadXys(xys, indexXys, xLeft, xRight, yMid - hLine / 2, yMid + hLine / 2); + } - // draw vertical lines (split in two to avoid overlap with horizontal) - if ( hasval( cursorModel.showVerticalLine ) ? cursorModel.showVerticalLine : true ) { - indexXys = putQuadXys( xys, indexXys, xMid-wLine/2, xMid+wLine/2, 0, yMid-hLine/2 ); - indexXys = putQuadXys( xys, indexXys, xMid-wLine/2, xMid+wLine/2, yMid+hLine/2, 1 ); - } + // draw vertical lines (split in two to avoid overlap with horizontal) + if (hasval(cursorModel.showVerticalLine) ? cursorModel.showVerticalLine : true) { + indexXys = putQuadXys(xys, indexXys, xMid - wLine / 2, xMid + wLine / 2, 0, yMid - hLine / 2); + indexXys = putQuadXys(xys, indexXys, xMid - wLine / 2, xMid + wLine / 2, yMid + hLine / 2, 1); + } - // draw lines - program.use( gl ); + // draw lines + program.use(gl); - xysBuffer.setData( xys.subarray( 0, indexXys ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - u_Color.setData( gl, lineColor ); - gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); + xysBuffer.setData(xys.subarray(0, indexXys)); + a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); + u_Color.setData(gl, lineColor); + gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2)); - a_Position.disable( gl ); - program.endUse( gl ); - } + a_Position.disable(gl); + program.endUse(gl); } } } } +} diff --git a/src/webglimpse/timeline/timeline_event_style.ts b/src/webglimpse/timeline/timeline_event_style.ts index fc89ff9..ff62f8c 100644 --- a/src/webglimpse/timeline/timeline_event_style.ts +++ b/src/webglimpse/timeline/timeline_event_style.ts @@ -28,95 +28,93 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +export interface TimelineEventIcon { + url: string; + displayWidth: number; // horizontal size of icon in pixels + displayHeight: number; // vertical size of icon in pixels + hAlign: number; // relative location of center pixel of icon (0=left side, 1=right side) + hPos: number; // relative icon position along event bar (0=left side, 1=right side) +} - export interface TimelineEventIcon { - url : string; - displayWidth : number; // horizontal size of icon in pixels - displayHeight : number; // vertical size of icon in pixels - hAlign : number; // relative location of center pixel of icon (0=left side, 1=right side) - hPos : number; // relative icon position along event bar (0=left side, 1=right side) - } +export interface TimelineEventStyle { + styleGuid: string; + icons: TimelineEventIcon[]; +} - export interface TimelineEventStyle { - styleGuid : string; - icons : TimelineEventIcon[]; - } +export class TimelineEventIconUi { + private _url: string; + private _displayWidth: number; + private _displayHeight: number; + private _hAlign: number; + private _hPos: number; + constructor(icon: TimelineEventIcon) { + this._setAttrs(icon); + } + + private _setAttrs(icon: TimelineEventIcon) { + this._url = icon.url; + this._displayWidth = icon.displayWidth; + this._displayHeight = icon.displayHeight; + this._hAlign = icon.hAlign; + this._hPos = icon.hPos; + } - export class TimelineEventIconUi { - private _url : string; - private _displayWidth : number; - private _displayHeight : number; - private _hAlign : number; - private _hPos : number; - - constructor( icon : TimelineEventIcon ) { - this._setAttrs( icon ); - } - - private _setAttrs( icon : TimelineEventIcon ) { - this._url = icon.url; - this._displayWidth = icon.displayWidth; - this._displayHeight = icon.displayHeight; - this._hAlign = icon.hAlign; - this._hPos = icon.hPos; - } - - get url( ) : string { return this._url; } - get displayWidth( ) : number { return this._displayWidth; } - get displayHeight( ) : number { return this._displayHeight; } - get hAlign( ) : number { return this._hAlign; } - get hPos( ) : number { return this._hPos; } - - snapshot( ) : TimelineEventIcon { - return { - url: this._url, - displayWidth: this._displayWidth, - displayHeight: this._displayHeight, - hAlign: this._hAlign, - hPos: this._hPos - }; - } + get url(): string { return this._url; } + get displayWidth(): number { return this._displayWidth; } + get displayHeight(): number { return this._displayHeight; } + get hAlign(): number { return this._hAlign; } + get hPos(): number { return this._hPos; } + + snapshot(): TimelineEventIcon { + return { + url: this._url, + displayWidth: this._displayWidth, + displayHeight: this._displayHeight, + hAlign: this._hAlign, + hPos: this._hPos + }; } +} - export class TimelineEventStyleUi { - private _styleGuid : string; - private _icons : TimelineEventIconUi[]; +export class TimelineEventStyleUi { + private _styleGuid: string; + private _icons: TimelineEventIconUi[]; - constructor( style : TimelineEventStyle ) { - this._styleGuid = style.styleGuid; - this._setAttrs( style ); - } + constructor(style: TimelineEventStyle) { + this._styleGuid = style.styleGuid; + this._setAttrs(style); + } - get styleGuid( ) : string { - return this._styleGuid; - } + get styleGuid(): string { + return this._styleGuid; + } - private _setAttrs( style : TimelineEventStyle ) { - this._icons = style.icons.map( ( icon )=>{ return new TimelineEventIconUi( icon ); } ); - } + private _setAttrs(style: TimelineEventStyle) { + this._icons = style.icons.map((icon) => { return new TimelineEventIconUi(icon); }); + } - get numIcons( ) : number { - return this._icons.length; - } + get numIcons(): number { + return this._icons.length; + } - icon( index : number ) : TimelineEventIconUi { - return this._icons[ index ]; - } + icon(index: number): TimelineEventIconUi { + return this._icons[index]; + } - snapshot( ) : TimelineEventStyle { - return { - styleGuid: this._styleGuid, - icons: this._icons.map( (ui)=>ui.snapshot() ) - }; - } + snapshot(): TimelineEventStyle { + return { + styleGuid: this._styleGuid, + icons: this._icons.map((ui) => ui.snapshot()) + }; } +} diff --git a/src/webglimpse/timeline/timeline_events_row.ts b/src/webglimpse/timeline/timeline_events_row.ts index 8ab988f..041a331 100644 --- a/src/webglimpse/timeline/timeline_events_row.ts +++ b/src/webglimpse/timeline/timeline_events_row.ts @@ -27,1921 +27,1938 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Color, darker } from '../color'; +import { Drawable, Painter, Pane, PointerEvent, Mask2D, yFrac, xFrac, isLeftMouseDown, Layout } from '../core'; +import { TimeAxis1D } from './time_axis'; +import { TimelineLaneArray, TimelineLane, effectiveEdges_PMILLIS } from './timeline_lanes'; +import { TimelineUi } from './timeline_ui'; +import { TimelineRowPaneFactory, TimelineRowPaneOptions } from './timeline_row'; +import { Axis1D } from '../plot/axis'; +import { TimelineModel, TimelineRowModel, TimelineEventModel } from './timeline_model'; +import { BoundsUnmodifiable, Size } from '../bounds'; +import { StringMap, concatLines, GL, ensureCapacityFloat32, hasval, isNumber } from '../util/util'; +import { indexNearest } from '../util/sorted_arrays'; +import { Program, Attribute, Uniform1f } from '../shader'; +import { newDynamicBuffer } from '../buffer'; +import { putQuadXys, putRgbas, putQuadRgbas, putUpperRightTriangleXys, putLowerRightTriangleXys, putLowerLeftTriangleXys, putUpperLeftTriangleXys, varyingColor_FRAGSHADER } from '../misc'; +import { OrderedSet } from '../util/ordered_set'; +import { TextureRenderer, Texture2D } from '../texture'; +import { TwoKeyCache } from '../util/multikey_cache'; +import { TextTexture2D, newTextTextureCache2 } from '../text'; + + +export interface TimelineEventsPainterOptions { + timelineFont: string; + timelineFgColor: Color; + rowTopPadding: number; + rowBottomPadding: number; + laneHeight: number; +} + + + +export interface TimelineEventsPainterFactory { + (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter; +} + + + +export interface TimelineEventsRowPaneOptions { + rowTopPadding?: number; + rowBottomPadding?: number; + laneHeight?: number; + allowMultipleLanes?: boolean; + painterFactories?: TimelineEventsPainterFactory[]; +} + + + +export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOptions): TimelineRowPaneFactory { + + // Pane Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane { + let rowTopPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowTopPadding) ? eventsRowOpts.rowTopPadding : 6); + let rowBottomPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowBottomPadding) ? eventsRowOpts.rowBottomPadding : 6); + let laneHeight = (hasval(eventsRowOpts) && hasval(eventsRowOpts.laneHeight) ? eventsRowOpts.laneHeight : 33); + let painterFactories = (hasval(eventsRowOpts) && hasval(eventsRowOpts.painterFactories) ? eventsRowOpts.painterFactories : []); + let allowMultipleLanes = (hasval(eventsRowOpts) && hasval(eventsRowOpts.allowMultipleLanes) ? eventsRowOpts.allowMultipleLanes : true); + + let timelineFont = options.timelineFont; + let timelineFgColor = options.timelineFgColor; + let draggableEdgeWidth = options.draggableEdgeWidth; + let snapToDistance = options.snapToDistance; + + let rowUi = ui.rowUi(row.rowGuid); + let input = ui.input; + let selection = ui.selection; + + let lanes = new TimelineLaneArray(model, row, ui, allowMultipleLanes); + + let timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number { + return timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); + }; + let timeAtPointer_PMILLIS = function (ev: PointerEvent): number { + return timeAtCoords_PMILLIS(ev.paneViewport, ev.i); + }; + let eventAtCoords = function (viewport: BoundsUnmodifiable, i: number, j: number): TimelineEventModel { + let laneNum = Math.floor((viewport.jEnd - j - rowTopPadding) / laneHeight); + let time_PMILLIS = timeAtCoords_PMILLIS(viewport, i); + return lanes.eventAt(laneNum, time_PMILLIS); + }; - export interface TimelineEventsPainterOptions { - timelineFont : string; - timelineFgColor : Color; - rowTopPadding : number; - rowBottomPadding : number; - laneHeight : number; - } - - - - export interface TimelineEventsPainterFactory { - ( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter; - } - + let eventAtPointer = function (ev: PointerEvent): TimelineEventModel { + return eventAtCoords(ev.paneViewport, ev.i, ev.j); + }; + let isInsideAnEvent: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { + return hasval(eventAtCoords(viewport, i, j)); + }; - export interface TimelineEventsRowPaneOptions { - rowTopPadding? : number; - rowBottomPadding? : number; - laneHeight? : number; - allowMultipleLanes? : boolean; - painterFactories? : TimelineEventsPainterFactory[]; - } + // Create pane + // + let layout = { + updatePrefSize: function (parentPrefSize: Size): void { + parentPrefSize.h = rowTopPadding + rowBottomPadding + Math.max(1, lanes.length) * laneHeight; + parentPrefSize.w = null; + } + }; + let rowContentPane = new Pane(layout, true, isInsideAnEvent); - export function newEventsRowPaneFactory( eventsRowOpts? : TimelineEventsRowPaneOptions ) : TimelineRowPaneFactory { + rowUi.addPane('content', rowContentPane); - // Pane Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { - var rowTopPadding = ( hasval( eventsRowOpts ) && hasval( eventsRowOpts.rowTopPadding ) ? eventsRowOpts.rowTopPadding : 6 ); - var rowBottomPadding = ( hasval( eventsRowOpts ) && hasval( eventsRowOpts.rowBottomPadding ) ? eventsRowOpts.rowBottomPadding : 6 ); - var laneHeight = ( hasval( eventsRowOpts ) && hasval( eventsRowOpts.laneHeight ) ? eventsRowOpts.laneHeight : 33 ); - var painterFactories = ( hasval( eventsRowOpts ) && hasval( eventsRowOpts.painterFactories ) ? eventsRowOpts.painterFactories : [] ); - var allowMultipleLanes = ( hasval( eventsRowOpts ) && hasval( eventsRowOpts.allowMultipleLanes ) ? eventsRowOpts.allowMultipleLanes : true ); + let painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding, laneHeight: laneHeight }; + for (let n = 0; n < painterFactories.length; n++) { + let createPainter = painterFactories[n]; + rowContentPane.addPainter(createPainter(drawable, timeAxis, lanes, ui, painterOptions)); + } - var timelineFont = options.timelineFont; - var timelineFgColor = options.timelineFgColor; - var draggableEdgeWidth = options.draggableEdgeWidth; - var snapToDistance = options.snapToDistance; - var rowUi = ui.rowUi( row.rowGuid ); - var input = ui.input; - var selection = ui.selection; + let redraw = function () { + drawable.redraw(); + }; - var lanes = new TimelineLaneArray( model, row, ui, allowMultipleLanes ); + row.eventGuids.valueAdded.on(redraw); + row.eventGuids.valueMoved.on(redraw); + row.eventGuids.valueRemoved.on(redraw); - var timeAtCoords_PMILLIS = function( viewport : BoundsUnmodifiable, i : number ) : number { - return timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); - }; + let watchEventAttrs = function (eventGuid: string) { + model.event(eventGuid).attrsChanged.on(redraw); + }; + row.eventGuids.forEach(watchEventAttrs); + row.eventGuids.valueAdded.on(watchEventAttrs); - var timeAtPointer_PMILLIS = function( ev : PointerEvent ) : number { - return timeAtCoords_PMILLIS( ev.paneViewport, ev.i ); - }; + let removeRedraw = function (eventGuid: string) { + model.event(eventGuid).attrsChanged.off(redraw); + } + row.eventGuids.valueRemoved.on(removeRedraw); - var eventAtCoords = function( viewport : BoundsUnmodifiable, i : number, j : number ) : TimelineEventModel { - var laneNum = Math.floor( ( viewport.jEnd - j - rowTopPadding ) / laneHeight ); - var time_PMILLIS = timeAtCoords_PMILLIS( viewport, i ); - return lanes.eventAt( laneNum, time_PMILLIS ); - }; - var eventAtPointer = function( ev : PointerEvent ) : TimelineEventModel { - return eventAtCoords( ev.paneViewport, ev.i, ev.j ); - }; - var isInsideAnEvent : Mask2D = function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { - return hasval( eventAtCoords( viewport, i, j ) ); - }; + // Used by both sets of listeners to know whether an event-drag is in progress + let eventDragMode: string = null; - // Create pane - // - var layout = { - updatePrefSize: function( parentPrefSize : Size ) { - parentPrefSize.h = rowTopPadding + rowBottomPadding + Math.max( 1, lanes.length )*laneHeight; - parentPrefSize.w = null; - } - }; - var rowContentPane = new Pane( layout, true, isInsideAnEvent ); + // Hook up input notifications + // - rowUi.addPane( 'content', rowContentPane ); + let recentMouseMove: PointerEvent = null; - var painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding, laneHeight: laneHeight }; - for ( var n = 0; n < painterFactories.length; n++ ) { - var createPainter = painterFactories[ n ]; - rowContentPane.addPainter( createPainter( drawable, timeAxis, lanes, ui, painterOptions ) ); + rowContentPane.mouseMove.on(function (ev: PointerEvent) { + input.mouseMove.fire(ev); + if (!eventDragMode) { + input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev); + input.rowHover.fire(row, ev); + input.eventHover.fire(eventAtPointer(ev), ev); } - - - var redraw = function( ) { - drawable.redraw( ); - }; - - row.eventGuids.valueAdded.on( redraw ); - row.eventGuids.valueMoved.on( redraw ); - row.eventGuids.valueRemoved.on( redraw ); - - var watchEventAttrs = function( eventGuid : string ) { - model.event( eventGuid ).attrsChanged.on( redraw ); - }; - row.eventGuids.forEach( watchEventAttrs ); - row.eventGuids.valueAdded.on( watchEventAttrs ); - - var removeRedraw = function( eventGuid : string ) { - model.event( eventGuid ).attrsChanged.off( redraw ); + recentMouseMove = ev; + }); + + rowContentPane.mouseExit.on(function (ev: PointerEvent) { + input.mouseExit.fire(ev); + if (!eventDragMode) { + input.timeHover.fire(null, ev); + input.rowHover.fire(null, ev); + input.eventHover.fire(null, ev); } - row.eventGuids.valueRemoved.on( removeRedraw ); - - - - // Used by both sets of listeners to know whether an event-drag is in progress - var eventDragMode : string = null; - - - - // Hook up input notifications - // - - var recentMouseMove : PointerEvent = null; - - rowContentPane.mouseMove.on( function( ev : PointerEvent ) { - input.mouseMove.fire( ev ); - if ( !eventDragMode ) { - input.timeHover.fire( timeAtPointer_PMILLIS( ev ), ev ); - input.rowHover.fire( row, ev ); - input.eventHover.fire( eventAtPointer( ev ), ev ); - } - recentMouseMove = ev; - } ); - - rowContentPane.mouseExit.on( function( ev : PointerEvent ) { - input.mouseExit.fire( ev ); - if ( !eventDragMode ) { - input.timeHover.fire( null, ev ); - input.rowHover.fire( null, ev ); - input.eventHover.fire( null, ev ); - } - recentMouseMove = null; - } ); - - var uiMillisPerPxChanged = function( ) { - if ( !eventDragMode && recentMouseMove != null ) { - var ev = recentMouseMove; - input.timeHover.fire( timeAtPointer_PMILLIS( ev ), ev ); - input.eventHover.fire( eventAtPointer( ev ), ev ); - } - }; - ui.millisPerPx.changed.on( uiMillisPerPxChanged ); + recentMouseMove = null; + }); + + let uiMillisPerPxChanged = function () { + if (!eventDragMode && recentMouseMove != null) { + let ev = recentMouseMove; + input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev); + input.eventHover.fire(eventAtPointer(ev), ev); + } + }; + ui.millisPerPx.changed.on(uiMillisPerPxChanged); - rowContentPane.mouseUp.on( function( ev : PointerEvent ) { - input.mouseUp.fire( ev ); - } ); + rowContentPane.mouseUp.on(function (ev: PointerEvent) { + input.mouseUp.fire(ev); + }); - rowContentPane.mouseDown.on( function( ev : PointerEvent ) { - input.mouseDown.fire( ev ); - } ); + rowContentPane.mouseDown.on(function (ev: PointerEvent) { + input.mouseDown.fire(ev); + }); - rowContentPane.mouseWheel.on( options.mouseWheelListener ); + rowContentPane.mouseWheel.on(options.mouseWheelListener); - rowContentPane.contextMenu.on( function( ev : PointerEvent ) { - input.contextMenu.fire( ev ); - } ); + rowContentPane.contextMenu.on(function (ev: PointerEvent) { + input.contextMenu.fire(ev); + }); - // Begin event-drag - // + // Begin event-drag + // - var eventDragEvents : TimelineEventModel[] = []; - var eventDragOffsets_MILLIS : StringMap = {}; - var eventDragSnapTimes_PMILLIS : number[] = []; + let eventDragEvents: TimelineEventModel[] = []; + let eventDragOffsets_MILLIS: StringMap = {}; + let eventDragSnapTimes_PMILLIS: number[] = []; - // Event-edges are draggable for events at least this wide - var minEventWidthForEdgeDraggability = 3 * draggableEdgeWidth; + // Event-edges are draggable for events at least this wide + let minEventWidthForEdgeDraggability = 3 * draggableEdgeWidth; - // When dragging an event-edge, the event cannot be made narrower than this - // - // Needs to be greater than minEventWidthForEdgeDraggability -- by enough to - // cover floating-point precision loss -- so a user can't accidentally make - // an event so narrow that it can't easily be widened again. - // - var minEventWidthWhenDraggingEdge = minEventWidthForEdgeDraggability + 1; + // When dragging an event-edge, the event cannot be made narrower than this + // + // Needs to be greater than minEventWidthForEdgeDraggability -- by enough to + // cover floating-point precision loss -- so a user can't accidentally make + // an event so narrow that it can't easily be widened again. + // + let minEventWidthWhenDraggingEdge = minEventWidthForEdgeDraggability + 1; - function allUserEditable( events : TimelineEventModel[] ) : boolean { - for ( var n = 0; n < events.length; n++ ) { - if ( !events[ n ].userEditable ) { - return false; - } + function allUserEditable(events: TimelineEventModel[]): boolean { + for (let n = 0; n < events.length; n++) { + if (!events[n].userEditable) { + return false; } - return true; } + return true; + } - function chooseEventDragMode( ui : TimelineUi, mouseTime_PMILLIS : number, eventDragEvents : TimelineEventModel[] ) : string { - if ( eventDragEvents.length === 0 ) { - // If no events are selected, then we don't have any to drag - return null; - } - else if ( !allUserEditable( eventDragEvents ) ) { - // If any selected event is not user-editable, don't allow editing - return 'undraggable'; - } - else if ( eventDragEvents.length > 1 ) { - // If more than one event is selected, don't allow edge dragging + function chooseEventDragMode(ui: TimelineUi, mouseTime_PMILLIS: number, eventDragEvents: TimelineEventModel[]): string { + if (eventDragEvents.length === 0) { + // If no events are selected, then we don't have any to drag + return null; + } + else if (!allUserEditable(eventDragEvents)) { + // If any selected event is not user-editable, don't allow editing + return 'undraggable'; + } + else if (eventDragEvents.length > 1) { + // If more than one event is selected, don't allow edge dragging + return 'center'; + } + else if (eventDragEvents.length === 1) { + let event = eventDragEvents[0]; + let pxPerMilli = 1 / ui.millisPerPx.value; + let eventWidth = (event.end_PMILLIS - event.start_PMILLIS) * pxPerMilli; + if (eventWidth < minEventWidthForEdgeDraggability) { + // If event isn't very wide, don't try to allow edge dragging return 'center'; } - else if ( eventDragEvents.length === 1 ) { - var event = eventDragEvents[ 0 ]; - var pxPerMilli = 1 / ui.millisPerPx.value; - var eventWidth = ( event.end_PMILLIS - event.start_PMILLIS ) * pxPerMilli; - if ( eventWidth < minEventWidthForEdgeDraggability ) { - // If event isn't very wide, don't try to allow edge dragging + else { + let mouseOffset = (mouseTime_PMILLIS - event.start_PMILLIS) * pxPerMilli; + if (mouseOffset < draggableEdgeWidth) { + // If mouse is near the left edge, drag the event's start-time + return 'start'; + } + else if (mouseOffset < eventWidth - draggableEdgeWidth) { + // If mouse is in the center, drag the whole event return 'center'; } else { - var mouseOffset = ( mouseTime_PMILLIS - event.start_PMILLIS ) * pxPerMilli; - if ( mouseOffset < draggableEdgeWidth ) { - // If mouse is near the left edge, drag the event's start-time - return 'start'; - } - else if ( mouseOffset < eventWidth - draggableEdgeWidth ) { - // If mouse is in the center, drag the whole event - return 'center'; - } - else { - // If mouse is near the right edge, drag the event's end-time - return 'end'; - } + // If mouse is near the right edge, drag the event's end-time + return 'end'; } } - else { - // Should never get here, because we have clauses above for length === 0, length === 1, and length > 1 - return null; - } } + else { + // Should never get here, because we have clauses above for length === 0, length === 1, and length > 1 + return null; + } + } - var updateCursor = function( ) { - if ( !eventDragMode ) { + let updateCursor = function () { + if (!eventDragMode) { - var mouseCursors = { 'center': 'default', 'start': 'w-resize', 'end': 'e-resize', 'undraggable': 'default' }; - var hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; + let mouseCursors = { 'center': 'default', 'start': 'w-resize', 'end': 'e-resize', 'undraggable': 'default' }; + let hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; - // if a multi-selection has been made, update the cursor based on all the events in the multi-selection - if ( selection.selectedEvents.length > 1 ) { - rowContentPane.mouseCursor = mouseCursors[ chooseEventDragMode( ui, hoveredTime_PMILLIS, selection.selectedEvents.toArray( ) ) ]; - } - else { - var hoveredEvent = selection.hoveredEvent.value; - var hoveredEvents = ( hasval( hoveredEvent ) ? [ hoveredEvent ] : [] ); - rowContentPane.mouseCursor = mouseCursors[ chooseEventDragMode( ui, hoveredTime_PMILLIS, hoveredEvents ) ]; - } + // if a multi-selection has been made, update the cursor based on all the events in the multi-selection + if (selection.selectedEvents.length > 1) { + rowContentPane.mouseCursor = mouseCursors[chooseEventDragMode(ui, hoveredTime_PMILLIS, selection.selectedEvents.toArray())]; } - }; - ui.millisPerPx.changed.on( updateCursor ); - selection.hoveredTime_PMILLIS.changed.on( updateCursor ); - selection.hoveredEvent.changed.on( updateCursor ); - - rowContentPane.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) ) { - var eventDragEventsSet = selection.selectedEvents; - eventDragEvents = eventDragEventsSet.toArray( ); - eventDragMode = chooseEventDragMode( ui, timeAtPointer_PMILLIS( ev ), eventDragEvents ); - - eventDragSnapTimes_PMILLIS = new Array( ); - var numSnapTimes = 0; - var allEventGuids = row.eventGuids; - for ( var n = 0; n < allEventGuids.length; n++ ) { - var eventGuid = allEventGuids.valueAt( n ); - if ( !eventDragEventsSet.hasId( eventGuid ) ) { - var event = model.event( eventGuid ); - eventDragSnapTimes_PMILLIS.push( event.start_PMILLIS ); - eventDragSnapTimes_PMILLIS.push( event.end_PMILLIS ); - } - } - eventDragSnapTimes_PMILLIS.sort( ); + else { + let hoveredEvent = selection.hoveredEvent.value; + let hoveredEvents = (hasval(hoveredEvent) ? [hoveredEvent] : []); + rowContentPane.mouseCursor = mouseCursors[chooseEventDragMode(ui, hoveredTime_PMILLIS, hoveredEvents)]; } - } ); - - function findSnapShift_MILLIS( t_PMILLIS : number, maxShift_MILLIS : number ) : number { - var i = indexNearest( eventDragSnapTimes_PMILLIS, t_PMILLIS ); - if ( i >= 0 ) - { - var shift_MILLIS = eventDragSnapTimes_PMILLIS[ i ] - t_PMILLIS; - if ( Math.abs( shift_MILLIS ) <= maxShift_MILLIS ) { - return shift_MILLIS; + } + }; + ui.millisPerPx.changed.on(updateCursor); + selection.hoveredTime_PMILLIS.changed.on(updateCursor); + selection.hoveredEvent.changed.on(updateCursor); + + rowContentPane.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent)) { + let eventDragEventsSet = selection.selectedEvents; + eventDragEvents = eventDragEventsSet.toArray(); + eventDragMode = chooseEventDragMode(ui, timeAtPointer_PMILLIS(ev), eventDragEvents); + + eventDragSnapTimes_PMILLIS = new Array(); + let numSnapTimes = 0; + let allEventGuids = row.eventGuids; + for (let n = 0; n < allEventGuids.length; n++) { + let eventGuid = allEventGuids.valueAt(n); + if (!eventDragEventsSet.hasId(eventGuid)) { + let event = model.event(eventGuid); + eventDragSnapTimes_PMILLIS.push(event.start_PMILLIS); + eventDragSnapTimes_PMILLIS.push(event.end_PMILLIS); } } - return null; + eventDragSnapTimes_PMILLIS.sort(); } + }); + + function findSnapShift_MILLIS(t_PMILLIS: number, maxShift_MILLIS: number): number { + let i = indexNearest(eventDragSnapTimes_PMILLIS, t_PMILLIS); + if (i >= 0) { + let shift_MILLIS = eventDragSnapTimes_PMILLIS[i] - t_PMILLIS; + if (Math.abs(shift_MILLIS) <= maxShift_MILLIS) { + return shift_MILLIS; + } + } + return null; + } - // Compute (and remember) the pointer time, for use by the event-drag listeners below - // + // Compute (and remember) the pointer time, for use by the event-drag listeners below + // - var eventDragPointer_PMILLIS : number = null; - - var updateEventDragPointer = function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && eventDragMode ) { - eventDragPointer_PMILLIS = timeAtPointer_PMILLIS( ev ); - } - }; - rowContentPane.mouseDown.on( updateEventDragPointer ); - rowContentPane.mouseMove.on( updateEventDragPointer ); + let eventDragPointer_PMILLIS: number = null; + let updateEventDragPointer = function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && eventDragMode) { + eventDragPointer_PMILLIS = timeAtPointer_PMILLIS(ev); + } + }; + rowContentPane.mouseDown.on(updateEventDragPointer); + rowContentPane.mouseMove.on(updateEventDragPointer); - // Dragging event-center - // - var grabEventCenter = function( ) { - if ( eventDragMode === 'center' ) { - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - eventDragOffsets_MILLIS[ event.eventGuid ] = eventDragPointer_PMILLIS - event.start_PMILLIS; - } + // Dragging event-center + // - // If this is a simple click-and-release, leave the mouse-cursor alone -- - // but once we can tell that it's actually a drag, change to a drag cursor - // - - var beginDrag = function( ) { - rowContentPane.mouseCursor = 'move'; - }; - rowContentPane.mouseMove.on( beginDrag ); - var pendingBeginDrag = setTimeout( beginDrag, 300 ); - - var endDrag = function( ) { - clearTimeout( pendingBeginDrag ); - rowContentPane.mouseMove.off( beginDrag ); - rowContentPane.mouseUp.off( endDrag ); - }; - rowContentPane.mouseUp.on( endDrag ); + let grabEventCenter = function () { + if (eventDragMode === 'center') { + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.start_PMILLIS; } - }; - rowContentPane.mouseDown.on( grabEventCenter ); - - var dragEventCenter = function( ) { - if ( eventDragMode === 'center' ) { - var maxSnapShift_MILLIS = snapToDistance * ( timeAxis.tSize_MILLIS / rowContentPane.viewport.w ); - - var snapShift_MILLIS : number = null; - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - var newStart_PMILLIS = ( eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[ event.eventGuid ] ); - var newEnd_PMILLIS = event.end_PMILLIS + ( newStart_PMILLIS - event.start_PMILLIS ); - - var eventStartSnapShift_MILLIS = findSnapShift_MILLIS( newStart_PMILLIS, maxSnapShift_MILLIS ); - if ( hasval( eventStartSnapShift_MILLIS ) ) { - if ( !hasval( snapShift_MILLIS ) || Math.abs( eventStartSnapShift_MILLIS ) < Math.abs( snapShift_MILLIS )) { - snapShift_MILLIS = eventStartSnapShift_MILLIS; - } - } - var eventEndSnapShift_MILLIS = findSnapShift_MILLIS( newEnd_PMILLIS, maxSnapShift_MILLIS ); - if ( hasval( eventEndSnapShift_MILLIS ) ) { - if ( !hasval( snapShift_MILLIS ) || Math.abs( eventEndSnapShift_MILLIS ) < Math.abs( snapShift_MILLIS )) { - snapShift_MILLIS = eventEndSnapShift_MILLIS; - } + // If this is a simple click-and-release, leave the mouse-cursor alone -- + // but once we can tell that it's actually a drag, change to a drag cursor + // + + let beginDrag = function () { + rowContentPane.mouseCursor = 'move'; + }; + rowContentPane.mouseMove.on(beginDrag); + let pendingBeginDrag = setTimeout(beginDrag, 300); + + let endDrag = function () { + clearTimeout(pendingBeginDrag); + rowContentPane.mouseMove.off(beginDrag); + rowContentPane.mouseUp.off(endDrag); + }; + rowContentPane.mouseUp.on(endDrag); + } + }; + rowContentPane.mouseDown.on(grabEventCenter); + + let dragEventCenter = function () { + if (eventDragMode === 'center') { + let maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); + + let snapShift_MILLIS: number = null; + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + let newStart_PMILLIS = (eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]); + let newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS); + + let eventStartSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS); + if (hasval(eventStartSnapShift_MILLIS)) { + if (!hasval(snapShift_MILLIS) || Math.abs(eventStartSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { + snapShift_MILLIS = eventStartSnapShift_MILLIS; } } - if ( !hasval( snapShift_MILLIS ) ) { - snapShift_MILLIS = 0; - } - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - var newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[ event.eventGuid ] + snapShift_MILLIS; - var newEnd_PMILLIS = event.end_PMILLIS + ( newStart_PMILLIS - event.start_PMILLIS ); - event.setInterval( newStart_PMILLIS, newEnd_PMILLIS ); + let eventEndSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS); + if (hasval(eventEndSnapShift_MILLIS)) { + if (!hasval(snapShift_MILLIS) || Math.abs(eventEndSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { + snapShift_MILLIS = eventEndSnapShift_MILLIS; + } } } - }; - rowContentPane.mouseMove.on( dragEventCenter ); + if (!hasval(snapShift_MILLIS)) { + snapShift_MILLIS = 0; + } + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + let newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; + let newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS); + event.setInterval(newStart_PMILLIS, newEnd_PMILLIS); + } + } + }; + rowContentPane.mouseMove.on(dragEventCenter); - // Dragging event-start - // - var grabEventStart = function( ) { - if ( eventDragMode === 'start' ) { - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - eventDragOffsets_MILLIS[ event.eventGuid ] = eventDragPointer_PMILLIS - event.start_PMILLIS; - } + // Dragging event-start + // + + let grabEventStart = function () { + if (eventDragMode === 'start') { + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.start_PMILLIS; } - }; - rowContentPane.mouseDown.on( grabEventStart ); - - var dragEventStart = function( ) { - if ( eventDragMode === 'start' ) { - var wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; - var maxSnapShift_MILLIS = snapToDistance * ( timeAxis.tSize_MILLIS / rowContentPane.viewport.w ); - - var snapShift_MILLIS : number = null; - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - var newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[ event.eventGuid ]; - - var eventSnapShift_MILLIS = findSnapShift_MILLIS( newStart_PMILLIS, maxSnapShift_MILLIS ); - if ( hasval( eventSnapShift_MILLIS ) ) { - if ( !hasval( snapShift_MILLIS ) || Math.abs( eventSnapShift_MILLIS ) < Math.abs( snapShift_MILLIS )) { - snapShift_MILLIS = eventSnapShift_MILLIS; - } + } + }; + rowContentPane.mouseDown.on(grabEventStart); + + let dragEventStart = function () { + if (eventDragMode === 'start') { + let wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; + let maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); + + let snapShift_MILLIS: number = null; + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + let newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]; + + let eventSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS); + if (hasval(eventSnapShift_MILLIS)) { + if (!hasval(snapShift_MILLIS) || Math.abs(eventSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { + snapShift_MILLIS = eventSnapShift_MILLIS; } } - if ( !hasval( snapShift_MILLIS ) ) { - snapShift_MILLIS = 0; - } + } + if (!hasval(snapShift_MILLIS)) { + snapShift_MILLIS = 0; + } - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - var newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[ event.eventGuid ] + snapShift_MILLIS; - event.start_PMILLIS = Math.min( event.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS ); - } + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + let newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; + event.start_PMILLIS = Math.min(event.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS); } - }; - rowContentPane.mouseMove.on( dragEventStart ); - timeAxis.limitsChanged.on( dragEventStart ); + } + }; + rowContentPane.mouseMove.on(dragEventStart); + timeAxis.limitsChanged.on(dragEventStart); - // Dragging event-end - // + // Dragging event-end + // - var grabEventEnd = function( ) { - if ( eventDragMode === 'end' ) { - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - eventDragOffsets_MILLIS[ event.eventGuid ] = eventDragPointer_PMILLIS - event.end_PMILLIS; - } + let grabEventEnd = function () { + if (eventDragMode === 'end') { + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.end_PMILLIS; } - }; - rowContentPane.mouseDown.on( grabEventEnd ); - - var dragEventEnd = function( ) { - if ( eventDragMode === 'end' ) { - var wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; - var maxSnapShift_MILLIS = snapToDistance * ( timeAxis.tSize_MILLIS / rowContentPane.viewport.w ); - - var snapShift_MILLIS : number = null; - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - var newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[ event.eventGuid ]; - - var eventSnapShift_MILLIS = findSnapShift_MILLIS( newEnd_PMILLIS, maxSnapShift_MILLIS ); - if ( hasval( eventSnapShift_MILLIS ) ) { - if ( !hasval( snapShift_MILLIS ) || Math.abs( eventSnapShift_MILLIS ) < Math.abs( snapShift_MILLIS )) { - snapShift_MILLIS = eventSnapShift_MILLIS; - } + } + }; + rowContentPane.mouseDown.on(grabEventEnd); + + let dragEventEnd = function () { + if (eventDragMode === 'end') { + let wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; + let maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); + + let snapShift_MILLIS: number = null; + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + let newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]; + + let eventSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS); + if (hasval(eventSnapShift_MILLIS)) { + if (!hasval(snapShift_MILLIS) || Math.abs(eventSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { + snapShift_MILLIS = eventSnapShift_MILLIS; } } - if ( !hasval( snapShift_MILLIS ) ) { - snapShift_MILLIS = 0; - } + } + if (!hasval(snapShift_MILLIS)) { + snapShift_MILLIS = 0; + } - for ( var n = 0; n < eventDragEvents.length; n++ ) { - var event = eventDragEvents[ n ]; - var newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[ event.eventGuid ] + snapShift_MILLIS; - event.end_PMILLIS = Math.max( event.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS ); - } + for (let n = 0; n < eventDragEvents.length; n++) { + let event = eventDragEvents[n]; + let newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; + event.end_PMILLIS = Math.max(event.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS); } - }; - rowContentPane.mouseMove.on( dragEventEnd ); - timeAxis.limitsChanged.on( dragEventEnd ); + } + }; + rowContentPane.mouseMove.on(dragEventEnd); + timeAxis.limitsChanged.on(dragEventEnd); - // Finish event-drag - // + // Finish event-drag + // - rowContentPane.mouseUp.on( function( ev : PointerEvent ) { - eventDragEvents = []; - eventDragOffsets_MILLIS = {}; - eventDragSnapTimes_PMILLIS = []; - eventDragPointer_PMILLIS = null; - eventDragMode = null; - } ); + rowContentPane.mouseUp.on(function (ev: PointerEvent) { + eventDragEvents = []; + eventDragOffsets_MILLIS = {}; + eventDragSnapTimes_PMILLIS = []; + eventDragPointer_PMILLIS = null; + eventDragMode = null; + }); - rowContentPane.dispose.on( function( ) { - lanes.dispose( ); + rowContentPane.dispose.on(function () { + lanes.dispose(); - timeAxis.limitsChanged.off( dragEventEnd ); - timeAxis.limitsChanged.off( dragEventStart ); + timeAxis.limitsChanged.off(dragEventEnd); + timeAxis.limitsChanged.off(dragEventStart); - ui.millisPerPx.changed.off( uiMillisPerPxChanged ); + ui.millisPerPx.changed.off(uiMillisPerPxChanged); - ui.millisPerPx.changed.off( updateCursor ); - selection.hoveredTime_PMILLIS.changed.off( updateCursor ); - selection.hoveredEvent.changed.off( updateCursor ); + ui.millisPerPx.changed.off(updateCursor); + selection.hoveredTime_PMILLIS.changed.off(updateCursor); + selection.hoveredEvent.changed.off(updateCursor); - row.eventGuids.valueAdded.off( redraw ); - row.eventGuids.valueMoved.off( redraw ); - row.eventGuids.valueRemoved.off( redraw ); - row.eventGuids.valueRemoved.off( removeRedraw ); + row.eventGuids.valueAdded.off(redraw); + row.eventGuids.valueMoved.off(redraw); + row.eventGuids.valueRemoved.off(redraw); + row.eventGuids.valueRemoved.off(removeRedraw); - row.eventGuids.valueAdded.off( watchEventAttrs ); + row.eventGuids.valueAdded.off(watchEventAttrs); - row.eventGuids.forEach( function( eventGuid : string ) { - model.event( eventGuid ).attrsChanged.off( redraw ); - } ); - } ); + row.eventGuids.forEach(function (eventGuid: string) { + model.event(eventGuid).attrsChanged.off(redraw); + }); + }); - return rowContentPane; - }; - } + return rowContentPane; + }; +} - export interface TimelineEventLimitsPainterOptions { - lineColor? : Color; - lineThickness? : number; - } +export interface TimelineEventLimitsPainterOptions { + lineColor?: Color; + lineThickness?: number; +} - function eventLimitsPainterHelper( limitsOpts : TimelineEventLimitsPainterOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { - - var rowTopPadding = options.rowTopPadding; - var rowBottomPadding = options.rowBottomPadding; - var laneHeight = options.laneHeight; - - var lineColor = ( hasval( limitsOpts ) && hasval( limitsOpts.lineColor ) ? limitsOpts.lineColor : new Color( 1, 0, 0, 1 ) ); - var lineThickness = ( hasval( limitsOpts ) && hasval( limitsOpts.lineThickness ) ? limitsOpts.lineThickness : 2.5 ); - - var xyFrac_vColor_VERTSHADER = concatLines( - ' ', - ' attribute vec2 a_XyFrac; ', - ' attribute vec4 a_Color; ', - ' ', - ' varying vec4 v_Color; ', - ' ', - ' void main( ) { ', - ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', - ' v_Color = a_Color; ', - ' } ', - ' ' - ); - - var program = new Program( xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var a_Color = new Attribute( program, 'a_Color' ); - - var xys = new Float32Array( 0 ); - var xysBuffer = newDynamicBuffer( ); - - var rgbas = new Float32Array( 0 ); - var rgbasBuffer = newDynamicBuffer( ); - - return { - paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( indexXys > 0 ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - program.use( gl ); - xysBuffer.setData( xys.subarray( 0, indexXys ) ); - a_XyFrac.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - rgbasBuffer.setData( rgbas.subarray( 0, indexRgbas ) ); - a_Color.setDataAndEnable( gl, rgbasBuffer, 4, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); - - a_Color.disable( gl ); - a_XyFrac.disable( gl ); - program.endUse( gl ); - } - }, - ensureCapacity: function( eventCount : number ) { - var numVertices = ( 6 * 3 /* triangles */ * eventCount ); - xys = ensureCapacityFloat32( xys, 2*numVertices ); - rgbas = ensureCapacityFloat32( rgbas, 4*numVertices ); - }, - fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable ) : { indexXys : number; indexRgbas : number } { - - var lane : TimelineLane = lanes.lane( laneIndex ); - var event : TimelineEventModel = lane.event( eventIndex ); - - var wLine = lineThickness / viewport.w; - var hLine = lineThickness / viewport.h; - - var jTop = rowTopPadding + ( laneIndex )*laneHeight; - var yTop = ( viewport.h - jTop ) / viewport.h; - var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight; - var yBottom = ( viewport.h - jBottom ) / viewport.h; - var yMid = ( yTop + yBottom ) / 2; - - var xLeft = hasval( event.startLimit_PMILLIS ) ? timeAxis.tFrac( event.startLimit_PMILLIS ) : 0; - var xRight = hasval( event.endLimit_PMILLIS ) ? timeAxis.tFrac( event.endLimit_PMILLIS ) : 1; - - indexXys = putQuadXys( xys, indexXys, xLeft, xRight, yMid-hLine/2, yMid+hLine/2 ); - indexXys = putQuadXys( xys, indexXys, xLeft, xLeft-wLine, yTop, yBottom ); - indexXys = putQuadXys( xys, indexXys, xRight, xRight+wLine, yTop, yBottom ); - indexRgbas = putRgbas( rgbas, indexRgbas, lineColor, 18 ); - - return { indexXys : indexXys, indexRgbas : indexRgbas }; - } - }; - } +function eventLimitsPainterHelper(limitsOpts: TimelineEventLimitsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - export function newEventLimitsPainterFactory( limitOpts? : TimelineEventLimitsPainterOptions ) : TimelineEventsPainterFactory { + let rowTopPadding = options.rowTopPadding; + let rowBottomPadding = options.rowBottomPadding; + let laneHeight = options.laneHeight; - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { + let lineColor = (hasval(limitsOpts) && hasval(limitsOpts.lineColor) ? limitsOpts.lineColor : new Color(1, 0, 0, 1)); + let lineThickness = (hasval(limitsOpts) && hasval(limitsOpts.lineThickness) ? limitsOpts.lineThickness : 2.5); - var helper = eventLimitsPainterHelper( limitOpts, drawable, timeAxis, lanes, ui, options ); + let xyFrac_vColor_VERTSHADER = concatLines( + ' ', + ' attribute vec2 a_XyFrac; ', + ' attribute vec4 a_Color; ', + ' ', + ' varying vec4 v_Color; ', + ' ', + ' void main( ) { ', + ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', + ' v_Color = a_Color; ', + ' } ', + ' ' + ); - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { + let program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let a_Color = new Attribute(program, 'a_Color'); - var selectedEvents : OrderedSet = ui.selection.selectedEvents; + let xys = new Float32Array(0); + let xysBuffer = newDynamicBuffer(); - //XXX Instead of estimating the number of events we will need to draw ahead of time - //XXX (difficult because selected events may be present in multiple lanes, so - //XXX selectedEvents.length might not be sufficient) just make enough space for all events. - //XXX Potentially quite inefficient with lots of events (and few selected events). - helper.ensureCapacity( lanes.numEvents ); + let rgbas = new Float32Array(0); + let rgbasBuffer = newDynamicBuffer(); - var indexXys = 0; - var indexRgbas = 0; + return { + paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + if (indexXys > 0) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); - for ( var l = 0; l < lanes.length; l++ ) { - var lane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { - var event = lane.event( e ); + program.use(gl); + xysBuffer.setData(xys.subarray(0, indexXys)); + a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); + rgbasBuffer.setData(rgbas.subarray(0, indexRgbas)); + a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT); - // check whether the event is selected and has limits defined - if ( selectedEvents.hasId( event.eventGuid ) && ( hasval( event.startLimit_PMILLIS ) || hasval( event.endLimit_PMILLIS ) ) ) { - var indexes = helper.fillEvent( l, e, indexXys, indexRgbas, viewport ); - indexXys = indexes.indexXys; - indexRgbas = indexes.indexRgbas; - } - } - } - - helper.paint( indexXys, indexRgbas, gl, viewport ); - }; - }; - } + gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2)); + a_Color.disable(gl); + a_XyFrac.disable(gl); + program.endUse(gl); + } + }, + ensureCapacity: function (eventCount: number) { + let numVertices = (6 * 3 /* triangles */ * eventCount); + xys = ensureCapacityFloat32(xys, 2 * numVertices); + rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); + }, + fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable): { indexXys: number; indexRgbas: number } { + + let lane: TimelineLane = lanes.lane(laneIndex); + let event: TimelineEventModel = lane.event(eventIndex); + + let wLine = lineThickness / viewport.w; + let hLine = lineThickness / viewport.h; + + let jTop = rowTopPadding + (laneIndex) * laneHeight; + let yTop = (viewport.h - jTop) / viewport.h; + let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight; + let yBottom = (viewport.h - jBottom) / viewport.h; + let yMid = (yTop + yBottom) / 2; + + let xLeft = hasval(event.startLimit_PMILLIS) ? timeAxis.tFrac(event.startLimit_PMILLIS) : 0; + let xRight = hasval(event.endLimit_PMILLIS) ? timeAxis.tFrac(event.endLimit_PMILLIS) : 1; + + indexXys = putQuadXys(xys, indexXys, xLeft, xRight, yMid - hLine / 2, yMid + hLine / 2); + indexXys = putQuadXys(xys, indexXys, xLeft, xLeft - wLine, yTop, yBottom); + indexXys = putQuadXys(xys, indexXys, xRight, xRight + wLine, yTop, yBottom); + indexRgbas = putRgbas(rgbas, indexRgbas, lineColor, 18); + + return { indexXys: indexXys, indexRgbas: indexRgbas }; + } + }; +} - export enum JointType { - BEVEL, MITER - } +export function newEventLimitsPainterFactory(limitOpts?: TimelineEventLimitsPainterOptions): TimelineEventsPainterFactory { - export interface TimelineEventBarsPainterOptions { - topMargin? : number; - bottomMargin? : number; - borderThickness? : number; - cornerType? : JointType; - defaultColor? : Color; - defaultBorderColor? : Color; - selectedBorderColor? : Color; - - // the size of the dashes when painting stippled event borders - dashLength? : number; - // the width of stripes in the painter fill - stripeWidth? : number; - // the width of secondary color stripes in the painter fill - stripeSecondaryWidth? : number; - // the slant of the stipes: 0 = horizontal, 1 = 45 degrees, -1 = 45 degrees backward - stripeSlant? : number; - // width in pixels of the antialiasing of the slant - featherWidth? : number; - - // minimum pixel width of the event bar - // when the timeline is zoomed out so that the event bar - // is smaller than this visible width, the event bar is hidden - minimumVisibleWidth? : number; - } + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - export enum FillPattern { - solid = 0, - stripe = 1, - gradient = 2 - } + let helper = eventLimitsPainterHelper(limitOpts, drawable, timeAxis, lanes, ui, options); - function eventStripedBarPainterHelper( barOpts : TimelineEventBarsPainterOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { - var rowTopPadding = options.rowTopPadding; - var rowBottomPadding = options.rowBottomPadding; - var laneHeight = options.laneHeight; - - var topMargin = ( hasval( barOpts ) && hasval( barOpts.topMargin ) ? barOpts.topMargin : 1.2 ); - var bottomMargin = ( hasval( barOpts ) && hasval( barOpts.bottomMargin ) ? barOpts.bottomMargin : 1.2 ); - var borderThickness = ( hasval( barOpts ) && hasval( barOpts.borderThickness ) ? barOpts.borderThickness : 2 ); - var cornerType = ( hasval( barOpts ) && hasval( barOpts.cornerType ) ? barOpts.cornerType : JointType.BEVEL ); - var defaultColor = ( hasval( barOpts ) && hasval( barOpts.defaultColor ) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes( 0.4 ) ); - var defaultColorSecondary = new Color( 1, 1, 1, 1 ); - var minimumVisibleWidth = ( hasval( barOpts ) && hasval( barOpts.minimumVisibleWidth ) ? barOpts.minimumVisibleWidth : 0 ); - - var stripeWidth = ( hasval( barOpts ) && hasval( barOpts.stripeWidth ) ? barOpts.stripeWidth : 5 ); - var stripeSecondaryWidth= ( hasval( barOpts ) && hasval( barOpts.stripeSecondaryWidth ) ? barOpts.stripeSecondaryWidth : 5 ); - var stripeSlant = ( hasval( barOpts ) && hasval( barOpts.stripeSlant ) ? barOpts.stripeSlant : 1 ); - var featherWidth = ( hasval( barOpts ) && hasval( barOpts.featherWidth ) ? barOpts.featherWidth : 2 ); - - var selection = ui.selection; - - var xyFrac_vColor_VERTSHADER = concatLines( - ' ', - ' attribute vec2 a_XyFrac; ', - ' attribute vec4 a_Color; ', - ' attribute vec4 a_ColorSecondary; ', - ' attribute vec2 a_relativeXy; ', - ' attribute float a_fillPattern; ', - ' ', - ' varying vec4 v_Color; ', - ' varying vec4 v_ColorSecondary; ', - ' varying vec2 v_relativeXy; ', - ' varying float v_fillPattern; ', - ' ', - ' void main( ) { ', - ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', - ' v_Color = a_Color; ', - ' v_ColorSecondary = a_ColorSecondary; ', - ' v_relativeXy = a_relativeXy; ', - ' v_fillPattern = a_fillPattern; ', - ' } ', - ' ' - ); - - var fillPattern_FRAGSHADER = Webglimpse.concatLines( - ' #define PI 3.1415926535897932384626433832795 ', - ' ', - ' precision lowp float; ', - ' // the width in pixels of the first color stripe ', - ' uniform float u_stripeWidth; ', - ' // the width in pixels of the second color stripe ', - ' uniform float u_stripeSecondaryWidth; ', - ' // the slant of the stipes: 0 = horizontal, 1 = 45 degrees ', - ' uniform float u_slant; ', - ' // width in pixels of the antialiasing of the slant ', - ' uniform float u_featherWidth; ', - ' ', - ' varying vec4 v_Color; ', - ' varying vec4 v_ColorSecondary; ', - ' varying vec2 v_relativeXy; ', - ' varying float v_fillPattern; ', - ' ', - ' void pattern_stripe( ) { ', - ' float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth; ', - ' ', - ' // calculate the value indicating where we are in the stripe pattern ', - ' float stripeCoord = mod( v_relativeXy.x + u_slant * v_relativeXy.y , stripeWidthTotal ); ', - ' ', - ' // we are in the feather region beween the two stripes ', - ' if ( stripeCoord < u_featherWidth ) { ', - ' float diff = stripeCoord / u_featherWidth; ', - ' gl_FragColor = vec4 ( v_Color.xyz * diff + (1.0-diff) * v_ColorSecondary.xyz, 1.0 ); ', - ' } ', - ' // we are in the color 1 stripe ', - ' else if ( stripeCoord < u_stripeWidth ) { ', - ' gl_FragColor = v_Color; ', - ' } ', - ' // we are the feather region between the two stripes ', - ' else if ( stripeCoord < u_stripeWidth + u_featherWidth ) { ', - ' float diff = ( stripeCoord - u_stripeWidth ) / u_featherWidth; ', - ' gl_FragColor = vec4 ( v_Color.xyz * (1.0-diff) + diff * v_ColorSecondary.xyz, 1.0 ); ', - ' } ', - ' // we are in the color 2 stripe ', - ' else { ', - ' gl_FragColor = v_ColorSecondary; ', - ' } ', - ' } ', - ' ', - ' void pattern_gradient( ) { ', - ' float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth; ', - ' ', - ' // calculate the value indicating where we are in the stripe pattern ', - ' float stripeCoord = mod( v_relativeXy.x + u_slant * v_relativeXy.y , stripeWidthTotal ); ', - ' ', - ' float weightedCoord; ', - ' if ( stripeCoord < u_stripeWidth ) { ', - ' float slope = PI / u_stripeWidth; ', - ' weightedCoord = slope * stripeCoord; ', - ' } ', - ' else { ', - ' float slope = PI / u_stripeSecondaryWidth; ', - ' weightedCoord = PI + slope * ( stripeCoord - u_stripeWidth ); ', - ' } ', - ' ', - ' // sin wave domain: [0, stripeWidthTotal ] range: [0, 1] ', - ' float frac = sin( weightedCoord ) * 2.0 - 1.0; ', - ' ', - ' // mix primary and secondary colors based on gradient fraction ', - ' gl_FragColor = mix( v_Color, v_ColorSecondary, frac ); ', - ' } ', - ' ', - ' void pattern_solid( ) { ', - ' gl_FragColor = v_Color; ', - ' } ', - ' ', - ' void main( ) { ', - ' if ( v_fillPattern == 1.0 ) { ', - ' pattern_stripe( ); ', - ' } ', - ' else if ( v_fillPattern == 2.0 ) { ', - ' pattern_gradient( ); ', - ' } ', - ' else { ', - ' pattern_solid( ); ', - ' } ', - ' } ', - ' ', - ' ', - ' ' - ); - - var program = new Program( xyFrac_vColor_VERTSHADER, fillPattern_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var a_Color = new Attribute( program, 'a_Color' ); - var a_ColorSecondary = new Attribute( program, 'a_ColorSecondary' ); - var a_relativeXy = new Attribute( program, 'a_relativeXy'); - var a_fillPattern = new Attribute( program, 'a_fillPattern'); - - var u_stripeWidth = new Uniform1f( program, 'u_stripeWidth'); - var u_stripeSecondaryWidth = new Uniform1f( program, 'u_stripeSecondaryWidth'); - var u_slant = new Uniform1f( program, 'u_slant'); - var u_featherWidth = new Uniform1f( program, 'u_featherWidth'); - - var xys = new Float32Array( 0 ); - var xysBuffer = newDynamicBuffer( ); - - var rgbas = new Float32Array( 0 ); - var rgbasBuffer = newDynamicBuffer( ); - - var rgbasSecondary = new Float32Array( 0 ); - var rgbasSecondaryBuffer = newDynamicBuffer( ); - - var relativeXys = new Float32Array( 0 ); - var relativeXysBuffer = newDynamicBuffer( ); - - var fillPattern = new Float32Array( 0 ); - var fillPatternBuffer = newDynamicBuffer( ); - - return { - paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable, indexRelativeXys : number, indexFillPattern: number ) { - if ( indexXys == 0 || indexRgbas == 0 ) return; - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - program.use( gl ); - - u_slant.setData( gl, stripeSlant ); - u_stripeWidth.setData( gl, stripeWidth ); - u_stripeSecondaryWidth.setData( gl, stripeSecondaryWidth ); - u_featherWidth.setData( gl, featherWidth ); - - xysBuffer.setData( xys.subarray( 0, indexXys ) ); - a_XyFrac.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - - rgbasBuffer.setData( rgbas.subarray( 0, indexRgbas ) ); - a_Color.setDataAndEnable( gl, rgbasBuffer, 4, GL.FLOAT ); - - rgbasSecondaryBuffer.setData( rgbasSecondary.subarray( 0, indexRgbas ) ); - a_ColorSecondary.setDataAndEnable( gl, rgbasSecondaryBuffer, 4, GL.FLOAT ); - - relativeXysBuffer.setData( relativeXys.subarray(0, indexRelativeXys ) ); - a_relativeXy.setDataAndEnable( gl, relativeXysBuffer, 2, GL.FLOAT ); - - fillPatternBuffer.setData( fillPattern.subarray(0, indexFillPattern) ); - a_fillPattern.setDataAndEnable( gl, fillPatternBuffer, 1, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); - - a_Color.disable( gl ); - a_XyFrac.disable( gl ); - a_ColorSecondary.disable( gl ); - a_fillPattern.disable( gl ); - a_relativeXy.disable( gl ); - - program.endUse( gl ); - }, - ensureCapacity: function( eventCount : number ) { - var numVertices = ( 6*( 1 /*quads*/ ) )*eventCount; - xys = ensureCapacityFloat32( xys, 2*numVertices ); - rgbas = ensureCapacityFloat32( rgbas, 4*numVertices ); - rgbasSecondary = ensureCapacityFloat32( rgbasSecondary, 4*numVertices ); - relativeXys = Webglimpse.ensureCapacityFloat32( relativeXys, 2 * numVertices ); - fillPattern = Webglimpse.ensureCapacityFloat32( fillPattern, numVertices ); - }, - fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number ) : { indexXys : number; indexRgbas : number; indexRelativeXys: number; indexFillPattern: number; } { - var lane : TimelineLane = lanes.lane( laneIndex ); - var event : TimelineEventModel = lane.event( eventIndex ); - - var wBorder = borderThickness / viewport.w; - var hBorder = borderThickness / viewport.h; - - var _topMargin = hasval( event.topMargin ) ? event.topMargin : topMargin; - var _bottomMargin = hasval( event.bottomMargin ) ? event.bottomMargin : bottomMargin; - - var jTop = rowTopPadding + ( laneIndex )*laneHeight + _topMargin; - var yTop = ( viewport.h - jTop ) / viewport.h; - var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight - _bottomMargin; - var yBottom = ( viewport.h - jBottom ) / viewport.h; - - var xLeft = timeAxis.tFrac( event.start_PMILLIS ); - var xRight = timeAxis.tFrac( event.end_PMILLIS ); - - var xWidthPixels = viewport.w * ( xRight - xLeft ); - var yHeightPixels = jTop - jBottom; - - if ( !( xRight < 0 || xLeft > 1 ) && xWidthPixels > minimumVisibleWidth ) { + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - // Fill - var fillColor = ( event.bgColor || defaultColor ); - var fillColorSecondary = ( event.bgSecondaryColor || defaultColorSecondary ); - if ( event === selection.hoveredEvent.value ) { - fillColor = darker( fillColor, 0.8 ); - fillColorSecondary = darker( fillColorSecondary, 0.8 ); - } - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yTop-hBorder, yBottom+hBorder ); + let selectedEvents: OrderedSet = ui.selection.selectedEvents; - var startIndex = indexRgbas; - putQuadRgbas( rgbas, startIndex, fillColor ); - indexRgbas = putQuadRgbas( rgbasSecondary, startIndex, fillColorSecondary ); + // XXX Instead of estimating the number of events we will need to draw ahead of time + // XXX (difficult because selected events may be present in multiple lanes, so + // XXX selectedEvents.length might not be sufficient) just make enough space for all events. + // XXX Potentially quite inefficient with lots of events (and few selected events). + helper.ensureCapacity(lanes.numEvents); - // create a quad with relative coordinates - indexRelativeXys = putQuadXys(relativeXys, indexRelativeXys, 0.0, xWidthPixels, 0.0, yHeightPixels ); + let indexXys = 0; + let indexRgbas = 0; - // Set the fillPatternValue per vertex of the quad - var fillPatternValue : number = event.fillPattern; + for (let l = 0; l < lanes.length; l++) { + let lane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + let event = lane.event(e); - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; - fillPattern[indexFillPattern++] = fillPatternValue; + // check whether the event is selected and has limits defined + if (selectedEvents.hasId(event.eventGuid) && (hasval(event.startLimit_PMILLIS) || hasval(event.endLimit_PMILLIS))) { + let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport); + indexXys = indexes.indexXys; + indexRgbas = indexes.indexRgbas; + } } - - return { indexXys : indexXys, indexRgbas : indexRgbas, indexRelativeXys: indexRelativeXys, indexFillPattern: indexFillPattern }; } + + helper.paint(indexXys, indexRgbas, gl, viewport); }; - } + }; +} + + +export enum JointType { + BEVEL, MITER +} + +export interface TimelineEventBarsPainterOptions { + topMargin?: number; + bottomMargin?: number; + borderThickness?: number; + cornerType?: JointType; + defaultColor?: Color; + defaultBorderColor?: Color; + selectedBorderColor?: Color; + + // the size of the dashes when painting stippled event borders + dashLength?: number; + // the width of stripes in the painter fill + stripeWidth?: number; + // the width of secondary color stripes in the painter fill + stripeSecondaryWidth?: number; + // the slant of the stipes: 0 = horizontal, 1 = 45 degrees, -1 = 45 degrees backward + stripeSlant?: number; + // width in pixels of the antialiasing of the slant + featherWidth?: number; + + // minimum pixel width of the event bar + // when the timeline is zoomed out so that the event bar + // is smaller than this visible width, the event bar is hidden + minimumVisibleWidth?: number; +} + +export enum FillPattern { + solid = 0, + stripe = 1, + gradient = 2 +} + +function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { + let rowTopPadding = options.rowTopPadding; + let rowBottomPadding = options.rowBottomPadding; + let laneHeight = options.laneHeight; + + let topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); + let bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); + let borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); + let cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); + let defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); + let defaultColorSecondary = new Color(1, 1, 1, 1); + let minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); + + let stripeWidth = (hasval(barOpts) && hasval(barOpts.stripeWidth) ? barOpts.stripeWidth : 5); + let stripeSecondaryWidth = (hasval(barOpts) && hasval(barOpts.stripeSecondaryWidth) ? barOpts.stripeSecondaryWidth : 5); + let stripeSlant = (hasval(barOpts) && hasval(barOpts.stripeSlant) ? barOpts.stripeSlant : 1); + let featherWidth = (hasval(barOpts) && hasval(barOpts.featherWidth) ? barOpts.featherWidth : 2); + + let selection = ui.selection; + + let xyFrac_vColor_VERTSHADER = concatLines( + ' ', + ' attribute vec2 a_XyFrac; ', + ' attribute vec4 a_Color; ', + ' attribute vec4 a_ColorSecondary; ', + ' attribute vec2 a_relativeXy; ', + ' attribute float a_fillPattern; ', + ' ', + ' varying vec4 v_Color; ', + ' varying vec4 v_ColorSecondary; ', + ' varying vec2 v_relativeXy; ', + ' varying float v_fillPattern; ', + ' ', + ' void main( ) { ', + ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', + ' v_Color = a_Color; ', + ' v_ColorSecondary = a_ColorSecondary; ', + ' v_relativeXy = a_relativeXy; ', + ' v_fillPattern = a_fillPattern; ', + ' } ', + ' ' + ); + + let fillPattern_FRAGSHADER = concatLines( + ' #define PI 3.1415926535897932384626433832795 ', + ' ', + ' precision lowp float; ', + ' // the width in pixels of the first color stripe ', + ' uniform float u_stripeWidth; ', + ' // the width in pixels of the second color stripe ', + ' uniform float u_stripeSecondaryWidth; ', + ' // the slant of the stipes: 0 = horizontal, 1 = 45 degrees ', + ' uniform float u_slant; ', + ' // width in pixels of the antialiasing of the slant ', + ' uniform float u_featherWidth; ', + ' ', + ' varying vec4 v_Color; ', + ' varying vec4 v_ColorSecondary; ', + ' varying vec2 v_relativeXy; ', + ' varying float v_fillPattern; ', + ' ', + ' void pattern_stripe( ) { ', + ' float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth; ', + ' ', + ' // calculate the value indicating where we are in the stripe pattern ', + ' float stripeCoord = mod( v_relativeXy.x + u_slant * v_relativeXy.y , stripeWidthTotal ); ', + ' ', + ' // we are in the feather region beween the two stripes ', + ' if ( stripeCoord < u_featherWidth ) { ', + ' float diff = stripeCoord / u_featherWidth; ', + ' gl_FragColor = vec4 ( v_Color.xyz * diff + (1.0-diff) * v_ColorSecondary.xyz, 1.0 ); ', + ' } ', + ' // we are in the color 1 stripe ', + ' else if ( stripeCoord < u_stripeWidth ) { ', + ' gl_FragColor = v_Color; ', + ' } ', + ' // we are the feather region between the two stripes ', + ' else if ( stripeCoord < u_stripeWidth + u_featherWidth ) { ', + ' float diff = ( stripeCoord - u_stripeWidth ) / u_featherWidth; ', + ' gl_FragColor = vec4 ( v_Color.xyz * (1.0-diff) + diff * v_ColorSecondary.xyz, 1.0 ); ', + ' } ', + ' // we are in the color 2 stripe ', + ' else { ', + ' gl_FragColor = v_ColorSecondary; ', + ' } ', + ' } ', + ' ', + ' void pattern_gradient( ) { ', + ' float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth; ', + ' ', + ' // calculate the value indicating where we are in the stripe pattern ', + ' float stripeCoord = mod( v_relativeXy.x + u_slant * v_relativeXy.y , stripeWidthTotal ); ', + ' ', + ' float weightedCoord; ', + ' if ( stripeCoord < u_stripeWidth ) { ', + ' float slope = PI / u_stripeWidth; ', + ' weightedCoord = slope * stripeCoord; ', + ' } ', + ' else { ', + ' float slope = PI / u_stripeSecondaryWidth; ', + ' weightedCoord = PI + slope * ( stripeCoord - u_stripeWidth ); ', + ' } ', + ' ', + ' // sin wave domain: [0, stripeWidthTotal ] range: [0, 1] ', + ' float frac = sin( weightedCoord ) * 2.0 - 1.0; ', + ' ', + ' // mix primary and secondary colors based on gradient fraction ', + ' gl_FragColor = mix( v_Color, v_ColorSecondary, frac ); ', + ' } ', + ' ', + ' void pattern_solid( ) { ', + ' gl_FragColor = v_Color; ', + ' } ', + ' ', + ' void main( ) { ', + ' if ( v_fillPattern == 1.0 ) { ', + ' pattern_stripe( ); ', + ' } ', + ' else if ( v_fillPattern == 2.0 ) { ', + ' pattern_gradient( ); ', + ' } ', + ' else { ', + ' pattern_solid( ); ', + ' } ', + ' } ', + ' ', + ' ', + ' ' + ); + + let program = new Program(xyFrac_vColor_VERTSHADER, fillPattern_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let a_Color = new Attribute(program, 'a_Color'); + let a_ColorSecondary = new Attribute(program, 'a_ColorSecondary'); + let a_relativeXy = new Attribute(program, 'a_relativeXy'); + let a_fillPattern = new Attribute(program, 'a_fillPattern'); + + let u_stripeWidth = new Uniform1f(program, 'u_stripeWidth'); + let u_stripeSecondaryWidth = new Uniform1f(program, 'u_stripeSecondaryWidth'); + let u_slant = new Uniform1f(program, 'u_slant'); + let u_featherWidth = new Uniform1f(program, 'u_featherWidth'); + + let xys = new Float32Array(0); + let xysBuffer = newDynamicBuffer(); + + let rgbas = new Float32Array(0); + let rgbasBuffer = newDynamicBuffer(); + + let rgbasSecondary = new Float32Array(0); + let rgbasSecondaryBuffer = newDynamicBuffer(); + + let relativeXys = new Float32Array(0); + let relativeXysBuffer = newDynamicBuffer(); + + let fillPattern = new Float32Array(0); + let fillPatternBuffer = newDynamicBuffer(); + + return { + paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number) { + if (indexXys === 0 || indexRgbas === 0) return; + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + program.use(gl); + + u_slant.setData(gl, stripeSlant); + u_stripeWidth.setData(gl, stripeWidth); + u_stripeSecondaryWidth.setData(gl, stripeSecondaryWidth); + u_featherWidth.setData(gl, featherWidth); + + xysBuffer.setData(xys.subarray(0, indexXys)); + a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); + + rgbasBuffer.setData(rgbas.subarray(0, indexRgbas)); + a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT); + + rgbasSecondaryBuffer.setData(rgbasSecondary.subarray(0, indexRgbas)); + a_ColorSecondary.setDataAndEnable(gl, rgbasSecondaryBuffer, 4, GL.FLOAT); + + relativeXysBuffer.setData(relativeXys.subarray(0, indexRelativeXys)); + a_relativeXy.setDataAndEnable(gl, relativeXysBuffer, 2, GL.FLOAT); + + fillPatternBuffer.setData(fillPattern.subarray(0, indexFillPattern)); + a_fillPattern.setDataAndEnable(gl, fillPatternBuffer, 1, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2)); + + a_Color.disable(gl); + a_XyFrac.disable(gl); + a_ColorSecondary.disable(gl); + a_fillPattern.disable(gl); + a_relativeXy.disable(gl); + + program.endUse(gl); + }, + ensureCapacity: function (eventCount: number) { + let numVertices = (6 * (1 /*quads*/)) * eventCount; + xys = ensureCapacityFloat32(xys, 2 * numVertices); + rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); + rgbasSecondary = ensureCapacityFloat32(rgbasSecondary, 4 * numVertices); + relativeXys = ensureCapacityFloat32(relativeXys, 2 * numVertices); + fillPattern = ensureCapacityFloat32(fillPattern, numVertices); + }, + fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number): { indexXys: number; indexRgbas: number; indexRelativeXys: number; indexFillPattern: number; } { + let lane: TimelineLane = lanes.lane(laneIndex); + let event: TimelineEventModel = lane.event(eventIndex); + + let wBorder = borderThickness / viewport.w; + let hBorder = borderThickness / viewport.h; + + let _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; + let _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; + + let jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; + let yTop = (viewport.h - jTop) / viewport.h; + let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; + let yBottom = (viewport.h - jBottom) / viewport.h; + + let xLeft = timeAxis.tFrac(event.start_PMILLIS); + let xRight = timeAxis.tFrac(event.end_PMILLIS); + + let xWidthPixels = viewport.w * (xRight - xLeft); + let yHeightPixels = jTop - jBottom; + + if (!(xRight < 0 || xLeft > 1) && xWidthPixels > minimumVisibleWidth) { - function eventDashedBorderPainterHelper( barOpts : TimelineEventBarsPainterOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { - var rowTopPadding = options.rowTopPadding; - var rowBottomPadding = options.rowBottomPadding; - var laneHeight = options.laneHeight; - - var topMargin = ( hasval( barOpts ) && hasval( barOpts.topMargin ) ? barOpts.topMargin : 1.2 ); - var bottomMargin = ( hasval( barOpts ) && hasval( barOpts.bottomMargin ) ? barOpts.bottomMargin : 1.2 ); - var borderThickness = ( hasval( barOpts ) && hasval( barOpts.borderThickness ) ? barOpts.borderThickness : 2 ); - var cornerType = ( hasval( barOpts ) && hasval( barOpts.cornerType ) ? barOpts.cornerType : JointType.BEVEL ); - var defaultColor = ( hasval( barOpts ) && hasval( barOpts.defaultColor ) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes( 0.4 ) ); - var defaultBorderColor = ( hasval( barOpts ) && hasval( barOpts.defaultBorderColor ) ? barOpts.defaultBorderColor : null ); - var selectedBorderColor = ( hasval( barOpts ) && hasval( barOpts.selectedBorderColor ) ? barOpts.selectedBorderColor : options.timelineFgColor ); - var minimumVisibleWidth = ( hasval( barOpts ) && hasval( barOpts.minimumVisibleWidth ) ? barOpts.minimumVisibleWidth : 0 ); - var dashLength = ( hasval( barOpts ) && hasval( barOpts.dashLength ) ? barOpts.dashLength : 5 ); - var defaultSecondaryColor = new Color( 0, 0, 0, 0 ); - - var selection = ui.selection; - - var dashedBorder_VERTSHADER = concatLines( - ' ', - ' attribute vec2 a_XyFrac; ', - ' attribute vec4 a_Color; ', - ' attribute vec4 a_SecondaryColor; ', - ' attribute float a_LengthSoFar; ', - ' ', - ' varying vec4 v_Color; ', - ' varying vec4 v_SecondaryColor; ', - ' varying float f_LengthSoFar; ', - ' ', - ' void main( ) { ', - ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', - ' v_Color = a_Color; ', - ' v_SecondaryColor = a_SecondaryColor; ', - ' f_LengthSoFar = a_LengthSoFar; ', - ' } ', - ' ' - ); - - var varyingBorder_FRAGSHADER = concatLines( - ' ', - ' precision lowp float; ', - ' varying vec4 v_Color; ', - ' varying vec4 v_SecondaryColor; ', - ' varying float f_LengthSoFar; ', - ' //dashes are u_DashLength_PX pixels long ', - ' uniform float u_DashLength_PX; ', - ' ', - ' void main( ) { ', - ' gl_FragColor = v_Color; ', - ' ', - ' if (f_LengthSoFar > 0.0) { ', - ' float mod = mod(f_LengthSoFar, u_DashLength_PX * 2.0); ', - ' float alpha = 1.0; ', - ' if ( mod < u_DashLength_PX ) { ', - ' gl_FragColor = v_SecondaryColor; ', - ' } ', - ' else { ', - ' gl_FragColor = v_Color; ', - ' } ', - ' } ', - ' else { ', - ' gl_FragColor = v_Color; ', - ' } ', - ' } ', - ' ' - ); - - var program = new Program( dashedBorder_VERTSHADER, varyingBorder_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var a_Color = new Attribute( program, 'a_Color' ); - var a_SecondaryColor = new Attribute( program, 'a_SecondaryColor' ); - var a_LengthSoFar = new Attribute( program, 'a_LengthSoFar' ); - var u_DashLength_PX = new Uniform1f( program, 'u_DashLength_PX' ); - - var xys = new Float32Array( 0 ); - var xysBuffer = newDynamicBuffer( ); - - var rgbas = new Float32Array( 0 ); - var rgbasBuffer = newDynamicBuffer( ); - - var rgbasSecondary = new Float32Array( 0 ); - var rgbasSecondaryBuffer = newDynamicBuffer( ); - - var lengths = new Float32Array( 0 ); - var lengthsBuffer = newDynamicBuffer( ); - - return { - paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable, indexLengthSoFar : number ) { - if ( indexXys == 0 || indexRgbas == 0 ) return; - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - program.use( gl ); - u_DashLength_PX.setData( gl, dashLength ); - xysBuffer.setData( xys.subarray( 0, indexXys ) ); - a_XyFrac.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - rgbasBuffer.setData( rgbas.subarray( 0, indexRgbas ) ); - a_Color.setDataAndEnable( gl, rgbasBuffer, 4, GL.FLOAT ); - rgbasSecondaryBuffer.setData( rgbasSecondary.subarray( 0, indexRgbas ) ); - a_SecondaryColor.setDataAndEnable( gl, rgbasSecondaryBuffer, 4, GL.FLOAT ); - lengthsBuffer.setData( lengths.subarray( 0, indexLengthSoFar ) ); - a_LengthSoFar.setDataAndEnable( gl, lengthsBuffer, 1, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); - - a_Color.disable( gl ); - a_SecondaryColor.disable( gl ); - a_XyFrac.disable( gl ); - a_LengthSoFar.disable( gl ); - program.endUse( gl ); - }, - ensureCapacity: function( eventCount : number ) { - var numVertices; - switch ( cornerType ) { - case JointType.BEVEL: - numVertices = ( 6*( 4 /*quads*/ ) + 3*( 4 /*triangles*/ ) )*eventCount; - break; - - default: - numVertices = ( 6*( 4 /*quads*/ ) )*eventCount; - break; + // Fill + let fillColor = (event.bgColor || defaultColor); + let fillColorSecondary = (event.bgSecondaryColor || defaultColorSecondary); + if (event === selection.hoveredEvent.value) { + fillColor = darker(fillColor, 0.8); + fillColorSecondary = darker(fillColorSecondary, 0.8); } + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop - hBorder, yBottom + hBorder); - xys = ensureCapacityFloat32( xys, 2*numVertices ); - rgbas = ensureCapacityFloat32( rgbas, 4*numVertices ); - rgbasSecondary = ensureCapacityFloat32( rgbasSecondary, 4*numVertices ); - lengths = ensureCapacityFloat32 ( lengths, numVertices ); - }, - fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable, indexLengthSoFar : number ) : { indexXys : number; indexRgbas : number; indexLengthSoFar : number } { - var lane : TimelineLane = lanes.lane( laneIndex ); - var event : TimelineEventModel = lane.event( eventIndex ); - - var wBorder = borderThickness / viewport.w; - var hBorder = borderThickness / viewport.h; - - var _topMargin = hasval( event.topMargin ) ? event.topMargin : topMargin; - var _bottomMargin = hasval( event.bottomMargin ) ? event.bottomMargin : bottomMargin; - - var jTop = rowTopPadding + ( laneIndex )*laneHeight + _topMargin; - var yTop = ( viewport.h - jTop ) / viewport.h; - var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight - _bottomMargin; - var yBottom = ( viewport.h - jBottom ) / viewport.h; - - var xLeft = timeAxis.tFrac( event.start_PMILLIS ); - var xRight = timeAxis.tFrac( event.end_PMILLIS ); - - var widthPixels = viewport.w * ( xRight - xLeft ); - var heightPixels = jBottom - jTop; // confirmed jBottom > jTop - - var setLengthsVertical = function( bottomEdge, topEdge ) { - lengths[ indexLengthSoFar++ ] = topEdge; - lengths[ indexLengthSoFar++ ] = topEdge; - lengths[ indexLengthSoFar++ ] = bottomEdge; - lengths[ indexLengthSoFar++ ] = bottomEdge; - lengths[ indexLengthSoFar++ ] = topEdge; - lengths[ indexLengthSoFar++ ] = bottomEdge; - - // for convenience, return the length of the edge - return Math.abs(bottomEdge - topEdge ); - }; + let startIndex = indexRgbas; + putQuadRgbas(rgbas, startIndex, fillColor); + indexRgbas = putQuadRgbas(rgbasSecondary, startIndex, fillColorSecondary); - var setLengthsHorizontal = function( leftEdge, rightEdge ) { - lengths[ indexLengthSoFar++ ] = leftEdge; - lengths[ indexLengthSoFar++ ] = rightEdge; - lengths[ indexLengthSoFar++ ] = leftEdge; - lengths[ indexLengthSoFar++ ] = leftEdge; - lengths[ indexLengthSoFar++ ] = rightEdge; - lengths[ indexLengthSoFar++ ] = rightEdge; + // create a quad with relative coordinates + indexRelativeXys = putQuadXys(relativeXys, indexRelativeXys, 0.0, xWidthPixels, 0.0, yHeightPixels); - // for convenience, return the length of the edge - return Math.abs(leftEdge - rightEdge); - }; + // Set the fillPatternValue per vertex of the quad + let fillPatternValue: number = event.fillPattern; - var setLengthsTriangle = function( length ) { - lengths[ indexLengthSoFar++ ] = length; - lengths[ indexLengthSoFar++ ] = length; - lengths[ indexLengthSoFar++ ] = length; - } + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + fillPattern[indexFillPattern++] = fillPatternValue; + } - if ( !( xRight < 0 || xLeft > 1 ) && widthPixels > minimumVisibleWidth ) { + return { indexXys: indexXys, indexRgbas: indexRgbas, indexRelativeXys: indexRelativeXys, indexFillPattern: indexFillPattern }; + } + }; +} + +function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { + let rowTopPadding = options.rowTopPadding; + let rowBottomPadding = options.rowBottomPadding; + let laneHeight = options.laneHeight; + + let topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); + let bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); + let borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); + let cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); + let defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); + let defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); + let selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); + let minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); + let dashLength = (hasval(barOpts) && hasval(barOpts.dashLength) ? barOpts.dashLength : 5); + let defaultSecondaryColor = new Color(0, 0, 0, 0); + + let selection = ui.selection; + + let dashedBorder_VERTSHADER = concatLines( + ' ', + ' attribute vec2 a_XyFrac; ', + ' attribute vec4 a_Color; ', + ' attribute vec4 a_SecondaryColor; ', + ' attribute float a_LengthSoFar; ', + ' ', + ' varying vec4 v_Color; ', + ' varying vec4 v_SecondaryColor; ', + ' varying float f_LengthSoFar; ', + ' ', + ' void main( ) { ', + ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', + ' v_Color = a_Color; ', + ' v_SecondaryColor = a_SecondaryColor; ', + ' f_LengthSoFar = a_LengthSoFar; ', + ' } ', + ' ' + ); + + let varyingBorder_FRAGSHADER = concatLines( + ' ', + ' precision lowp float; ', + ' varying vec4 v_Color; ', + ' varying vec4 v_SecondaryColor; ', + ' varying float f_LengthSoFar; ', + ' //dashes are u_DashLength_PX pixels long ', + ' uniform float u_DashLength_PX; ', + ' ', + ' void main( ) { ', + ' gl_FragColor = v_Color; ', + ' ', + ' if (f_LengthSoFar > 0.0) { ', + ' float mod = mod(f_LengthSoFar, u_DashLength_PX * 2.0); ', + ' float alpha = 1.0; ', + ' if ( mod < u_DashLength_PX ) { ', + ' gl_FragColor = v_SecondaryColor; ', + ' } ', + ' else { ', + ' gl_FragColor = v_Color; ', + ' } ', + ' } ', + ' else { ', + ' gl_FragColor = v_Color; ', + ' } ', + ' } ', + ' ' + ); + + let program = new Program(dashedBorder_VERTSHADER, varyingBorder_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let a_Color = new Attribute(program, 'a_Color'); + let a_SecondaryColor = new Attribute(program, 'a_SecondaryColor'); + let a_LengthSoFar = new Attribute(program, 'a_LengthSoFar'); + let u_DashLength_PX = new Uniform1f(program, 'u_DashLength_PX'); + + let xys = new Float32Array(0); + let xysBuffer = newDynamicBuffer(); + + let rgbas = new Float32Array(0); + let rgbasBuffer = newDynamicBuffer(); + + let rgbasSecondary = new Float32Array(0); + let rgbasSecondaryBuffer = newDynamicBuffer(); + + let lengths = new Float32Array(0); + let lengthsBuffer = newDynamicBuffer(); + + return { + paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable, indexLengthSoFar: number) { + if (indexXys === 0 || indexRgbas === 0) return; + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + program.use(gl); + u_DashLength_PX.setData(gl, dashLength); + xysBuffer.setData(xys.subarray(0, indexXys)); + a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); + rgbasBuffer.setData(rgbas.subarray(0, indexRgbas)); + a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT); + rgbasSecondaryBuffer.setData(rgbasSecondary.subarray(0, indexRgbas)); + a_SecondaryColor.setDataAndEnable(gl, rgbasSecondaryBuffer, 4, GL.FLOAT); + lengthsBuffer.setData(lengths.subarray(0, indexLengthSoFar)); + a_LengthSoFar.setDataAndEnable(gl, lengthsBuffer, 1, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2)); + + a_Color.disable(gl); + a_SecondaryColor.disable(gl); + a_XyFrac.disable(gl); + a_LengthSoFar.disable(gl); + program.endUse(gl); + }, + ensureCapacity: function (eventCount: number) { + let numVertices; + switch (cornerType) { + case JointType.BEVEL: + numVertices = (6 * (4 /*quads*/) + 3 * (4 /*triangles*/)) * eventCount; + break; + + default: + numVertices = (6 * (4 /*quads*/)) * eventCount; + break; + } - // Border - var borderColor = ( event.borderColor || event.bgColor || defaultBorderColor ); - var borderSecondaryColor = ( event.borderSecondaryColor || defaultSecondaryColor ); - if ( selection.selectedEvents.hasValue( event ) ) { - borderColor = selectedBorderColor; - } - if ( borderColor ) { - switch ( cornerType ) { - case JointType.BEVEL: - // Quads + xys = ensureCapacityFloat32(xys, 2 * numVertices); + rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); + rgbasSecondary = ensureCapacityFloat32(rgbasSecondary, 4 * numVertices); + lengths = ensureCapacityFloat32(lengths, numVertices); + }, + fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable, indexLengthSoFar: number): { indexXys: number; indexRgbas: number; indexLengthSoFar: number } { + let lane: TimelineLane = lanes.lane(laneIndex); + let event: TimelineEventModel = lane.event(eventIndex); + + let wBorder = borderThickness / viewport.w; + let hBorder = borderThickness / viewport.h; + + let _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; + let _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; + + let jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; + let yTop = (viewport.h - jTop) / viewport.h; + let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; + let yBottom = (viewport.h - jBottom) / viewport.h; + + let xLeft = timeAxis.tFrac(event.start_PMILLIS); + let xRight = timeAxis.tFrac(event.end_PMILLIS); + + let widthPixels = viewport.w * (xRight - xLeft); + let heightPixels = jBottom - jTop; // confirmed jBottom > jTop + + let setLengthsVertical = function (bottomEdge: number, topEdge: number) { + lengths[indexLengthSoFar++] = topEdge; + lengths[indexLengthSoFar++] = topEdge; + lengths[indexLengthSoFar++] = bottomEdge; + lengths[indexLengthSoFar++] = bottomEdge; + lengths[indexLengthSoFar++] = topEdge; + lengths[indexLengthSoFar++] = bottomEdge; + + // for convenience, return the length of the edge + return Math.abs(bottomEdge - topEdge); + }; + + let setLengthsHorizontal = function (leftEdge: number, rightEdge: number) { + lengths[indexLengthSoFar++] = leftEdge; + lengths[indexLengthSoFar++] = rightEdge; + lengths[indexLengthSoFar++] = leftEdge; + lengths[indexLengthSoFar++] = leftEdge; + lengths[indexLengthSoFar++] = rightEdge; + lengths[indexLengthSoFar++] = rightEdge; + + // for convenience, return the length of the edge + return Math.abs(leftEdge - rightEdge); + }; + + let setLengthsTriangle = function (length: number) { + lengths[indexLengthSoFar++] = length; + lengths[indexLengthSoFar++] = length; + lengths[indexLengthSoFar++] = length; + } + if (!(xRight < 0 || xLeft > 1) && widthPixels > minimumVisibleWidth) { + + // Border + let borderColor = (event.borderColor || event.bgColor || defaultBorderColor); + let borderSecondaryColor = (event.borderSecondaryColor || defaultSecondaryColor); + if (selection.selectedEvents.hasValue(event)) { + borderColor = selectedBorderColor; + } + if (borderColor) { + let startIndex = 0; + switch (cornerType) { + case JointType.BEVEL: + // Quads + + // top edge + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop, yTop - hBorder); + indexXys = putUpperRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yBottom + hBorder, yBottom); + // right edge + indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop - hBorder, yBottom + hBorder); + indexXys = putLowerRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yTop, yTop - hBorder); + // bottom edge + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yBottom + hBorder, yBottom); + indexXys = putLowerLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yTop, yTop - hBorder); + // left edge + indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom + hBorder); + indexXys = putUpperLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yBottom + hBorder, yBottom); + + // Colors + startIndex = indexRgbas; + putRgbas(rgbas, startIndex, borderColor, 24); + indexRgbas = putRgbas(rgbasSecondary, startIndex, borderSecondaryColor, 24); + + // Colors + startIndex = indexRgbas; + putRgbas(rgbas, startIndex, borderColor, 12); + indexRgbas = putRgbas(rgbasSecondary, startIndex, borderSecondaryColor, 12); + + // Stipple + if (!event.isBorderDashed) { + setLengthsHorizontal(-1, -1); + setLengthsTriangle(-1); + setLengthsVertical(-1, -1); + setLengthsTriangle(-1); + setLengthsHorizontal(-1, -1); + setLengthsTriangle(-1); + setLengthsVertical(-1, -1); + setLengthsTriangle(-1); + } + else { + let cumulativeLength = 0; // top edge - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yTop, yTop-hBorder ); - indexXys = putUpperRightTriangleXys( xys, indexXys, xLeft, xLeft+wBorder, yBottom+hBorder, yBottom ); + cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); + setLengthsTriangle(cumulativeLength); // right edge - indexXys = putQuadXys( xys, indexXys, xRight-wBorder, xRight, yTop-hBorder, yBottom+hBorder ); - indexXys = putLowerRightTriangleXys( xys, indexXys, xLeft, xLeft+wBorder, yTop, yTop-hBorder ); + cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength); + setLengthsTriangle(cumulativeLength); // bottom edge - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yBottom+hBorder, yBottom ); - indexXys = putLowerLeftTriangleXys( xys, indexXys, xRight-wBorder, xRight, yTop, yTop-hBorder ); + cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); + setLengthsTriangle(cumulativeLength); // left edge - indexXys = putQuadXys( xys, indexXys, xLeft, xLeft+wBorder, yTop-hBorder, yBottom+hBorder ); - indexXys = putUpperLeftTriangleXys( xys, indexXys, xRight-wBorder, xRight, yBottom+hBorder, yBottom ); - - // Colors - var startIndex = indexRgbas; - putRgbas( rgbas, startIndex, borderColor, 24 ); - indexRgbas = putRgbas( rgbasSecondary, startIndex, borderSecondaryColor, 24 ); - - // Colors - startIndex = indexRgbas; - putRgbas( rgbas, startIndex, borderColor, 12 ); - indexRgbas = putRgbas( rgbasSecondary, startIndex, borderSecondaryColor, 12 ); - - // Stipple - if ( !event.isBorderDashed ) { - setLengthsHorizontal(-1, -1); - setLengthsTriangle( -1 ); - setLengthsVertical(-1, -1); - setLengthsTriangle( -1 ); - setLengthsHorizontal(-1, -1); - setLengthsTriangle( -1 ); - setLengthsVertical(-1, -1); - setLengthsTriangle( -1 ); - } - else { - var cumulativeLength = 0; - // top edge - cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); - setLengthsTriangle( cumulativeLength ); - // right edge - cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength); - setLengthsTriangle( cumulativeLength ); - // bottom edge - cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); - setLengthsTriangle( cumulativeLength ); - // left edge - cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels , cumulativeLength); - setLengthsTriangle( cumulativeLength ); - } - - break; - - default: + cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength); + setLengthsTriangle(cumulativeLength); + } + break; + + default: + + // top edge + indexXys = putQuadXys(xys, indexXys, xLeft, xRight - wBorder, yTop, yTop - hBorder); + // right edge + indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop, yBottom + hBorder); + // bottom edge + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight, yBottom + hBorder, yBottom); + // left edge + indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom); + // color + startIndex = indexRgbas; + putRgbas(rgbas, startIndex, borderColor, 24); + indexRgbas = putRgbas(rgbasSecondary, startIndex, borderSecondaryColor, 24); + + // Stipple + if (!event.isBorderDashed) { + setLengthsHorizontal(-1, -1); + setLengthsVertical(-1, -1); + setLengthsHorizontal(-1, -1); + setLengthsVertical(-1, -1); + } + else { + let cumulativeLength = 0; // top edge - indexXys = putQuadXys( xys, indexXys, xLeft, xRight-wBorder, yTop, yTop-hBorder ); + cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); // right edge - indexXys = Webglimpse.putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop, yBottom + hBorder); + cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength); // bottom edge - indexXys = Webglimpse.putQuadXys(xys, indexXys, xLeft + wBorder, xRight, yBottom + hBorder, yBottom); + cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); // left edge - indexXys = Webglimpse.putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom); - // color - var startIndex = indexRgbas; - putRgbas( rgbas, startIndex, borderColor, 24 ); - indexRgbas = putRgbas( rgbasSecondary, startIndex, borderSecondaryColor, 24 ); - - // Stipple - if ( !event.isBorderDashed ) { - setLengthsHorizontal(-1, -1); - setLengthsVertical(-1, -1); - setLengthsHorizontal(-1, -1); - setLengthsVertical(-1, -1); - } - else { - var cumulativeLength = 0; - // top edge - cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); - // right edge - cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength); - // bottom edge - cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels); - // left edge - cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels , cumulativeLength); - } - - break; - } + cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength); + } + + break; } } - - return { indexXys : indexXys, indexRgbas : indexRgbas, indexLengthSoFar : indexLengthSoFar }; } - }; - } - - export function newEventStripedBarsPainterFactory( barOpts? : TimelineEventBarsPainterOptions ) : TimelineEventsPainterFactory { - - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - - var helper = eventStripedBarPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); - - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - helper.ensureCapacity( lanes.numEvents ); - var indexXys = 0; - var indexRgbas = 0; - var indexRelativeXys = 0; - var indexFillPattern = 0; - - for ( var l = 0; l < lanes.length; l++ ) { - var lane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { - var event = lane.event( e ); - var indexes = helper.fillEvent( l, e, indexXys, indexRgbas, viewport, indexRelativeXys, indexFillPattern); - indexXys = indexes.indexXys; - indexRgbas = indexes.indexRgbas; - indexRelativeXys = indexes.indexRelativeXys; - indexFillPattern = indexes.indexFillPattern; - } + return { indexXys: indexXys, indexRgbas: indexRgbas, indexLengthSoFar: indexLengthSoFar }; + } + }; +} + +export function newEventStripedBarsPainterFactory(barOpts?: TimelineEventBarsPainterOptions): TimelineEventsPainterFactory { + + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { + + let helper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + helper.ensureCapacity(lanes.numEvents); + + let indexXys = 0; + let indexRgbas = 0; + let indexRelativeXys = 0; + let indexFillPattern = 0; + + for (let l = 0; l < lanes.length; l++) { + let lane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + let event = lane.event(e); + let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexRelativeXys, indexFillPattern); + indexXys = indexes.indexXys; + indexRgbas = indexes.indexRgbas; + indexRelativeXys = indexes.indexRelativeXys; + indexFillPattern = indexes.indexFillPattern; } + } - helper.paint( indexXys, indexRgbas, gl, viewport, indexRelativeXys, indexFillPattern); - }; + helper.paint(indexXys, indexRgbas, gl, viewport, indexRelativeXys, indexFillPattern); }; - } + }; +} - export function newEventDashedBordersPainterFactory( barOpts? : TimelineEventBarsPainterOptions ) : TimelineEventsPainterFactory { +export function newEventDashedBordersPainterFactory(barOpts?: TimelineEventBarsPainterOptions): TimelineEventsPainterFactory { - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - var helper = eventDashedBorderPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); + let helper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - helper.ensureCapacity( lanes.numEvents ); + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + helper.ensureCapacity(lanes.numEvents); - var indexXys = 0; - var indexRgbas = 0; - var indexLengthSoFar = 0; + let indexXys = 0; + let indexRgbas = 0; + let indexLengthSoFar = 0; - for ( var l = 0; l < lanes.length; l++ ) { - var lane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { - var event = lane.event( e ); - var indexes = helper.fillEvent( l, e, indexXys, indexRgbas, viewport, indexLengthSoFar ); - indexXys = indexes.indexXys; - indexRgbas = indexes.indexRgbas; - indexLengthSoFar = indexes.indexLengthSoFar; - } + for (let l = 0; l < lanes.length; l++) { + let lane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + let event = lane.event(e); + let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexLengthSoFar); + indexXys = indexes.indexXys; + indexRgbas = indexes.indexRgbas; + indexLengthSoFar = indexes.indexLengthSoFar; } + } - helper.paint( indexXys, indexRgbas, gl, viewport, indexLengthSoFar ); - }; + helper.paint(indexXys, indexRgbas, gl, viewport, indexLengthSoFar); }; - } + }; +} - export interface TimelineEventIconsPainterOptions { - topMargin? : number; - bottomMargin? : number; - vAlign? : number; - } +export interface TimelineEventIconsPainterOptions { + topMargin?: number; + bottomMargin?: number; + vAlign?: number; +} - function eventIconsPainterHelper( iconOpts : TimelineEventIconsPainterOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { +function eventIconsPainterHelper(iconOpts: TimelineEventIconsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - var rowTopPadding = options.rowTopPadding; - var rowBottomPadding = options.rowBottomPadding; - var laneHeight = options.laneHeight; + let rowTopPadding = options.rowTopPadding; + let rowBottomPadding = options.rowBottomPadding; + let laneHeight = options.laneHeight; - var topMargin = ( hasval( iconOpts ) && hasval( iconOpts.topMargin ) ? iconOpts.topMargin : 1.2 ); - var bottomMargin = ( hasval( iconOpts ) && hasval( iconOpts.bottomMargin ) ? iconOpts.bottomMargin : 1.2 ); - var vAlign = ( hasval( iconOpts ) && hasval( iconOpts.vAlign ) ? iconOpts.vAlign : 0.5 ); + let topMargin = (hasval(iconOpts) && hasval(iconOpts.topMargin) ? iconOpts.topMargin : 1.2); + let bottomMargin = (hasval(iconOpts) && hasval(iconOpts.bottomMargin) ? iconOpts.bottomMargin : 1.2); + let vAlign = (hasval(iconOpts) && hasval(iconOpts.vAlign) ? iconOpts.vAlign : 0.5); - var textureRenderer = new TextureRenderer( ); + let textureRenderer = new TextureRenderer(); - return { - textureRenderer : textureRenderer, - paintEvent: function( laneIndex : number, eventIndex : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - var lane : TimelineLane = lanes.lane( laneIndex ); - var event : TimelineEventModel = lane.event( eventIndex ); - var eventStyle = ui.eventStyle( event.styleGuid ); + return { + textureRenderer: textureRenderer, + paintEvent: function (laneIndex: number, eventIndex: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + let lane: TimelineLane = lanes.lane(laneIndex); + let event: TimelineEventModel = lane.event(eventIndex); + let eventStyle = ui.eventStyle(event.styleGuid); - var jTop = rowTopPadding + ( laneIndex )*laneHeight + topMargin; - var yFrac = ( viewport.h - jTop - ( 1.0 - vAlign )*( laneHeight - topMargin - bottomMargin ) ) / viewport.h; + let jTop = rowTopPadding + (laneIndex) * laneHeight + topMargin; + let yFrac = (viewport.h - jTop - (1.0 - vAlign) * (laneHeight - topMargin - bottomMargin)) / viewport.h; - for ( var n = 0; n < eventStyle.numIcons; n++ ) { - var icon = eventStyle.icon( n ); - var iconTime_PMILLIS = event.start_PMILLIS + icon.hPos*( event.end_PMILLIS - event.start_PMILLIS ); - var xFrac = timeAxis.tFrac( iconTime_PMILLIS ); - var w = icon.displayWidth / viewport.w; - if ( -w <= xFrac && xFrac <= 1+w ) { - var iconTexture = ui.loadImage( icon.url, function( ) { drawable.redraw( ); } ); - if ( iconTexture ) { - textureRenderer.draw( gl, iconTexture, xFrac, yFrac, { xAnchor: icon.hAlign, yAnchor: vAlign, width: icon.displayWidth, height: icon.displayHeight } ); - } + for (let n = 0; n < eventStyle.numIcons; n++) { + let icon = eventStyle.icon(n); + let iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS); + let xFrac = timeAxis.tFrac(iconTime_PMILLIS); + let w = icon.displayWidth / viewport.w; + if (-w <= xFrac && xFrac <= 1 + w) { + let iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); + if (iconTexture) { + textureRenderer.draw(gl, iconTexture, xFrac, yFrac, { xAnchor: icon.hAlign, yAnchor: vAlign, width: icon.displayWidth, height: icon.displayHeight }); } } } - }; - } + } + }; +} - export function newEventIconsPainterFactory( iconOpts? : TimelineEventIconsPainterOptions ) : TimelineEventsPainterFactory { +export function newEventIconsPainterFactory(iconOpts?: TimelineEventIconsPainterOptions): TimelineEventsPainterFactory { - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - var helper = eventIconsPainterHelper( iconOpts, drawable, timeAxis, lanes, ui, options ); + let helper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options); - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); - helper.textureRenderer.begin( gl, viewport ); - for ( var l = 0; l < lanes.length; l++ ) { - var lane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { - helper.paintEvent( l, e, gl, viewport ); - } + helper.textureRenderer.begin(gl, viewport); + for (let l = 0; l < lanes.length; l++) { + let lane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + helper.paintEvent(l, e, gl, viewport); } - helper.textureRenderer.end( gl ); - }; + } + helper.textureRenderer.end(gl); }; + }; +} + + + +export interface TimelineEventLabelOptions { + topMargin?: number; + bottomMargin?: number; + leftMargin?: number; + rightMargin?: number; + vAlign?: number; + spacing?: number; + extendBeyondBar?: boolean; + + // Options: + // 'force' always show text regardless of available space + // 'truncate' truncate text with '...' when space is insufficient + // 'show' show text if space exits, hide all the text if it cannot be displayed in its entirity + textMode?: string; + + iconsEnabled?: boolean; + // Can be a number, or 'imageSize', or 'auto' + iconsForceWidth?: any; + // Can be a number, or 'imageSize', or 'auto' + iconsForceHeight?: any; + iconsSizeFactor?: number; + + textEnabled?: boolean; + textDefaultColor?: Color; + textFont?: string; +} + +function calculateTextWidth(textEnabled: boolean, labelText: string, fgColor: Color, textDefaultColor: Color, + textTextures: TwoKeyCache, viewport: BoundsUnmodifiable) { + let wText = 0; + let textTexture; + if (textEnabled && labelText) { + let textColor = hasval(fgColor) ? fgColor : textDefaultColor; + textTexture = textTextures.value(textColor.rgbaString, labelText); + wText = textTexture.w / viewport.w; } + return { + wText: wText, + textTexture: textTexture + }; +} + +function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { + let rowTopPadding = options.rowTopPadding; + let rowBottomPadding = options.rowBottomPadding; + let laneHeight = options.laneHeight; + + let topMargin = (hasval(labelOpts) && hasval(labelOpts.topMargin) ? labelOpts.topMargin : 1.2); + let bottomMargin = (hasval(labelOpts) && hasval(labelOpts.bottomMargin) ? labelOpts.bottomMargin : 1.2); + let leftMargin = (hasval(labelOpts) && hasval(labelOpts.leftMargin) ? labelOpts.leftMargin : 4); + let rightMargin = (hasval(labelOpts) && hasval(labelOpts.rightMargin) ? labelOpts.rightMargin : 4); + let vAlign = (hasval(labelOpts) && hasval(labelOpts.vAlign) ? labelOpts.vAlign : 0.5); + let spacing = (hasval(labelOpts) && hasval(labelOpts.spacing) ? labelOpts.spacing : 3); + let extendBeyondBar = (hasval(labelOpts) && hasval(labelOpts.extendBeyondBar) ? labelOpts.extendBeyondBar : false); + let textMode = (hasval(labelOpts) && hasval(labelOpts.textMode) ? labelOpts.textMode : 'force'); + + // Icon options + let iconsEnabled = (hasval(labelOpts) && hasval(labelOpts.iconsEnabled) ? labelOpts.iconsEnabled : true); + let iconsForceWidth = (hasval(labelOpts) && hasval(labelOpts.iconsForceWidth) ? labelOpts.iconsForceWidth : 'auto'); + let iconsForceHeight = (hasval(labelOpts) && hasval(labelOpts.iconsForceHeight) ? labelOpts.iconsForceHeight : 'auto'); + let iconsSizeFactor = (hasval(labelOpts) && hasval(labelOpts.iconsSizeFactor) ? labelOpts.iconsSizeFactor : 1); + + // Text options + let textEnabled = (hasval(labelOpts) && hasval(labelOpts.textEnabled) ? labelOpts.textEnabled : true); + let textDefaultColor = (hasval(labelOpts) && hasval(labelOpts.textDefaultColor) ? labelOpts.textDefaultColor : options.timelineFgColor); + let textFont = (hasval(labelOpts) && hasval(labelOpts.textFont) ? labelOpts.textFont : options.timelineFont); + + // XXX: Old icon textures never get cleaned out + let iconTextures: StringMap = {}; + let textTextures = newTextTextureCache2(textFont); + let textureRenderer = new TextureRenderer(); + + return { + textTextures: textTextures, + textureRenderer: textureRenderer, + paintEvent: function (laneIndex: number, eventIndex: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + + let lane: TimelineLane = lanes.lane(laneIndex); + let event: TimelineEventModel = lane.event(eventIndex); + + let labelTopMargin = hasval(event.labelTopMargin) ? event.labelTopMargin : topMargin; + let labelBottomMargin = hasval(event.labelBottomMargin) ? event.labelBottomMargin : bottomMargin; + + let labelVAlign = hasval(event.labelVAlign) ? event.labelVAlign : vAlign; + let labelVPos = hasval(event.labelVPos) ? event.labelVPos : labelVAlign; + + let labelHAlign = hasval(event.labelHAlign) ? event.labelHAlign : 0; + let labelHPos = hasval(event.labelHPos) ? event.labelHPos : labelHAlign; + + let jTop = rowTopPadding + (laneIndex) * laneHeight + labelTopMargin; + let yFrac = (viewport.h - jTop - (1.0 - labelVAlign) * (laneHeight - labelTopMargin - labelBottomMargin)) / viewport.h; + + let xLeftMin = 2 / viewport.w; + let xRightMax = (viewport.w - 2) / viewport.w; + let wLeftIndent = leftMargin / viewport.w; + let wRightIndent = rightMargin / viewport.w; + + let xStart = timeAxis.tFrac(event.start_PMILLIS); + let xEnd = timeAxis.tFrac(event.end_PMILLIS); + + let wTotal = (xEnd - wRightIndent) - (xStart + wLeftIndent) + let wSpacing = (spacing / viewport.w); + + if (!(xEnd <= 0 || xStart > 1)) { + + let xLeft; + let xRight; + if (extendBeyondBar) { + if (eventIndex + 1 < lane.length) { + let nextEvent = lane.event(eventIndex + 1); + let nextStart_PMILLIS = effectiveEdges_PMILLIS(ui, nextEvent)[0]; + xRight = timeAxis.tFrac(nextStart_PMILLIS); + } + else { + xRight = xRightMax; + } + if (eventIndex - 1 >= 0) { + let previousEvent = lane.event(eventIndex - 1); + let previousEnd_PMILLIS = effectiveEdges_PMILLIS(ui, previousEvent)[1]; + xLeft = timeAxis.tFrac(previousEnd_PMILLIS); + } + else { + xLeft = xLeftMin; + } + } + else { + xRight = xEnd; + xLeft = xStart; + } - - export interface TimelineEventLabelOptions { - topMargin? : number; - bottomMargin? : number; - leftMargin? : number; - rightMargin? : number; - vAlign? : number; - spacing? : number; - extendBeyondBar?: boolean; - - // Options: - // 'force' always show text regardless of available space - // 'truncate' truncate text with '...' when space is insufficient - // 'show' show text if space exits, hide all the text if it cannot be displayed in its entirity - textMode? : string; - - iconsEnabled? : boolean; - // Can be a number, or 'imageSize', or 'auto' - iconsForceWidth? : any; - // Can be a number, or 'imageSize', or 'auto' - iconsForceHeight? : any; - iconsSizeFactor? : number; - - textEnabled? : boolean; - textDefaultColor? : Color; - textFont? : string; - } - - function calculateTextWidth(textEnabled: boolean, labelText: string, fgColor: Color, textDefaultColor: Color, - textTextures: TwoKeyCache, viewport: BoundsUnmodifiable) { - var wText = 0; - var textTexture; - if (textEnabled && labelText) { - var textColor = Webglimpse.hasval(fgColor) ? fgColor : textDefaultColor; - textTexture = textTextures.value(textColor.rgbaString, labelText); - wText = textTexture.w / viewport.w; - } - return { - wText: wText, - textTexture: textTexture - }; - } - - function eventLabelsPainterHelper( labelOpts : TimelineEventLabelOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { - var rowTopPadding = options.rowTopPadding; - var rowBottomPadding = options.rowBottomPadding; - var laneHeight = options.laneHeight; - - var topMargin = ( hasval( labelOpts ) && hasval( labelOpts.topMargin ) ? labelOpts.topMargin : 1.2 ); - var bottomMargin = ( hasval( labelOpts ) && hasval( labelOpts.bottomMargin ) ? labelOpts.bottomMargin : 1.2 ); - var leftMargin = ( hasval( labelOpts ) && hasval( labelOpts.leftMargin ) ? labelOpts.leftMargin : 4 ); - var rightMargin = ( hasval( labelOpts ) && hasval( labelOpts.rightMargin ) ? labelOpts.rightMargin : 4 ); - var vAlign = ( hasval( labelOpts ) && hasval( labelOpts.vAlign ) ? labelOpts.vAlign : 0.5 ); - var spacing = ( hasval( labelOpts ) && hasval( labelOpts.spacing ) ? labelOpts.spacing : 3 ); - var extendBeyondBar = ( hasval( labelOpts ) && hasval( labelOpts.extendBeyondBar ) ? labelOpts.extendBeyondBar : false ); - var textMode = ( hasval( labelOpts ) && hasval( labelOpts.textMode ) ? labelOpts.textMode : 'force' ); - - // Icon options - var iconsEnabled = ( hasval( labelOpts ) && hasval( labelOpts.iconsEnabled ) ? labelOpts.iconsEnabled : true ); - var iconsForceWidth = ( hasval( labelOpts ) && hasval( labelOpts.iconsForceWidth ) ? labelOpts.iconsForceWidth : 'auto' ); - var iconsForceHeight = ( hasval( labelOpts ) && hasval( labelOpts.iconsForceHeight ) ? labelOpts.iconsForceHeight : 'auto' ); - var iconsSizeFactor = ( hasval( labelOpts ) && hasval( labelOpts.iconsSizeFactor ) ? labelOpts.iconsSizeFactor : 1 ); - - // Text options - var textEnabled = ( hasval( labelOpts ) && hasval( labelOpts.textEnabled ) ? labelOpts.textEnabled : true ); - var textDefaultColor = ( hasval( labelOpts ) && hasval( labelOpts.textDefaultColor ) ? labelOpts.textDefaultColor : options.timelineFgColor ); - var textFont = ( hasval( labelOpts ) && hasval( labelOpts.textFont ) ? labelOpts.textFont : options.timelineFont ); - - // XXX: Old icon textures never get cleaned out - var iconTextures : StringMap = {}; - var textTextures = newTextTextureCache2( textFont ); - var textureRenderer = new TextureRenderer( ); - - return { - textTextures : textTextures, - textureRenderer : textureRenderer, - paintEvent: function( laneIndex : number, eventIndex : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - - var lane : TimelineLane = lanes.lane( laneIndex ); - var event : TimelineEventModel = lane.event( eventIndex ); - - var labelTopMargin = hasval( event.labelTopMargin ) ? event.labelTopMargin : topMargin; - var labelBottomMargin = hasval( event.labelBottomMargin ) ? event.labelBottomMargin : bottomMargin; - - var labelVAlign = hasval( event.labelVAlign ) ? event.labelVAlign : vAlign; - var labelVPos = hasval( event.labelVPos ) ? event.labelVPos : labelVAlign; - - var labelHAlign = hasval( event.labelHAlign ) ? event.labelHAlign : 0; - var labelHPos = hasval( event.labelHPos ) ? event.labelHPos : labelHAlign; - - var jTop = rowTopPadding + ( laneIndex )*laneHeight + labelTopMargin; - var yFrac = ( viewport.h - jTop - ( 1.0 - labelVAlign )*( laneHeight - labelTopMargin - labelBottomMargin ) ) / viewport.h; - - var xLeftMin = 2 / viewport.w; - var xRightMax = ( viewport.w - 2 ) / viewport.w; - var wLeftIndent = leftMargin / viewport.w; - var wRightIndent = rightMargin / viewport.w; - - var xStart = timeAxis.tFrac( event.start_PMILLIS ); - var xEnd = timeAxis.tFrac( event.end_PMILLIS ); - - var wTotal = ( xEnd - wRightIndent ) - ( xStart + wLeftIndent ) - var wSpacing = ( spacing / viewport.w ); - - if ( !( xEnd <= 0 || xStart > 1 ) ) { - - var xLeft; - var xRight; - if ( extendBeyondBar ) { - if ( eventIndex+1 < lane.length ) { - var nextEvent = lane.event( eventIndex+1 ); - var nextStart_PMILLIS = effectiveEdges_PMILLIS( ui, nextEvent )[ 0 ]; - xRight = timeAxis.tFrac( nextStart_PMILLIS ); + // calculate Text width + let calculatedTextWidth = calculateTextWidth(textEnabled, event.label, event.fgColor, textDefaultColor, textTextures, viewport); + let wText = calculatedTextWidth.wText; + let textTexture = calculatedTextWidth.textTexture; + + // calculate Icon width (and start load if necessary) + let wIcon = 0; + let wIconPlusSpacing = 0; + let iconWidth; + let iconHeight; + let iconTexture; + if (iconsEnabled && event.labelIcon) { + iconTexture = iconTextures[event.labelIcon]; + if (hasval(iconTexture)) { + iconWidth = (isNumber(iconsForceWidth) ? iconsForceWidth : (iconsForceWidth === 'imageSize' ? iconTexture.w : null)); + iconHeight = (isNumber(iconsForceHeight) ? iconsForceHeight : (iconsForceHeight === 'imageSize' ? iconTexture.h : null)); + + let wIconKnown = hasval(iconWidth); + let hIconKnown = hasval(iconHeight); + if (!wIconKnown && !hIconKnown) { + iconHeight = Math.round(iconsSizeFactor * (laneHeight - labelTopMargin - labelBottomMargin)); + iconWidth = iconTexture.w * iconHeight / iconTexture.h; } - else { - xRight = xRightMax; + else if (!wIconKnown) { + iconHeight = Math.round(iconsSizeFactor * iconHeight); + iconWidth = iconTexture.w * iconHeight / iconTexture.h; } - - if ( eventIndex-1 >= 0 ) { - var previousEvent = lane.event( eventIndex-1 ); - var previousEnd_PMILLIS = effectiveEdges_PMILLIS( ui, previousEvent )[ 1 ]; - xLeft = timeAxis.tFrac( previousEnd_PMILLIS ); + else if (!hIconKnown) { + iconWidth = Math.round(iconsSizeFactor * iconWidth); + iconHeight = iconTexture.h * iconWidth / iconTexture.w; } else { - xLeft = xLeftMin; + iconWidth = Math.round(iconsSizeFactor * iconWidth); + iconHeight = Math.round(iconsSizeFactor * iconHeight); } - } - else { - xRight = xEnd; - xLeft = xStart; - } - // calculate Text width - var calculatedTextWidth = calculateTextWidth(textEnabled, event.label, event.fgColor, textDefaultColor, textTextures, viewport); - var wText = calculatedTextWidth.wText; - var textTexture = calculatedTextWidth.textTexture; - - // calculate Icon width (and start load if necessary) - var wIcon = 0; - var wIconPlusSpacing = 0; - var iconWidth; - var iconHeight; - var iconTexture; - if ( iconsEnabled && event.labelIcon ) { - iconTexture = iconTextures[ event.labelIcon ]; - if ( hasval( iconTexture ) ) { - iconWidth = ( isNumber( iconsForceWidth ) ? iconsForceWidth : ( iconsForceWidth === 'imageSize' ? iconTexture.w : null ) ); - iconHeight = ( isNumber( iconsForceHeight ) ? iconsForceHeight : ( iconsForceHeight === 'imageSize' ? iconTexture.h : null ) ); - - var wIconKnown = hasval( iconWidth ); - var hIconKnown = hasval( iconHeight ); - if ( !wIconKnown && !hIconKnown ) { - iconHeight = Math.round( iconsSizeFactor * ( laneHeight - labelTopMargin - labelBottomMargin ) ); - iconWidth = iconTexture.w * iconHeight / iconTexture.h; - } - else if ( !wIconKnown ) { - iconHeight = Math.round( iconsSizeFactor * iconHeight ); - iconWidth = iconTexture.w * iconHeight / iconTexture.h; - } - else if ( !hIconKnown ) { - iconWidth = Math.round( iconsSizeFactor * iconWidth ); - iconHeight = iconTexture.h * iconWidth / iconTexture.w; - } - else { - iconWidth = Math.round( iconsSizeFactor * iconWidth ); - iconHeight = Math.round( iconsSizeFactor * iconHeight ); - } - - wIcon = ( iconWidth / viewport.w ); + wIcon = (iconWidth / viewport.w); - wIconPlusSpacing = wIcon + wSpacing; - } - // A null in the map means a fetch has already been initiated - // ... either it is still in progress, or it has already failed - else if ( iconTexture !== null ) { - iconTextures[ event.labelIcon ] = null; - - var image = new Image( ); - image.onload = ( function( url, img ) { - return function( ) { - var wImage = img.naturalWidth; - var hImage = img.naturalHeight; - iconTextures[ url ] = new Texture2D( wImage, hImage, GL.LINEAR, GL.LINEAR, function( g ) { - g.drawImage( img, 0, 0 ); - } ); - drawable.redraw( ); - }; - } )( event.labelIcon, image ); - image.src = event.labelIcon; - } + wIconPlusSpacing = wIcon + wSpacing; } + // A null in the map means a fetch has already been initiated + // ... either it is still in progress, or it has already failed + else if (iconTexture !== null) { + iconTextures[event.labelIcon] = null; + + let image = new Image(); + image.onload = (function (url, img) { + return function () { + let wImage = img.naturalWidth; + let hImage = img.naturalHeight; + iconTextures[url] = new Texture2D(wImage, hImage, GL.LINEAR, GL.LINEAR, function (g) { + g.drawImage(img, 0, 0); + }); + drawable.redraw(); + }; + })(event.labelIcon, image); + image.src = event.labelIcon; + } + } - // NOTE: With extendBeyondBar=true, we detect when there is insufficient space between the current event - // and those to either side to display the text + icon. However, if one event has right aligned text - // and the other has left aligned text, so both text labels overlap into the same space between the - // events, we don't currently try to detect that. + // NOTE: With extendBeyondBar=true, we detect when there is insufficient space between the current event + // and those to either side to display the text + icon. However, if one event has right aligned text + // and the other has left aligned text, so both text labels overlap into the same space between the + // events, we don't currently try to detect that. - // Determine whether there is enough space to display both text and icon, or only icon, or neither + // Determine whether there is enough space to display both text and icon, or only icon, or neither - // coordinates of the start edge of the icon + label - var xStartLabel = xStart + wLeftIndent - ( wSpacing + wIcon + wText ) * labelHPos + ( wTotal ) * labelHAlign; - // coordinates of the end edge of the icon + label - var xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); + // coordinates of the start edge of the icon + label + let xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; + // coordinates of the end edge of the icon + label + let xEndLabel = xStartLabel + (wSpacing + wIcon + wText); - // adjust xStartLabel and xEndLabel if they fall off the screen - if ( xStartLabel < xLeftMin ) { - xStartLabel = xLeftMin; - xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); - } - else if ( xEndLabel > xRightMax ) { - xEndLabel = xRightMax; - xStartLabel = xEndLabel - ( wSpacing + wIcon + wText ); - } + // adjust xStartLabel and xEndLabel if they fall off the screen + if (xStartLabel < xLeftMin) { + xStartLabel = xLeftMin; + xEndLabel = xStartLabel + (wSpacing + wIcon + wText); + } + else if (xEndLabel > xRightMax) { + xEndLabel = xRightMax; + xStartLabel = xEndLabel - (wSpacing + wIcon + wText); + } - if (textMode === 'truncate') { - var labelText = event.label; - while (!!labelText && labelText !== "...") { - if (xEndLabel > xRight || xStartLabel < xLeft) { - // there is not enough room for the text, begin truncating the text - labelText = labelText.substring(0, labelText.length - 4).concat("..."); - var calculatedTextWidth = calculateTextWidth(textEnabled, labelText, event.fgColor, textDefaultColor, textTextures, viewport); - wText = calculatedTextWidth.wText; - textTexture = calculatedTextWidth.textTexture; - - xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + wTotal * labelHAlign; - // coordinates of the end edge of the icon + label - xEndLabel = xStartLabel + (wSpacing + wIcon + wText); - // adjust xStartLabel and xEndLabel if they fall off the screen - if (xStartLabel < xLeftMin) { - xStartLabel = xLeftMin; - xEndLabel = xStartLabel + (wSpacing + wIcon + wText); - } else if (xEndLabel > xRightMax) { - xEndLabel = xRightMax; - xStartLabel = xEndLabel - (wSpacing + wIcon + wText); - } - } else { - break; - } - } - if (!labelText || labelText === "...") { - wText = 0; - textTexture = null; - } - } else if (textMode === 'show') { - if ( xEndLabel > xRight || xStartLabel < xLeft ) { - // there is not enough room for the text, try with just the icon - wText = 0; - textTexture = null; - - // coordinates of the start edge of the icon + label - var xStartLabel = xStart + wLeftIndent - ( wIcon ) * labelHPos + ( wTotal ) * labelHAlign; + if (textMode === 'truncate') { + let labelText = event.label; + while (!!labelText && labelText !== "...") { + if (xEndLabel > xRight || xStartLabel < xLeft) { + // there is not enough room for the text, begin truncating the text + labelText = labelText.substring(0, labelText.length - 4).concat("..."); + let calculatedTextWidth = calculateTextWidth(textEnabled, labelText, event.fgColor, textDefaultColor, textTextures, viewport); + wText = calculatedTextWidth.wText; + textTexture = calculatedTextWidth.textTexture; + + xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + wTotal * labelHAlign; // coordinates of the end edge of the icon + label - var xEndLabel = xStartLabel + ( wIcon ); - + xEndLabel = xStartLabel + (wSpacing + wIcon + wText); // adjust xStartLabel and xEndLabel if they fall off the screen - if ( xStartLabel < xLeftMin ) { + if (xStartLabel < xLeftMin) { xStartLabel = xLeftMin; - xEndLabel = xStartLabel + ( wIcon ); - } - else if ( xEndLabel > xRightMax ) { + xEndLabel = xStartLabel + (wSpacing + wIcon + wText); + } else if (xEndLabel > xRightMax) { xEndLabel = xRightMax; - xStartLabel = xEndLabel - ( wIcon ); - } - - // if there is still not enough room, don't show anything - if ( xEndLabel > xRight || xStartLabel < xLeft ) { - wIcon = 0; - iconTexture = null; + xStartLabel = xEndLabel - (wSpacing + wIcon + wText); } + } else { + break; } } - - // Icons - if ( hasval( iconTexture ) ) { - // coordinates of the start edge of the icon + label - var xStartLabel = xStart + wLeftIndent - ( wSpacing + wIcon + wText ) * labelHPos + ( wTotal ) * labelHAlign; - - // coordinates of the end edge of the icon + label - var xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); - - if ( xStartLabel < xLeftMin ) { - textureRenderer.draw( gl, iconTexture, xLeftMin, yFrac, { xAnchor: 0, yAnchor: labelVPos, width: iconWidth, height: iconHeight } ); - } - else if ( xEndLabel > xRightMax ) { - textureRenderer.draw( gl, iconTexture, xRightMax - wSpacing - wText, yFrac, { xAnchor: 1, yAnchor: labelVPos, width: iconWidth, height: iconHeight } ); - } - else { - var xFrac = xStart + wLeftIndent - ( wSpacing + wText ) * labelHPos + ( wTotal ) * labelHAlign; - textureRenderer.draw( gl, iconTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: labelVPos, width: iconWidth, height: iconHeight } ); - } + if (!labelText || labelText === "...") { + wText = 0; + textTexture = null; } + } else if (textMode === 'show') { + if (xEndLabel > xRight || xStartLabel < xLeft) { + // there is not enough room for the text, try with just the icon + wText = 0; + textTexture = null; - // Text - if ( hasval( textTexture ) ) { // coordinates of the start edge of the icon + label - var xStartLabel = xStart + wLeftIndent - ( wSpacing + wIcon + wText ) * labelHPos + ( wTotal ) * labelHAlign; - + let xStartLabel = xStart + wLeftIndent - (wIcon) * labelHPos + (wTotal) * labelHAlign; // coordinates of the end edge of the icon + label - var xEndLabel = xStartLabel + ( wSpacing + wIcon + wText ); + let xEndLabel = xStartLabel + (wIcon); - if ( xStartLabel < xLeftMin ) { - textureRenderer.draw( gl, textTexture, xLeftMin + wSpacing + wIcon, yFrac, { xAnchor: 0, yAnchor: textTexture.yAnchor( labelVPos ) } ); + // adjust xStartLabel and xEndLabel if they fall off the screen + if (xStartLabel < xLeftMin) { + xStartLabel = xLeftMin; + xEndLabel = xStartLabel + (wIcon); } - else if ( xEndLabel > xRightMax ) { - textureRenderer.draw( gl, textTexture, xRightMax, yFrac, { xAnchor: 1, yAnchor: textTexture.yAnchor( labelVPos ) } ); + else if (xEndLabel > xRightMax) { + xEndLabel = xRightMax; + xStartLabel = xEndLabel - (wIcon); } - else { - var xFrac = xStart + wLeftIndent + ( wIconPlusSpacing ) * ( 1 - labelHPos ) + ( wTotal ) * labelHAlign; - textureRenderer.draw( gl, textTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: textTexture.yAnchor( labelVPos ) } ); + + // if there is still not enough room, don't show anything + if (xEndLabel > xRight || xStartLabel < xLeft) { + wIcon = 0; + iconTexture = null; } } } - } - }; - } - export function newEventLabelsPainterFactory( labelOpts? : TimelineEventLabelOptions ) : TimelineEventsPainterFactory { - - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - - var helper = eventLabelsPainterHelper( labelOpts, drawable, timeAxis, lanes, ui, options ); + // Icons + if (hasval(iconTexture)) { + // coordinates of the start edge of the icon + label + let xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); + // coordinates of the end edge of the icon + label + let xEndLabel = xStartLabel + (wSpacing + wIcon + wText); - helper.textTextures.resetTouches( ); - helper.textureRenderer.begin( gl, viewport ); - for ( var l = 0; l < lanes.length; l++ ) { - var lane : TimelineLane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { - helper.paintEvent( l, e, gl, viewport ); + if (xStartLabel < xLeftMin) { + textureRenderer.draw(gl, iconTexture, xLeftMin, yFrac, { xAnchor: 0, yAnchor: labelVPos, width: iconWidth, height: iconHeight }); + } + else if (xEndLabel > xRightMax) { + textureRenderer.draw(gl, iconTexture, xRightMax - wSpacing - wText, yFrac, { xAnchor: 1, yAnchor: labelVPos, width: iconWidth, height: iconHeight }); + } + else { + let xFrac = xStart + wLeftIndent - (wSpacing + wText) * labelHPos + (wTotal) * labelHAlign; + textureRenderer.draw(gl, iconTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: labelVPos, width: iconWidth, height: iconHeight }); } } - helper.textureRenderer.end( gl ); - helper.textTextures.retainTouched( ); - }; - }; - } - - - function eventBarPainterHelper( barOpts : TimelineEventBarsPainterOptions, drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) { - var rowTopPadding = options.rowTopPadding; - var rowBottomPadding = options.rowBottomPadding; - var laneHeight = options.laneHeight; - - var topMargin = ( hasval( barOpts ) && hasval( barOpts.topMargin ) ? barOpts.topMargin : 1.2 ); - var bottomMargin = ( hasval( barOpts ) && hasval( barOpts.bottomMargin ) ? barOpts.bottomMargin : 1.2 ); - var borderThickness = ( hasval( barOpts ) && hasval( barOpts.borderThickness ) ? barOpts.borderThickness : 2 ); - var cornerType = ( hasval( barOpts ) && hasval( barOpts.cornerType ) ? barOpts.cornerType : JointType.BEVEL ); - var defaultColor = ( hasval( barOpts ) && hasval( barOpts.defaultColor ) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes( 0.4 ) ); - var defaultBorderColor = ( hasval( barOpts ) && hasval( barOpts.defaultBorderColor ) ? barOpts.defaultBorderColor : null ); - var selectedBorderColor = ( hasval( barOpts ) && hasval( barOpts.selectedBorderColor ) ? barOpts.selectedBorderColor : options.timelineFgColor ); - var minimumVisibleWidth = ( hasval( barOpts ) && hasval( barOpts.minimumVisibleWidth ) ? barOpts.minimumVisibleWidth : 0 ); - - var selection = ui.selection; - - var xyFrac_vColor_VERTSHADER = concatLines( - ' ', - ' attribute vec2 a_XyFrac; ', - ' attribute vec4 a_Color; ', - ' ', - ' varying vec4 v_Color; ', - ' ', - ' void main( ) { ', - ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', - ' v_Color = a_Color; ', - ' } ', - ' ' - ); - - var program = new Program( xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var a_Color = new Attribute( program, 'a_Color' ); - - var xys = new Float32Array( 0 ); - var xysBuffer = newDynamicBuffer( ); - - var rgbas = new Float32Array( 0 ); - var rgbasBuffer = newDynamicBuffer( ); - - return { - paint( indexXys : number, indexRgbas : number, gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( indexXys == 0 || indexRgbas == 0 ) return; - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - program.use( gl ); - xysBuffer.setData( xys.subarray( 0, indexXys ) ); - a_XyFrac.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); - rgbasBuffer.setData( rgbas.subarray( 0, indexRgbas ) ); - a_Color.setDataAndEnable( gl, rgbasBuffer, 4, GL.FLOAT ); - - gl.drawArrays( GL.TRIANGLES, 0, Math.floor( indexXys / 2 ) ); - - a_Color.disable( gl ); - a_XyFrac.disable( gl ); - program.endUse( gl ); - }, - ensureCapacity: function( eventCount : number ) { - var numVertices; - switch ( cornerType ) { - case JointType.BEVEL: - numVertices = ( 6*( 5 /*quads*/ ) + 3*( 4 /*triangles*/ ) )*eventCount; - break; - - default: - numVertices = ( 6*( 5 /*quads*/ ) )*eventCount; - break; - } - - xys = ensureCapacityFloat32( xys, 2*numVertices ); - rgbas = ensureCapacityFloat32( rgbas, 4*numVertices ); - }, - fillEvent: function( laneIndex : number, eventIndex : number, indexXys : number, indexRgbas : number, viewport : BoundsUnmodifiable ) : { indexXys : number; indexRgbas : number } { - var lane : TimelineLane = lanes.lane( laneIndex ); - var event : TimelineEventModel = lane.event( eventIndex ); - var wBorder = borderThickness / viewport.w; - var hBorder = borderThickness / viewport.h; + // Text + if (hasval(textTexture)) { + // coordinates of the start edge of the icon + label + let xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; - var _topMargin = hasval( event.topMargin ) ? event.topMargin : topMargin; - var _bottomMargin = hasval( event.bottomMargin ) ? event.bottomMargin : bottomMargin; + // coordinates of the end edge of the icon + label + let xEndLabel = xStartLabel + (wSpacing + wIcon + wText); - var jTop = rowTopPadding + ( laneIndex )*laneHeight + _topMargin; - var yTop = ( viewport.h - jTop ) / viewport.h; - var jBottom = rowTopPadding + ( laneIndex + 1 )*laneHeight - _bottomMargin; - var yBottom = ( viewport.h - jBottom ) / viewport.h; + if (xStartLabel < xLeftMin) { + textureRenderer.draw(gl, textTexture, xLeftMin + wSpacing + wIcon, yFrac, { xAnchor: 0, yAnchor: textTexture.yAnchor(labelVPos) }); + } + else if (xEndLabel > xRightMax) { + textureRenderer.draw(gl, textTexture, xRightMax, yFrac, { xAnchor: 1, yAnchor: textTexture.yAnchor(labelVPos) }); + } + else { + let xFrac = xStart + wLeftIndent + (wIconPlusSpacing) * (1 - labelHPos) + (wTotal) * labelHAlign; + textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: textTexture.yAnchor(labelVPos) }); + } + } + } + } + }; +} - var xLeft = timeAxis.tFrac( event.start_PMILLIS ); - var xRight = timeAxis.tFrac( event.end_PMILLIS ); +export function newEventLabelsPainterFactory(labelOpts?: TimelineEventLabelOptions): TimelineEventsPainterFactory { - var xWidthPixels = viewport.w * ( xRight - xLeft ); + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - if ( !( xRight < 0 || xLeft > 1 ) && xWidthPixels > minimumVisibleWidth ) { + let helper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options); - // Fill - var fillColor = ( event.bgColor || defaultColor ); - if ( event === selection.hoveredEvent.value ) { - fillColor = darker( fillColor, 0.8 ); - } - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yTop-hBorder, yBottom+hBorder ); - indexRgbas = putQuadRgbas( rgbas, indexRgbas, fillColor ); + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); - // Border - var borderColor = ( event.borderColor || ( event.bgColor ? fillColor : null ) || defaultBorderColor || fillColor ); - if ( selection.selectedEvents.hasValue( event ) ) { - borderColor = selectedBorderColor; - } - if ( borderColor ) { - switch ( cornerType ) { - case JointType.BEVEL: - // Quads - indexXys = putQuadXys( xys, indexXys, xLeft, xLeft+wBorder, yTop-hBorder, yBottom+hBorder ); - indexXys = putQuadXys( xys, indexXys, xRight-wBorder, xRight, yTop-hBorder, yBottom+hBorder ); - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yTop, yTop-hBorder ); - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight-wBorder, yBottom+hBorder, yBottom ); - indexRgbas = putRgbas( rgbas, indexRgbas, borderColor, 24 ); - // Triangles - indexXys = putLowerLeftTriangleXys( xys, indexXys, xRight-wBorder, xRight, yTop, yTop-hBorder ); - indexXys = putUpperLeftTriangleXys( xys, indexXys, xRight-wBorder, xRight, yBottom+hBorder, yBottom ); - indexXys = putUpperRightTriangleXys( xys, indexXys, xLeft, xLeft+wBorder, yBottom+hBorder, yBottom ); - indexXys = putLowerRightTriangleXys( xys, indexXys, xLeft, xLeft+wBorder, yTop, yTop-hBorder ); - indexRgbas = putRgbas( rgbas, indexRgbas, borderColor, 12 ); - break; - - default: - indexXys = putQuadXys( xys, indexXys, xLeft, xRight-wBorder, yTop, yTop-hBorder ); - indexXys = putQuadXys( xys, indexXys, xRight-wBorder, xRight, yTop, yBottom+hBorder ); - indexXys = putQuadXys( xys, indexXys, xLeft+wBorder, xRight, yBottom+hBorder, yBottom ); - indexXys = putQuadXys( xys, indexXys, xLeft, xLeft+wBorder, yTop-hBorder, yBottom ); - indexRgbas = putRgbas( rgbas, indexRgbas, borderColor, 24 ); - break; - } - } + helper.textTextures.resetTouches(); + helper.textureRenderer.begin(gl, viewport); + for (let l = 0; l < lanes.length; l++) { + let lane: TimelineLane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + helper.paintEvent(l, e, gl, viewport); } - - return { indexXys : indexXys, indexRgbas : indexRgbas }; } + helper.textureRenderer.end(gl); + helper.textTextures.retainTouched(); }; - } + }; +} + + +function eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { + let rowTopPadding = options.rowTopPadding; + let rowBottomPadding = options.rowBottomPadding; + let laneHeight = options.laneHeight; + + let topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); + let bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); + let borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); + let cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); + let defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); + let defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); + let selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); + let minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); + + let selection = ui.selection; + + let xyFrac_vColor_VERTSHADER = concatLines( + ' ', + ' attribute vec2 a_XyFrac; ', + ' attribute vec4 a_Color; ', + ' ', + ' varying vec4 v_Color; ', + ' ', + ' void main( ) { ', + ' gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 ); ', + ' v_Color = a_Color; ', + ' } ', + ' ' + ); + + let program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let a_Color = new Attribute(program, 'a_Color'); + + let xys = new Float32Array(0); + let xysBuffer = newDynamicBuffer(); + + let rgbas = new Float32Array(0); + let rgbasBuffer = newDynamicBuffer(); + + return { + paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + if (indexXys === 0 || indexRgbas === 0) return; + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + program.use(gl); + xysBuffer.setData(xys.subarray(0, indexXys)); + a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); + rgbasBuffer.setData(rgbas.subarray(0, indexRgbas)); + a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2)); + + a_Color.disable(gl); + a_XyFrac.disable(gl); + program.endUse(gl); + }, + ensureCapacity: function (eventCount: number) { + let numVertices; + switch (cornerType) { + case JointType.BEVEL: + numVertices = (6 * (5 /*quads*/) + 3 * (4 /*triangles*/)) * eventCount; + break; + + default: + numVertices = (6 * (5 /*quads*/)) * eventCount; + break; + } + xys = ensureCapacityFloat32(xys, 2 * numVertices); + rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); + }, + fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable): { indexXys: number; indexRgbas: number } { + let lane: TimelineLane = lanes.lane(laneIndex); + let event: TimelineEventModel = lane.event(eventIndex); - export function newEventBarsPainterFactory( barOpts? : TimelineEventBarsPainterOptions ) : TimelineEventsPainterFactory { + let wBorder = borderThickness / viewport.w; + let hBorder = borderThickness / viewport.h; - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { + let _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; + let _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; - var helper = eventBarPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); + let jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; + let yTop = (viewport.h - jTop) / viewport.h; + let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; + let yBottom = (viewport.h - jBottom) / viewport.h; - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - helper.ensureCapacity( lanes.numEvents ); + let xLeft = timeAxis.tFrac(event.start_PMILLIS); + let xRight = timeAxis.tFrac(event.end_PMILLIS); - var indexXys = 0; - var indexRgbas = 0; + let xWidthPixels = viewport.w * (xRight - xLeft); - for ( var l = 0; l < lanes.length; l++ ) { - var lane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { - var event = lane.event( e ); - var indexes = helper.fillEvent( l, e, indexXys, indexRgbas, viewport ); - indexXys = indexes.indexXys; - indexRgbas = indexes.indexRgbas; - } - } + if (!(xRight < 0 || xLeft > 1) && xWidthPixels > minimumVisibleWidth) { - helper.paint( indexXys, indexRgbas, gl, viewport ); - }; - }; - } + // Fill + let fillColor = (event.bgColor || defaultColor); + if (event === selection.hoveredEvent.value) { + fillColor = darker(fillColor, 0.8); + } + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop - hBorder, yBottom + hBorder); + indexRgbas = putQuadRgbas(rgbas, indexRgbas, fillColor); + // Border + let borderColor = (event.borderColor || (event.bgColor ? fillColor : null) || defaultBorderColor || fillColor); + if (selection.selectedEvents.hasValue(event)) { + borderColor = selectedBorderColor; + } + if (borderColor) { + switch (cornerType) { + case JointType.BEVEL: + // Quads + indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom + hBorder); + indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop - hBorder, yBottom + hBorder); + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop, yTop - hBorder); + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yBottom + hBorder, yBottom); + indexRgbas = putRgbas(rgbas, indexRgbas, borderColor, 24); + // Triangles + indexXys = putLowerLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yTop, yTop - hBorder); + indexXys = putUpperLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yBottom + hBorder, yBottom); + indexXys = putUpperRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yBottom + hBorder, yBottom); + indexXys = putLowerRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yTop, yTop - hBorder); + indexRgbas = putRgbas(rgbas, indexRgbas, borderColor, 12); + break; + + default: + indexXys = putQuadXys(xys, indexXys, xLeft, xRight - wBorder, yTop, yTop - hBorder); + indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop, yBottom + hBorder); + indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight, yBottom + hBorder, yBottom); + indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom); + indexRgbas = putRgbas(rgbas, indexRgbas, borderColor, 24); + break; + } + } + } - export function newCombinedEventPainterFactory( barOpts? : TimelineEventBarsPainterOptions, labelOpts? : TimelineEventLabelOptions, iconOpts? : TimelineEventIconsPainterOptions ) : TimelineEventsPainterFactory { + return { indexXys: indexXys, indexRgbas: indexRgbas }; + } + }; +} - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, lanes : TimelineLaneArray, ui : TimelineUi, options : TimelineEventsPainterOptions ) : Painter { - var labelHelper = eventLabelsPainterHelper( labelOpts, drawable, timeAxis, lanes, ui, options ); - var iconHelper = eventIconsPainterHelper( iconOpts, drawable, timeAxis, lanes, ui, options ); - var barHelper = eventStripedBarPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); - var dashedHelper = eventDashedBorderPainterHelper( barOpts, drawable, timeAxis, lanes, ui, options ); +export function newEventBarsPainterFactory(barOpts?: TimelineEventBarsPainterOptions): TimelineEventsPainterFactory { - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - for ( var l = 0; l < lanes.length; l++ ) { - var lane : TimelineLane = lanes.lane( l ); - for ( var e = 0; e < lane.length; e++ ) { + let helper = eventBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); - // draw bar - barHelper.ensureCapacity( 1 ); - var indexes = barHelper.fillEvent( l, e, 0, 0, viewport, 0, 0 ); - var dashedIndexes = dashedHelper.fillEvent( l, e, 0, 0, viewport, 0 ); - barHelper.paint( indexes.indexXys, indexes.indexRgbas, gl, viewport, indexes.indexRelativeXys, indexes.indexFillPattern ); - dashedHelper.paint( dashedIndexes.indexXys, dashedIndexes.indexRgbas, gl, viewport, dashedIndexes.indexLengthSoFar ); + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + helper.ensureCapacity(lanes.numEvents); - // draw label - labelHelper.textTextures.resetTouches( ); - labelHelper.textureRenderer.begin( gl, viewport ); - labelHelper.paintEvent( l, e, gl, viewport ); - labelHelper.textureRenderer.end( gl ); - labelHelper.textTextures.retainTouched( ); + let indexXys = 0; + let indexRgbas = 0; - // draw icon - iconHelper.textureRenderer.begin( gl, viewport ); - iconHelper.paintEvent( l, e, gl, viewport ); - iconHelper.textureRenderer.end( gl ); - } + for (let l = 0; l < lanes.length; l++) { + let lane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + let event = lane.event(e); + let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport); + indexXys = indexes.indexXys; + indexRgbas = indexes.indexRgbas; } + } + helper.paint(indexXys, indexRgbas, gl, viewport); + }; + }; +} + + +export function newCombinedEventPainterFactory(barOpts?: TimelineEventBarsPainterOptions, labelOpts?: TimelineEventLabelOptions, iconOpts?: TimelineEventIconsPainterOptions): TimelineEventsPainterFactory { + + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { + + let labelHelper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options); + let iconHelper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options); + let barHelper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + let dashedHelper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + for (let l = 0; l < lanes.length; l++) { + let lane: TimelineLane = lanes.lane(l); + for (let e = 0; e < lane.length; e++) { + + // draw bar + barHelper.ensureCapacity(1); + let indexes = barHelper.fillEvent(l, e, 0, 0, viewport, 0, 0); + let dashedIndexes = dashedHelper.fillEvent(l, e, 0, 0, viewport, 0); + barHelper.paint(indexes.indexXys, indexes.indexRgbas, gl, viewport, indexes.indexRelativeXys, indexes.indexFillPattern); + dashedHelper.paint(dashedIndexes.indexXys, dashedIndexes.indexRgbas, gl, viewport, dashedIndexes.indexLengthSoFar); + + // draw label + labelHelper.textTextures.resetTouches(); + labelHelper.textureRenderer.begin(gl, viewport); + labelHelper.paintEvent(l, e, gl, viewport); + labelHelper.textureRenderer.end(gl); + labelHelper.textTextures.retainTouched(); + + // draw icon + iconHelper.textureRenderer.begin(gl, viewport); + iconHelper.paintEvent(l, e, gl, viewport); + iconHelper.textureRenderer.end(gl); + } } + } } +} diff --git a/src/webglimpse/timeline/timeline_lanes.ts b/src/webglimpse/timeline/timeline_lanes.ts index 5cf9484..df70d60 100644 --- a/src/webglimpse/timeline/timeline_lanes.ts +++ b/src/webglimpse/timeline/timeline_lanes.ts @@ -27,541 +27,544 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - export class TimelineLaneArray { - private _ui : TimelineUi; - private _row : TimelineRowModel; - private _lanes : TimelineLane[]; - private _laneNums : StringMap; - - private _rebuildLanesMouseWheel; - private _rebuildLanes; - private _newEvent; - private _addEvent; - private _removeEvent; - - private _model : TimelineModel; - - // Keep references to listeners, so that we can remove them later - private _eventAttrsListeners : StringMap; - - constructor( model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, allowMultipleLanes : boolean ) { - this._model = model; - this._row = row; - this._ui = ui; - - this._lanes = []; - this._laneNums = {}; - this._eventAttrsListeners = {}; - - var self = this; - - function findAvailableLaneNum( event : TimelineEventModel, startLaneNum : number, endLaneNum : number ) : number { - for ( var n = startLaneNum; n < endLaneNum; n++ ) { - if ( self._lanes[ n ].couldFitEvent( event ) ) { - return n; - } +import { TimelineUi } from './timeline_ui'; +import { TimelineRowModel, TimelineModel, TimelineEventModel } from './timeline_model'; +import { StringMap, order, formatTime_ISO8601, hasval } from '../util/util'; +import { Listener } from '../util/notification'; +import { indexAfter, indexBefore, indexAtOrAfter } from '../util/sorted_arrays'; + +export class TimelineLaneArray { + private _ui: TimelineUi; + private _row: TimelineRowModel; + private _lanes: TimelineLane[]; + private _laneNums: StringMap; + + private _rebuildLanesMouseWheel: () => void; + private _rebuildLanes: () => void; + private _newEvent: (eventGuid: string) => void; + private _addEvent: (eventGuid: string) => void; + private _removeEvent: (eventGuid: string) => void; + + private _model: TimelineModel; + + // Keep references to listeners, so that we can remove them later + private _eventAttrsListeners: StringMap; + + constructor(model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, allowMultipleLanes: boolean) { + this._model = model; + this._row = row; + this._ui = ui; + + this._lanes = []; + this._laneNums = {}; + this._eventAttrsListeners = {}; + + let self = this; + + function findAvailableLaneNum(event: TimelineEventModel, startLaneNum: number, endLaneNum: number): number { + for (let n = startLaneNum; n < endLaneNum; n++) { + if (self._lanes[n].couldFitEvent(event)) { + return n; } - return null; } + return null; + } - function firstAvailableLaneNum( event : TimelineEventModel ) : number { - var laneNum = findAvailableLaneNum( event, 0, self._lanes.length ); - return ( hasval( laneNum ) ? laneNum : self._lanes.length ); - } + function firstAvailableLaneNum(event: TimelineEventModel): number { + let laneNum = findAvailableLaneNum(event, 0, self._lanes.length); + return (hasval(laneNum) ? laneNum : self._lanes.length); + } - function addEventToLane( event : TimelineEventModel, laneNum : number ) { - if ( !self._lanes[ laneNum ] ) { - self._lanes[ laneNum ] = allowMultipleLanes ? new TimelineLaneStack( ui ) : new TimelineLaneSimple( ui ); + function addEventToLane(event: TimelineEventModel, laneNum: number) { + if (!self._lanes[laneNum]) { + self._lanes[laneNum] = allowMultipleLanes ? new TimelineLaneStack(ui) : new TimelineLaneSimple(ui); + } + self._lanes[laneNum].add(event); + self._laneNums[event.eventGuid] = laneNum; + } + + function fillVacancy(vacancyLaneNum: number, vacancyEdges_PMILLIS: number[]) { + let vacancyLane = self._lanes[vacancyLaneNum]; + for (let n = vacancyLaneNum + 1; n < self._lanes.length; n++) { + let lane = self._lanes[n]; + let possibleTenants = lane.collisionsWithInterval(vacancyEdges_PMILLIS[0], vacancyEdges_PMILLIS[1]); + for (let p = 0; p < possibleTenants.length; p++) { + let event = possibleTenants[p]; + if (vacancyLane.couldFitEvent(event)) { + lane.remove(event); + addEventToLane(event, vacancyLaneNum); + fillVacancy(n, effectiveEdges_PMILLIS(ui, event)); + } } - self._lanes[ laneNum ].add( event ); - self._laneNums[ event.eventGuid ] = laneNum; } + } - function fillVacancy( vacancyLaneNum : number, vacancyEdges_PMILLIS : number[] ) { - var vacancyLane = self._lanes[ vacancyLaneNum ]; - for ( var n = vacancyLaneNum + 1; n < self._lanes.length; n++ ) { - var lane = self._lanes[ n ]; - var possibleTenants = lane.collisionsWithInterval( vacancyEdges_PMILLIS[ 0 ], vacancyEdges_PMILLIS[ 1 ] ); - for ( var p = 0; p < possibleTenants.length; p++ ) { - var event = possibleTenants[ p ]; - if ( vacancyLane.couldFitEvent( event ) ) { - lane.remove( event ); - addEventToLane( event, vacancyLaneNum ); - fillVacancy( n, effectiveEdges_PMILLIS( ui, event ) ); - } - } + function trimEmptyLanes() { + for (let n = self._lanes.length - 1; n >= 0; n--) { + if (self._lanes[n].isEmpty()) { + self._lanes.splice(n, 1); + } + else { + break; } } + } - function trimEmptyLanes( ) { - for ( var n = self._lanes.length - 1; n >= 0; n-- ) { - if ( self._lanes[ n ].isEmpty( ) ) { - self._lanes.splice( n, 1 ); + // adds event to lane, may be called multiple times + this._addEvent = function (eventGuid: string) { + if (hasval(self._laneNums[eventGuid])) { + throw new Error('Lanes-array already contains this event: row-guid = ' + row.rowGuid + ', lane = ' + self._laneNums[eventGuid] + ', event-guid = ' + eventGuid); + } + let event = model.event(eventGuid); + let laneNum = firstAvailableLaneNum(event); + addEventToLane(event, laneNum); + }; + + row.eventGuids.forEach(this._addEvent); + row.eventGuids.valueAdded.on(this._addEvent); + + // attaches listeners to event, should be called only once + // when an event is first added to the row model + this._newEvent = function (eventGuid: string) { + let event = model.event(eventGuid); + let oldEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event); + let updateLaneAssignment = function () { + let newEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event); + if (newEdges_PMILLIS[0] !== oldEdges_PMILLIS[0] || newEdges_PMILLIS[1] !== oldEdges_PMILLIS[1]) { + let oldLaneNum = self._laneNums[event.eventGuid]; + let oldLane = self._lanes[oldLaneNum]; + + let betterLaneNum = findAvailableLaneNum(event, 0, oldLaneNum); + if (hasval(betterLaneNum)) { + // Move to a better lane + oldLane.remove(event); + addEventToLane(event, betterLaneNum); + } + else if (oldLane.eventStillFits(event)) { + // Stay in the current lane + oldLane.update(event); } else { - break; + // Take whatever lane we can get + let newLaneNum = findAvailableLaneNum(event, oldLaneNum + 1, self._lanes.length); + if (!hasval(newLaneNum)) newLaneNum = self._lanes.length; + oldLane.remove(event); + addEventToLane(event, newLaneNum); } - } - } - // adds event to lane, may be called multiple times - this._addEvent = function( eventGuid : string ) { - if ( hasval( self._laneNums[ eventGuid ] ) ) { - throw new Error( 'Lanes-array already contains this event: row-guid = ' + row.rowGuid + ', lane = ' + self._laneNums[ eventGuid ] + ', event-guid = ' + eventGuid ); + fillVacancy(oldLaneNum, oldEdges_PMILLIS); + trimEmptyLanes(); + + oldEdges_PMILLIS = newEdges_PMILLIS; } - var event = model.event( eventGuid ); - var laneNum = firstAvailableLaneNum( event ); - addEventToLane( event, laneNum ); }; - row.eventGuids.forEach( this._addEvent ); - row.eventGuids.valueAdded.on( this._addEvent ); - - // attaches listeners to event, should be called only once - // when an event is first added to the row model - this._newEvent = function( eventGuid : string ) { - var event = model.event( eventGuid ); - var oldEdges_PMILLIS = effectiveEdges_PMILLIS( ui, event ); - var updateLaneAssignment = function( ) { - var newEdges_PMILLIS = effectiveEdges_PMILLIS( ui, event ); - if ( newEdges_PMILLIS[ 0 ] !== oldEdges_PMILLIS[ 0 ] || newEdges_PMILLIS[ 1 ] !== oldEdges_PMILLIS[ 1 ] ) { - var oldLaneNum = self._laneNums[ event.eventGuid ]; - var oldLane = self._lanes[ oldLaneNum ]; - - var betterLaneNum = findAvailableLaneNum( event, 0, oldLaneNum ); - if ( hasval( betterLaneNum ) ) { - // Move to a better lane - oldLane.remove( event ); - addEventToLane( event, betterLaneNum ); - } - else if ( oldLane.eventStillFits( event ) ) { - // Stay in the current lane - oldLane.update( event ); - } - else { - // Take whatever lane we can get - var newLaneNum = findAvailableLaneNum( event, oldLaneNum + 1, self._lanes.length ); - if ( !hasval( newLaneNum ) ) newLaneNum = self._lanes.length; - oldLane.remove( event ); - addEventToLane( event, newLaneNum ); - } - - fillVacancy( oldLaneNum, oldEdges_PMILLIS ); - trimEmptyLanes( ); - - oldEdges_PMILLIS = newEdges_PMILLIS; - } - }; + event.attrsChanged.on(updateLaneAssignment); + self._eventAttrsListeners[eventGuid] = updateLaneAssignment; + }; + row.eventGuids.forEach(this._newEvent); + row.eventGuids.valueAdded.on(this._newEvent); - event.attrsChanged.on( updateLaneAssignment ); - self._eventAttrsListeners[ eventGuid ] = updateLaneAssignment; - }; - row.eventGuids.forEach( this._newEvent ); - row.eventGuids.valueAdded.on( this._newEvent ); + this._removeEvent = function (eventGuid: string) { + let event = model.event(eventGuid); - this._removeEvent = function( eventGuid : string ) { - var event = model.event( eventGuid ); + let oldLaneNum = self._laneNums[eventGuid]; + delete self._laneNums[eventGuid]; - var oldLaneNum = self._laneNums[ eventGuid ]; - delete self._laneNums[ eventGuid ]; + self._lanes[oldLaneNum].remove(event); + fillVacancy(oldLaneNum, effectiveEdges_PMILLIS(ui, event)); + trimEmptyLanes(); - self._lanes[ oldLaneNum ].remove( event ); - fillVacancy( oldLaneNum, effectiveEdges_PMILLIS( ui, event ) ); - trimEmptyLanes( ); + event.attrsChanged.off(self._eventAttrsListeners[eventGuid]); + delete self._eventAttrsListeners[eventGuid]; + } + row.eventGuids.valueRemoved.on(this._removeEvent); - event.attrsChanged.off( self._eventAttrsListeners[ eventGuid ] ); - delete self._eventAttrsListeners[ eventGuid ]; - } - row.eventGuids.valueRemoved.on( this._removeEvent ); - - self._rebuildLanes = function( ) { - var oldLanes = self._lanes; - self._lanes = []; - self._laneNums = {}; - - for ( var l = 0; l < oldLanes.length; l++ ) { - var lane = oldLanes[ l ]; - for ( var e = 0; e < lane.length; e++ ) { - var event = lane.event( e ); - self._addEvent( event.eventGuid ); - } - } - }; + self._rebuildLanes = function () { + let oldLanes = self._lanes; + self._lanes = []; + self._laneNums = {}; - var hasIcons = function( ) { - var oldLanes = self._lanes; - for ( var l = 0; l < oldLanes.length; l++ ) { - var lane = oldLanes[ l ]; - for ( var e = 0; e < lane.length; e++ ) { - var event = lane.event( e ); - var style = ui.eventStyle( event.styleGuid ); - if ( event.labelIcon || style.numIcons > 0 ) return true; - } + for (let l = 0; l < oldLanes.length; l++) { + let lane = oldLanes[l]; + for (let e = 0; e < lane.length; e++) { + let event = lane.event(e); + self._addEvent(event.eventGuid); } - return false; } - - self._rebuildLanesMouseWheel = function( ) { - if ( hasIcons( ) ) { - self._rebuildLanes( ); + }; + + let hasIcons = function () { + let oldLanes = self._lanes; + for (let l = 0; l < oldLanes.length; l++) { + let lane = oldLanes[l]; + for (let e = 0; e < lane.length; e++) { + let event = lane.event(e); + let style = ui.eventStyle(event.styleGuid); + if (event.labelIcon || style.numIcons > 0) return true; } } - - ui.millisPerPx.changed.on( self._rebuildLanesMouseWheel ); - ui.eventStyles.valueAdded.on( self._rebuildLanes ); - ui.eventStyles.valueRemoved.on( self._rebuildLanes ); + return false; } - get length( ) : number { - return this._lanes.length; + self._rebuildLanesMouseWheel = function () { + if (hasIcons()) { + self._rebuildLanes(); + } } - lane( index : number ) : TimelineLane { - return this._lanes[ index ]; - } + ui.millisPerPx.changed.on(self._rebuildLanesMouseWheel); + ui.eventStyles.valueAdded.on(self._rebuildLanes); + ui.eventStyles.valueRemoved.on(self._rebuildLanes); + } - get numEvents( ) : number { - return this._row.eventGuids.length; - } + get length(): number { + return this._lanes.length; + } - eventAt( laneNum : number, time_PMILLIS : number ) : TimelineEventModel { - var lane = this._lanes[ laneNum ]; - return ( lane && lane.eventAtTime( time_PMILLIS ) ); - } + lane(index: number): TimelineLane { + return this._lanes[index]; + } - dispose( ) : void { - this._row.eventGuids.valueAdded.off( this._addEvent ); - this._row.eventGuids.valueRemoved.off( this._removeEvent ); - this._row.eventGuids.valueAdded.off( this._newEvent ); + get numEvents(): number { + return this._row.eventGuids.length; + } + + eventAt(laneNum: number, time_PMILLIS: number): TimelineEventModel { + let lane = this._lanes[laneNum]; + return (lane && lane.eventAtTime(time_PMILLIS)); + } - this._ui.millisPerPx.changed.off( this._rebuildLanesMouseWheel ); - this._ui.eventStyles.valueAdded.off( this._rebuildLanes ); - this._ui.eventStyles.valueRemoved.off( this._rebuildLanes ); + dispose(): void { + this._row.eventGuids.valueAdded.off(this._addEvent); + this._row.eventGuids.valueRemoved.off(this._removeEvent); + this._row.eventGuids.valueAdded.off(this._newEvent); - for ( var eventGuid in this._eventAttrsListeners ) { - if ( this._eventAttrsListeners.hasOwnProperty( eventGuid ) ) { - var listener = this._eventAttrsListeners[ eventGuid ]; - var event = this._model.event( eventGuid ); - if ( listener && event ) event.attrsChanged.off( listener ); - } + this._ui.millisPerPx.changed.off(this._rebuildLanesMouseWheel); + this._ui.eventStyles.valueAdded.off(this._rebuildLanes); + this._ui.eventStyles.valueRemoved.off(this._rebuildLanes); + + for (let eventGuid in this._eventAttrsListeners) { + if (this._eventAttrsListeners.hasOwnProperty(eventGuid)) { + let listener = this._eventAttrsListeners[eventGuid]; + let event = this._model.event(eventGuid); + if (listener && event) event.attrsChanged.off(listener); } } } +} - export function effectiveEdges_PMILLIS( ui : TimelineUi, event : TimelineEventModel ) : number[] { - var start_PMILLIS = event.start_PMILLIS; - var end_PMILLIS = event.end_PMILLIS; +export function effectiveEdges_PMILLIS(ui: TimelineUi, event: TimelineEventModel): number[] { + let start_PMILLIS = event.start_PMILLIS; + let end_PMILLIS = event.end_PMILLIS; - var millisPerPx = ui.millisPerPx.value; - var eventStyle = ui.eventStyle( event.styleGuid ); - for ( var n = 0; n < eventStyle.numIcons; n++ ) { - var icon = eventStyle.icon( n ); - var iconTime_PMILLIS = event.start_PMILLIS + icon.hPos*( event.end_PMILLIS - event.start_PMILLIS ); - var iconStart_PMILLIS = iconTime_PMILLIS - ( millisPerPx * icon.hAlign * icon.displayWidth ); - var iconEnd_PMILLIS = iconTime_PMILLIS + ( millisPerPx * (1-icon.hAlign) * icon.displayWidth ); + let millisPerPx = ui.millisPerPx.value; + let eventStyle = ui.eventStyle(event.styleGuid); + for (let n = 0; n < eventStyle.numIcons; n++) { + let icon = eventStyle.icon(n); + let iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS); + let iconStart_PMILLIS = iconTime_PMILLIS - (millisPerPx * icon.hAlign * icon.displayWidth); + let iconEnd_PMILLIS = iconTime_PMILLIS + (millisPerPx * (1 - icon.hAlign) * icon.displayWidth); - start_PMILLIS = Math.min( start_PMILLIS, iconStart_PMILLIS ); - end_PMILLIS = Math.max( end_PMILLIS, iconEnd_PMILLIS ); - } + start_PMILLIS = Math.min(start_PMILLIS, iconStart_PMILLIS); + end_PMILLIS = Math.max(end_PMILLIS, iconEnd_PMILLIS); + } - return [ start_PMILLIS, end_PMILLIS ]; - } - - - export interface TimelineLane { - length : number; - event( index : number ) : TimelineEventModel; - isEmpty( ) : boolean; - eventAtTime( time_PMILLIS : number ) : TimelineEventModel; - add( event : TimelineEventModel ); - remove( event : TimelineEventModel ); - eventStillFits( event : TimelineEventModel ) : boolean; - update( event : TimelineEventModel ); - collisionsWithInterval( start_PMILLIS : number, end_PMILLIS : number ) : TimelineEventModel[]; - couldFitEvent( event : TimelineEventModel ) : boolean; - } - - // a TimelineLane where no events start/end time overlap - export class TimelineLaneStack implements TimelineLane { - private _events : TimelineEventModel[]; - private _starts_PMILLIS : number[]; - private _ends_PMILLIS : number[]; - private _indices : StringMap; - private _ui : TimelineUi; - - constructor( ui : TimelineUi ) { - this._events = []; - this._starts_PMILLIS = []; - this._ends_PMILLIS = []; - this._indices = {}; - this._ui = ui; - } + return [start_PMILLIS, end_PMILLIS]; +} + + +export interface TimelineLane { + length: number; + event(index: number): TimelineEventModel; + isEmpty(): boolean; + eventAtTime(time_PMILLIS: number): TimelineEventModel; + add(event: TimelineEventModel): void; + remove(event: TimelineEventModel): void; + eventStillFits(event: TimelineEventModel): boolean; + update(event: TimelineEventModel): void; + collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[]; + couldFitEvent(event: TimelineEventModel): boolean; +} + +// a TimelineLane where no events start/end time overlap +export class TimelineLaneStack implements TimelineLane { + private _events: TimelineEventModel[]; + private _starts_PMILLIS: number[]; + private _ends_PMILLIS: number[]; + private _indices: StringMap; + private _ui: TimelineUi; + + constructor(ui: TimelineUi) { + this._events = []; + this._starts_PMILLIS = []; + this._ends_PMILLIS = []; + this._indices = {}; + this._ui = ui; + } - get length( ) : number { - return this._events.length; - } + get length(): number { + return this._events.length; + } - event( index : number ) : TimelineEventModel { - return this._events[ index ]; - } + event(index: number): TimelineEventModel { + return this._events[index]; + } - isEmpty( ) : boolean { - return ( this._events.length === 0 ); - } + isEmpty(): boolean { + return (this._events.length === 0); + } - eventAtTime( time_PMILLIS : number ) : TimelineEventModel { - if ( hasval( time_PMILLIS ) ) { - // Check the first event ending after time - var iFirst = indexAfter( this._ends_PMILLIS, time_PMILLIS ); - if ( iFirst < this._events.length ) { - var eventFirst = this._events[ iFirst ]; - var startFirst_PMILLIS = effectiveEdges_PMILLIS( this._ui, eventFirst )[ 0 ]; - if ( time_PMILLIS >= startFirst_PMILLIS ) { - return eventFirst; - } + eventAtTime(time_PMILLIS: number): TimelineEventModel { + if (hasval(time_PMILLIS)) { + // Check the first event ending after time + let iFirst = indexAfter(this._ends_PMILLIS, time_PMILLIS); + if (iFirst < this._events.length) { + let eventFirst = this._events[iFirst]; + let startFirst_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventFirst)[0]; + if (time_PMILLIS >= startFirst_PMILLIS) { + return eventFirst; } - // Check the previous event, in case we're in its icon-slop - var iPrev = iFirst - 1; - if ( iPrev >= 0 ) { - var eventPrev = this._events[ iPrev ]; - var endPrev_PMILLIS = effectiveEdges_PMILLIS( this._ui, eventPrev )[ 1 ]; - if ( time_PMILLIS < endPrev_PMILLIS ) { - return eventPrev; - } + } + // Check the previous event, in case we're in its icon-slop + let iPrev = iFirst - 1; + if (iPrev >= 0) { + let eventPrev = this._events[iPrev]; + let endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventPrev)[1]; + if (time_PMILLIS < endPrev_PMILLIS) { + return eventPrev; } } - return null; } + return null; + } - add( event : TimelineEventModel ) { - var eventGuid = event.eventGuid; - if ( hasval( this._indices[ eventGuid ] ) ) throw new Error( 'Lane already contains this event: event = ' + formatEvent( event ) ); + add(event: TimelineEventModel) { + let eventGuid = event.eventGuid; + if (hasval(this._indices[eventGuid])) throw new Error('Lane already contains this event: event = ' + formatEvent(event)); - var i = indexAfter( this._starts_PMILLIS, event.start_PMILLIS ); - if ( !this._eventFitsBetween( event, i-1, i ) ) throw new Error( 'New event does not fit between existing events: new = ' + formatEvent( event ) + ', before = ' + formatEvent( this._events[ i-1 ] ) + ', after = ' +formatEvent( this._events[ i ] ) ); + let i = indexAfter(this._starts_PMILLIS, event.start_PMILLIS); + if (!this._eventFitsBetween(event, i - 1, i)) throw new Error('New event does not fit between existing events: new = ' + formatEvent(event) + ', before = ' + formatEvent(this._events[i - 1]) + ', after = ' + formatEvent(this._events[i])); - this._events.splice( i, 0, event ); - this._starts_PMILLIS.splice( i, 0, event.start_PMILLIS ); - this._ends_PMILLIS.splice( i, 0, event.end_PMILLIS ); - this._indices[ eventGuid ] = i; + this._events.splice(i, 0, event); + this._starts_PMILLIS.splice(i, 0, event.start_PMILLIS); + this._ends_PMILLIS.splice(i, 0, event.end_PMILLIS); + this._indices[eventGuid] = i; - for ( var n = i; n < this._events.length; n++ ) { - this._indices[ this._events[ n ].eventGuid ] = n; - } + for (let n = i; n < this._events.length; n++) { + this._indices[this._events[n].eventGuid] = n; } + } - remove( event : TimelineEventModel ) { - var eventGuid = event.eventGuid; - var i = this._indices[ eventGuid ]; - if ( !hasval( i ) ) throw new Error( 'Event not found in this lane: event = ' + formatEvent( event ) ); + remove(event: TimelineEventModel) { + let eventGuid = event.eventGuid; + let i = this._indices[eventGuid]; + if (!hasval(i)) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); - this._events.splice( i, 1 ); - this._starts_PMILLIS.splice( i, 1 ); - this._ends_PMILLIS.splice( i, 1 ); - delete this._indices[ eventGuid ]; + this._events.splice(i, 1); + this._starts_PMILLIS.splice(i, 1); + this._ends_PMILLIS.splice(i, 1); + delete this._indices[eventGuid]; - for ( var n = i; n < this._events.length; n++ ) { - this._indices[ this._events[ n ].eventGuid ] = n; - } + for (let n = i; n < this._events.length; n++) { + this._indices[this._events[n].eventGuid] = n; } + } - eventStillFits( event : TimelineEventModel ) : boolean { - var i = this._indices[ event.eventGuid ]; - if ( !hasval( i ) ) throw new Error( 'Event not found in this lane: event = ' + formatEvent( event ) ); + eventStillFits(event: TimelineEventModel): boolean { + let i = this._indices[event.eventGuid]; + if (!hasval(i)) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); - return this._eventFitsBetween( event, i-1, i+1 ); - } + return this._eventFitsBetween(event, i - 1, i + 1); + } - update( event : TimelineEventModel ) { - var i = this._indices[ event.eventGuid ]; - if ( !hasval( i ) ) throw new Error( 'Event not found in this lane: event = ' + formatEvent( event ) ); + update(event: TimelineEventModel) { + let i = this._indices[event.eventGuid]; + if (!hasval(i)) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); - this._starts_PMILLIS[ i ] = event.start_PMILLIS; - this._ends_PMILLIS[ i ] = event.end_PMILLIS; - } + this._starts_PMILLIS[i] = event.start_PMILLIS; + this._ends_PMILLIS[i] = event.end_PMILLIS; + } - collisionsWithInterval( start_PMILLIS : number, end_PMILLIS : number ) : TimelineEventModel[] { - // Find the first event ending after start - var iFirst = indexAfter( this._ends_PMILLIS, start_PMILLIS ); - var iPrev = iFirst - 1; - if ( iPrev >= 0 ) { - var endPrev_PMILLIS = effectiveEdges_PMILLIS( this._ui, this._events[ iPrev ] )[ 1 ]; - if ( start_PMILLIS < endPrev_PMILLIS ) { - iFirst = iPrev; - } + collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[] { + // Find the first event ending after start + let iFirst = indexAfter(this._ends_PMILLIS, start_PMILLIS); + let iPrev = iFirst - 1; + if (iPrev >= 0) { + let endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPrev])[1]; + if (start_PMILLIS < endPrev_PMILLIS) { + iFirst = iPrev; } - // Find the last event starting before end - var iLast = indexBefore( this._starts_PMILLIS, end_PMILLIS ); - var iPost = iLast + 1; - if ( iPost < this._events.length ) { - var startPost_PMILLIS = effectiveEdges_PMILLIS( this._ui, this._events[ iPost ] )[ 0 ]; - if ( end_PMILLIS > startPost_PMILLIS ) { - iLast = iPost; - } + } + // Find the last event starting before end + let iLast = indexBefore(this._starts_PMILLIS, end_PMILLIS); + let iPost = iLast + 1; + if (iPost < this._events.length) { + let startPost_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPost])[0]; + if (end_PMILLIS > startPost_PMILLIS) { + iLast = iPost; } - // Return that section - return this._events.slice( iFirst, iLast + 1 ); } + // Return that section + return this._events.slice(iFirst, iLast + 1); + } - couldFitEvent( event : TimelineEventModel ) : boolean { - var iAfter = indexAfter( this._starts_PMILLIS, event.start_PMILLIS ); - var iBefore = iAfter - 1; - return this._eventFitsBetween( event, iBefore, iAfter ); - } + couldFitEvent(event: TimelineEventModel): boolean { + let iAfter = indexAfter(this._starts_PMILLIS, event.start_PMILLIS); + let iBefore = iAfter - 1; + return this._eventFitsBetween(event, iBefore, iAfter); + } - _eventFitsBetween( event : TimelineEventModel, iBefore : number, iAfter : number ) : boolean { - var edges_PMILLIS = effectiveEdges_PMILLIS( this._ui, event ); + _eventFitsBetween(event: TimelineEventModel, iBefore: number, iAfter: number): boolean { + let edges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event); - if ( iBefore >= 0 ) { - // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision - var edgesBefore_PMILLIS = effectiveEdges_PMILLIS( this._ui, this._events[ iBefore ] ); - if ( edges_PMILLIS[ 0 ] < edgesBefore_PMILLIS[ 1 ] ) { - return false; - } + if (iBefore >= 0) { + // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision + let edgesBefore_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iBefore]); + if (edges_PMILLIS[0] < edgesBefore_PMILLIS[1]) { + return false; } + } - if ( iAfter < this._events.length ) { - // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision - var edgesAfter_PMILLIS = effectiveEdges_PMILLIS( this._ui, this._events[ iAfter ] ); - if ( edges_PMILLIS[ 1 ] > edgesAfter_PMILLIS[ 0 ] ) { - return false; - } + if (iAfter < this._events.length) { + // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision + let edgesAfter_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iAfter]); + if (edges_PMILLIS[1] > edgesAfter_PMILLIS[0]) { + return false; } - - return true; } - } - // a TimelineLane where events are allowed to overlap arbitrarily - // because of this assumptions like the index for an event in the _starts_PMILLIS - // and _ends_PMILLIS arrays being the same no longer hold - // - // does not make any assumptions about event overlapping and uses - // an inefficient O(n) brute force search to find events (an interval tree - // would be needed for efficient search in the general case) - export class TimelineLaneSimple implements TimelineLane { - - private _events : TimelineEventModel[]; - private _orders : number[]; - private _ids : StringMap; - private _ui : TimelineUi; - - constructor( ui : TimelineUi ) { - this._events = []; - this._orders = []; - this._ids = {}; - this._ui = ui; - } + return true; + } +} + +// a TimelineLane where events are allowed to overlap arbitrarily +// because of this assumptions like the index for an event in the _starts_PMILLIS +// and _ends_PMILLIS arrays being the same no longer hold +// +// does not make any assumptions about event overlapping and uses +// an inefficient O(n) brute force search to find events (an interval tree +// would be needed for efficient search in the general case) +export class TimelineLaneSimple implements TimelineLane { + + private _events: TimelineEventModel[]; + private _orders: number[]; + private _ids: StringMap; + private _ui: TimelineUi; + + constructor(ui: TimelineUi) { + this._events = []; + this._orders = []; + this._ids = {}; + this._ui = ui; + } - get length( ) : number { - return this._events.length; - } + get length(): number { + return this._events.length; + } - event( index : number ) : TimelineEventModel { - return this._events[ index ]; - } + event(index: number): TimelineEventModel { + return this._events[index]; + } - isEmpty( ) : boolean { - return ( this._events.length === 0 ); - } + isEmpty(): boolean { + return (this._events.length === 0); + } - eventAtTime( time_PMILLIS : number ) : TimelineEventModel { + eventAtTime(time_PMILLIS: number): TimelineEventModel { - var bestEvent : TimelineEventModel; + let bestEvent: TimelineEventModel; - // start at end of events list so that eventAtTime result - // favors events drawn on top (in cases where events are unordered - // those that happen to be at end end of the list are drawn last - for ( var n = this._events.length-1; n >= 0; n-- ) { - var event : TimelineEventModel = this._events[n]; + // start at end of events list so that eventAtTime result + // favors events drawn on top (in cases where events are unordered + // those that happen to be at end end of the list are drawn last + for (let n = this._events.length - 1; n >= 0; n--) { + let event: TimelineEventModel = this._events[n]; - var eventEdges_PMILLIS = effectiveEdges_PMILLIS( this._ui, event ); + let eventEdges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event); - if ( time_PMILLIS > eventEdges_PMILLIS[0] && - time_PMILLIS < eventEdges_PMILLIS[1] && - ( bestEvent === undefined || bestEvent.order < event.order ) ) { - bestEvent = event; - } + if (time_PMILLIS > eventEdges_PMILLIS[0] && + time_PMILLIS < eventEdges_PMILLIS[1] && + (bestEvent === undefined || bestEvent.order < event.order)) { + bestEvent = event; } - - return bestEvent; } - add( event : TimelineEventModel ) { - var eventGuid = event.eventGuid; - if ( hasval( this._ids[ eventGuid ] ) ) throw new Error( 'Lane already contains this event: event = ' + formatEvent( event ) ); + return bestEvent; + } - // for events with undefined order, replace with largest possible negative order so sort is correct - var order = hasval( event.order ) ? event.order : Number.NEGATIVE_INFINITY; + add(event: TimelineEventModel) { + let eventGuid = event.eventGuid; + if (hasval(this._ids[eventGuid])) throw new Error('Lane already contains this event: event = ' + formatEvent(event)); - var i : number = indexAtOrAfter( this._orders, order ); + // for events with undefined order, replace with largest possible negative order so sort is correct + let order = hasval(event.order) ? event.order : Number.NEGATIVE_INFINITY; - this._ids[ eventGuid ] = eventGuid; - this._orders.splice( i, 0, order ); - this._events.splice( i, 0, event ); - } + let i: number = indexAtOrAfter(this._orders, order); - remove( event : TimelineEventModel ) { - var eventGuid = event.eventGuid; - if ( !hasval( this._ids[ eventGuid ] ) ) throw new Error( 'Event not found in this lane: event = ' + formatEvent( event ) ); + this._ids[eventGuid] = eventGuid; + this._orders.splice(i, 0, order); + this._events.splice(i, 0, event); + } - delete this._ids[ eventGuid ]; - var i : number = this._getIndex( event ); - this._orders.splice( i, 1 ); - this._events.splice( i, 1 ); - } + remove(event: TimelineEventModel) { + let eventGuid = event.eventGuid; + if (!hasval(this._ids[eventGuid])) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); - update( event : TimelineEventModel ) { - this.remove( event ); - this.add( event ); - } + delete this._ids[eventGuid]; + let i: number = this._getIndex(event); + this._orders.splice(i, 1); + this._events.splice(i, 1); + } - collisionsWithInterval( start_PMILLIS : number, end_PMILLIS : number ) : TimelineEventModel[] { + update(event: TimelineEventModel) { + this.remove(event); + this.add(event); + } - var results = []; + collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[] { - for ( var n = 0; n < this._events.length; n++ ) { - var event : TimelineEventModel = this._events[n]; + let results = []; - if ( !(start_PMILLIS > event.end_PMILLIS || end_PMILLIS < event.start_PMILLIS) ) { - results.push( event ); - } - } + for (let n = 0; n < this._events.length; n++) { + let event: TimelineEventModel = this._events[n]; - return results; + if (!(start_PMILLIS > event.end_PMILLIS || end_PMILLIS < event.start_PMILLIS)) { + results.push(event); + } } - // we can always fit more events because overlaps are allowed - eventStillFits( event : TimelineEventModel ) : boolean { - return true; - } + return results; + } - // we can always fit more events because overlaps are allowed - couldFitEvent( event : TimelineEventModel ) : boolean { - return true; - } + // we can always fit more events because overlaps are allowed + eventStillFits(event: TimelineEventModel): boolean { + return true; + } - _getIndex( queryEvent : TimelineEventModel ) : number { - for ( var n = 0; n < this._events.length; n++ ) { - var event : TimelineEventModel = this._events[n]; - if ( queryEvent.eventGuid === event.eventGuid ) { - return n; - } + // we can always fit more events because overlaps are allowed + couldFitEvent(event: TimelineEventModel): boolean { + return true; + } + + _getIndex(queryEvent: TimelineEventModel): number { + for (let n = 0; n < this._events.length; n++) { + let event: TimelineEventModel = this._events[n]; + if (queryEvent.eventGuid === event.eventGuid) { + return n; } - throw new Error( 'Event not found in this lane: event = ' + formatEvent( queryEvent ) ); } + throw new Error('Event not found in this lane: event = ' + formatEvent(queryEvent)); } +} - function formatEvent( event : TimelineEventModel ) : string { - if ( !hasval( event ) ) { - return '' + event; - } - else { - return ( event.label + ' [ ' + formatTime_ISO8601( event.start_PMILLIS ) + ' ... ' + formatTime_ISO8601( event.end_PMILLIS ) + ' ]' ); - } +function formatEvent(event: TimelineEventModel): string { + if (!hasval(event)) { + return '' + event; + } + else { + return (event.label + ' [ ' + formatTime_ISO8601(event.start_PMILLIS) + ' ... ' + formatTime_ISO8601(event.end_PMILLIS) + ' ]'); } +} diff --git a/src/webglimpse/timeline/timeline_layout.ts b/src/webglimpse/timeline/timeline_layout.ts index 73f8def..c8579c8 100644 --- a/src/webglimpse/timeline/timeline_layout.ts +++ b/src/webglimpse/timeline/timeline_layout.ts @@ -27,101 +27,103 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - - export function newTimelineLayout( axisHeight : number ) : Layout { - - return { - - updatePrefSize: function( parentPrefSize : Size, children : LayoutEntry[] ) { - var topAxis : LayoutEntry = null; - var bottomAxis : LayoutEntry = null; - var center : LayoutEntry = null; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - switch ( child.layoutArg ) { - case Side.TOP: - if ( hasval( topAxis ) ) throw new Error( 'Timeline-layout can have at most one top-axis pane' ); - topAxis = child; - break; - - case Side.BOTTOM: - if ( hasval( bottomAxis ) ) throw new Error( 'Timeline-layout can have at most one bottom-axis pane' ); - bottomAxis = child; - break; - - default: - if ( hasval( center ) ) throw new Error( 'Timeline-layout can have at most one center pane' ); - center = child; - break; - } +import { Layout, LayoutEntry } from '../core'; +import { Size, BoundsUnmodifiable } from '../bounds'; +import { Side } from '../misc'; +import { hasval } from '../util/util'; + +export function newTimelineLayout(axisHeight: number): Layout { + + return { + + updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { + let topAxis: LayoutEntry = null; + let bottomAxis: LayoutEntry = null; + let center: LayoutEntry = null; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + switch (child.layoutArg) { + case Side.TOP: + if (hasval(topAxis)) throw new Error('Timeline-layout can have at most one top-axis pane'); + topAxis = child; + break; + + case Side.BOTTOM: + if (hasval(bottomAxis)) throw new Error('Timeline-layout can have at most one bottom-axis pane'); + bottomAxis = child; + break; + + default: + if (hasval(center)) throw new Error('Timeline-layout can have at most one center pane'); + center = child; + break; } + } - var hSum = 0; + let hSum = 0; - if ( hasval( topAxis ) ) { - hSum += axisHeight; - } + if (hasval(topAxis)) { + hSum += axisHeight; + } - if ( hasval( bottomAxis ) ) { - hSum += axisHeight; - } + if (hasval(bottomAxis)) { + hSum += axisHeight; + } - if ( hasval( center ) ) { - if ( hasval( center.prefSize.h ) ) { - hSum += center.prefSize.h; - } - else { - hSum = null; - } + if (hasval(center)) { + if (hasval(center.prefSize.h)) { + hSum += center.prefSize.h; } - - parentPrefSize.w = null; - parentPrefSize.h = hSum; - }, - - updateChildViewports: function( children : LayoutEntry[], parentViewport : BoundsUnmodifiable ) { - var topAxis : LayoutEntry = null; - var bottomAxis : LayoutEntry = null; - var center : LayoutEntry = null; - for ( var c = 0; c < children.length; c++ ) { - var child = children[ c ]; - switch ( child.layoutArg ) { - case Side.TOP: - if ( hasval( topAxis ) ) throw new Error( 'Timeline-layout can have at most one top-axis pane' ); - topAxis = child; - break; - - case Side.BOTTOM: - if ( hasval( bottomAxis ) ) throw new Error( 'Timeline-layout can have at most one bottom-axis pane' ); - bottomAxis = child; - break; - - default: - if ( hasval( center ) ) throw new Error( 'Timeline-layout can have at most one center pane' ); - center = child; - break; - } + else { + hSum = null; } + } - if ( hasval( topAxis ) ) { - topAxis.viewport.setRect( parentViewport.i, parentViewport.jEnd - axisHeight, parentViewport.w, axisHeight ); + parentPrefSize.w = null; + parentPrefSize.h = hSum; + }, + + updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { + let topAxis: LayoutEntry = null; + let bottomAxis: LayoutEntry = null; + let center: LayoutEntry = null; + for (let c = 0; c < children.length; c++) { + let child = children[c]; + switch (child.layoutArg) { + case Side.TOP: + if (hasval(topAxis)) throw new Error('Timeline-layout can have at most one top-axis pane'); + topAxis = child; + break; + + case Side.BOTTOM: + if (hasval(bottomAxis)) throw new Error('Timeline-layout can have at most one bottom-axis pane'); + bottomAxis = child; + break; + + default: + if (hasval(center)) throw new Error('Timeline-layout can have at most one center pane'); + center = child; + break; } + } - if ( hasval( bottomAxis ) ) { - var jBottomMax = ( hasval( topAxis ) ? topAxis.viewport.j : parentViewport.jEnd ) - axisHeight; - bottomAxis.viewport.setRect( parentViewport.i, Math.min( jBottomMax, parentViewport.j ), parentViewport.w, axisHeight ); - } + if (hasval(topAxis)) { + topAxis.viewport.setRect(parentViewport.i, parentViewport.jEnd - axisHeight, parentViewport.w, axisHeight); + } - if ( hasval( center ) ) { - var jCenterEnd = ( hasval( topAxis ) ? topAxis.viewport.jStart : parentViewport.jEnd ); - var jCenterStart = ( hasval( bottomAxis ) ? bottomAxis.viewport.jEnd : parentViewport.jStart ); - center.viewport.setEdges( parentViewport.iStart, parentViewport.iEnd, jCenterStart, jCenterEnd ); - } + if (hasval(bottomAxis)) { + let jBottomMax = (hasval(topAxis) ? topAxis.viewport.j : parentViewport.jEnd) - axisHeight; + bottomAxis.viewport.setRect(parentViewport.i, Math.min(jBottomMax, parentViewport.j), parentViewport.w, axisHeight); + } + + if (hasval(center)) { + let jCenterEnd = (hasval(topAxis) ? topAxis.viewport.jStart : parentViewport.jEnd); + let jCenterStart = (hasval(bottomAxis) ? bottomAxis.viewport.jEnd : parentViewport.jStart); + center.viewport.setEdges(parentViewport.iStart, parentViewport.iEnd, jCenterStart, jCenterEnd); } + } - }; - } + }; +} diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 6f64f73..42d25c0 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -27,1845 +27,1853 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { OrderedStringSet, OrderedSet } from '../util/ordered_set'; +import { Color, parseCssColor } from '../color'; +import { Notification, Notification2 } from '../util/notification'; +import { formatTime_ISO8601, order, hasval, parseTime_PMILLIS } from '../util/util'; +import { indexOf } from '../util/sorted_arrays'; +import { FillPattern } from './timeline_events_row'; +import { Axis1D } from '../plot/axis'; + + +export interface TimelineCursor { + cursorGuid: string; + labeledTimeseriesGuids: string[]; + lineColor: string; + textColor: string; + showVerticalLine: boolean; + showHorizontalLine: boolean; + showCursorText: boolean; +} + + + +export interface TimelineAnnotation { + annotationGuid: string; + // time (x axis position) of annotation + time_ISO8601?: string; + // y axis position of annotion + y?: number; + label: string; + styleGuid: string; +} + + +export interface TimelineTimeseries { + timeseriesGuid: string; + // supported hints: + // lines, points, lines-and-points, bars, area + uiHint?: string; + // used for bars and area plots + // determines the y axis value that the bars/area originate from + baseline?: number; + lineColor?: string; + pointColor?: string; + lineThickness?: number; + pointSize?: number; + dash?: number; + fragmentGuids?: string[]; +} + + +export interface TimelineTimeseriesFragment { + fragmentGuid: string; + data?: number[]; + times_ISO8601?: string[]; + + // undefined : user cannot adjust data points + // 'y' : user can adjust y value of points, but not time value + // 'xy : user can adjust both x (time) and y value of points + userEditMode?: string; +} + +export interface TimelineEvent { + eventGuid: string; + // the left side (earliest) time bound of the event box + start_ISO8601: string; + // the right side (latest) time bound of the event box + end_ISO8601: string; + // text to be displayed with the event + label: string; + // the minimum allowed value of start_ISO8601 + startLimit_ISO8601?: string; + // the maximum allowed value of end_ISO8601 + endLimit_ISO8601?: string; + // guid for icon shown to the left of the label text + labelIcon?: string; + // whether or not the event can be dragged / resized by user clicks + userEditable?: boolean; + // see timeline_event_style.ts (determines what icons the event displays) + styleGuid?: string; + // determines which events are drawn over others (higher numbers on top) + order?: number; + // distance between event box and top of timeline row + topMargin?: number; + // distance between event box and bottom of timeline row + bottomMargin?: number; + // text label color + fgColor?: string; + // event box color + bgColor?: string; + // event box secondary color used when displaying stiped background + bgSecondaryColor?: string; + // event box border color + borderColor?: string; + // secondary event box border color used when displaying stippled event borders + borderSecondaryColor?: string; + // portion at the top of the timeline row not considered by labelVAlign when placing text + labelTopMargin?: number; + // portion at the bottom of the timeline row not considered by labelVAlign when placing text + labelBottomMargin?: number; + // vertical alignment of label text (0 = bottom of row, 0.5 = middle of row, 1 = top of row) + labelVAlign?: number; + // relative position within the text label of the point considered the start of the label text (0 = bottom, 1 = top) this is the point positioned by labelVAlign + // if labelVPos is not set, it defaults to labelVAlign's value, which is usually what is intended anyway + labelVPos?: number; + // vertical alignment of label text (0=left side, 0.5 = middle of event, 1=right side) + labelHAlign?: number; + // relative position within the text label of the point considered the start of the label text (0 = left side, 1 = right side) this is the point positioned by labelHAlign + // if labelHPos is not set, it defaults to labelHAlign's value, which is usually what is intended anyway + labelHPos?: number; + // determines if the borders are dashed or not + isBorderDashed?: boolean; + // determines the fill pattern of the event ('solid', 'stripes') + fillPattern?: string; +} + + +export interface TimelineRow { + rowGuid: string; + label: string; + hidden?: boolean; + rowHeight?: number; + yMin?: number; + yMax?: number; + uiHint?: string; + eventGuids?: string[]; + timeseriesGuids?: string[]; + annotationGuids?: string[]; + cursorGuid?: string; + bgColor?: string; + fgLabelColor?: string; + bgLabelColor?: string; + labelFont?: string; +} + + +export interface TimelineGroup { + groupGuid: string; + rollupGuid?: string; + label: string; + hidden?: boolean; + collapsed?: boolean; + highlighted?: boolean; + rowGuids: string[]; +} + + +export interface TimelineRoot { + groupGuids: string[]; + topPinnedRowGuids: string[]; + bottomPinnedRowGuids: string[]; + maximizedRowGuids: string[]; +} + + +export interface Timeline { + cursors: TimelineCursor[]; + annotations: TimelineAnnotation[]; + timeseriesFragments: TimelineTimeseriesFragment[]; + timeseries: TimelineTimeseries[]; + events: TimelineEvent[]; + rows: TimelineRow[]; + groups: TimelineGroup[]; + root: TimelineRoot; +} + + + +export class TimelineCursorModel { + private _cursorGuid: string; + // guids of timeseries to display values for at the selected time + private _labeledTimeseriesGuids: OrderedStringSet; + private _lineColor: Color; + private _textColor: Color; + private _showCursorText: boolean; + private _showVerticalLine: boolean; + private _showHorizontalLine: boolean; + private _attrsChanged: Notification; + + constructor(cursor: TimelineCursor) { + this._cursorGuid = cursor.cursorGuid; + this._attrsChanged = new Notification(); + this.setAttrs(cursor); + } + get labeledTimeseriesGuids(): OrderedStringSet { + return this._labeledTimeseriesGuids; + } + get cursorGuid(): string { + return this._cursorGuid; + } - export interface TimelineCursor { - cursorGuid : string; - labeledTimeseriesGuids : string[]; - lineColor : string; - textColor : string; - showVerticalLine : boolean; - showHorizontalLine : boolean; - showCursorText : boolean; - } - - - - export interface TimelineAnnotation { - annotationGuid : string; - // time (x axis position) of annotation - time_ISO8601? : string; - // y axis position of annotion - y? : number; - label : string; - styleGuid : string; - } - - - export interface TimelineTimeseries { - timeseriesGuid : string; - // supported hints: - // lines, points, lines-and-points, bars, area - uiHint? : string; - // used for bars and area plots - // determines the y axis value that the bars/area originate from - baseline? : number; - lineColor? : string; - pointColor? : string; - lineThickness? : number; - pointSize? : number; - dash? : number; - fragmentGuids? : string[]; - } - - - export interface TimelineTimeseriesFragment { - fragmentGuid : string; - data? : number[]; - times_ISO8601? : string[]; - - // undefined : user cannot adjust data points - // 'y' : user can adjust y value of points, but not time value - // 'xy : user can adjust both x (time) and y value of points - userEditMode? : string; - } - - export interface TimelineEvent { - eventGuid : string; - // the left side (earliest) time bound of the event box - start_ISO8601 : string; - // the right side (latest) time bound of the event box - end_ISO8601 : string; - // text to be displayed with the event - label : string; - // the minimum allowed value of start_ISO8601 - startLimit_ISO8601? : string; - // the maximum allowed value of end_ISO8601 - endLimit_ISO8601? : string; - // guid for icon shown to the left of the label text - labelIcon? : string; - // whether or not the event can be dragged / resized by user clicks - userEditable? : boolean; - // see timeline_event_style.ts (determines what icons the event displays) - styleGuid? : string; - // determines which events are drawn over others (higher numbers on top) - order? : number; - // distance between event box and top of timeline row - topMargin? : number; - // distance between event box and bottom of timeline row - bottomMargin? : number; - // text label color - fgColor? : string; - // event box color - bgColor? : string; - // event box secondary color used when displaying stiped background - bgSecondaryColor? : string; - // event box border color - borderColor? : string; - // secondary event box border color used when displaying stippled event borders - borderSecondaryColor? : string; - // portion at the top of the timeline row not considered by labelVAlign when placing text - labelTopMargin? : number; - // portion at the bottom of the timeline row not considered by labelVAlign when placing text - labelBottomMargin? : number; - // vertical alignment of label text (0 = bottom of row, 0.5 = middle of row, 1 = top of row) - labelVAlign? : number; - // relative position within the text label of the point considered the start of the label text (0 = bottom, 1 = top) this is the point positioned by labelVAlign - // if labelVPos is not set, it defaults to labelVAlign's value, which is usually what is intended anyway - labelVPos? : number; - // vertical alignment of label text (0=left side, 0.5 = middle of event, 1=right side) - labelHAlign? : number; - // relative position within the text label of the point considered the start of the label text (0 = left side, 1 = right side) this is the point positioned by labelHAlign - // if labelHPos is not set, it defaults to labelHAlign's value, which is usually what is intended anyway - labelHPos? : number; - // determines if the borders are dashed or not - isBorderDashed? : boolean; - // determines the fill pattern of the event ('solid', 'stripes') - fillPattern? : string; - } - - - export interface TimelineRow { - rowGuid : string; - label : string; - hidden? : boolean; - rowHeight? : number; - yMin? : number; - yMax? : number; - uiHint? : string; - eventGuids? : string[]; - timeseriesGuids? : string[]; - annotationGuids? : string[]; - cursorGuid? : string; - bgColor? : string; - fgLabelColor? : string; - bgLabelColor? : string; - labelFont? : string; - } - - - export interface TimelineGroup { - groupGuid : string; - rollupGuid? : string; - label : string; - hidden? : boolean; - collapsed? : boolean; - highlighted?: boolean; - rowGuids : string[]; - } - - - export interface TimelineRoot { - groupGuids : string[]; - topPinnedRowGuids : string[]; - bottomPinnedRowGuids : string[]; - maximizedRowGuids : string[]; - } - - - export interface Timeline { - cursors : TimelineCursor[]; - annotations : TimelineAnnotation[]; - timeseriesFragments : TimelineTimeseriesFragment[]; - timeseries : TimelineTimeseries[]; - events : TimelineEvent[]; - rows : TimelineRow[]; - groups : TimelineGroup[]; - root : TimelineRoot; - } - - - - export class TimelineCursorModel { - private _cursorGuid : string; - // guids of timeseries to display values for at the selected time - private _labeledTimeseriesGuids : OrderedStringSet; - private _lineColor : Color; - private _textColor : Color; - private _showCursorText : boolean; - private _showVerticalLine : boolean; - private _showHorizontalLine : boolean; - private _attrsChanged : Notification; + get attrsChanged(): Notification { + return this._attrsChanged; + } - constructor( cursor : TimelineCursor ) { - this._cursorGuid = cursor.cursorGuid; - this._attrsChanged = new Notification( ); - this.setAttrs( cursor ); - } + get lineColor(): Color { + return this._lineColor; + } - get labeledTimeseriesGuids( ) : OrderedStringSet { - return this._labeledTimeseriesGuids; - } + get textColor(): Color { + return this._textColor; + } - get cursorGuid( ) : string { - return this._cursorGuid; - } + get showVerticalLine(): boolean { + return this._showVerticalLine; + } - get attrsChanged( ) : Notification { - return this._attrsChanged; - } + get showHorizontalLine(): boolean { + return this._showHorizontalLine; + } - get lineColor( ) : Color { - return this._lineColor; - } + get showCursorText(): boolean { + return this._showCursorText; + } - get textColor( ) : Color { - return this._textColor; - } + setAttrs(cursor: TimelineCursor) { + this._labeledTimeseriesGuids = new OrderedStringSet(cursor.labeledTimeseriesGuids || []); + this._lineColor = (hasval(cursor.lineColor) ? parseCssColor(cursor.lineColor) : null); + this._textColor = (hasval(cursor.textColor) ? parseCssColor(cursor.textColor) : null); + this._showVerticalLine = cursor.showVerticalLine; + this._showHorizontalLine = cursor.showHorizontalLine; + this._showCursorText = cursor.showCursorText; + this._attrsChanged.fire(); + } - get showVerticalLine( ) : boolean { - return this._showVerticalLine; - } + snapshot(): TimelineCursor { + return { + cursorGuid: this._cursorGuid, + labeledTimeseriesGuids: this._labeledTimeseriesGuids.toArray(), + lineColor: (hasval(this._lineColor) ? this._lineColor.cssString : null), + textColor: (hasval(this._textColor) ? this._textColor.cssString : null), + showVerticalLine: this._showVerticalLine, + showHorizontalLine: this._showHorizontalLine, + showCursorText: this._showCursorText + }; + } +} - get showHorizontalLine( ) : boolean { - return this._showHorizontalLine; - } - get showCursorText( ) : boolean { - return this._showCursorText; - } +export class TimelineAnnotationModel { + private _annotationGuid: string; + private _attrsChanged: Notification; + private _time_PMILLIS: number; + private _y: number; + private _label: string; + private _styleGuid: string; - setAttrs( cursor : TimelineCursor ) { - this._labeledTimeseriesGuids = new OrderedStringSet( cursor.labeledTimeseriesGuids || [] ); - this._lineColor = ( hasval( cursor.lineColor ) ? parseCssColor( cursor.lineColor ) : null ); - this._textColor = ( hasval( cursor.textColor ) ? parseCssColor( cursor.textColor ) : null ); - this._showVerticalLine = cursor.showVerticalLine; - this._showHorizontalLine = cursor.showHorizontalLine; - this._showCursorText = cursor.showCursorText; - this._attrsChanged.fire( ); - } + constructor(annotation: TimelineAnnotation) { + this._annotationGuid = annotation.annotationGuid; + this._attrsChanged = new Notification(); + this.setAttrs(annotation); + } - snapshot( ) : TimelineCursor { - return { - cursorGuid: this._cursorGuid, - labeledTimeseriesGuids: this._labeledTimeseriesGuids.toArray( ), - lineColor: ( hasval( this._lineColor ) ? this._lineColor.cssString : null ), - textColor: ( hasval( this._textColor ) ? this._textColor.cssString : null ), - showVerticalLine: this._showVerticalLine, - showHorizontalLine: this._showHorizontalLine, - showCursorText: this._showCursorText - }; - } + get annotationGuid(): string { + return this._annotationGuid; } + get attrsChanged(): Notification { + return this._attrsChanged; + } - export class TimelineAnnotationModel { - private _annotationGuid : string; - private _attrsChanged : Notification; - private _time_PMILLIS : number; - private _y : number; - private _label : string; - private _styleGuid : string; + setLocation(time_PMILLIS: number, y: number) { + if (time_PMILLIS !== this._time_PMILLIS || y !== this.y) { + this._y = y; + this._time_PMILLIS = time_PMILLIS; + this._attrsChanged.fire(); - constructor( annotation : TimelineAnnotation ) { - this._annotationGuid = annotation.annotationGuid; - this._attrsChanged = new Notification( ); - this.setAttrs( annotation ); } + } - get annotationGuid( ) : string { - return this._annotationGuid; - } + get time_PMILLIS(): number { + return this._time_PMILLIS; + } - get attrsChanged( ) : Notification { - return this._attrsChanged; + set time_PMILLIS(time_PMILLIS: number) { + if (time_PMILLIS !== this._time_PMILLIS) { + this._time_PMILLIS = time_PMILLIS; + this._attrsChanged.fire(); } + } - setLocation( time_PMILLIS : number, y : number ) { - if ( time_PMILLIS !== this._time_PMILLIS || y !== this.y ) { - this._y = y; - this._time_PMILLIS = time_PMILLIS; - this._attrsChanged.fire( ); + get y(): number { + return this._y; + } - } + set y(y: number) { + if (y !== this.y) { + this._y = y; + this._attrsChanged.fire(); } + } - get time_PMILLIS( ) : number { - return this._time_PMILLIS; - } + get label(): string { + return this._label; + } - set time_PMILLIS( time_PMILLIS : number ) { - if ( time_PMILLIS !== this._time_PMILLIS ) { - this._time_PMILLIS = time_PMILLIS; - this._attrsChanged.fire( ); - } + set label(label: string) { + if (label !== this.label) { + this._label = label; + this._attrsChanged.fire(); } + } - get y( ) : number { - return this._y; - } + get styleGuid(): string { + return this._styleGuid; + } - set y( y : number ) { - if ( y !== this.y ) { - this._y = y; - this._attrsChanged.fire( ); - } + set styleGuid(styleGuid: string) { + if (styleGuid !== this.styleGuid) { + this._styleGuid = styleGuid; + this._attrsChanged.fire(); } + } - get label( ) : string { - return this._label; - } + setAttrs(annotation: TimelineAnnotation) { + // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here + this._time_PMILLIS = hasval(annotation.time_ISO8601) ? parseTime_PMILLIS(annotation.time_ISO8601) : undefined; + this._y = annotation.y; + this._label = annotation.label; + this._styleGuid = annotation.styleGuid; + this._attrsChanged.fire(); + } - set label( label : string ) { - if ( label !== this.label ) { - this._label = label; - this._attrsChanged.fire( ); - } - } + snapshot(): TimelineAnnotation { + return { + annotationGuid: this._annotationGuid, + label: this._label, + styleGuid: this._styleGuid, + time_ISO8601: formatTime_ISO8601(this._time_PMILLIS), + y: this._y, + }; + } +} + + +export class TimelineTimeseriesModel { + private _timeseriesGuid: string; + private _attrsChanged: Notification; + private _uiHint: string; + private _baseline: number; + private _lineColor: Color; + private _pointColor: Color; + private _lineThickness: number; + private _pointSize: number; + private _dash: number; + private _fragmentGuids: OrderedStringSet; + + constructor(timeseries: TimelineTimeseries) { + this._timeseriesGuid = timeseries.timeseriesGuid; + this._attrsChanged = new Notification(); + this.setAttrs(timeseries); + this._fragmentGuids = new OrderedStringSet(timeseries.fragmentGuids || []); + } - get styleGuid( ) : string { - return this._styleGuid; - } + get timeseriesGuid(): string { + return this._timeseriesGuid; + } - set styleGuid( styleGuid : string ) { - if ( styleGuid !== this.styleGuid ) { - this._styleGuid = styleGuid; - this._attrsChanged.fire( ); - } - } + get attrsChanged(): Notification { + return this._attrsChanged; + } - setAttrs( annotation : TimelineAnnotation ) { - // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - this._time_PMILLIS = hasval( annotation.time_ISO8601 ) ? parseTime_PMILLIS( annotation.time_ISO8601 ) : undefined; - this._y = annotation.y; - this._label = annotation.label; - this._styleGuid = annotation.styleGuid; - this._attrsChanged.fire( ); - } + setAttrs(timeseries: TimelineTimeseries) { + // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here + this._uiHint = timeseries.uiHint; + this._baseline = timeseries.baseline; + this._lineColor = (hasval(timeseries.lineColor) ? parseCssColor(timeseries.lineColor) : null); + this._pointColor = (hasval(timeseries.pointColor) ? parseCssColor(timeseries.pointColor) : null); + this._lineThickness = timeseries.lineThickness; + this._pointSize = timeseries.pointSize; + this._dash = timeseries.dash; + this._fragmentGuids = new OrderedStringSet(timeseries.fragmentGuids || []); + this._attrsChanged.fire(); + } - snapshot( ) : TimelineAnnotation { - return { - annotationGuid: this._annotationGuid, - label: this._label, - styleGuid: this._styleGuid, - time_ISO8601 : formatTime_ISO8601( this._time_PMILLIS ), - y: this._y, - }; - } + get baseline(): number { + return this._baseline; } + set baseline(baseline: number) { + if (baseline !== this._baseline) { + this._baseline = baseline; + this._attrsChanged.fire(); + } + } - export class TimelineTimeseriesModel { - private _timeseriesGuid : string; - private _attrsChanged : Notification; - private _uiHint : string; - private _baseline : number; - private _lineColor : Color; - private _pointColor : Color; - private _lineThickness : number; - private _pointSize : number; - private _dash : number; - private _fragmentGuids : OrderedStringSet; + get lineColor(): Color { + return this._lineColor; + } - constructor( timeseries : TimelineTimeseries ) { - this._timeseriesGuid = timeseries.timeseriesGuid; - this._attrsChanged = new Notification( ); - this.setAttrs( timeseries ); - this._fragmentGuids = new OrderedStringSet( timeseries.fragmentGuids || [] ); + set lineColor(lineColor: Color) { + if (lineColor !== this._lineColor) { + this._lineColor = lineColor; + this._attrsChanged.fire(); } + } - get timeseriesGuid( ) : string { - return this._timeseriesGuid; - } + get pointColor(): Color { + return this._pointColor; + } - get attrsChanged( ) : Notification { - return this._attrsChanged; + set pointColor(pointColor: Color) { + if (pointColor !== this._pointColor) { + this._pointColor = pointColor; + this._attrsChanged.fire(); } + } - setAttrs( timeseries : TimelineTimeseries ) { - // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - this._uiHint = timeseries.uiHint; - this._baseline = timeseries.baseline; - this._lineColor = ( hasval( timeseries.lineColor ) ? parseCssColor( timeseries.lineColor ) : null ); - this._pointColor = ( hasval( timeseries.pointColor ) ? parseCssColor( timeseries.pointColor ) : null ); - this._lineThickness = timeseries.lineThickness; - this._pointSize = timeseries.pointSize; - this._dash = timeseries.dash; - this._fragmentGuids = new OrderedStringSet( timeseries.fragmentGuids || [] ); - this._attrsChanged.fire( ); - } + get lineThickness(): number { + return this._lineThickness; + } - get baseline( ) : number { - return this._baseline; + set lineThickness(lineThickness: number) { + if (lineThickness !== this._lineThickness) { + this._lineThickness = lineThickness; + this._attrsChanged.fire(); } + } - set baseline( baseline : number ) { - if ( baseline !== this._baseline ) { - this._baseline = baseline; - this._attrsChanged.fire( ); - } - } + get pointSize(): number { + return this._pointSize; + } - get lineColor( ) : Color { - return this._lineColor; + set pointSize(pointSize: number) { + if (pointSize !== this._pointSize) { + this._pointSize = pointSize; + this._attrsChanged.fire(); } + } - set lineColor( lineColor : Color ) { - if ( lineColor !== this._lineColor ) { - this._lineColor = lineColor; - this._attrsChanged.fire( ); - } - } + get dash(): number { + return this._dash; + } - get pointColor( ) : Color { - return this._pointColor; + set dash(dash: number) { + if (dash !== this._dash) { + this._dash = dash; + this._attrsChanged.fire(); } + } - set pointColor( pointColor : Color ) { - if ( pointColor !== this._pointColor ) { - this._pointColor = pointColor; - this._attrsChanged.fire( ); - } - } + get uiHint(): string { + return this._uiHint; + } - get lineThickness( ) : number { - return this._lineThickness; + set uiHint(uiHint: string) { + if (uiHint !== this._uiHint) { + this._uiHint = uiHint; + this._attrsChanged.fire(); } + } - set lineThickness( lineThickness : number ) { - if ( lineThickness !== this._lineThickness ) { - this._lineThickness = lineThickness; - this._attrsChanged.fire( ); - } - } + get fragmentGuids(): OrderedStringSet { + return this._fragmentGuids; + } - get pointSize( ) : number { - return this._pointSize; + set fragmentGuids(fragmentGuids: OrderedStringSet) { + if (fragmentGuids !== this._fragmentGuids) { + this._fragmentGuids = fragmentGuids; + this._attrsChanged.fire(); } + } - set pointSize( pointSize : number ) { - if ( pointSize !== this._pointSize ) { - this._pointSize = pointSize; - this._attrsChanged.fire( ); - } - } + snapshot(): TimelineTimeseries { + return { + timeseriesGuid: this._timeseriesGuid, + uiHint: this._uiHint, + baseline: this._baseline, + lineColor: (hasval(this._lineColor) ? this._lineColor.cssString : null), + pointColor: (hasval(this._pointColor) ? this._pointColor.cssString : null), + lineThickness: this._lineThickness, + pointSize: this._pointSize, + dash: this._dash, + fragmentGuids: this._fragmentGuids.toArray(), + }; + } +} + + +export class TimelineTimeseriesFragmentModel { + private _fragmentGuid: string; + // notification provides the start and end indexes of the modified range + // start index is inclusive, end index is exclusive + private _dataChanged: Notification2; + private _attrsChanged: Notification; + private _userEditMode: string; + private _data: number[]; + private _times_PMILLIS: number[]; + + constructor(fragment: TimelineTimeseriesFragment) { + this._fragmentGuid = fragment.fragmentGuid; + this._attrsChanged = new Notification(); + this._dataChanged = new Notification2(); + this.setAttrs(fragment); + } - get dash( ) : number { - return this._dash; - } + get fragmentGuid(): string { + return this._fragmentGuid; + } - set dash( dash : number ) { - if ( dash !== this._dash ) { - this._dash = dash; - this._attrsChanged.fire( ); - } - } + get dataChanged(): Notification2 { + return this._dataChanged; + } - get uiHint( ) : string { - return this._uiHint; - } + setAttrs(fragment: TimelineTimeseriesFragment) { + this._userEditMode = fragment.userEditMode; + this._times_PMILLIS = hasval(fragment.times_ISO8601) ? fragment.times_ISO8601.map(parseTime_PMILLIS) : []; + this._data = hasval(fragment.data) ? fragment.data.slice() : []; + this._dataChanged.fire(0, this._data.length); + this._attrsChanged.fire(); + } - set uiHint( uiHint : string ) { - if ( uiHint !== this._uiHint ) { - this._uiHint = uiHint; - this._attrsChanged.fire( ); - } - } + get data(): number[] { + return this._data; + } - get fragmentGuids( ) : OrderedStringSet { - return this._fragmentGuids; + set data(data: number[]) { + if (data !== this._data) { + this._data = data; + this._dataChanged.fire(0, this._data.length); } + } - set fragmentGuids( fragmentGuids : OrderedStringSet ) { - if ( fragmentGuids !== this._fragmentGuids ) { - this._fragmentGuids = fragmentGuids; - this._attrsChanged.fire( ); - } - } + get times_PMILLIS(): number[] { + return this._times_PMILLIS; + } - snapshot( ) : TimelineTimeseries { - return { - timeseriesGuid: this._timeseriesGuid, - uiHint: this._uiHint, - baseline: this._baseline, - lineColor: ( hasval( this._lineColor ) ? this._lineColor.cssString : null ), - pointColor: ( hasval( this._pointColor ) ? this._pointColor.cssString : null ), - lineThickness: this._lineThickness, - pointSize: this._pointSize, - dash: this._dash, - fragmentGuids: this._fragmentGuids.toArray( ), - }; + // Time should only be modified in a way which keeps the _times_PMILLIS + // array sorted. This is currently not enforced by the model. + set times_PMILLIS(times_PMILLIS: number[]) { + if (times_PMILLIS !== this._times_PMILLIS) { + this._times_PMILLIS = times_PMILLIS; + this._dataChanged.fire(0, this._data.length); } } + // Time should only be modified in a way which keeps the _times_PMILLIS + // array sorted. This is currently not enforced by the model. + setAllData(data: number[], times_PMILLIS: number[]) { + if (data !== this._data || times_PMILLIS !== this._times_PMILLIS) { + this._data = data; + this._times_PMILLIS = times_PMILLIS; + this._dataChanged.fire(0, this._data.length); + } + } - export class TimelineTimeseriesFragmentModel { - private _fragmentGuid : string; - // notification provides the start and end indexes of the modified range - // start index is inclusive, end index is exclusive - private _dataChanged : Notification2; - private _attrsChanged : Notification; - private _userEditMode : string; - private _data : number[]; - private _times_PMILLIS : number[]; + // Handles adjusting the _times_PMILLIS and _data arrays if the new time + // requires them to be rearranged to stay in time order. Returns the new + // index assigned to the data point. + setData(index: number, value: number, time?: number): number { + if (this._data[index] !== value || (hasval(time) && this._times_PMILLIS[index] !== time)) { + if (hasval(time)) { + // the new time value would maintain the sorted order of the array + if ((index === 0 || time > this._times_PMILLIS[index - 1]) && + (index === this._times_PMILLIS.length - 1 || time < this._times_PMILLIS[index + 1])) { + this._times_PMILLIS[index] = time; + this._data[index] = value; + this._dataChanged.fire(index, index + 1); + } + else { + // remove the current point at index + this._times_PMILLIS.splice(index, 1); + this._data.splice(index, 1); - constructor( fragment : TimelineTimeseriesFragment ) { - this._fragmentGuid = fragment.fragmentGuid; - this._attrsChanged = new Notification( ); - this._dataChanged = new Notification2( ); - this.setAttrs( fragment ); - } + // find the index to reinsert new data at + index = indexOf(this._times_PMILLIS, time); + if (index < 0) index = -index - 1; - get fragmentGuid( ) : string { - return this._fragmentGuid; + this._times_PMILLIS.splice(index, 0, time); + this._data.splice(index, 0, value); + this._dataChanged.fire(index, index + 1); + } + } + else { + this._data[index] = value; + this._dataChanged.fire(index, index + 1); + } } - get dataChanged( ) : Notification2 { - return this._dataChanged; - } + return index; + } - setAttrs( fragment : TimelineTimeseriesFragment ) { - this._userEditMode = fragment.userEditMode; - this._times_PMILLIS = hasval( fragment.times_ISO8601 ) ? fragment.times_ISO8601.map( parseTime_PMILLIS ) : []; - this._data = hasval( fragment.data ) ? fragment.data.slice( ) : []; - this._dataChanged.fire( 0, this._data.length ); - this._attrsChanged.fire( ); - } + get start_PMILLIS(): number { + return this._times_PMILLIS[0]; + } - get data( ) : number[] { - return this._data; - } + get end_PMILLIS(): number { + return this._times_PMILLIS.slice(-1)[0]; + } - set data( data : number[] ) { - if ( data !== this._data ) { - this._data = data; - this._dataChanged.fire( 0, this._data.length ); - } - } + get userEditMode(): string { + return this._userEditMode; + } - get times_PMILLIS( ) : number[] { - return this._times_PMILLIS; + set userEditMode(userEditMode: string) { + if (userEditMode !== this._userEditMode) { + this._userEditMode = userEditMode; + this._attrsChanged.fire(); } + } - // Time should only be modified in a way which keeps the _times_PMILLIS - // array sorted. This is currently not enforced by the model. - set times_PMILLIS( times_PMILLIS : number[] ) { - if ( times_PMILLIS !== this._times_PMILLIS ) { - this._times_PMILLIS = times_PMILLIS; - this._dataChanged.fire( 0, this._data.length ); - } - } + snapshot(): TimelineTimeseriesFragment { + return { + userEditMode: this._userEditMode, + fragmentGuid: this._fragmentGuid, + data: this._data.slice(), + times_ISO8601: this._times_PMILLIS.map(formatTime_ISO8601) + }; + } +} + + +export class TimelineEventModel { + private _eventGuid: string; + private _attrsChanged: Notification; + private _startLimit_PMILLIS: number; + private _endLimit_PMILLIS: number; + private _start_PMILLIS: number; + private _end_PMILLIS: number; + private _label: string; + private _labelIcon: string; + private _userEditable: boolean; + private _styleGuid: string; + private _order: number; + private _topMargin: number; + private _bottomMargin: number; + private _fgColor: Color; + private _bgColor: Color; + private _bgSecondaryColor: Color; + private _borderColor: Color; + private _borderSecondaryColor: Color; + private _labelTopMargin: number; + private _labelBottomMargin: number; + private _labelVAlign: number; + private _labelVPos: number; + private _labelHAlign: number; + private _labelHPos: number; + private _isBorderDashed: boolean; + private _fillPattern: FillPattern; + + constructor(event: TimelineEvent) { + this._eventGuid = event.eventGuid; + this._attrsChanged = new Notification(); + this.setAttrs(event); + } - // Time should only be modified in a way which keeps the _times_PMILLIS - // array sorted. This is currently not enforced by the model. - setAllData( data : number[], times_PMILLIS : number[] ) { - if ( data !== this._data || times_PMILLIS !== this._times_PMILLIS ) { - this._data = data; - this._times_PMILLIS = times_PMILLIS; - this._dataChanged.fire( 0, this._data.length ); - } - } + get eventGuid(): string { + return this._eventGuid; + } - // Handles adjusting the _times_PMILLIS and _data arrays if the new time - // requires them to be rearranged to stay in time order. Returns the new - // index assigned to the data point. - setData( index : number, value : number, time? : number ) : number { - if ( this._data[index] !== value || ( hasval( time ) && this._times_PMILLIS[index] !== time ) ) { - if ( hasval( time ) ) { - // the new time value would maintain the sorted order of the array - if ( ( index === 0 || time > this._times_PMILLIS[index-1] ) && - ( index === this._times_PMILLIS.length-1 || time < this._times_PMILLIS[index+1] ) ) { - this._times_PMILLIS[index] = time; - this._data[index] = value; - this._dataChanged.fire( index, index+1 ); - } - else { - // remove the current point at index - this._times_PMILLIS.splice( index, 1 ); - this._data.splice( index, 1 ); - - // find the index to reinsert new data at - index = indexOf( this._times_PMILLIS, time ); - if ( index < 0 ) index = -index-1; - - this._times_PMILLIS.splice( index, 0, time ); - this._data.splice( index, 0, value ); - this._dataChanged.fire( index, index+1 ); - } - } - else { - this._data[index] = value; - this._dataChanged.fire( index, index+1 ); - } - } + get attrsChanged(): Notification { + return this._attrsChanged; + } - return index; - } + setAttrs(event: TimelineEvent) { + // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here + this._startLimit_PMILLIS = (hasval(event.startLimit_ISO8601) ? parseTime_PMILLIS(event.startLimit_ISO8601) : null); + this._endLimit_PMILLIS = (hasval(event.endLimit_ISO8601) ? parseTime_PMILLIS(event.endLimit_ISO8601) : null); + this._start_PMILLIS = parseTime_PMILLIS(event.start_ISO8601); + this._end_PMILLIS = parseTime_PMILLIS(event.end_ISO8601); + this._label = event.label; + this._labelIcon = event.labelIcon; + this._userEditable = (hasval(event.userEditable) ? event.userEditable : false); + this._styleGuid = event.styleGuid; + this._order = event.order; + this._topMargin = event.topMargin; + this._bottomMargin = event.bottomMargin; + this._fgColor = (hasval(event.fgColor) ? parseCssColor(event.fgColor) : null); + this._bgColor = (hasval(event.bgColor) ? parseCssColor(event.bgColor) : null); + this._bgSecondaryColor = (hasval(event.bgSecondaryColor) ? parseCssColor(event.bgSecondaryColor) : null); + this._borderColor = (hasval(event.borderColor) ? parseCssColor(event.borderColor) : null); + this._borderSecondaryColor = (hasval(event.borderSecondaryColor) ? parseCssColor(event.borderSecondaryColor) : null); + this._labelTopMargin = event.labelTopMargin; + this._labelBottomMargin = event.labelBottomMargin; + this._labelVAlign = event.labelVAlign; + this._labelVPos = event.labelVPos; + this._labelHAlign = event.labelHAlign; + this._labelHPos = event.labelHPos; + this._isBorderDashed = (hasval(event.isBorderDashed) ? event.isBorderDashed : false); + this._fillPattern = (hasval(event.fillPattern) ? FillPattern[event.fillPattern] : FillPattern.solid); + this._attrsChanged.fire(); + } - get start_PMILLIS( ) : number { - return this._times_PMILLIS[ 0 ]; - } + setInterval(start_PMILLIS: number, end_PMILLIS: number) { + if (start_PMILLIS !== this._start_PMILLIS || end_PMILLIS !== this._end_PMILLIS) { - get end_PMILLIS( ) : number { - return this._times_PMILLIS.slice( -1 )[ 0 ]; - } + let initial_start_PMILLIS = this._start_PMILLIS; + let initial_end_PMILLIS = this._end_PMILLIS; - get userEditMode( ) : string { - return this._userEditMode; - } + let underStartLimit = hasval(this._startLimit_PMILLIS) && start_PMILLIS < this._startLimit_PMILLIS; + let overEndLimit = hasval(this._endLimit_PMILLIS) && end_PMILLIS > this._endLimit_PMILLIS; + let duration_PMILLIS = end_PMILLIS - start_PMILLIS; + let durationLimit_PMILLIS = this._endLimit_PMILLIS - this._startLimit_PMILLIS; - set userEditMode( userEditMode : string ) { - if ( userEditMode !== this._userEditMode ) { - this._userEditMode = userEditMode; - this._attrsChanged.fire( ); + // If both limits are present and the event is larger than the total distance between them + // then shrink the event to fit between the limits. + if (hasval(this._startLimit_PMILLIS) && hasval(this._endLimit_PMILLIS) && durationLimit_PMILLIS < duration_PMILLIS) { + this._start_PMILLIS = this._startLimit_PMILLIS; + this._end_PMILLIS = this._endLimit_PMILLIS; + } + // Otherwise shift the event to comply with the limits without adjusting its total duration + else if (underStartLimit) { + this._start_PMILLIS = this._startLimit_PMILLIS; + this._end_PMILLIS = this._start_PMILLIS + duration_PMILLIS; + } + else if (overEndLimit) { + this._end_PMILLIS = this._endLimit_PMILLIS; + this._start_PMILLIS = this._end_PMILLIS - duration_PMILLIS; + } + else { + this._end_PMILLIS = end_PMILLIS; + this._start_PMILLIS = start_PMILLIS; } - } - - snapshot( ) : TimelineTimeseriesFragment { - return { - userEditMode: this._userEditMode, - fragmentGuid: this._fragmentGuid, - data: this._data.slice( ), - times_ISO8601: this._times_PMILLIS.map( formatTime_ISO8601 ) - }; - } - } - - - export class TimelineEventModel { - private _eventGuid : string; - private _attrsChanged : Notification; - private _startLimit_PMILLIS : number; - private _endLimit_PMILLIS : number; - private _start_PMILLIS : number; - private _end_PMILLIS : number; - private _label : string; - private _labelIcon : string; - private _userEditable : boolean; - private _styleGuid : string; - private _order : number; - private _topMargin : number; - private _bottomMargin : number; - private _fgColor : Color; - private _bgColor : Color; - private _bgSecondaryColor : Color; - private _borderColor : Color; - private _borderSecondaryColor : Color; - private _labelTopMargin : number; - private _labelBottomMargin : number; - private _labelVAlign : number; - private _labelVPos : number; - private _labelHAlign : number; - private _labelHPos : number; - private _isBorderDashed : boolean; - private _fillPattern: FillPattern; - - constructor( event : TimelineEvent ) { - this._eventGuid = event.eventGuid; - this._attrsChanged = new Notification( ); - this.setAttrs( event ); - } - - get eventGuid( ) : string { - return this._eventGuid; - } - - get attrsChanged( ) : Notification { - return this._attrsChanged; - } - - setAttrs( event : TimelineEvent ) { - // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - this._startLimit_PMILLIS = ( hasval( event.startLimit_ISO8601 ) ? parseTime_PMILLIS( event.startLimit_ISO8601 ) : null ); - this._endLimit_PMILLIS = ( hasval( event.endLimit_ISO8601 ) ? parseTime_PMILLIS( event.endLimit_ISO8601 ) : null ); - this._start_PMILLIS = parseTime_PMILLIS( event.start_ISO8601 ); - this._end_PMILLIS = parseTime_PMILLIS( event.end_ISO8601 ); - this._label = event.label; - this._labelIcon = event.labelIcon; - this._userEditable = ( hasval( event.userEditable ) ? event.userEditable : false ); - this._styleGuid = event.styleGuid; - this._order = event.order; - this._topMargin = event.topMargin; - this._bottomMargin = event.bottomMargin; - this._fgColor = ( hasval( event.fgColor ) ? parseCssColor( event.fgColor ) : null ); - this._bgColor = ( hasval( event.bgColor ) ? parseCssColor( event.bgColor ) : null ); - this._bgSecondaryColor = ( hasval( event.bgSecondaryColor ) ? parseCssColor( event.bgSecondaryColor ) : null ); - this._borderColor = ( hasval( event.borderColor ) ? parseCssColor( event.borderColor ) : null ); - this._borderSecondaryColor = ( hasval( event.borderSecondaryColor ) ? parseCssColor( event.borderSecondaryColor ) : null ); - this._labelTopMargin = event.labelTopMargin; - this._labelBottomMargin = event.labelBottomMargin; - this._labelVAlign = event.labelVAlign; - this._labelVPos = event.labelVPos; - this._labelHAlign = event.labelHAlign; - this._labelHPos = event.labelHPos; - this._isBorderDashed = ( hasval( event.isBorderDashed ) ? event.isBorderDashed : false ); - this._fillPattern = ( hasval( event.fillPattern ) ? FillPattern[ event.fillPattern ] : FillPattern.solid ); - this._attrsChanged.fire( ); - } - - setInterval( start_PMILLIS : number, end_PMILLIS : number ) { - if ( start_PMILLIS !== this._start_PMILLIS || end_PMILLIS !== this._end_PMILLIS ) { - - var initial_start_PMILLIS = this._start_PMILLIS; - var initial_end_PMILLIS = this._end_PMILLIS; - - var underStartLimit = hasval( this._startLimit_PMILLIS ) && start_PMILLIS < this._startLimit_PMILLIS; - var overEndLimit = hasval( this._endLimit_PMILLIS ) && end_PMILLIS > this._endLimit_PMILLIS; - var duration_PMILLIS = end_PMILLIS - start_PMILLIS; - var durationLimit_PMILLIS = this._endLimit_PMILLIS - this._startLimit_PMILLIS; - - // If both limits are present and the event is larger than the total distance between them - // then shrink the event to fit between the limits. - if ( hasval( this._startLimit_PMILLIS ) && hasval( this._endLimit_PMILLIS ) && durationLimit_PMILLIS < duration_PMILLIS ) { - this._start_PMILLIS = this._startLimit_PMILLIS; - this._end_PMILLIS = this._endLimit_PMILLIS; - } - // Otherwise shift the event to comply with the limits without adjusting its total duration - else if ( underStartLimit ) { - this._start_PMILLIS = this._startLimit_PMILLIS; - this._end_PMILLIS = this._start_PMILLIS + duration_PMILLIS; - } - else if ( overEndLimit ) { - this._end_PMILLIS = this._endLimit_PMILLIS; - this._start_PMILLIS = this._end_PMILLIS - duration_PMILLIS; - } - else { - this._end_PMILLIS = end_PMILLIS; - this._start_PMILLIS = start_PMILLIS; - } - // its possible due to the limits that the values didn't actually change - // only fire attrsChanged if one of the values did actually change - if ( initial_start_PMILLIS !== this._start_PMILLIS || initial_end_PMILLIS !== this._end_PMILLIS ) { - this._attrsChanged.fire( ); - } + // its possible due to the limits that the values didn't actually change + // only fire attrsChanged if one of the values did actually change + if (initial_start_PMILLIS !== this._start_PMILLIS || initial_end_PMILLIS !== this._end_PMILLIS) { + this._attrsChanged.fire(); } } + } - private limit_start_PMILLIS( start_PMILLIS : number ) { - return hasval( this._startLimit_PMILLIS ) ? Math.max( start_PMILLIS, this._startLimit_PMILLIS ) : start_PMILLIS; - } + private limit_start_PMILLIS(start_PMILLIS: number) { + return hasval(this._startLimit_PMILLIS) ? Math.max(start_PMILLIS, this._startLimit_PMILLIS) : start_PMILLIS; + } - private limit_end_PMILLIS( end_PMILLIS : number ) { - return hasval( this._endLimit_PMILLIS ) ? Math.min( end_PMILLIS, this._endLimit_PMILLIS ) : end_PMILLIS; - } + private limit_end_PMILLIS(end_PMILLIS: number) { + return hasval(this._endLimit_PMILLIS) ? Math.min(end_PMILLIS, this._endLimit_PMILLIS) : end_PMILLIS; + } - get start_PMILLIS( ) : number { - return this._start_PMILLIS; - } + get start_PMILLIS(): number { + return this._start_PMILLIS; + } - set start_PMILLIS( start_PMILLIS : number ) { - if ( start_PMILLIS !== this._start_PMILLIS ) { - this._start_PMILLIS = this.limit_start_PMILLIS( start_PMILLIS ); - this._attrsChanged.fire( ); - } + set start_PMILLIS(start_PMILLIS: number) { + if (start_PMILLIS !== this._start_PMILLIS) { + this._start_PMILLIS = this.limit_start_PMILLIS(start_PMILLIS); + this._attrsChanged.fire(); } + } - get end_PMILLIS( ) : number { - return this._end_PMILLIS; - } + get end_PMILLIS(): number { + return this._end_PMILLIS; + } - set end_PMILLIS( end_PMILLIS : number ) { - if ( end_PMILLIS !== this._end_PMILLIS ) { - this._end_PMILLIS = this.limit_end_PMILLIS( end_PMILLIS ); - this._attrsChanged.fire( ); - } + set end_PMILLIS(end_PMILLIS: number) { + if (end_PMILLIS !== this._end_PMILLIS) { + this._end_PMILLIS = this.limit_end_PMILLIS(end_PMILLIS); + this._attrsChanged.fire(); } + } - get startLimit_PMILLIS( ) : number { - return this._startLimit_PMILLIS; - } + get startLimit_PMILLIS(): number { + return this._startLimit_PMILLIS; + } - set startLimit_PMILLIS( startLimit_PMILLIS : number ) { - if ( startLimit_PMILLIS !== this._startLimit_PMILLIS ) { - this._startLimit_PMILLIS = startLimit_PMILLIS; - this._start_PMILLIS = this.limit_start_PMILLIS( this._start_PMILLIS ); - this._attrsChanged.fire( ); - } + set startLimit_PMILLIS(startLimit_PMILLIS: number) { + if (startLimit_PMILLIS !== this._startLimit_PMILLIS) { + this._startLimit_PMILLIS = startLimit_PMILLIS; + this._start_PMILLIS = this.limit_start_PMILLIS(this._start_PMILLIS); + this._attrsChanged.fire(); } + } - get endLimit_PMILLIS( ) : number { - return this._endLimit_PMILLIS; - } + get endLimit_PMILLIS(): number { + return this._endLimit_PMILLIS; + } - set endLimit_PMILLIS( endLimit_PMILLIS : number ) { - if ( endLimit_PMILLIS !== this._endLimit_PMILLIS ) { - this._endLimit_PMILLIS = endLimit_PMILLIS; - this._end_PMILLIS = this.limit_end_PMILLIS( this._end_PMILLIS ); - this._attrsChanged.fire( ); - } + set endLimit_PMILLIS(endLimit_PMILLIS: number) { + if (endLimit_PMILLIS !== this._endLimit_PMILLIS) { + this._endLimit_PMILLIS = endLimit_PMILLIS; + this._end_PMILLIS = this.limit_end_PMILLIS(this._end_PMILLIS); + this._attrsChanged.fire(); } + } - get label( ) : string { - return this._label; - } - - set label( label : string ) { - if ( label !== this._label ) { - this._label = label; - this._attrsChanged.fire( ); - } - } + get label(): string { + return this._label; + } - get labelIcon( ) : string { - return this._labelIcon; + set label(label: string) { + if (label !== this._label) { + this._label = label; + this._attrsChanged.fire(); } + } - set labelIcon( labelIcon : string ) { - if ( labelIcon !== this._labelIcon ) { - this._labelIcon = labelIcon; - this._attrsChanged.fire( ); - } - } + get labelIcon(): string { + return this._labelIcon; + } - get userEditable( ) : boolean { - return this._userEditable; + set labelIcon(labelIcon: string) { + if (labelIcon !== this._labelIcon) { + this._labelIcon = labelIcon; + this._attrsChanged.fire(); } + } - set userEditable( userEditable : boolean ) { - if ( userEditable !== this._userEditable ) { - this._userEditable = userEditable; - this._attrsChanged.fire( ); - } - } + get userEditable(): boolean { + return this._userEditable; + } - get styleGuid( ) : string { - return this._styleGuid; + set userEditable(userEditable: boolean) { + if (userEditable !== this._userEditable) { + this._userEditable = userEditable; + this._attrsChanged.fire(); } + } - set styleGuid( styleGuid : string ) { - if ( styleGuid !== this._styleGuid ) { - this._styleGuid = styleGuid; - this._attrsChanged.fire( ); - } - } + get styleGuid(): string { + return this._styleGuid; + } - get order( ) : number { - return this._order; + set styleGuid(styleGuid: string) { + if (styleGuid !== this._styleGuid) { + this._styleGuid = styleGuid; + this._attrsChanged.fire(); } + } - set order( order : number ) { - if ( order !== this._order ) { - this._order = order; - this._attrsChanged.fire( ); - } - } + get order(): number { + return this._order; + } - get topMargin( ) : number { - return this._topMargin; + set order(order: number) { + if (order !== this._order) { + this._order = order; + this._attrsChanged.fire(); } + } - set topMargin( topMargin : number ) { - if ( topMargin !== this._topMargin ) { - this._topMargin = topMargin; - this._attrsChanged.fire( ); - } - } + get topMargin(): number { + return this._topMargin; + } - get bottomMargin( ) : number { - return this._bottomMargin; + set topMargin(topMargin: number) { + if (topMargin !== this._topMargin) { + this._topMargin = topMargin; + this._attrsChanged.fire(); } + } - set bottomMargin( bottomMargin : number ) { - if ( bottomMargin !== this._bottomMargin ) { - this._bottomMargin = bottomMargin; - this._attrsChanged.fire( ); - } - } + get bottomMargin(): number { + return this._bottomMargin; + } - get fgColor( ) : Color { - return this._fgColor; + set bottomMargin(bottomMargin: number) { + if (bottomMargin !== this._bottomMargin) { + this._bottomMargin = bottomMargin; + this._attrsChanged.fire(); } + } - set fgColor( fgColor : Color ) { - if ( fgColor !== this._fgColor ) { - this._fgColor = fgColor; - this._attrsChanged.fire( ); - } - } + get fgColor(): Color { + return this._fgColor; + } - get bgColor( ) : Color { - return this._bgColor; + set fgColor(fgColor: Color) { + if (fgColor !== this._fgColor) { + this._fgColor = fgColor; + this._attrsChanged.fire(); } + } - set bgColor( bgColor : Color ) { - if ( bgColor !== this._bgColor ) { - this._bgColor = bgColor; - this._attrsChanged.fire( ); - } - } + get bgColor(): Color { + return this._bgColor; + } - get bgSecondaryColor( ) : Color { - return this._bgSecondaryColor; + set bgColor(bgColor: Color) { + if (bgColor !== this._bgColor) { + this._bgColor = bgColor; + this._attrsChanged.fire(); } + } - set bgSecondaryColor( bgSecondaryColor : Color ) { - if ( bgSecondaryColor !== this._bgSecondaryColor ) { - this._bgSecondaryColor = bgSecondaryColor; - this._attrsChanged.fire( ); - } - } + get bgSecondaryColor(): Color { + return this._bgSecondaryColor; + } - get borderColor( ) : Color { - return this._borderColor; + set bgSecondaryColor(bgSecondaryColor: Color) { + if (bgSecondaryColor !== this._bgSecondaryColor) { + this._bgSecondaryColor = bgSecondaryColor; + this._attrsChanged.fire(); } + } - set borderColor( borderColor : Color ) { - if ( borderColor !== this._borderColor ) { - this._borderColor = borderColor; - this._attrsChanged.fire( ); - } - } + get borderColor(): Color { + return this._borderColor; + } - get borderSecondaryColor( ) : Color { - return this._borderSecondaryColor; + set borderColor(borderColor: Color) { + if (borderColor !== this._borderColor) { + this._borderColor = borderColor; + this._attrsChanged.fire(); } + } - set borderSecondaryColor( borderSecondaryColor : Color ) { - if ( borderSecondaryColor !== this._borderSecondaryColor ) { - this._borderSecondaryColor = borderSecondaryColor; - this._attrsChanged.fire( ); - } - } + get borderSecondaryColor(): Color { + return this._borderSecondaryColor; + } - get labelTopMargin( ) : number { - return this._labelTopMargin; + set borderSecondaryColor(borderSecondaryColor: Color) { + if (borderSecondaryColor !== this._borderSecondaryColor) { + this._borderSecondaryColor = borderSecondaryColor; + this._attrsChanged.fire(); } + } - set labelTopMargin( labelTopMargin : number ) { - if ( labelTopMargin !== this._labelTopMargin ) { - this._labelTopMargin = labelTopMargin; - this._attrsChanged.fire( ); - } - } + get labelTopMargin(): number { + return this._labelTopMargin; + } - get labelBottomMargin( ) : number { - return this._labelBottomMargin; + set labelTopMargin(labelTopMargin: number) { + if (labelTopMargin !== this._labelTopMargin) { + this._labelTopMargin = labelTopMargin; + this._attrsChanged.fire(); } + } - set labelBottomMargin( labelBottomMargin : number ) { - if ( labelBottomMargin !== this._labelBottomMargin ) { - this._labelBottomMargin = labelBottomMargin; - this._attrsChanged.fire( ); - } - } + get labelBottomMargin(): number { + return this._labelBottomMargin; + } - get labelVAlign( ) : number { - return this._labelVAlign; + set labelBottomMargin(labelBottomMargin: number) { + if (labelBottomMargin !== this._labelBottomMargin) { + this._labelBottomMargin = labelBottomMargin; + this._attrsChanged.fire(); } + } - set labelVAlign( labelVAlign : number ) { - if ( labelVAlign !== this._labelVAlign ) { - this._labelVAlign = labelVAlign; - this._attrsChanged.fire( ); - } - } + get labelVAlign(): number { + return this._labelVAlign; + } - get labelVPos( ) : number { - return this._labelVPos; + set labelVAlign(labelVAlign: number) { + if (labelVAlign !== this._labelVAlign) { + this._labelVAlign = labelVAlign; + this._attrsChanged.fire(); } + } - set labelVPos( labelVPos : number ) { - if ( labelVPos !== this._labelVPos ) { - this._labelVPos = labelVPos; - this._attrsChanged.fire( ); - } - } + get labelVPos(): number { + return this._labelVPos; + } - get labelHAlign( ) : number { - return this._labelHAlign; + set labelVPos(labelVPos: number) { + if (labelVPos !== this._labelVPos) { + this._labelVPos = labelVPos; + this._attrsChanged.fire(); } + } - set labelHAlign( labelHAlign : number ) { - if ( labelHAlign !== this._labelHAlign ) { - this._labelHAlign = labelHAlign; - this._attrsChanged.fire( ); - } - } + get labelHAlign(): number { + return this._labelHAlign; + } - get labelHPos( ) : number { - return this._labelHPos; + set labelHAlign(labelHAlign: number) { + if (labelHAlign !== this._labelHAlign) { + this._labelHAlign = labelHAlign; + this._attrsChanged.fire(); } + } - set labelHPos( labelHPos : number ) { - if ( labelHPos !== this._labelHPos ) { - this._labelHPos = labelHPos; - this._attrsChanged.fire( ); - } - } + get labelHPos(): number { + return this._labelHPos; + } - get isBorderDashed( ) : boolean { - return this._isBorderDashed; + set labelHPos(labelHPos: number) { + if (labelHPos !== this._labelHPos) { + this._labelHPos = labelHPos; + this._attrsChanged.fire(); } + } - set isBorderDashed( isBorderDashed : boolean ) { - if ( isBorderDashed !== this._isBorderDashed ) { - this._isBorderDashed = isBorderDashed; - this._attrsChanged.fire( ); - } - } + get isBorderDashed(): boolean { + return this._isBorderDashed; + } - get fillPattern( ) : FillPattern { - return this._fillPattern; + set isBorderDashed(isBorderDashed: boolean) { + if (isBorderDashed !== this._isBorderDashed) { + this._isBorderDashed = isBorderDashed; + this._attrsChanged.fire(); } + } - set fillPattern( fillPattern : FillPattern ) { - if ( fillPattern !== this._fillPattern ) { - this._fillPattern = fillPattern; - this._attrsChanged.fire( ); - } - } + get fillPattern(): FillPattern { + return this._fillPattern; + } - snapshot( ) : TimelineEvent { - return { - eventGuid: this._eventGuid, - startLimit_ISO8601: ( hasval( this._startLimit_PMILLIS ) ? formatTime_ISO8601( this._startLimit_PMILLIS ) : null ), - endLimit_ISO8601: ( hasval( this._endLimit_PMILLIS ) ? formatTime_ISO8601( this._endLimit_PMILLIS ) : null ), - start_ISO8601: formatTime_ISO8601( this._start_PMILLIS ), - end_ISO8601: formatTime_ISO8601( this._end_PMILLIS ), - label: this._label, - labelIcon: this._labelIcon, - userEditable: this._userEditable, - styleGuid: this._styleGuid, - order: this._order, - topMargin: this._topMargin, - bottomMargin: this._bottomMargin, - bgColor: ( hasval( this._bgColor ) ? this._bgColor.cssString : null ), - bgSecondaryColor: ( hasval( this._bgSecondaryColor ) ? this._bgSecondaryColor.cssString : null ), - fgColor: ( hasval( this._fgColor ) ? this._fgColor.cssString : null ), - borderColor: ( hasval( this._borderColor ) ? this._borderColor.cssString : null ), - borderSecondaryColor: ( hasval( this._borderSecondaryColor ) ? this.borderSecondaryColor.cssString : null ), - labelTopMargin: this._labelTopMargin, - labelBottomMargin: this._labelBottomMargin, - labelVAlign: this._labelVAlign, - labelVPos: this._labelVPos, - labelHAlign: this._labelHAlign, - labelHPos: this._labelHPos, - isBorderDashed: this._isBorderDashed, - fillPattern: FillPattern[ this._fillPattern ] - }; + set fillPattern(fillPattern: FillPattern) { + if (fillPattern !== this._fillPattern) { + this._fillPattern = fillPattern; + this._attrsChanged.fire(); } } + snapshot(): TimelineEvent { + return { + eventGuid: this._eventGuid, + startLimit_ISO8601: (hasval(this._startLimit_PMILLIS) ? formatTime_ISO8601(this._startLimit_PMILLIS) : null), + endLimit_ISO8601: (hasval(this._endLimit_PMILLIS) ? formatTime_ISO8601(this._endLimit_PMILLIS) : null), + start_ISO8601: formatTime_ISO8601(this._start_PMILLIS), + end_ISO8601: formatTime_ISO8601(this._end_PMILLIS), + label: this._label, + labelIcon: this._labelIcon, + userEditable: this._userEditable, + styleGuid: this._styleGuid, + order: this._order, + topMargin: this._topMargin, + bottomMargin: this._bottomMargin, + bgColor: (hasval(this._bgColor) ? this._bgColor.cssString : null), + bgSecondaryColor: (hasval(this._bgSecondaryColor) ? this._bgSecondaryColor.cssString : null), + fgColor: (hasval(this._fgColor) ? this._fgColor.cssString : null), + borderColor: (hasval(this._borderColor) ? this._borderColor.cssString : null), + borderSecondaryColor: (hasval(this._borderSecondaryColor) ? this.borderSecondaryColor.cssString : null), + labelTopMargin: this._labelTopMargin, + labelBottomMargin: this._labelBottomMargin, + labelVAlign: this._labelVAlign, + labelVPos: this._labelVPos, + labelHAlign: this._labelHAlign, + labelHPos: this._labelHPos, + isBorderDashed: this._isBorderDashed, + fillPattern: FillPattern[this._fillPattern] + }; + } +} + + +export class TimelineRowModel { + private _rowGuid: string; + private _attrsChanged: Notification; + private _rowHeight: number; + private _hidden: boolean; + private _label: string; + private _uiHint: string; + private _eventGuids: OrderedStringSet; + private _timeseriesGuids: OrderedStringSet; + private _annotationGuids: OrderedStringSet; + private _cursorGuid: string; + private _fgLabelColor: Color; + private _bgLabelColor: Color; + private _labelFont: string; + private _dataAxis: Axis1D; + private _bgColor: Color; + + constructor(row: TimelineRow) { + this._rowGuid = row.rowGuid; + this._attrsChanged = new Notification(); + + let min: number = hasval(row.yMin) ? row.yMin : 0; + let max: number = hasval(row.yMax) ? row.yMax : 1; + this._dataAxis = new Axis1D(min, max); + + this.setAttrs(row); + this._eventGuids = new OrderedStringSet(row.eventGuids || []); + this._timeseriesGuids = new OrderedStringSet(row.timeseriesGuids || []); + this._annotationGuids = new OrderedStringSet(row.annotationGuids || []); + } - export class TimelineRowModel { - private _rowGuid : string; - private _attrsChanged : Notification; - private _rowHeight : number; - private _hidden : boolean; - private _label : string; - private _uiHint : string; - private _eventGuids : OrderedStringSet; - private _timeseriesGuids : OrderedStringSet; - private _annotationGuids : OrderedStringSet; - private _cursorGuid : string; - private _fgLabelColor : Color; - private _bgLabelColor : Color; - private _labelFont : string; - private _dataAxis : Axis1D; - private _bgColor : Color; + get rowGuid(): string { + return this._rowGuid; + } - constructor( row : TimelineRow ) { - this._rowGuid = row.rowGuid; - this._attrsChanged = new Notification( ); + get attrsChanged(): Notification { + return this._attrsChanged; + } - var min : number = hasval( row.yMin ) ? row.yMin : 0; - var max : number = hasval( row.yMax ) ? row.yMax : 1; - this._dataAxis = new Axis1D( min, max ); + setAttrs(row: TimelineRow) { + // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here + this._label = row.label; + this._uiHint = row.uiHint; + this._hidden = row.hidden; + this._rowHeight = row.rowHeight; + this._cursorGuid = row.cursorGuid; + this._bgColor = (hasval(row.bgColor) ? parseCssColor(row.bgColor) : null); + this._fgLabelColor = (hasval(row.fgLabelColor) ? parseCssColor(row.fgLabelColor) : null); + this._bgLabelColor = (hasval(row.bgLabelColor) ? parseCssColor(row.bgLabelColor) : null); + this._labelFont = row.labelFont; + this._attrsChanged.fire(); + } - this.setAttrs( row ); - this._eventGuids = new OrderedStringSet( row.eventGuids || [] ); - this._timeseriesGuids = new OrderedStringSet( row.timeseriesGuids || [] ); - this._annotationGuids = new OrderedStringSet( row.annotationGuids || [] ); - } + get cursorGuid(): string { + return this._cursorGuid; + } - get rowGuid( ) : string { - return this._rowGuid; - } + set cursorGuid(cursorGuid: string) { + this._cursorGuid = cursorGuid; + this._attrsChanged.fire(); + } - get attrsChanged( ) : Notification { - return this._attrsChanged; - } + get rowHeight(): number { + return this._rowHeight; + } - setAttrs( row : TimelineRow ) { - // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - this._label = row.label; - this._uiHint = row.uiHint; - this._hidden = row.hidden; - this._rowHeight = row.rowHeight; - this._cursorGuid = row.cursorGuid; - this._bgColor = ( hasval( row.bgColor ) ? parseCssColor( row.bgColor ) : null ); - this._fgLabelColor = ( hasval( row.fgLabelColor ) ? parseCssColor( row.fgLabelColor ) : null ); - this._bgLabelColor = ( hasval( row.bgLabelColor ) ? parseCssColor( row.bgLabelColor ) : null ); - this._labelFont = row.labelFont; - this._attrsChanged.fire( ); - } + set rowHeight(rowHeight: number) { + this._rowHeight = rowHeight; + this._attrsChanged.fire(); + } - get cursorGuid( ) : string { - return this._cursorGuid; - } + get hidden(): boolean { + return this._hidden; + } - set cursorGuid( cursorGuid : string ) { - this._cursorGuid = cursorGuid; - this._attrsChanged.fire( ); - } + set hidden(hidden: boolean) { + this._hidden = hidden; + this._attrsChanged.fire(); + } - get rowHeight( ) : number { - return this._rowHeight; - } + get dataAxis(): Axis1D { + return this._dataAxis; + } - set rowHeight( rowHeight : number ) { - this._rowHeight = rowHeight; - this._attrsChanged.fire( ); - } + set dataAxis(dataAxis: Axis1D) { + this._dataAxis = dataAxis; + this._attrsChanged.fire(); + } - get hidden( ) : boolean { - return this._hidden; - } + get label(): string { + return this._label; + } - set hidden( hidden : boolean ) { - this._hidden = hidden; - this._attrsChanged.fire( ); + set label(label: string) { + if (label !== this._label) { + this._label = label; + this._attrsChanged.fire(); } + } - get dataAxis( ) : Axis1D { - return this._dataAxis; - } + get uiHint(): string { + return this._uiHint; + } - set dataAxis( dataAxis : Axis1D ) { - this._dataAxis = dataAxis; - this._attrsChanged.fire( ); + set uiHint(uiHint: string) { + if (uiHint !== this._uiHint) { + this._uiHint = uiHint; + this._attrsChanged.fire(); } + } - get label( ) : string { - return this._label; - } + get bgColor(): Color { + return this._bgColor; + } - set label( label : string ) { - if ( label !== this._label ) { - this._label = label; - this._attrsChanged.fire( ); - } + set bgColor(bgColor: Color) { + if (bgColor !== this._bgColor) { + this._bgColor = bgColor; + this._attrsChanged.fire(); } + } - get uiHint( ) : string { - return this._uiHint; - } + get bgLabelColor(): Color { + return this._bgLabelColor; + } - set uiHint( uiHint : string ) { - if ( uiHint !== this._uiHint ) { - this._uiHint = uiHint; - this._attrsChanged.fire( ); - } + set bgLabelColor(bgLabelColor: Color) { + if (bgLabelColor !== this._bgLabelColor) { + this._bgLabelColor = bgLabelColor; + this._attrsChanged.fire(); } + } - get bgColor( ) : Color { - return this._bgColor; - } + get fgLabelColor(): Color { + return this._fgLabelColor; + } - set bgColor( bgColor : Color ) { - if ( bgColor !== this._bgColor ) { - this._bgColor = bgColor; - this._attrsChanged.fire( ); - } + set fgLabelColor(fgLabelColor: Color) { + if (fgLabelColor !== this._fgLabelColor) { + this._fgLabelColor = fgLabelColor; + this._attrsChanged.fire(); } + } - get bgLabelColor( ) : Color { - return this._bgLabelColor; - } + get labelFont(): string { + return this._labelFont; + } - set bgLabelColor( bgLabelColor : Color ) { - if ( bgLabelColor !== this._bgLabelColor ) { - this._bgLabelColor = bgLabelColor; - this._attrsChanged.fire( ); - } + set labelFont(labelFont: string) { + if (labelFont !== this._labelFont) { + this._labelFont = labelFont; + this._attrsChanged.fire(); } + } - get fgLabelColor( ) : Color { - return this._fgLabelColor; - } + get eventGuids(): OrderedStringSet { + return this._eventGuids; + } - set fgLabelColor( fgLabelColor : Color ) { - if ( fgLabelColor !== this._fgLabelColor ) { - this._fgLabelColor = fgLabelColor; - this._attrsChanged.fire( ); - } - } + get timeseriesGuids(): OrderedStringSet { + return this._timeseriesGuids; + } - get labelFont( ) : string { - return this._labelFont; - } + get annotationGuids(): OrderedStringSet { + return this._annotationGuids; + } - set labelFont( labelFont : string ) { - if ( labelFont !== this._labelFont ) { - this._labelFont = labelFont; - this._attrsChanged.fire( ); - } - } + snapshot(): TimelineRow { + return { + rowGuid: this._rowGuid, + label: this._label, + rowHeight: this._rowHeight, + hidden: this._hidden, + uiHint: this._uiHint, + eventGuids: this._eventGuids.toArray(), + timeseriesGuids: this._timeseriesGuids.toArray(), + annotationGuids: this._annotationGuids.toArray(), + cursorGuid: this._cursorGuid, + bgColor: (hasval(this._bgColor) ? this._bgColor.cssString : null), + bgLabelColor: (hasval(this._bgLabelColor) ? this._bgLabelColor.cssString : null), + fgLabelColor: (hasval(this._fgLabelColor) ? this._fgLabelColor.cssString : null), + labelFont: this._labelFont + }; + } +} + + +export class TimelineGroupModel { + private _groupGuid: string; + private _rollupGuid: string; + private _attrsChanged: Notification; + private _hidden: boolean; + private _label: string; + private _collapsed: boolean; + private _highlighted: boolean; + private _rowGuids: OrderedStringSet; + + constructor(group: TimelineGroup) { + this._groupGuid = group.groupGuid; + this._attrsChanged = new Notification(); + this.setAttrs(group); + this._rowGuids = new OrderedStringSet(group.rowGuids); + } - get eventGuids( ) : OrderedStringSet { - return this._eventGuids; - } + get groupGuid(): string { + return this._groupGuid; + } - get timeseriesGuids( ) : OrderedStringSet { - return this._timeseriesGuids; - } + get rollupGuid(): string { + return this._rollupGuid; + } - get annotationGuids( ) : OrderedStringSet { - return this._annotationGuids; - } + set rollupGuid(rollupGuid: string) { + this._rollupGuid = rollupGuid; + this._attrsChanged.fire(); + } - snapshot( ) : TimelineRow { - return { - rowGuid: this._rowGuid, - label: this._label, - rowHeight: this._rowHeight, - hidden: this._hidden, - uiHint: this._uiHint, - eventGuids: this._eventGuids.toArray( ), - timeseriesGuids: this._timeseriesGuids.toArray( ), - annotationGuids: this._annotationGuids.toArray( ), - cursorGuid: this._cursorGuid, - bgColor: ( hasval( this._bgColor ) ? this._bgColor.cssString : null ), - bgLabelColor: ( hasval( this._bgLabelColor ) ? this._bgLabelColor.cssString : null ), - fgLabelColor: ( hasval( this._fgLabelColor ) ? this._fgLabelColor.cssString : null ), - labelFont: this._labelFont - }; - } + get attrsChanged(): Notification { + return this._attrsChanged; } + setAttrs(group: TimelineGroup) { + // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here + this._rollupGuid = group.rollupGuid; + this._hidden = group.hidden; + this._label = group.label; + this._collapsed = group.collapsed; + this._highlighted = hasval(group.highlighted) ? group.highlighted : false; + this._attrsChanged.fire(); + } - export class TimelineGroupModel { - private _groupGuid : string; - private _rollupGuid : string; - private _attrsChanged : Notification; - private _hidden : boolean; - private _label : string; - private _collapsed : boolean; - private _highlighted : boolean; - private _rowGuids : OrderedStringSet; + get hidden(): boolean { + return this._hidden; + } - constructor( group : TimelineGroup ) { - this._groupGuid = group.groupGuid; - this._attrsChanged = new Notification( ); - this.setAttrs( group ); - this._rowGuids = new OrderedStringSet( group.rowGuids ); - } + set hidden(hidden: boolean) { + this._hidden = hidden; + this._attrsChanged.fire(); + } - get groupGuid( ) : string { - return this._groupGuid; - } + get label(): string { + return this._label; + } - get rollupGuid( ) : string { - return this._rollupGuid; + set label(label: string) { + if (label !== this._label) { + this._label = label; + this._attrsChanged.fire(); } + } - set rollupGuid( rollupGuid : string ) { - this._rollupGuid = rollupGuid; - this._attrsChanged.fire( ); - } + get collapsed(): boolean { + return this._collapsed; + } - get attrsChanged( ) : Notification { - return this._attrsChanged; + set collapsed(collapsed: boolean) { + if (collapsed !== this._collapsed) { + this._collapsed = collapsed; + this._attrsChanged.fire(); } + } - setAttrs( group : TimelineGroup ) { - // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - this._rollupGuid = group.rollupGuid; - this._hidden = group.hidden; - this._label = group.label; - this._collapsed = group.collapsed; - this._highlighted = hasval(group.highlighted) ? group.highlighted : false; - this._attrsChanged.fire( ); - } + get highlighted(): boolean { + return this._highlighted; + } - get hidden( ) : boolean { - return this._hidden; + set highlighted(highlighted: boolean) { + if (highlighted !== this._highlighted) { + this._highlighted = highlighted; + this._attrsChanged.fire(); } + } - set hidden( hidden : boolean ) { - this._hidden = hidden; - this._attrsChanged.fire( ); - } + get rowGuids(): OrderedStringSet { + return this._rowGuids; + } - get label( ) : string { - return this._label; - } + snapshot(): TimelineGroup { + return { + groupGuid: this._groupGuid, + rollupGuid: this._rollupGuid, + label: this._label, + hidden: this._hidden, + collapsed: (hasval(this._collapsed) ? this._collapsed : false), + highlighted: (hasval(this._highlighted) ? this._highlighted : false), + rowGuids: this._rowGuids.toArray() + }; + } +} + + +export class TimelineRootModel { + private _attrsChanged: Notification; + private _groupGuids: OrderedStringSet; + private _topPinnedRowGuids: OrderedStringSet; + private _bottomPinnedRowGuids: OrderedStringSet; + private _maximizedRowGuids: OrderedStringSet; + + constructor(root: TimelineRoot) { + this._attrsChanged = new Notification(); + this.setAttrs(root); + this._groupGuids = new OrderedStringSet(root.groupGuids); + this._topPinnedRowGuids = new OrderedStringSet(root.topPinnedRowGuids || []); + this._bottomPinnedRowGuids = new OrderedStringSet(root.bottomPinnedRowGuids || []); + this._maximizedRowGuids = new OrderedStringSet(root.maximizedRowGuids || []); + } - set label( label : string ) { - if ( label !== this._label ) { - this._label = label; - this._attrsChanged.fire( ); - } - } + get attrsChanged(): Notification { + return this._attrsChanged; + } - get collapsed( ) : boolean { - return this._collapsed; - } + setAttrs(root: TimelineRoot) { + // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here + // No attrs yet + this._attrsChanged.fire(); + } - set collapsed( collapsed : boolean ) { - if ( collapsed !== this._collapsed ) { - this._collapsed = collapsed; - this._attrsChanged.fire( ); - } - } + get groupGuids(): OrderedStringSet { + return this._groupGuids; + } - get highlighted(): boolean { - return this._highlighted; - } + get topPinnedRowGuids(): OrderedStringSet { + return this._topPinnedRowGuids; + } - set highlighted(highlighted: boolean) { - if (highlighted !== this._highlighted) { - this._highlighted = highlighted; - this._attrsChanged.fire(); - } - } + get bottomPinnedRowGuids(): OrderedStringSet { + return this._bottomPinnedRowGuids; + } - get rowGuids( ) : OrderedStringSet { - return this._rowGuids; - } + get maximizedRowGuids(): OrderedStringSet { + return this._maximizedRowGuids; + } - snapshot( ) : TimelineGroup { - return { - groupGuid: this._groupGuid, - rollupGuid: this._rollupGuid, - label: this._label, - hidden: this._hidden, - collapsed: ( hasval( this._collapsed ) ? this._collapsed : false ), - highlighted: (hasval(this._highlighted) ? this._highlighted : false), - rowGuids: this._rowGuids.toArray( ) - }; - } + snapshot(): TimelineRoot { + return { + groupGuids: this._groupGuids.toArray(), + topPinnedRowGuids: this._topPinnedRowGuids.toArray(), + bottomPinnedRowGuids: this._bottomPinnedRowGuids.toArray(), + maximizedRowGuids: this._maximizedRowGuids.toArray() + }; } +} - export class TimelineRootModel { - private _attrsChanged : Notification; - private _groupGuids : OrderedStringSet; - private _topPinnedRowGuids : OrderedStringSet; - private _bottomPinnedRowGuids : OrderedStringSet; - private _maximizedRowGuids : OrderedStringSet; +export interface TimelineMergeStrategy { + updateCursorModel(cursorModel: TimelineCursorModel, newCursor: TimelineCursor): void; + updateAnnotationModel(annotationModel: TimelineAnnotationModel, newAnnotation: TimelineAnnotation): void; + updateTimeseriesFragmentModel(timeseriesFragmentModel: TimelineTimeseriesFragmentModel, newTimeseriesFragment: TimelineTimeseriesFragment): void; + updateTimeseriesModel(timeseriesModel: TimelineTimeseriesModel, newTimeseries: TimelineTimeseries): void; + updateEventModel(eventModel: TimelineEventModel, newEvent: TimelineEvent): void; + updateRowModel(rowModel: TimelineRowModel, newRow: TimelineRow): void; + updateGroupModel(groupModel: TimelineGroupModel, newGroup: TimelineGroup): void; + updateRootModel(rootModel: TimelineRootModel, newRoot: TimelineRoot): void; +} - constructor( root : TimelineRoot ) { - this._attrsChanged = new Notification( ); - this.setAttrs( root ); - this._groupGuids = new OrderedStringSet( root.groupGuids ); - this._topPinnedRowGuids = new OrderedStringSet( root.topPinnedRowGuids || [] ); - this._bottomPinnedRowGuids = new OrderedStringSet( root.bottomPinnedRowGuids || [] ); - this._maximizedRowGuids = new OrderedStringSet( root.maximizedRowGuids || [] ); - } - get attrsChanged( ) : Notification { - return this._attrsChanged; - } +export class TimelineModel { + private _cursors: OrderedSet; + private _annotations: OrderedSet; + private _timeseriesFragments: OrderedSet; + private _timeseries: OrderedSet; + private _events: OrderedSet; + private _rows: OrderedSet; + private _groups: OrderedSet; + private _root: TimelineRootModel; - setAttrs( root : TimelineRoot ) { - // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - // No attrs yet - this._attrsChanged.fire( ); + constructor(timeline?: Timeline) { + + let cursors = (hasval(timeline) && hasval(timeline.cursors) ? timeline.cursors : []); + this._cursors = new OrderedSet([], (g) => g.cursorGuid); + for (let n = 0; n < cursors.length; n++) { + this._cursors.add(new TimelineCursorModel(cursors[n])); } - get groupGuids( ) : OrderedStringSet { - return this._groupGuids; + let annotations = (hasval(timeline) && hasval(timeline.annotations) ? timeline.annotations : []); + this._annotations = new OrderedSet([], (g) => g.annotationGuid); + for (let n = 0; n < annotations.length; n++) { + this._annotations.add(new TimelineAnnotationModel(annotations[n])); } - get topPinnedRowGuids( ) : OrderedStringSet { - return this._topPinnedRowGuids; + let timeseriesFragments = (hasval(timeline) && hasval(timeline.timeseriesFragments) ? timeline.timeseriesFragments : []); + this._timeseriesFragments = new OrderedSet([], (e) => e.fragmentGuid); + for (let n = 0; n < timeseriesFragments.length; n++) { + this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(timeseriesFragments[n])); } - get bottomPinnedRowGuids( ) : OrderedStringSet { - return this._bottomPinnedRowGuids; + let timeseries = (hasval(timeline) && hasval(timeline.timeseries) ? timeline.timeseries : []); + this._timeseries = new OrderedSet([], (e) => e.timeseriesGuid); + for (let n = 0; n < timeseries.length; n++) { + this._timeseries.add(new TimelineTimeseriesModel(timeseries[n])); } - get maximizedRowGuids( ) : OrderedStringSet { - return this._maximizedRowGuids; + let events = (hasval(timeline) && hasval(timeline.events) ? timeline.events : []); + this._events = new OrderedSet([], (e) => e.eventGuid); + for (let n = 0; n < events.length; n++) { + this._events.add(new TimelineEventModel(events[n])); } - snapshot( ) : TimelineRoot { - return { - groupGuids: this._groupGuids.toArray( ), - topPinnedRowGuids: this._topPinnedRowGuids.toArray( ), - bottomPinnedRowGuids: this._bottomPinnedRowGuids.toArray( ), - maximizedRowGuids: this._maximizedRowGuids.toArray( ) - }; + let rows = (hasval(timeline) && hasval(timeline.rows) ? timeline.rows : []); + this._rows = new OrderedSet([], (r) => r.rowGuid); + for (let n = 0; n < rows.length; n++) { + this._rows.add(new TimelineRowModel(rows[n])); } - } + let groups = (hasval(timeline) && hasval(timeline.groups) ? timeline.groups : []); + this._groups = new OrderedSet([], (g) => g.groupGuid); + for (let n = 0; n < groups.length; n++) { + this._groups.add(new TimelineGroupModel(groups[n])); + } - export interface TimelineMergeStrategy { - updateCursorModel( cursorModel : TimelineCursorModel, newCursor : TimelineCursor ); - updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ); - updateTimeseriesFragmentModel( timeseriesFragmentModel : TimelineTimeseriesFragmentModel, newTimeseriesFragment : TimelineTimeseriesFragment ); - updateTimeseriesModel( timeseriesModel : TimelineTimeseriesModel, newTimeseries : TimelineTimeseries ); - updateEventModel( eventModel : TimelineEventModel, newEvent : TimelineEvent ); - updateRowModel( rowModel : TimelineRowModel, newRow : TimelineRow ); - updateGroupModel( groupModel : TimelineGroupModel, newGroup : TimelineGroup ); - updateRootModel( rootModel : TimelineRootModel, newRoot : TimelineRoot ); + let root = (hasval(timeline) && hasval(timeline.root) ? timeline.root : newEmptyTimelineRoot()); + this._root = new TimelineRootModel(root); } + get cursors(): OrderedSet { return this._cursors; } + get annotations(): OrderedSet { return this._annotations; } + get timeseriesFragments(): OrderedSet { return this._timeseriesFragments; } + get timeseriesSets(): OrderedSet { return this._timeseries; } + get events(): OrderedSet { return this._events; } + get rows(): OrderedSet { return this._rows; } + get groups(): OrderedSet { return this._groups; } + get root(): TimelineRootModel { return this._root; } + + cursor(cursorGuid: string): TimelineCursorModel { return this._cursors.valueFor(cursorGuid); } + annotation(annotationGuid: string): TimelineAnnotationModel { return this._annotations.valueFor(annotationGuid); } + timeseriesFragment(fragmentGuid: string): TimelineTimeseriesFragmentModel { return this._timeseriesFragments.valueFor(fragmentGuid); } + timeseries(timeseriesGuid: string): TimelineTimeseriesModel { return this._timeseries.valueFor(timeseriesGuid); } + event(eventGuid: string): TimelineEventModel { return this._events.valueFor(eventGuid); } + row(rowGuid: string): TimelineRowModel { return this._rows.valueFor(rowGuid); } + group(groupGuid: string): TimelineGroupModel { return this._groups.valueFor(groupGuid); } + - export class TimelineModel { - private _cursors : OrderedSet; - private _annotations : OrderedSet; - private _timeseriesFragments : OrderedSet; - private _timeseries : OrderedSet; - private _events : OrderedSet; - private _rows : OrderedSet; - private _groups : OrderedSet; - private _root : TimelineRootModel; - - constructor( timeline? : Timeline ) { + replace(newTimeline: Timeline) { + + // Purge removed items + // + + let freshRoot = newTimeline.root; + this._root.groupGuids.retainValues(freshRoot.groupGuids); + this._root.topPinnedRowGuids.retainValues(freshRoot.topPinnedRowGuids); + this._root.bottomPinnedRowGuids.retainValues(freshRoot.bottomPinnedRowGuids); + this._root.maximizedRowGuids.retainValues(freshRoot.maximizedRowGuids); - var cursors = ( hasval( timeline ) && hasval( timeline.cursors ) ? timeline.cursors : [] ); - this._cursors = new OrderedSet( [], (g)=>g.cursorGuid ); - for ( var n = 0; n < cursors.length; n++ ) { - this._cursors.add( new TimelineCursorModel( cursors[ n ] ) ); + let freshGroups = newTimeline.groups; + let retainedGroupGuids: string[] = []; + for (let n = 0; n < freshGroups.length; n++) { + let freshGroup = freshGroups[n]; + let groupGuid = freshGroup.groupGuid; + let oldGroup = this._groups.valueFor(groupGuid); + if (hasval(oldGroup)) { + oldGroup.rowGuids.retainValues(freshGroup.rowGuids); + retainedGroupGuids.push(groupGuid); } + } + this._groups.retainIds(retainedGroupGuids); - var annotations = ( hasval( timeline ) && hasval( timeline.annotations ) ? timeline.annotations : [] ); - this._annotations = new OrderedSet( [], (g)=>g.annotationGuid ); - for ( var n = 0; n < annotations.length; n++ ) { - this._annotations.add( new TimelineAnnotationModel( annotations[ n ] ) ); + let freshRows = newTimeline.rows; + let retainedRowGuids: string[] = []; + for (let n = 0; n < freshRows.length; n++) { + let freshRow = freshRows[n]; + let rowGuid = freshRow.rowGuid; + let oldRow = this._rows.valueFor(rowGuid); + if (hasval(oldRow)) { + oldRow.eventGuids.retainValues(freshRow.eventGuids || []); + retainedRowGuids.push(rowGuid); } + } + this._rows.retainIds(retainedRowGuids); - var timeseriesFragments = ( hasval( timeline ) && hasval( timeline.timeseriesFragments ) ? timeline.timeseriesFragments : [] ); - this._timeseriesFragments = new OrderedSet( [], (e)=>e.fragmentGuid ); - for ( var n = 0; n < timeseriesFragments.length; n++ ) { - this._timeseriesFragments.add( new TimelineTimeseriesFragmentModel( timeseriesFragments[ n ] ) ); + let freshEvents = newTimeline.events; + let retainedEventGuids: string[] = []; + for (let n = 0; n < freshEvents.length; n++) { + let freshEvent = freshEvents[n]; + let eventGuid = freshEvent.eventGuid; + let oldEvent = this._events.valueFor(eventGuid); + if (hasval(oldEvent)) { + retainedEventGuids.push(eventGuid); } + } + this._events.retainIds(retainedEventGuids); - var timeseries = ( hasval( timeline ) && hasval( timeline.timeseries ) ? timeline.timeseries : [] ); - this._timeseries = new OrderedSet( [], (e)=>e.timeseriesGuid ); - for ( var n = 0; n < timeseries.length; n++ ) { - this._timeseries.add( new TimelineTimeseriesModel( timeseries[ n ] ) ); + let freshTimeseriesSet = newTimeline.timeseries; + let retainedTimeseriesGuids: string[] = []; + for (let n = 0; n < freshTimeseriesSet.length; n++) { + let freshTimeseries = freshTimeseriesSet[n]; + let timeseriesGuid = freshTimeseries.timeseriesGuid; + let oldTimeseries = this._timeseries.valueFor(timeseriesGuid); + if (hasval(oldTimeseries)) { + retainedTimeseriesGuids.push(timeseriesGuid); } + } + this._timeseries.retainIds(retainedTimeseriesGuids); - var events = ( hasval( timeline ) && hasval( timeline.events ) ? timeline.events : [] ); - this._events = new OrderedSet( [], (e)=>e.eventGuid ); - for ( var n = 0; n < events.length; n++ ) { - this._events.add( new TimelineEventModel( events[ n ] ) ); + let freshTimeseriesFragments = newTimeline.timeseriesFragments; + let retainedTimeseriesFragmentGuids: string[] = []; + for (let n = 0; n < freshTimeseriesFragments.length; n++) { + let freshTimeseriesFragment = freshTimeseriesFragments[n]; + let fragmentGuid = freshTimeseriesFragment.fragmentGuid; + let oldTimeseriesFragment = this._timeseriesFragments.valueFor(fragmentGuid); + if (hasval(oldTimeseriesFragment)) { + retainedTimeseriesFragmentGuids.push(fragmentGuid); } + } + this._timeseriesFragments.retainIds(retainedTimeseriesFragmentGuids); - var rows = ( hasval( timeline ) && hasval( timeline.rows ) ? timeline.rows : [] ); - this._rows = new OrderedSet( [], (r)=>r.rowGuid ); - for ( var n = 0; n < rows.length; n++ ) { - this._rows.add( new TimelineRowModel( rows[ n ] ) ); + let freshAnnotations = newTimeline.annotations; + let retainedAnnotationGuids: string[] = []; + for (let n = 0; n < freshAnnotations.length; n++) { + let freshAnnotation = freshAnnotations[n]; + let annotationGuid = freshAnnotation.annotationGuid; + let oldAnnotation = this._annotations.valueFor(annotationGuid); + if (hasval(oldAnnotation)) { + retainedAnnotationGuids.push(annotationGuid); } + } + this._annotations.retainIds(retainedAnnotationGuids); - var groups = ( hasval( timeline ) && hasval( timeline.groups ) ? timeline.groups : [] ); - this._groups = new OrderedSet( [], (g)=>g.groupGuid ); - for ( var n = 0; n < groups.length; n++ ) { - this._groups.add( new TimelineGroupModel( groups[ n ] ) ); + let freshCursors = newTimeline.cursors; + let retainedCursorGuids: string[] = []; + for (let n = 0; n < freshCursors.length; n++) { + let freshCursor = freshCursors[n]; + let cursorGuid = freshCursor.cursorGuid; + let oldCursor = this._cursors.valueFor(cursorGuid); + if (hasval(oldCursor)) { + retainedCursorGuids.push(cursorGuid); } + } + this._cursors.retainIds(retainedCursorGuids); - var root = ( hasval( timeline ) && hasval( timeline.root ) ? timeline.root : newEmptyTimelineRoot( ) ); - this._root = new TimelineRootModel( root ); - } - - get cursors( ) : OrderedSet { return this._cursors; } - get annotations( ) : OrderedSet { return this._annotations; } - get timeseriesFragments( ) : OrderedSet { return this._timeseriesFragments; } - get timeseriesSets( ) : OrderedSet { return this._timeseries; } - get events( ) : OrderedSet { return this._events; } - get rows( ) : OrderedSet { return this._rows; } - get groups( ) : OrderedSet { return this._groups; } - get root( ) : TimelineRootModel { return this._root; } - - cursor( cursorGuid : string ) : TimelineCursorModel { return this._cursors.valueFor( cursorGuid ); } - annotation( annotationGuid : string ) : TimelineAnnotationModel { return this._annotations.valueFor( annotationGuid ); } - timeseriesFragment( fragmentGuid : string ) : TimelineTimeseriesFragmentModel { return this._timeseriesFragments.valueFor( fragmentGuid ); } - timeseries( timeseriesGuid : string ) : TimelineTimeseriesModel { return this._timeseries.valueFor( timeseriesGuid ); } - event( eventGuid : string ) : TimelineEventModel { return this._events.valueFor( eventGuid ); } - row( rowGuid : string ) : TimelineRowModel { return this._rows.valueFor( rowGuid ); } - group( groupGuid : string ) : TimelineGroupModel { return this._groups.valueFor( groupGuid ); } - - - replace( newTimeline : Timeline ) { - - // Purge removed items - // - - var freshRoot = newTimeline.root; - this._root.groupGuids.retainValues( freshRoot.groupGuids ); - this._root.topPinnedRowGuids.retainValues( freshRoot.topPinnedRowGuids ); - this._root.bottomPinnedRowGuids.retainValues( freshRoot.bottomPinnedRowGuids ); - this._root.maximizedRowGuids.retainValues( freshRoot.maximizedRowGuids ); - - var freshGroups = newTimeline.groups; - var retainedGroupGuids : string[] = []; - for ( var n = 0; n < freshGroups.length; n++ ) { - var freshGroup = freshGroups[ n ]; - var groupGuid = freshGroup.groupGuid; - var oldGroup = this._groups.valueFor( groupGuid ); - if ( hasval( oldGroup ) ) { - oldGroup.rowGuids.retainValues( freshGroup.rowGuids ); - retainedGroupGuids.push( groupGuid ); - } - } - this._groups.retainIds( retainedGroupGuids ); - - var freshRows = newTimeline.rows; - var retainedRowGuids : string[] = []; - for ( var n = 0; n < freshRows.length; n++ ) { - var freshRow = freshRows[ n ]; - var rowGuid = freshRow.rowGuid; - var oldRow = this._rows.valueFor( rowGuid ); - if ( hasval( oldRow ) ) { - oldRow.eventGuids.retainValues( freshRow.eventGuids || [] ); - retainedRowGuids.push( rowGuid ); - } + // Add new items + // + + for (let n = 0; n < freshCursors.length; n++) { + let freshCursor = freshCursors[n]; + let oldCursor = this._cursors.valueFor(freshCursor.cursorGuid); + if (hasval(oldCursor)) { + oldCursor.setAttrs(freshCursor); } - this._rows.retainIds( retainedRowGuids ); - - var freshEvents = newTimeline.events; - var retainedEventGuids : string[] = []; - for ( var n = 0; n < freshEvents.length; n++ ) { - var freshEvent = freshEvents[ n ]; - var eventGuid = freshEvent.eventGuid; - var oldEvent = this._events.valueFor( eventGuid ); - if ( hasval( oldEvent ) ) { - retainedEventGuids.push( eventGuid ); - } + else { + this._cursors.add(new TimelineCursorModel(freshCursor)); } - this._events.retainIds( retainedEventGuids ); - - var freshTimeseriesSet = newTimeline.timeseries; - var retainedTimeseriesGuids : string[] = []; - for ( var n = 0; n < freshTimeseriesSet.length; n++ ) { - var freshTimeseries = freshTimeseriesSet[ n ]; - var timeseriesGuid = freshTimeseries.timeseriesGuid; - var oldTimeseries = this._timeseries.valueFor( timeseriesGuid ); - if ( hasval( oldTimeseries ) ) { - retainedTimeseriesGuids.push( timeseriesGuid ); - } + } + + for (let n = 0; n < freshAnnotations.length; n++) { + let freshAnnotation = freshAnnotations[n]; + let oldAnnotation = this._annotations.valueFor(freshAnnotation.annotationGuid); + if (hasval(oldAnnotation)) { + oldAnnotation.setAttrs(freshAnnotation); } - this._timeseries.retainIds( retainedTimeseriesGuids ); - - var freshTimeseriesFragments = newTimeline.timeseriesFragments; - var retainedTimeseriesFragmentGuids : string[] = []; - for ( var n = 0; n < freshTimeseriesFragments.length; n++ ) { - var freshTimeseriesFragment = freshTimeseriesFragments[ n ]; - var fragmentGuid = freshTimeseriesFragment.fragmentGuid; - var oldTimeseriesFragment = this._timeseriesFragments.valueFor( fragmentGuid ); - if ( hasval( oldTimeseriesFragment ) ) { - retainedTimeseriesFragmentGuids.push( fragmentGuid ); - } + else { + this._annotations.add(new TimelineAnnotationModel(freshAnnotation)); } - this._timeseriesFragments.retainIds( retainedTimeseriesFragmentGuids ); - - var freshAnnotations = newTimeline.annotations; - var retainedAnnotationGuids : string[] = []; - for ( var n = 0; n < freshAnnotations.length; n++ ) { - var freshAnnotation = freshAnnotations[ n ]; - var annotationGuid = freshAnnotation.annotationGuid; - var oldAnnotation = this._annotations.valueFor( annotationGuid ); - if ( hasval( oldAnnotation ) ) { - retainedAnnotationGuids.push( annotationGuid ); - } + } + + for (let n = 0; n < freshTimeseriesFragments.length; n++) { + let freshTimeseriesFragment = freshTimeseriesFragments[n]; + let oldTimeseriesFragment = this._timeseriesFragments.valueFor(freshTimeseriesFragment.fragmentGuid); + if (hasval(oldTimeseriesFragment)) { + oldTimeseriesFragment.setAttrs(freshTimeseriesFragment); } - this._annotations.retainIds( retainedAnnotationGuids ); - - var freshCursors = newTimeline.cursors; - var retainedCursorGuids : string[] = []; - for ( var n = 0; n < freshCursors.length; n++ ) { - var freshCursor = freshCursors[ n ]; - var cursorGuid = freshCursor.cursorGuid; - var oldCursor = this._cursors.valueFor( cursorGuid ); - if ( hasval( oldCursor ) ) { - retainedCursorGuids.push( cursorGuid ); - } + else { + this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(freshTimeseriesFragment)); } - this._cursors.retainIds( retainedCursorGuids ); - - // Add new items - // + } - for ( var n = 0; n < freshCursors.length; n++ ) { - var freshCursor = freshCursors[ n ]; - var oldCursor = this._cursors.valueFor( freshCursor.cursorGuid ); - if ( hasval( oldCursor ) ) { - oldCursor.setAttrs( freshCursor ); - } - else { - this._cursors.add( new TimelineCursorModel( freshCursor ) ); - } + for (let n = 0; n < freshTimeseriesSet.length; n++) { + let freshTimeseries = freshTimeseriesSet[n]; + let oldTimeseries = this._timeseries.valueFor(freshTimeseries.timeseriesGuid); + if (hasval(oldTimeseries)) { + oldTimeseries.setAttrs(freshTimeseries); } - - for ( var n = 0; n < freshAnnotations.length; n++ ) { - var freshAnnotation = freshAnnotations[ n ]; - var oldAnnotation = this._annotations.valueFor( freshAnnotation.annotationGuid ); - if ( hasval( oldAnnotation ) ) { - oldAnnotation.setAttrs( freshAnnotation ); - } - else { - this._annotations.add( new TimelineAnnotationModel( freshAnnotation ) ); - } + else { + this._timeseries.add(new TimelineTimeseriesModel(freshTimeseries)); } + } - for ( var n = 0; n < freshTimeseriesFragments.length; n++ ) { - var freshTimeseriesFragment = freshTimeseriesFragments[ n ]; - var oldTimeseriesFragment = this._timeseriesFragments.valueFor( freshTimeseriesFragment.fragmentGuid ); - if ( hasval( oldTimeseriesFragment ) ) { - oldTimeseriesFragment.setAttrs( freshTimeseriesFragment ); - } - else { - this._timeseriesFragments.add( new TimelineTimeseriesFragmentModel( freshTimeseriesFragment ) ); - } + for (let n = 0; n < freshEvents.length; n++) { + let freshEvent = freshEvents[n]; + let oldEvent = this._events.valueFor(freshEvent.eventGuid); + if (hasval(oldEvent)) { + oldEvent.setAttrs(freshEvent); } - - for ( var n = 0; n < freshTimeseriesSet.length; n++ ) { - var freshTimeseries = freshTimeseriesSet[ n ]; - var oldTimeseries = this._timeseries.valueFor( freshTimeseries.timeseriesGuid ); - if ( hasval( oldTimeseries ) ) { - oldTimeseries.setAttrs( freshTimeseries ); - } - else { - this._timeseries.add( new TimelineTimeseriesModel( freshTimeseries ) ); - } + else { + this._events.add(new TimelineEventModel(freshEvent)); } + } - for ( var n = 0; n < freshEvents.length; n++ ) { - var freshEvent = freshEvents[ n ]; - var oldEvent = this._events.valueFor( freshEvent.eventGuid ); - if ( hasval( oldEvent ) ) { - oldEvent.setAttrs( freshEvent ); - } - else { - this._events.add( new TimelineEventModel( freshEvent ) ); - } + for (let n = 0; n < freshRows.length; n++) { + let freshRow = freshRows[n]; + let oldRow = this._rows.valueFor(freshRow.rowGuid); + if (hasval(oldRow)) { + oldRow.setAttrs(freshRow); + oldRow.eventGuids.addAll((freshRow.eventGuids || []), 0, true); } - - for ( var n = 0; n < freshRows.length; n++ ) { - var freshRow = freshRows[ n ]; - var oldRow = this._rows.valueFor( freshRow.rowGuid ); - if ( hasval( oldRow ) ) { - oldRow.setAttrs( freshRow ); - oldRow.eventGuids.addAll( ( freshRow.eventGuids || [] ), 0, true ); - } - else { - this._rows.add( new TimelineRowModel( freshRow ) ); - } + else { + this._rows.add(new TimelineRowModel(freshRow)); } + } - for ( var n = 0; n < freshGroups.length; n++ ) { - var freshGroup = freshGroups[ n ]; - var oldGroup = this._groups.valueFor( freshGroup.groupGuid ); - if ( hasval( oldGroup ) ) { - oldGroup.setAttrs( freshGroup ); - oldGroup.rowGuids.addAll( freshGroup.rowGuids, 0, true ); - } - else { - this._groups.add( new TimelineGroupModel( freshGroup ) ); - } + for (let n = 0; n < freshGroups.length; n++) { + let freshGroup = freshGroups[n]; + let oldGroup = this._groups.valueFor(freshGroup.groupGuid); + if (hasval(oldGroup)) { + oldGroup.setAttrs(freshGroup); + oldGroup.rowGuids.addAll(freshGroup.rowGuids, 0, true); + } + else { + this._groups.add(new TimelineGroupModel(freshGroup)); } - - this._root.groupGuids.addAll( freshRoot.groupGuids, 0, true ); - this._root.topPinnedRowGuids.addAll( freshRoot.topPinnedRowGuids, 0, true ); - this._root.bottomPinnedRowGuids.addAll( freshRoot.bottomPinnedRowGuids, 0, true ); - this._root.maximizedRowGuids.addAll( freshRoot.maximizedRowGuids, 0, true ); } + this._root.groupGuids.addAll(freshRoot.groupGuids, 0, true); + this._root.topPinnedRowGuids.addAll(freshRoot.topPinnedRowGuids, 0, true); + this._root.bottomPinnedRowGuids.addAll(freshRoot.bottomPinnedRowGuids, 0, true); + this._root.maximizedRowGuids.addAll(freshRoot.maximizedRowGuids, 0, true); + } - merge( newData : Timeline, strategy : TimelineMergeStrategy ) { - var newCursors = hasval( newData.cursors ) ? newData.cursors : []; - for ( var n = 0; n < newCursors.length; n++ ) { - var newCursor = newCursors[ n ]; - var cursorModel = this._cursors.valueFor( newCursor.cursorGuid ); - if ( hasval( cursorModel ) ) { - strategy.updateCursorModel( cursorModel, newCursor ); - } - else { - this._cursors.add( new TimelineCursorModel( newCursor ) ); - } - } + merge(newData: Timeline, strategy: TimelineMergeStrategy) { - var newAnnotations = hasval( newData.annotations ) ? newData.annotations : []; - for ( var n = 0; n < newAnnotations.length; n++ ) { - var newAnnotation = newAnnotations[ n ]; - var annotationModel = this._annotations.valueFor( newAnnotation.annotationGuid ); - if ( hasval( annotationModel ) ) { - strategy.updateAnnotationModel( annotationModel, newAnnotation ); - } - else { - this._annotations.add( new TimelineAnnotationModel( newAnnotation ) ); - } + let newCursors = hasval(newData.cursors) ? newData.cursors : []; + for (let n = 0; n < newCursors.length; n++) { + let newCursor = newCursors[n]; + let cursorModel = this._cursors.valueFor(newCursor.cursorGuid); + if (hasval(cursorModel)) { + strategy.updateCursorModel(cursorModel, newCursor); } - - var newTimeseriesFragments = hasval( newData.timeseriesFragments ) ? newData.timeseriesFragments : []; - for ( var n = 0; n < newTimeseriesFragments.length; n++ ) { - var newTimeseriesFragment = newTimeseriesFragments[ n ]; - var timeseriesFragmentModel = this._timeseriesFragments.valueFor( newTimeseriesFragment.fragmentGuid ); - if ( hasval( timeseriesFragmentModel ) ) { - strategy.updateTimeseriesFragmentModel( timeseriesFragmentModel, newTimeseriesFragment ); - } - else { - this._timeseriesFragments.add( new TimelineTimeseriesFragmentModel( newTimeseriesFragment ) ); - } + else { + this._cursors.add(new TimelineCursorModel(newCursor)); } + } - var newTimeseriesSet = hasval( newData.timeseries ) ? newData.timeseries : []; - for ( var n = 0; n < newTimeseriesSet.length; n++ ) { - var newTimeseries = newTimeseriesSet[ n ]; - var timeseriesModel = this._timeseries.valueFor( newTimeseries.timeseriesGuid ); - if ( hasval( timeseriesModel ) ) { - strategy.updateTimeseriesModel( timeseriesModel, newTimeseries ); - } - else { - this._timeseries.add( new TimelineTimeseriesModel( newTimeseries ) ); - } + let newAnnotations = hasval(newData.annotations) ? newData.annotations : []; + for (let n = 0; n < newAnnotations.length; n++) { + let newAnnotation = newAnnotations[n]; + let annotationModel = this._annotations.valueFor(newAnnotation.annotationGuid); + if (hasval(annotationModel)) { + strategy.updateAnnotationModel(annotationModel, newAnnotation); } - - var newEvents = hasval( newData.events ) ? newData.events : []; - for ( var n = 0; n < newEvents.length; n++ ) { - var newEvent = newEvents[ n ]; - var eventModel = this._events.valueFor( newEvent.eventGuid ); - if ( hasval( eventModel ) ) { - strategy.updateEventModel( eventModel, newEvent ); - } - else { - this._events.add( new TimelineEventModel( newEvent ) ); - } + else { + this._annotations.add(new TimelineAnnotationModel(newAnnotation)); } + } - var newRows = hasval( newData.rows ) ? newData.rows : []; - for ( var n = 0; n < newRows.length; n++ ) { - var newRow = newRows[ n ]; - var rowModel = this._rows.valueFor( newRow.rowGuid ); - if ( hasval( rowModel ) ) { - strategy.updateRowModel( rowModel, newRow ); - } - else { - this._rows.add( new TimelineRowModel( newRow ) ); - } + let newTimeseriesFragments = hasval(newData.timeseriesFragments) ? newData.timeseriesFragments : []; + for (let n = 0; n < newTimeseriesFragments.length; n++) { + let newTimeseriesFragment = newTimeseriesFragments[n]; + let timeseriesFragmentModel = this._timeseriesFragments.valueFor(newTimeseriesFragment.fragmentGuid); + if (hasval(timeseriesFragmentModel)) { + strategy.updateTimeseriesFragmentModel(timeseriesFragmentModel, newTimeseriesFragment); } + else { + this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(newTimeseriesFragment)); + } + } - var newGroups = hasval( newData.groups ) ? newData.groups : []; - for ( var n = 0; n < newGroups.length; n++ ) { - var newGroup = newGroups[ n ]; - var groupModel = this._groups.valueFor( newGroup.groupGuid ); - if ( hasval( groupModel ) ) { - strategy.updateGroupModel( groupModel, newGroup ); - } - else { - this._groups.add( new TimelineGroupModel( newGroup ) ); - } + let newTimeseriesSet = hasval(newData.timeseries) ? newData.timeseries : []; + for (let n = 0; n < newTimeseriesSet.length; n++) { + let newTimeseries = newTimeseriesSet[n]; + let timeseriesModel = this._timeseries.valueFor(newTimeseries.timeseriesGuid); + if (hasval(timeseriesModel)) { + strategy.updateTimeseriesModel(timeseriesModel, newTimeseries); } + else { + this._timeseries.add(new TimelineTimeseriesModel(newTimeseries)); + } + } - var newRoot = newData.root; - strategy.updateRootModel( this._root, newRoot ); + let newEvents = hasval(newData.events) ? newData.events : []; + for (let n = 0; n < newEvents.length; n++) { + let newEvent = newEvents[n]; + let eventModel = this._events.valueFor(newEvent.eventGuid); + if (hasval(eventModel)) { + strategy.updateEventModel(eventModel, newEvent); + } + else { + this._events.add(new TimelineEventModel(newEvent)); + } } - snapshot( ) : Timeline { - return { - cursors : this._cursors.map( (e)=>e.snapshot() ), - annotations : this._annotations.map( (e)=>e.snapshot() ), - timeseriesFragments : this._timeseriesFragments.map( (e)=>e.snapshot() ), - timeseries : this._timeseries.map( (e)=>e.snapshot() ), - events : this._events.map( (e)=>e.snapshot() ), - rows : this._rows.map( (r)=>r.snapshot() ), - groups : this._groups.map( (g)=>g.snapshot() ), - root : this._root.snapshot( ) - }; + let newRows = hasval(newData.rows) ? newData.rows : []; + for (let n = 0; n < newRows.length; n++) { + let newRow = newRows[n]; + let rowModel = this._rows.valueFor(newRow.rowGuid); + if (hasval(rowModel)) { + strategy.updateRowModel(rowModel, newRow); + } + else { + this._rows.add(new TimelineRowModel(newRow)); + } } + let newGroups = hasval(newData.groups) ? newData.groups : []; + for (let n = 0; n < newGroups.length; n++) { + let newGroup = newGroups[n]; + let groupModel = this._groups.valueFor(newGroup.groupGuid); + if (hasval(groupModel)) { + strategy.updateGroupModel(groupModel, newGroup); + } + else { + this._groups.add(new TimelineGroupModel(newGroup)); + } + } + let newRoot = newData.root; + strategy.updateRootModel(this._root, newRoot); } - - export function newEmptyTimelineRoot( ) : TimelineRoot { - return { groupGuids: [], - bottomPinnedRowGuids: [], - topPinnedRowGuids: [], - maximizedRowGuids: [] }; + snapshot(): Timeline { + return { + cursors: this._cursors.map((e) => e.snapshot()), + annotations: this._annotations.map((e) => e.snapshot()), + timeseriesFragments: this._timeseriesFragments.map((e) => e.snapshot()), + timeseries: this._timeseries.map((e) => e.snapshot()), + events: this._events.map((e) => e.snapshot()), + rows: this._rows.map((r) => r.snapshot()), + groups: this._groups.map((g) => g.snapshot()), + root: this._root.snapshot() + }; } - export var timelineMergeNewBeforeOld : TimelineMergeStrategy = { - - updateCursorModel( cursorModel : TimelineCursorModel, newCursor : TimelineCursor ) { - cursorModel.setAttrs( newCursor ); - }, - - updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ) { - annotationModel.setAttrs( newAnnotation ); - }, - - updateTimeseriesFragmentModel( timeseriesFragmentModel : TimelineTimeseriesFragmentModel, newTimeseriesFragment : TimelineTimeseriesFragment ) { - timeseriesFragmentModel.setAttrs( newTimeseriesFragment ); - }, - - updateTimeseriesModel( timeseriesModel : TimelineTimeseriesModel, newTimeseries : TimelineTimeseries ) { - timeseriesModel.setAttrs( newTimeseries ); - timeseriesModel.fragmentGuids.addAll( ( newTimeseries.fragmentGuids || [] ), 0, true ); - }, +} - updateEventModel: function( eventModel : TimelineEventModel, newEvent : TimelineEvent ) { - eventModel.setAttrs( newEvent ); - }, - updateRowModel: function( rowModel : TimelineRowModel, newRow : TimelineRow ) { - rowModel.setAttrs( newRow ); - rowModel.eventGuids.addAll( ( newRow.eventGuids || [] ), 0, true ); - }, - - updateGroupModel: function( groupModel : TimelineGroupModel, newGroup : TimelineGroup ) { - groupModel.setAttrs( newGroup ); - groupModel.rowGuids.addAll( newGroup.rowGuids, 0, true ); - }, - - updateRootModel: function( rootModel : TimelineRootModel, newRoot : TimelineRoot ) { - rootModel.setAttrs( newRoot ); - rootModel.groupGuids.addAll( newRoot.groupGuids, 0, true ); - rootModel.topPinnedRowGuids.addAll( newRoot.topPinnedRowGuids || [], 0, true ); - rootModel.bottomPinnedRowGuids.addAll( newRoot.bottomPinnedRowGuids || [], 0, true ); - rootModel.maximizedRowGuids.addAll( newRoot.maximizedRowGuids || [], 0, true ); - } +export function newEmptyTimelineRoot(): TimelineRoot { + return { + groupGuids: [], + bottomPinnedRowGuids: [], + topPinnedRowGuids: [], + maximizedRowGuids: [] }; +} - export var timelineMergeNewAfterOld : TimelineMergeStrategy = { +export let timelineMergeNewBeforeOld: TimelineMergeStrategy = { - updateCursorModel( cursorModel : TimelineCursorModel, newCursor : TimelineCursor ) { - cursorModel.setAttrs( newCursor ); - }, + updateCursorModel(cursorModel: TimelineCursorModel, newCursor: TimelineCursor) { + cursorModel.setAttrs(newCursor); + }, - updateAnnotationModel( annotationModel : TimelineAnnotationModel, newAnnotation : TimelineAnnotation ) { - annotationModel.setAttrs( newAnnotation ); - }, + updateAnnotationModel(annotationModel: TimelineAnnotationModel, newAnnotation: TimelineAnnotation) { + annotationModel.setAttrs(newAnnotation); + }, - updateTimeseriesFragmentModel( timeseriesFragmentModel : TimelineTimeseriesFragmentModel, newTimeseriesFragment : TimelineTimeseriesFragment ) { - timeseriesFragmentModel.setAttrs( newTimeseriesFragment ); - }, + updateTimeseriesFragmentModel(timeseriesFragmentModel: TimelineTimeseriesFragmentModel, newTimeseriesFragment: TimelineTimeseriesFragment) { + timeseriesFragmentModel.setAttrs(newTimeseriesFragment); + }, - updateTimeseriesModel( timeseriesModel : TimelineTimeseriesModel, newTimeseries : TimelineTimeseries ) { - timeseriesModel.setAttrs( newTimeseries ); - timeseriesModel.fragmentGuids.addAll( newTimeseries.fragmentGuids || [] ); - }, + updateTimeseriesModel(timeseriesModel: TimelineTimeseriesModel, newTimeseries: TimelineTimeseries) { + timeseriesModel.setAttrs(newTimeseries); + timeseriesModel.fragmentGuids.addAll((newTimeseries.fragmentGuids || []), 0, true); + }, - updateEventModel: function( eventModel : TimelineEventModel, newEvent : TimelineEvent ) { - eventModel.setAttrs( newEvent ); - }, + updateEventModel: function (eventModel: TimelineEventModel, newEvent: TimelineEvent) { + eventModel.setAttrs(newEvent); + }, - updateRowModel: function( rowModel : TimelineRowModel, newRow : TimelineRow ) { - rowModel.setAttrs( newRow ); - rowModel.eventGuids.addAll( newRow.eventGuids || [] ); - rowModel.timeseriesGuids.addAll( newRow.timeseriesGuids || [] ); - rowModel.annotationGuids.addAll( newRow.annotationGuids || [] ); - }, + updateRowModel: function (rowModel: TimelineRowModel, newRow: TimelineRow) { + rowModel.setAttrs(newRow); + rowModel.eventGuids.addAll((newRow.eventGuids || []), 0, true); + }, - updateGroupModel: function( groupModel : TimelineGroupModel, newGroup : TimelineGroup ) { - groupModel.setAttrs( newGroup ); - groupModel.rowGuids.addAll( newGroup.rowGuids ); - }, + updateGroupModel: function (groupModel: TimelineGroupModel, newGroup: TimelineGroup) { + groupModel.setAttrs(newGroup); + groupModel.rowGuids.addAll(newGroup.rowGuids, 0, true); + }, - updateRootModel: function( rootModel : TimelineRootModel, newRoot : TimelineRoot ) { - rootModel.setAttrs( newRoot ); - rootModel.groupGuids.addAll( newRoot.groupGuids ); - rootModel.topPinnedRowGuids.addAll( newRoot.topPinnedRowGuids || [] ); - rootModel.bottomPinnedRowGuids.addAll( newRoot.bottomPinnedRowGuids || [] ); - rootModel.maximizedRowGuids.addAll( newRoot.maximizedRowGuids || [] ); - } - }; + updateRootModel: function (rootModel: TimelineRootModel, newRoot: TimelineRoot) { + rootModel.setAttrs(newRoot); + rootModel.groupGuids.addAll(newRoot.groupGuids, 0, true); + rootModel.topPinnedRowGuids.addAll(newRoot.topPinnedRowGuids || [], 0, true); + rootModel.bottomPinnedRowGuids.addAll(newRoot.bottomPinnedRowGuids || [], 0, true); + rootModel.maximizedRowGuids.addAll(newRoot.maximizedRowGuids || [], 0, true); + } +}; + + +export let timelineMergeNewAfterOld: TimelineMergeStrategy = { + + updateCursorModel(cursorModel: TimelineCursorModel, newCursor: TimelineCursor) { + cursorModel.setAttrs(newCursor); + }, + + updateAnnotationModel(annotationModel: TimelineAnnotationModel, newAnnotation: TimelineAnnotation) { + annotationModel.setAttrs(newAnnotation); + }, + + updateTimeseriesFragmentModel(timeseriesFragmentModel: TimelineTimeseriesFragmentModel, newTimeseriesFragment: TimelineTimeseriesFragment) { + timeseriesFragmentModel.setAttrs(newTimeseriesFragment); + }, + + updateTimeseriesModel(timeseriesModel: TimelineTimeseriesModel, newTimeseries: TimelineTimeseries) { + timeseriesModel.setAttrs(newTimeseries); + timeseriesModel.fragmentGuids.addAll(newTimeseries.fragmentGuids || []); + }, + + updateEventModel: function (eventModel: TimelineEventModel, newEvent: TimelineEvent) { + eventModel.setAttrs(newEvent); + }, + + updateRowModel: function (rowModel: TimelineRowModel, newRow: TimelineRow) { + rowModel.setAttrs(newRow); + rowModel.eventGuids.addAll(newRow.eventGuids || []); + rowModel.timeseriesGuids.addAll(newRow.timeseriesGuids || []); + rowModel.annotationGuids.addAll(newRow.annotationGuids || []); + }, + + updateGroupModel: function (groupModel: TimelineGroupModel, newGroup: TimelineGroup) { + groupModel.setAttrs(newGroup); + groupModel.rowGuids.addAll(newGroup.rowGuids); + }, + + updateRootModel: function (rootModel: TimelineRootModel, newRoot: TimelineRoot) { + rootModel.setAttrs(newRoot); + rootModel.groupGuids.addAll(newRoot.groupGuids); + rootModel.topPinnedRowGuids.addAll(newRoot.topPinnedRowGuids || []); + rootModel.bottomPinnedRowGuids.addAll(newRoot.bottomPinnedRowGuids || []); + rootModel.maximizedRowGuids.addAll(newRoot.maximizedRowGuids || []); + } +}; diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 84720b3..b5364dc 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -27,1382 +27,1412 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - - export class TimelinePane extends Pane { - private _model : TimelineModel; - private _ui : TimelineUi; - - constructor( layout : Layout, model : TimelineModel, ui : TimelineUi ) { - super( layout, true ); - this._model = model; - this._ui = ui; - } - - get model( ) : TimelineModel { return this._model; } - get ui( ) : TimelineUi { return this._ui; } +import { Pane, Layout, Drawable, PointerEvent, xFrac, Mask2D, Painter, isLeftMouseDown, LayoutPhase1 } from '../core'; +import { TimelineModel, TimelineRowModel, TimelineGroupModel, TimelineGroup } from './timeline_model'; +import { TimelineUi, TimeIntervalModel, TimelineInput } from './timeline_ui'; +import { TimelineRowPaneFactoryChooser, TimelineRowPaneFactory } from './timeline_row'; +import { ScrollbarOptions, newVerticalScrollLayout, newVerticalScrollbar, attachTimelineVerticalScrollMouseListeners, VerticalScrollLayout } from '../scroll'; +import { Color, white, rgb, gray, rgba } from '../color'; +import { TimeAxisFormatOptions, newTimeAxisPainter } from './time_axis_painter'; +import { Insets, newInsets, newInsetPane, newInsetLayout } from '../layout/inset_layout'; +import { TimeAxis1D } from './time_axis'; +import { rowPaneFactoryChooser_DEFAULT } from './timeline_styles'; +import { axisZoomStep, Axis1D } from '../plot/axis'; +import { newColumnLayout } from '../layout/column_layout'; +import { newCardLayout } from '../layout/card_layout'; +import { newRowLayout } from '../layout/row_layout'; +import { Side, newBackgroundPainter, xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys, newSolidPane, Background } from '../misc'; +import { newOverlayLayout } from '../layout/overlay_layout'; +import { alwaysTrue, GL, StringMap, hasval, isNumber } from '../util/util'; +import { BoundsUnmodifiable, Size } from '../bounds'; +import { Program, Attribute, UniformColor } from '../shader'; +import { newDynamicBuffer } from '../buffer'; +import { TextureRenderer } from '../texture'; +import { Label, fitToLabel, newLabelPainter } from '../label'; +import { OrderedStringSet } from '../util/ordered_set'; +import { newTimeGridPainter } from './time_grid_painter'; +import { newBorderPainter } from '../painter/border_painter'; +import { createTextTextureFactory } from '../text'; + +export class TimelinePane extends Pane { + private _model: TimelineModel; + private _ui: TimelineUi; + + constructor(layout: Layout, model: TimelineModel, ui: TimelineUi) { + super(layout, true); + this._model = model; + this._ui = ui; } - - - export interface TimelinePaneOptions { - - // Misc - font? : string; - rowPaneFactoryChooser? : TimelineRowPaneFactoryChooser; - - // Scroll - showScrollbar? : boolean; - scrollbarOptions? : ScrollbarOptions; - - // Colors - fgColor? : Color; - rowLabelColor? : Color; - rowLabelBgColor? : Color; - groupLabelColor? : Color; - groupHighlightColor? : Color; - axisLabelColor? : Color; - bgColor? : Color; - rowBgColor? : Color; - rowAltBgColor? : Color; - gridColor? : Color; - selectedIntervalFillColor? : Color; - selectedIntervalBorderColor? : Color; - - // Axes - showTopAxis? : boolean; - showBottomAxis? : boolean; - topTimeZone? : string; - bottomTimeZone? : string; - tickSpacing? : number; - axisLabelAlign? : number; - isFuturePositive? : boolean; - timeAxisFormat? : TimeAxisFormatOptions; - - // date in time_ISO8601 format (see util.ts:parseTime_PMILLIS) - // that time labels on the timeline should be referenced from - // (i.e. Day 1, Day 2...) - // (if not provided, timeline labels will be in absolute time) - referenceDate? : string; - - // Sizing - groupLabelInsets? : Insets; - rowLabelInsets? : Insets; - rowLabelPaneWidth? : number; - rowSeparatorHeight? : number; - scrollbarWidth? : number; - axisPaneHeight? : number; - draggableEdgeWidth? : number; - snapToDistance? : number; - - // Event / Selection - allowEventMultiSelection? : boolean; - // Options: - // 'none' or any falsy value : no time selection - // 'single' : single selected time - // 'range' : range of selected times - // 'single-unmodifiable' : single selected time (cannot be adjusted by user mouse clicks) - // 'range-unmodifiable' : range of selected times (cannot be adjusted by user mouse clicks) - selectedIntervalMode? : string; - // enable / disable centering of time selection interval on double click - // (this has no effect for selectedIntervalMode 'none', 'single-unmodifiable', or 'range-unmodifiable' - // because mouse controls are off by default in those modes) - centerSelectedIntervalOnDoubleClick? : boolean; - // provide a custom listener callback function to modify the default behavior when the mouse - // scroll wheel is rotate over the timeline (default behavior is to zoom in/out in time) - mouseWheelListener? : ( PointerEvent ) => void; + get model(): TimelineModel { return this._model; } + get ui(): TimelineUi { return this._ui; } +} + + + +export interface TimelinePaneOptions { + + // Misc + font?: string; + rowPaneFactoryChooser?: TimelineRowPaneFactoryChooser; + + // Scroll + showScrollbar?: boolean; + scrollbarOptions?: ScrollbarOptions; + + // Colors + fgColor?: Color; + rowLabelColor?: Color; + rowLabelBgColor?: Color; + groupLabelColor?: Color; + groupHighlightColor?: Color; + axisLabelColor?: Color; + bgColor?: Color; + rowBgColor?: Color; + rowAltBgColor?: Color; + gridColor?: Color; + selectedIntervalFillColor?: Color; + selectedIntervalBorderColor?: Color; + + // Axes + showTopAxis?: boolean; + showBottomAxis?: boolean; + topTimeZone?: string; + bottomTimeZone?: string; + tickSpacing?: number; + axisLabelAlign?: number; + isFuturePositive?: boolean; + timeAxisFormat?: TimeAxisFormatOptions; + + // date in time_ISO8601 format (see util.ts:parseTime_PMILLIS) + // that time labels on the timeline should be referenced from + // (i.e. Day 1, Day 2...) + // (if not provided, timeline labels will be in absolute time) + referenceDate?: string; + + // Sizing + groupLabelInsets?: Insets; + rowLabelInsets?: Insets; + rowLabelPaneWidth?: number; + rowSeparatorHeight?: number; + scrollbarWidth?: number; + axisPaneHeight?: number; + draggableEdgeWidth?: number; + snapToDistance?: number; + + // Event / Selection + allowEventMultiSelection?: boolean; + // Options: + // 'none' or any falsy value : no time selection + // 'single' : single selected time + // 'range' : range of selected times + // 'single-unmodifiable' : single selected time (cannot be adjusted by user mouse clicks) + // 'range-unmodifiable' : range of selected times (cannot be adjusted by user mouse clicks) + selectedIntervalMode?: string; + // enable / disable centering of time selection interval on double click + // (this has no effect for selectedIntervalMode 'none', 'single-unmodifiable', or 'range-unmodifiable' + // because mouse controls are off by default in those modes) + centerSelectedIntervalOnDoubleClick?: boolean; + // provide a custom listener callback function to modify the default behavior when the mouse + // scroll wheel is rotate over the timeline (default behavior is to zoom in/out in time) + mouseWheelListener?: (PointerEvent: PointerEvent) => void; +} + +export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: TimelineModel, options?: TimelinePaneOptions, ui?: TimelineUi): TimelinePane { + + // Misc + let font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); + let rowPaneFactoryChooser = (hasval(options) && hasval(options.rowPaneFactoryChooser) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT); + + // Scroll + let showScrollbar = (hasval(options) && hasval(options.showScrollbar) ? options.showScrollbar : true); + let scrollbarOptions = (hasval(options) ? options.scrollbarOptions : null); + + // Colors + let fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : white); + let bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : rgb(0.098, 0.165, 0.243)); + let rowLabelColor = (hasval(options) && hasval(options.rowLabelColor) ? options.rowLabelColor : fgColor); + let rowLabelBgColor = (hasval(options) && hasval(options.rowLabelBgColor) ? options.rowLabelBgColor : bgColor); + let groupLabelColor = (hasval(options) && hasval(options.groupLabelColor) ? options.groupLabelColor : fgColor); + let groupHighlightColor = (hasval(options) && hasval(options.groupHighlightColor) ? options.groupHighlightColor : rgb(0, 1, 1)); + let axisLabelColor = (hasval(options) && hasval(options.axisLabelColor) ? options.axisLabelColor : fgColor); + let rowBgColor = (hasval(options) && hasval(options.rowBgColor) ? options.rowBgColor : rgb(0.020, 0.086, 0.165)); + let rowAltBgColor = (hasval(options) && hasval(options.rowAltBgColor) ? options.rowAltBgColor : rgb(0.020, 0.086, 0.165)); + let gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : gray(0.5)); + let selectedIntervalFillColor = (hasval(options) && hasval(options.selectedIntervalFillColor) ? options.selectedIntervalFillColor : rgba(0, 0.6, 0.8, 0.157)); + let selectedIntervalBorderColor = (hasval(options) && hasval(options.selectedIntervalBorderColor) ? options.selectedIntervalBorderColor : rgb(0, 0.2, 1.0)); + + // Axes + let showTopAxis = (hasval(options) && hasval(options.showTopAxis) ? options.showTopAxis : true); + let showBottomAxis = (hasval(options) && hasval(options.showBottomAxis) ? options.showBottomAxis : true); + let topTimeZone = (hasval(options) && hasval(options.topTimeZone) ? options.topTimeZone : '+0000'); + let bottomTimeZone = (hasval(options) && hasval(options.bottomTimeZone) ? options.bottomTimeZone : '+0000'); + let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); + let axisLabelAlign = (hasval(options) && hasval(options.axisLabelAlign) ? options.axisLabelAlign : 0.5); + + // Sizing + let groupLabelInsets = (hasval(options) && hasval(options.groupLabelInsets) ? options.groupLabelInsets : newInsets(6, 10)); + let rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35)); + let rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140); + let rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2); + let scrollbarWidth = (hasval(options) && hasval(options.scrollbarWidth) ? options.scrollbarWidth : 16); + scrollbarWidth = showScrollbar ? scrollbarWidth : 0; // if the scrollbar is not showing, set its width to 0 + let axisPaneHeight = (hasval(options) && hasval(options.axisPaneHeight) ? options.axisPaneHeight : 40); + let draggableEdgeWidth = (hasval(options) && hasval(options.draggableEdgeWidth) ? options.draggableEdgeWidth : 6); + let snapToDistance = (hasval(options) && hasval(options.snapToDistance) ? options.snapToDistance : 10); + + // Event / Selection + let allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true); + let selectedIntervalMode = (hasval(options) && hasval(options.selectedIntervalMode) ? options.selectedIntervalMode : 'range'); + let centerSelectedIntervalOnDoubleClick = (hasval(options) && hasval(options.centerSelectedIntervalOnDoubleClick) ? options.centerSelectedIntervalOnDoubleClick : true); + let defaultMouseWheelListener = function (ev: PointerEvent) { + let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + timeAxis.zoom(zoomFactor, timeAxis.vAtFrac(xFrac(ev))); } + let mouseWheelListener = (hasval(options) && hasval(options.mouseWheelListener) ? options.mouseWheelListener : defaultMouseWheelListener); - export function newTimelinePane( drawable : Drawable, timeAxis : TimeAxis1D, model : TimelineModel, options? : TimelinePaneOptions, ui? : TimelineUi ) : TimelinePane { - - // Misc - var font = ( hasval( options ) && hasval( options.font ) ? options.font : '11px verdana,sans-serif' ); - var rowPaneFactoryChooser = ( hasval( options ) && hasval( options.rowPaneFactoryChooser ) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT ); - - // Scroll - var showScrollbar = ( hasval( options ) && hasval( options.showScrollbar ) ? options.showScrollbar : true ); - var scrollbarOptions = ( hasval( options ) ? options.scrollbarOptions : null ); - - // Colors - var fgColor = ( hasval( options ) && hasval( options.fgColor ) ? options.fgColor : white ); - var bgColor = ( hasval( options ) && hasval( options.bgColor ) ? options.bgColor : rgb( 0.098, 0.165, 0.243 ) ); - var rowLabelColor = ( hasval( options ) && hasval( options.rowLabelColor ) ? options.rowLabelColor : fgColor ); - var rowLabelBgColor = ( hasval( options ) && hasval( options.rowLabelBgColor ) ? options.rowLabelBgColor : bgColor ); - var groupLabelColor = ( hasval( options ) && hasval( options.groupLabelColor ) ? options.groupLabelColor : fgColor ); - var groupHighlightColor = ( hasval( options ) && hasval( options.groupHighlightColor ) ? options.groupHighlightColor : rgb( 0, 1, 1 ) ); - var axisLabelColor = ( hasval( options ) && hasval( options.axisLabelColor ) ? options.axisLabelColor : fgColor ); - var rowBgColor = ( hasval( options ) && hasval( options.rowBgColor ) ? options.rowBgColor : rgb( 0.020, 0.086, 0.165 ) ); - var rowAltBgColor = ( hasval( options ) && hasval( options.rowAltBgColor ) ? options.rowAltBgColor : rgb( 0.020, 0.086, 0.165 ) ); - var gridColor = ( hasval( options ) && hasval( options.gridColor ) ? options.gridColor : gray( 0.5 ) ); - var selectedIntervalFillColor = ( hasval( options ) && hasval( options.selectedIntervalFillColor ) ? options.selectedIntervalFillColor : rgba( 0, 0.6, 0.8, 0.157 ) ); - var selectedIntervalBorderColor = ( hasval( options ) && hasval( options.selectedIntervalBorderColor ) ? options.selectedIntervalBorderColor : rgb( 0, 0.2, 1.0 ) ); - - // Axes - var showTopAxis = ( hasval( options ) && hasval( options.showTopAxis ) ? options.showTopAxis : true ); - var showBottomAxis = ( hasval( options ) && hasval( options.showBottomAxis ) ? options.showBottomAxis : true ); - var topTimeZone = ( hasval( options ) && hasval( options.topTimeZone ) ? options.topTimeZone : '+0000' ); - var bottomTimeZone = ( hasval( options ) && hasval( options.bottomTimeZone ) ? options.bottomTimeZone : '+0000' ); - var tickSpacing = ( hasval( options ) && hasval( options.tickSpacing ) ? options.tickSpacing : 60 ); - var axisLabelAlign = ( hasval( options ) && hasval( options.axisLabelAlign ) ? options.axisLabelAlign : 0.5 ); - - // Sizing - var groupLabelInsets = ( hasval( options ) && hasval( options.groupLabelInsets ) ? options.groupLabelInsets : newInsets( 6, 10 ) ); - var rowLabelInsets = ( hasval( options ) && hasval( options.rowLabelInsets ) ? options.rowLabelInsets : newInsets( 0, 35 ) ); - var rowLabelPaneWidth = ( hasval( options ) && hasval( options.rowLabelPaneWidth ) ? options.rowLabelPaneWidth : 140 ); - var rowSeparatorHeight = ( hasval( options ) && hasval( options.rowSeparatorHeight ) ? options.rowSeparatorHeight : 2 ); - var scrollbarWidth = ( hasval( options ) && hasval( options.scrollbarWidth ) ? options.scrollbarWidth : 16 ); - scrollbarWidth = showScrollbar ? scrollbarWidth : 0; // if the scrollbar is not showing, set its width to 0 - var axisPaneHeight = ( hasval( options ) && hasval( options.axisPaneHeight ) ? options.axisPaneHeight : 40 ); - var draggableEdgeWidth = ( hasval( options ) && hasval( options.draggableEdgeWidth ) ? options.draggableEdgeWidth : 6 ); - var snapToDistance = ( hasval( options ) && hasval( options.snapToDistance ) ? options.snapToDistance : 10 ); - - // Event / Selection - var allowEventMultiSelection = ( hasval( options ) && hasval( options.allowEventMultiSelection ) ? options.allowEventMultiSelection : true ); - var selectedIntervalMode = ( hasval( options ) && hasval( options.selectedIntervalMode ) ? options.selectedIntervalMode : 'range' ); - var centerSelectedIntervalOnDoubleClick = ( hasval( options ) && hasval( options.centerSelectedIntervalOnDoubleClick ) ? options.centerSelectedIntervalOnDoubleClick : true ); - var defaultMouseWheelListener = function( ev : PointerEvent ) { - var zoomFactor = Math.pow( axisZoomStep, ev.wheelSteps ); - timeAxis.zoom( zoomFactor, timeAxis.vAtFrac( xFrac( ev ) ) ); - } - var mouseWheelListener = ( hasval( options ) && hasval( options.mouseWheelListener ) ? options.mouseWheelListener : defaultMouseWheelListener); - - if ( !ui ) { - var outsideManagedUi = false; - ui = new TimelineUi( model, { allowEventMultiSelection: allowEventMultiSelection } ); - } - else { - // remove old panes (if the ui is being reused) - var outsideManagedUi = true; - ui.panes.removeAll( ); - } - - var selection = ui.selection; + let outsideManagedUi = false; + if (!ui) { + let outsideManagedUi = false; + ui = new TimelineUi(model, { allowEventMultiSelection: allowEventMultiSelection }); + } + else { + // remove old panes (if the ui is being reused) + let outsideManagedUi = true; + ui.panes.removeAll(); + } - var redraw = function( ) { - drawable.redraw( ); - }; - selection.selectedInterval.changed.on( redraw ); - selection.hoveredEvent.changed.on( redraw ); - selection.selectedEvents.valueAdded.on( redraw ); - selection.selectedEvents.valueRemoved.on( redraw ); - - // even if the model defines cursors, we may need to redraw when the mouse position changes - // (we might not actually need to if: none of the rows actually use the cursor, or if the - // cursor doesn't show a vertical or horizontal line) - // this check just avoids redrawing unncessarily in the easy-to-verify common case where - // no cursors are defined - var redrawCursor = function( ) { - if ( !model.cursors.isEmpty ) { - drawable.redraw( ); - } + let selection = ui.selection; + + let redraw = function () { + drawable.redraw(); + }; + selection.selectedInterval.changed.on(redraw); + selection.hoveredEvent.changed.on(redraw); + selection.selectedEvents.valueAdded.on(redraw); + selection.selectedEvents.valueRemoved.on(redraw); + + // even if the model defines cursors, we may need to redraw when the mouse position changes + // (we might not actually need to if: none of the rows actually use the cursor, or if the + // cursor doesn't show a vertical or horizontal line) + // this check just avoids redrawing unncessarily in the easy-to-verify common case where + // no cursors are defined + let redrawCursor = function () { + if (!model.cursors.isEmpty) { + drawable.redraw(); } + } - selection.hoveredY.changed.on( redrawCursor ); - selection.hoveredTime_PMILLIS.changed.on( redrawCursor ); + selection.hoveredY.changed.on(redrawCursor); + selection.hoveredTime_PMILLIS.changed.on(redrawCursor); - // Scroll Pane and Maximized Row Pane - // + // Scroll Pane and Maximized Row Pane + // - // setup Pane which either shows timeline content, or only maximized rows - // able to switch between the two depending on model.root.maximizedRowGuids.isEmpty + // setup Pane which either shows timeline content, or only maximized rows + // able to switch between the two depending on model.root.maximizedRowGuids.isEmpty - // Scroll Pane + // Scroll Pane - var tickTimeZone = ( showTopAxis ? topTimeZone : bottomTimeZone ); - var contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; - var contentPaneArgs; + let tickTimeZone = (showTopAxis ? topTimeZone : bottomTimeZone); + let contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; + let contentPaneArgs; + let contentPane: Pane = null; - if ( showScrollbar ) { + if (showScrollbar) { - var scrollLayout = newVerticalScrollLayout( ); - var scrollable = new Pane( scrollLayout, false ); - ui.addPane( 'scroll-content-pane', scrollable ); + let scrollLayout = newVerticalScrollLayout(); + let scrollable = new Pane(scrollLayout, false); + ui.addPane('scroll-content-pane', scrollable); - contentPaneArgs = { drawable: drawable, scrollLayout: scrollLayout, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; + contentPaneArgs = { drawable: drawable, scrollLayout: scrollLayout, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; - var scrollContentPane = newTimelineContentPane( contentPaneArgs ); - ui.addPane( 'content-pane', scrollContentPane ); + let scrollContentPane = newTimelineContentPane(contentPaneArgs); + ui.addPane('content-pane', scrollContentPane); - scrollable.addPane( scrollContentPane, 0 ); + scrollable.addPane(scrollContentPane, 0); - var scrollbar = newVerticalScrollbar( scrollLayout, drawable, scrollbarOptions ); - ui.addPane( 'scrollbar', scrollbar ); + let scrollbar = newVerticalScrollbar(scrollLayout, drawable, scrollbarOptions); + ui.addPane('scrollbar', scrollbar); - var contentPane = new Pane( newColumnLayout( false ), false ); - ui.addPane( 'scroll-outer-pane', contentPane ); + let contentPane = new Pane(newColumnLayout(false), false); + ui.addPane('scroll-outer-pane', contentPane); - contentPane.addPane( scrollbar, 0, { width: scrollbarWidth, ignoreHeight: true } ); - contentPane.addPane( scrollable, 1 ); + contentPane.addPane(scrollbar, 0, { width: scrollbarWidth, ignoreHeight: true }); + contentPane.addPane(scrollable, 1); - } - else { + } + else { - contentPaneArgs = { drawable: drawable, scrollLayout: null, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; - var contentPane = newTimelineContentPane( contentPaneArgs ); - ui.addPane( 'content-pane', contentPane ); + contentPaneArgs = { drawable: drawable, scrollLayout: null, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; + let contentPane = newTimelineContentPane(contentPaneArgs); + ui.addPane('content-pane', contentPane); - } + } - // Card Pane Switching Logic + // Card Pane Switching Logic - var timelineCardPane = new Pane( newCardLayout( ) ); - ui.addPane( 'switch-content-pane', timelineCardPane ); + let timelineCardPane = new Pane(newCardLayout()); + ui.addPane('switch-content-pane', timelineCardPane); - var maximizedContentPane = new Pane( newRowLayout( ) ); - ui.addPane( 'maximize-content-pane', maximizedContentPane ); + let maximizedContentPane = new Pane(newRowLayout()); + ui.addPane('maximize-content-pane', maximizedContentPane); - var insetMaximizedContentPane = newInsetPane( maximizedContentPane, newInsets( 0, scrollbarWidth, 0, 0 ) ); - ui.addPane( 'inset-maximize-content-pane', insetMaximizedContentPane ); + let insetMaximizedContentPane = newInsetPane(maximizedContentPane, newInsets(0, scrollbarWidth, 0, 0)); + ui.addPane('inset-maximize-content-pane', insetMaximizedContentPane); - var contentActive = model.root.maximizedRowGuids.isEmpty; - timelineCardPane.addPane( insetMaximizedContentPane, !contentActive ); - timelineCardPane.addPane( contentPane, contentActive ); + let contentActive = model.root.maximizedRowGuids.isEmpty; + timelineCardPane.addPane(insetMaximizedContentPane, !contentActive); + timelineCardPane.addPane(contentPane, contentActive); - setupRowContainerPane( contentPaneArgs, maximizedContentPane, model.root.maximizedRowGuids, true, 'maximized' ); + setupRowContainerPane(contentPaneArgs, maximizedContentPane, model.root.maximizedRowGuids, true, 'maximized'); - var updateMaximizedRows = function( rowGuid : string, rowIndex : number ) { - var contentActive = model.root.maximizedRowGuids.isEmpty; - timelineCardPane.setLayoutArg( insetMaximizedContentPane, !contentActive ); - timelineCardPane.setLayoutArg( contentPane, contentActive ); - drawable.redraw( ); - } + let updateMaximizedRows = function (rowGuid: string, rowIndex: number) { + let contentActive = model.root.maximizedRowGuids.isEmpty; + timelineCardPane.setLayoutArg(insetMaximizedContentPane, !contentActive); + timelineCardPane.setLayoutArg(contentPane, contentActive); + drawable.redraw(); + } - model.root.maximizedRowGuids.valueAdded.on( updateMaximizedRows ); - model.root.maximizedRowGuids.valueRemoved.on( updateMaximizedRows ); + model.root.maximizedRowGuids.valueAdded.on(updateMaximizedRows); + model.root.maximizedRowGuids.valueRemoved.on(updateMaximizedRows); - // Overlay and Underlay Panes - // + // Overlay and Underlay Panes + // - var underlayPane = new Pane( newRowLayout( ) ); - ui.addPane( 'underlay-pane', underlayPane ); + let underlayPane = new Pane(newRowLayout()); + ui.addPane('underlay-pane', underlayPane); - var axisInsets = newInsets( 0, scrollbarWidth, 0, rowLabelPaneWidth ); + let axisInsets = newInsets(0, scrollbarWidth, 0, rowLabelPaneWidth); - // top time axis pane - var axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive : options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; - if ( showTopAxis ) { - var topAxisPane = newTimeAxisPane( contentPaneArgs, null ); - ui.addPane( 'top-axis-pane', topAxisPane ); - topAxisPane.addPainter( newTimeAxisPainter( timeAxis, Side.TOP, topTimeZone, tickTimeZone, axisOpts ) ); - underlayPane.addPane( newInsetPane( topAxisPane, axisInsets ), 0, { height: axisPaneHeight, width: null } ); - } + // top time axis pane + let axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive: options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; + if (showTopAxis) { + let topAxisPane = newTimeAxisPane(contentPaneArgs, null); + ui.addPane('top-axis-pane', topAxisPane); + topAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.TOP, topTimeZone, tickTimeZone, axisOpts)); + underlayPane.addPane(newInsetPane(topAxisPane, axisInsets), 0, { height: axisPaneHeight, width: null }); + } - // pane containing pinned rows specified in TimelineRoot.topPinnedRowGuids - var topPinnedPane = new Pane( newRowLayout( ) ); - ui.addPane( 'top-pinned-pane', topPinnedPane ); + // pane containing pinned rows specified in TimelineRoot.topPinnedRowGuids + let topPinnedPane = new Pane(newRowLayout()); + ui.addPane('top-pinned-pane', topPinnedPane); - var insetTopPinnedPane = newInsetPane( topPinnedPane, newInsets( 0, scrollbarWidth, 0, 0 ) ); - ui.addPane( 'inset-top-pinned-pane', insetTopPinnedPane ); + let insetTopPinnedPane = newInsetPane(topPinnedPane, newInsets(0, scrollbarWidth, 0, 0)); + ui.addPane('inset-top-pinned-pane', insetTopPinnedPane); - setupRowContainerPane( contentPaneArgs, topPinnedPane, model.root.topPinnedRowGuids, false, 'toppinned' ); - underlayPane.addPane( insetTopPinnedPane, 1 ); + setupRowContainerPane(contentPaneArgs, topPinnedPane, model.root.topPinnedRowGuids, false, 'toppinned'); + underlayPane.addPane(insetTopPinnedPane, 1); - // main pane containing timeline groups and rows - underlayPane.addPane( timelineCardPane, 2, { height: 'pref-max', width: null } ); + // main pane containing timeline groups and rows + underlayPane.addPane(timelineCardPane, 2, { height: 'pref-max', width: null }); - // pane containing pinned rows specified in TimelineRoot.bottomPinnedRowGuids - var bottomPinnedPane = new Pane( newRowLayout( ) ); - ui.addPane( 'bottom-pinned-pane', bottomPinnedPane ); + // pane containing pinned rows specified in TimelineRoot.bottomPinnedRowGuids + let bottomPinnedPane = new Pane(newRowLayout()); + ui.addPane('bottom-pinned-pane', bottomPinnedPane); - var insetBottomPinnedPane = newInsetPane( bottomPinnedPane, newInsets( 0, scrollbarWidth, 0, 0 ) ); - ui.addPane( 'inset-bottom-pinned-pane', insetBottomPinnedPane ); + let insetBottomPinnedPane = newInsetPane(bottomPinnedPane, newInsets(0, scrollbarWidth, 0, 0)); + ui.addPane('inset-bottom-pinned-pane', insetBottomPinnedPane); - setupRowContainerPane( contentPaneArgs, bottomPinnedPane, model.root.bottomPinnedRowGuids, false, 'bottompinned' ); - underlayPane.addPane( insetBottomPinnedPane, 3 ); + setupRowContainerPane(contentPaneArgs, bottomPinnedPane, model.root.bottomPinnedRowGuids, false, 'bottompinned'); + underlayPane.addPane(insetBottomPinnedPane, 3); - // bottom time axis pane - if ( showBottomAxis ) { - var bottomAxisPane = newTimeAxisPane( contentPaneArgs, null ); - ui.addPane( 'bottom-axis-pane', bottomAxisPane ); - bottomAxisPane.addPainter( newTimeAxisPainter( timeAxis, Side.BOTTOM, bottomTimeZone, tickTimeZone, axisOpts ) ); - underlayPane.addPane( newInsetPane( bottomAxisPane, axisInsets ), 4, { height: axisPaneHeight, width: null } ); - } + // bottom time axis pane + if (showBottomAxis) { + let bottomAxisPane = newTimeAxisPane(contentPaneArgs, null); + ui.addPane('bottom-axis-pane', bottomAxisPane); + bottomAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.BOTTOM, bottomTimeZone, tickTimeZone, axisOpts)); + underlayPane.addPane(newInsetPane(bottomAxisPane, axisInsets), 4, { height: axisPaneHeight, width: null }); + } - var updateMillisPerPx = function( ) { - var w = underlayPane.viewport.w - axisInsets.left - axisInsets.right; - ui.millisPerPx.value = timeAxis.tSize_MILLIS / w; - }; - underlayPane.viewportChanged.on( updateMillisPerPx ); - timeAxis.limitsChanged.on( updateMillisPerPx ); - - var timelinePane = new TimelinePane( newOverlayLayout( ), model, ui ); - ui.addPane( 'timeline-pane', timelinePane ); - timelinePane.addPainter( newBackgroundPainter( bgColor ) ); - timelinePane.addPane( underlayPane, true ); - - if ( selectedIntervalMode === 'single' || selectedIntervalMode === 'single-unmodifiable' ) { - var overlayPane = new Pane( null, false, alwaysTrue ); - ui.addPane( 'overlay-pane', overlayPane ); - overlayPane.addPainter( newTimelineSingleSelectionPainter( timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor ) ); - timelinePane.addPane( newInsetPane( overlayPane, axisInsets, null, false ) ); - } - else if ( selectedIntervalMode === 'range' || selectedIntervalMode === 'range-unmodifiable' ) { - var overlayPane = new Pane( null, false, alwaysTrue ); - ui.addPane( 'overlay-pane', overlayPane ); - overlayPane.addPainter( newTimelineRangeSelectionPainter( timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor ) ); - timelinePane.addPane( newInsetPane( overlayPane, axisInsets, null, false ) ); - } + let updateMillisPerPx = function () { + let w = underlayPane.viewport.w - axisInsets.left - axisInsets.right; + ui.millisPerPx.value = timeAxis.tSize_MILLIS / w; + }; + underlayPane.viewportChanged.on(updateMillisPerPx); + timeAxis.limitsChanged.on(updateMillisPerPx); + + let timelinePane = new TimelinePane(newOverlayLayout(), model, ui); + ui.addPane('timeline-pane', timelinePane); + timelinePane.addPainter(newBackgroundPainter(bgColor)); + timelinePane.addPane(underlayPane, true); + + if (selectedIntervalMode === 'single' || selectedIntervalMode === 'single-unmodifiable') { + let overlayPane = new Pane(null, false, alwaysTrue); + ui.addPane('overlay-pane', overlayPane); + overlayPane.addPainter(newTimelineSingleSelectionPainter(timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor)); + timelinePane.addPane(newInsetPane(overlayPane, axisInsets, null, false)); + } + else if (selectedIntervalMode === 'range' || selectedIntervalMode === 'range-unmodifiable') { + let overlayPane = new Pane(null, false, alwaysTrue); + ui.addPane('overlay-pane', overlayPane); + overlayPane.addPainter(newTimelineRangeSelectionPainter(timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor)); + timelinePane.addPane(newInsetPane(overlayPane, axisInsets, null, false)); + } - // Enable double click to center selection on mouse + // Enable double click to center selection on mouse - if ( centerSelectedIntervalOnDoubleClick ) { - var doubleClick = function( ev : PointerEvent ) { - if ( selectedIntervalMode === 'single' ) { - if ( ev.clickCount > 1 ) { - var time_PMILLIS = timeAtPointer_PMILLIS( timeAxis, ev ); - selection.selectedInterval.setInterval( time_PMILLIS, time_PMILLIS ); - } + if (centerSelectedIntervalOnDoubleClick) { + let doubleClick = function (ev: PointerEvent) { + if (selectedIntervalMode === 'single') { + if (ev.clickCount > 1) { + let time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + selection.selectedInterval.setInterval(time_PMILLIS, time_PMILLIS); } - else if ( selectedIntervalMode === 'range' ) { - if ( ev.clickCount > 1 ) { - var time_PMILLIS = timeAtPointer_PMILLIS( timeAxis, ev ); - var offset_PMILLIS = selection.selectedInterval.start_PMILLIS + 0.5*selection.selectedInterval.duration_MILLIS; - selection.selectedInterval.pan( time_PMILLIS - offset_PMILLIS ); - } + } + else if (selectedIntervalMode === 'range') { + if (ev.clickCount > 1) { + let time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + let offset_PMILLIS = selection.selectedInterval.start_PMILLIS + 0.5 * selection.selectedInterval.duration_MILLIS; + selection.selectedInterval.pan(time_PMILLIS - offset_PMILLIS); } - }; - ui.input.mouseDown.on( doubleClick ); - } - - timelinePane.dispose.on( function( ) { - // only dispose the ui if we created it (and this manage its lifecycle) - if ( !outsideManagedUi ) ui.dispose.fire( ); - selection.selectedInterval.changed.off( redraw ); - selection.hoveredEvent.changed.off( redraw ); - selection.hoveredY.changed.off( redrawCursor ); - selection.hoveredTime_PMILLIS.changed.off( redrawCursor ); - selection.selectedEvents.valueAdded.off( redraw ); - selection.selectedEvents.valueRemoved.off( redraw ); - underlayPane.viewportChanged.off( updateMillisPerPx ); - timeAxis.limitsChanged.off( updateMillisPerPx ); - model.root.maximizedRowGuids.valueAdded.off( updateMaximizedRows ); - model.root.maximizedRowGuids.valueRemoved.off( updateMaximizedRows ); - } ); - - return timelinePane; + } + }; + ui.input.mouseDown.on(doubleClick); } + timelinePane.dispose.on(function () { + // only dispose the ui if we created it (and this manage its lifecycle) + if (!outsideManagedUi) ui.dispose.fire(); + selection.selectedInterval.changed.off(redraw); + selection.hoveredEvent.changed.off(redraw); + selection.hoveredY.changed.off(redrawCursor); + selection.hoveredTime_PMILLIS.changed.off(redrawCursor); + selection.selectedEvents.valueAdded.off(redraw); + selection.selectedEvents.valueRemoved.off(redraw); + underlayPane.viewportChanged.off(updateMillisPerPx); + timeAxis.limitsChanged.off(updateMillisPerPx); + model.root.maximizedRowGuids.valueAdded.off(updateMaximizedRows); + model.root.maximizedRowGuids.valueRemoved.off(updateMaximizedRows); + }); + return timelinePane; +} - function newTimeIntervalMask( timeAxis : TimeAxis1D, interval : TimeIntervalModel, selectedIntervalMode : string ) : Mask2D { - if ( selectedIntervalMode === 'range' ) { - return function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { - var time_PMILLIS = timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); - // allow a 10 pixel selection buffer to make it easier to grab ends of the selection - var buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; +function newTimeIntervalMask(timeAxis: TimeAxis1D, interval: TimeIntervalModel, selectedIntervalMode: string): Mask2D { - return interval.overlaps( time_PMILLIS - buffer_MILLIS, time_PMILLIS + buffer_MILLIS ); - }; - } - else if ( selectedIntervalMode === 'single' ) { - return function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { - var time_PMILLIS = timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); + if (selectedIntervalMode === 'range') { + return function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { + let time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); - // allow a 10 pixel selection buffer to make it easier to grab the selection - var buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; + // allow a 10 pixel selection buffer to make it easier to grab ends of the selection + let buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; - return time_PMILLIS < interval.cursor_PMILLIS + buffer_MILLIS && time_PMILLIS > interval.cursor_PMILLIS - buffer_MILLIS; - }; - } + return interval.overlaps(time_PMILLIS - buffer_MILLIS, time_PMILLIS + buffer_MILLIS); + }; } + else if (selectedIntervalMode === 'single') { + return function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { + let time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); - function attachTimeAxisMouseListeners( pane : Pane, axis : Axis1D, args : TimelineContentPaneArguments ) { - var vGrab : number = null; + // allow a 10 pixel selection buffer to make it easier to grab the selection + let buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; - pane.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && !hasval( vGrab ) ) { - vGrab = axis.vAtFrac( xFrac( ev ) ); - } - } ); + return time_PMILLIS < interval.cursor_PMILLIS + buffer_MILLIS && time_PMILLIS > interval.cursor_PMILLIS - buffer_MILLIS; + }; + } +} - pane.mouseMove.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) && hasval( vGrab ) ) { - axis.pan( vGrab - axis.vAtFrac( xFrac( ev ) ) ); - } - } ); +function attachTimeAxisMouseListeners(pane: Pane, axis: Axis1D, args: TimelineContentPaneArguments) { + let vGrab: number = null; - pane.mouseUp.on( function( ev : PointerEvent ) { - vGrab = null; - } ); + pane.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && !hasval(vGrab)) { + vGrab = axis.vAtFrac(xFrac(ev)); + } + }); - pane.mouseWheel.on( args.options.mouseWheelListener ); + pane.mouseMove.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent) && hasval(vGrab)) { + axis.pan(vGrab - axis.vAtFrac(xFrac(ev))); + } + }); + + pane.mouseUp.on(function (ev: PointerEvent) { + vGrab = null; + }); + + pane.mouseWheel.on(args.options.mouseWheelListener); +} + +function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel): Pane { + let timeAxis = args.timeAxis; + let ui = args.ui; + let draggableEdgeWidth = args.options.draggableEdgeWidth; + let scrollLayout = args.scrollLayout; + let drawable = args.drawable; + let selectedIntervalMode = args.options.selectedIntervalMode; + + let input = ui.input; + + let axisPane = new Pane(newOverlayLayout()); + if (scrollLayout) attachTimelineVerticalScrollMouseListeners(axisPane, scrollLayout, drawable); + attachTimeAxisMouseListeners(axisPane, timeAxis, args); + + let onMouseMove = function (ev: PointerEvent) { + let time_PMILLIS = timeAxis.tAtFrac_PMILLIS(xFrac(ev)); + input.mouseMove.fire(ev); + input.timeHover.fire(time_PMILLIS, ev); + if (row) input.rowHover.fire(row, ev); + }; + axisPane.mouseMove.on(onMouseMove); + + let onMouseExit = function (ev: PointerEvent) { + input.mouseExit.fire(ev); + input.timeHover.fire(null, ev); + if (row) input.rowHover.fire(null, ev); + }; + axisPane.mouseExit.on(onMouseExit); + + let onMouseDown = function (ev: PointerEvent) { + input.mouseDown.fire(ev); + }; + axisPane.mouseDown.on(onMouseDown); + + let onMouseUp = function (ev: PointerEvent) { + input.mouseUp.fire(ev); + }; + axisPane.mouseUp.on(onMouseUp); + + let onContextMenu = function (ev: PointerEvent) { + input.contextMenu.fire(ev); + }; + axisPane.contextMenu.on(onContextMenu); + + if (selectedIntervalMode === 'single' || selectedIntervalMode === 'range') { + let selection = ui.selection; + let selectedIntervalPane = new Pane(null, true, newTimeIntervalMask(timeAxis, selection.selectedInterval, selectedIntervalMode)); + attachTimeSelectionMouseListeners(selectedIntervalPane, timeAxis, selection.selectedInterval, input, draggableEdgeWidth, selectedIntervalMode); + axisPane.addPane(selectedIntervalPane, false); + + selectedIntervalPane.mouseMove.on(onMouseMove); + selectedIntervalPane.mouseExit.on(onMouseExit); + selectedIntervalPane.mouseDown.on(onMouseDown); + selectedIntervalPane.mouseUp.on(onMouseUp); + selectedIntervalPane.contextMenu.on(onContextMenu); } - function newTimeAxisPane( args : TimelineContentPaneArguments, row : TimelineRowModel ) : Pane { - var timeAxis = args.timeAxis; - var ui = args.ui; - var draggableEdgeWidth = args.options.draggableEdgeWidth; - var scrollLayout = args.scrollLayout; - var drawable = args.drawable; - var selectedIntervalMode = args.options.selectedIntervalMode; - - var input = ui.input; - - var axisPane = new Pane( newOverlayLayout( ) ); - if ( scrollLayout ) attachTimelineVerticalScrollMouseListeners( axisPane, scrollLayout, drawable ); - attachTimeAxisMouseListeners( axisPane, timeAxis, args ); - - var onMouseMove = function( ev : PointerEvent ) { - var time_PMILLIS = timeAxis.tAtFrac_PMILLIS( xFrac( ev ) ); - input.mouseMove.fire( ev ); - input.timeHover.fire( time_PMILLIS, ev ); - if ( row ) input.rowHover.fire( row, ev ); - }; - axisPane.mouseMove.on( onMouseMove ); + // Dispose + // - var onMouseExit = function( ev : PointerEvent ) { - input.mouseExit.fire( ev ); - input.timeHover.fire( null, ev ); - if ( row ) input.rowHover.fire( null, ev ); - }; - axisPane.mouseExit.on( onMouseExit ); + // mouse listeners are disposed of automatically by Pane - var onMouseDown = function( ev : PointerEvent ) { - input.mouseDown.fire( ev ); - }; - axisPane.mouseDown.on( onMouseDown ); + return axisPane; +} - var onMouseUp = function( ev : PointerEvent ) { - input.mouseUp.fire( ev ); - }; - axisPane.mouseUp.on( onMouseUp ); +function timeAtPointer_PMILLIS(timeAxis: TimeAxis1D, ev: PointerEvent): number { + return timeAxis.tAtFrac_PMILLIS(ev.paneViewport.xFrac(ev.i)); +} - var onContextMenu = function( ev : PointerEvent ) { - input.contextMenu.fire( ev ); - }; - axisPane.contextMenu.on( onContextMenu ); - - if ( selectedIntervalMode === 'single' || selectedIntervalMode === 'range' ) { - var selection = ui.selection; - var selectedIntervalPane = new Pane( null, true, newTimeIntervalMask( timeAxis, selection.selectedInterval, selectedIntervalMode ) ); - attachTimeSelectionMouseListeners( selectedIntervalPane, timeAxis, selection.selectedInterval, input, draggableEdgeWidth, selectedIntervalMode ); - axisPane.addPane( selectedIntervalPane, false ); - - selectedIntervalPane.mouseMove.on( onMouseMove ); - selectedIntervalPane.mouseExit.on( onMouseExit ); - selectedIntervalPane.mouseDown.on( onMouseDown ); - selectedIntervalPane.mouseUp.on( onMouseUp ); - selectedIntervalPane.contextMenu.on( onContextMenu ); - } - // Dispose - // +function attachTimeSelectionMouseListeners(pane: Pane, + timeAxis: TimeAxis1D, + interval: TimeIntervalModel, + input: TimelineInput, + draggableEdgeWidth: number, + selectedIntervalMode: string) { - // mouse listeners are disposed of automatically by Pane + if (selectedIntervalMode === 'single') { - return axisPane; - } + let chooseDragMode = function chooseDragMode(ev: PointerEvent): string { + return 'center'; + } - function timeAtPointer_PMILLIS( timeAxis : TimeAxis1D, ev : PointerEvent ) : number { - return timeAxis.tAtFrac_PMILLIS( ev.paneViewport.xFrac( ev.i ) ); - } + attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode); + } + else if (selectedIntervalMode === 'range') { - function attachTimeSelectionMouseListeners( pane : Pane, - timeAxis : TimeAxis1D, - interval : TimeIntervalModel, - input : TimelineInput, - draggableEdgeWidth : number, - selectedIntervalMode : string ) { + // Edges are draggable when interval is at least this wide + let minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; - if ( selectedIntervalMode === 'single' ) { + // When dragging an edge, the interval cannot be made narrower than this + // + // Needs to be greater than minIntervalWidthForEdgeDraggability -- by enough to + // cover floating-point precision loss -- so a user can't accidentally make + // the interval so narrow that it can't easily be widened again. + // + let minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; - var chooseDragMode = function chooseDragMode( ev : PointerEvent ) : string { + let chooseDragMode = function chooseDragMode(ev: PointerEvent): string { + let intervalWidth = (interval.duration_MILLIS) * ev.paneViewport.w / timeAxis.vSize; + if (intervalWidth < minIntervalWidthForEdgeDraggability) { + // If interval isn't very wide, don't try to allow edge dragging return 'center'; } - - attachTimeIntervalSelectionMouseListeners( pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode ); - - } - else if ( selectedIntervalMode === 'range' ) { - - // Edges are draggable when interval is at least this wide - var minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; - - // When dragging an edge, the interval cannot be made narrower than this - // - // Needs to be greater than minIntervalWidthForEdgeDraggability -- by enough to - // cover floating-point precision loss -- so a user can't accidentally make - // the interval so narrow that it can't easily be widened again. - // - var minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; - - var chooseDragMode = function chooseDragMode( ev : PointerEvent ) : string { - var intervalWidth = ( interval.duration_MILLIS ) * ev.paneViewport.w / timeAxis.vSize; - if ( intervalWidth < minIntervalWidthForEdgeDraggability ) { - // If interval isn't very wide, don't try to allow edge dragging + else { + let time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + let mouseOffset = (time_PMILLIS - interval.start_PMILLIS) * ev.paneViewport.w / timeAxis.vSize; + if (mouseOffset < draggableEdgeWidth) { + // If mouse is near the left edge, drag the interval's start-time + return 'start'; + } + else if (mouseOffset < intervalWidth - draggableEdgeWidth) { + // If mouse is in the center, drag the whole interval return 'center'; } else { - var time_PMILLIS = timeAtPointer_PMILLIS( timeAxis, ev ); - var mouseOffset = ( time_PMILLIS - interval.start_PMILLIS ) * ev.paneViewport.w / timeAxis.vSize; - if ( mouseOffset < draggableEdgeWidth ) { - // If mouse is near the left edge, drag the interval's start-time - return 'start'; - } - else if ( mouseOffset < intervalWidth - draggableEdgeWidth ) { - // If mouse is in the center, drag the whole interval - return 'center'; - } - else { - // If mouse is near the right edge, drag the interval's end-time - return 'end'; - } + // If mouse is near the right edge, drag the interval's end-time + return 'end'; } - }; + } + }; - attachTimeIntervalSelectionMouseListeners( pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode ); - } + attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode); } +} - function attachTimeIntervalSelectionMouseListeners( pane : Pane, - timeAxis : TimeAxis1D, - interval : TimeIntervalModel, - input : TimelineInput, - draggableEdgeWidth : number, - selectedIntervalMode : string, - chooseDragMode : ( ev : PointerEvent ) => string ) { - - // see comments in attachTimeSelectionMouseListeners( ... ) - var minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; - var minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; - - // Hook up input notifications - // - - pane.mouseWheel.on( function( ev : PointerEvent ) { - var zoomFactor = Math.pow( axisZoomStep, ev.wheelSteps ); - timeAxis.zoom( zoomFactor, timeAxis.vAtFrac( xFrac( ev ) ) ); - } ); - - pane.contextMenu.on( function( ev : PointerEvent ) { - input.contextMenu.fire( ev ); - } ); +function attachTimeIntervalSelectionMouseListeners(pane: Pane, + timeAxis: TimeAxis1D, + interval: TimeIntervalModel, + input: TimelineInput, + draggableEdgeWidth: number, + selectedIntervalMode: string, + chooseDragMode: (ev: PointerEvent) => string) { + // see comments in attachTimeSelectionMouseListeners( ... ) + let minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; + let minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; - // Begin interval-drag - // + // Hook up input notifications + // - var dragMode : string = null; - var dragOffset_MILLIS : number = null; + pane.mouseWheel.on(function (ev: PointerEvent) { + let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + timeAxis.zoom(zoomFactor, timeAxis.vAtFrac(xFrac(ev))); + }); - pane.mouseMove.on( function( ev : PointerEvent ) { - if ( !dragMode ) { - var mouseCursors = { 'center': 'move', 'start': 'w-resize', 'end': 'e-resize' }; - pane.mouseCursor = mouseCursors[ chooseDragMode( ev ) ]; - } - } ); + pane.contextMenu.on(function (ev: PointerEvent) { + input.contextMenu.fire(ev); + }); - pane.mouseDown.on( function( ev : PointerEvent ) { - dragMode = isLeftMouseDown( ev.mouseEvent ) ? chooseDragMode( ev ) : null; - if ( !hasval( dragMode ) ) { - dragOffset_MILLIS = null; - } - } ); + // Begin interval-drag + // - // Compute (and remember) the pointer time, for use by the drag listeners below - // - - var dragPointer_PMILLIS : number = null; + let dragMode: string = null; + let dragOffset_MILLIS: number = null; - var updateDragPointer = function( ev : PointerEvent ) { - if ( hasval( dragMode ) ) { - dragPointer_PMILLIS = timeAtPointer_PMILLIS( timeAxis, ev ); - } - }; - pane.mouseDown.on( updateDragPointer ); - pane.mouseMove.on( updateDragPointer ); + pane.mouseMove.on(function (ev: PointerEvent) { + if (!dragMode) { + let mouseCursors = { 'center': 'move', 'start': 'w-resize', 'end': 'e-resize' }; + pane.mouseCursor = mouseCursors[chooseDragMode(ev)]; + } + }); + pane.mouseDown.on(function (ev: PointerEvent) { + dragMode = isLeftMouseDown(ev.mouseEvent) ? chooseDragMode(ev) : null; + if (!hasval(dragMode)) { + dragOffset_MILLIS = null; + } + }); - // Dragging interval-center - // - var grabCenter = function( ) { - if ( dragMode === 'center' ) { - dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS; - } - }; - pane.mouseDown.on( grabCenter ); + // Compute (and remember) the pointer time, for use by the drag listeners below + // - var dragCenter = function( ) { - if ( dragMode === 'center' ) { - var newStart_PMILLIS = ( dragPointer_PMILLIS - dragOffset_MILLIS ); - var newEnd_PMILLIS = interval.end_PMILLIS + ( newStart_PMILLIS - interval.start_PMILLIS ); - interval.setInterval( newStart_PMILLIS, newEnd_PMILLIS ); - } - }; - pane.mouseMove.on( dragCenter ); + let dragPointer_PMILLIS: number = null; + let updateDragPointer = function (ev: PointerEvent) { + if (hasval(dragMode)) { + dragPointer_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + } + }; + pane.mouseDown.on(updateDragPointer); + pane.mouseMove.on(updateDragPointer); - // Dragging interval-start - // - var grabStart = function( ) { - if ( dragMode === 'start' ) { - dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS; - } - }; - pane.mouseDown.on( grabStart ); + // Dragging interval-center + // - var dragStart = function( ) { - if ( dragMode === 'start' ) { - var wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; - var newStart_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; - interval.start_PMILLIS = Math.min( interval.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS ); - } - }; - pane.mouseMove.on( dragStart ); + let grabCenter = function () { + if (dragMode === 'center') { + dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS; + } + }; + pane.mouseDown.on(grabCenter); + + let dragCenter = function () { + if (dragMode === 'center') { + let newStart_PMILLIS = (dragPointer_PMILLIS - dragOffset_MILLIS); + let newEnd_PMILLIS = interval.end_PMILLIS + (newStart_PMILLIS - interval.start_PMILLIS); + interval.setInterval(newStart_PMILLIS, newEnd_PMILLIS); + } + }; + pane.mouseMove.on(dragCenter); - // Dragging interval-end - // + // Dragging interval-start + // - var grabEnd = function( ) { - if ( dragMode === 'end' ) { - dragOffset_MILLIS = dragPointer_PMILLIS - interval.end_PMILLIS; - } - }; - pane.mouseDown.on( grabEnd ); - - var dragEnd = function( ) { - if ( dragMode === 'end' ) { - var wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; - var newEnd_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; - interval.end_PMILLIS = Math.max( interval.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS ); - interval.cursor_PMILLIS = interval.end_PMILLIS; - } - }; - pane.mouseMove.on( dragEnd ); + let grabStart = function () { + if (dragMode === 'start') { + dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS; + } + }; + pane.mouseDown.on(grabStart); + + let dragStart = function () { + if (dragMode === 'start') { + let wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; + let newStart_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; + interval.start_PMILLIS = Math.min(interval.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS); + } + }; + pane.mouseMove.on(dragStart); - // Finish interval-drag - // + // Dragging interval-end + // - pane.mouseUp.on( function( ev : PointerEvent ) { - dragOffset_MILLIS = null; - dragPointer_PMILLIS = null; - dragMode = null; - } ); - } + let grabEnd = function () { + if (dragMode === 'end') { + dragOffset_MILLIS = dragPointer_PMILLIS - interval.end_PMILLIS; + } + }; + pane.mouseDown.on(grabEnd); + + let dragEnd = function () { + if (dragMode === 'end') { + let wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; + let newEnd_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; + interval.end_PMILLIS = Math.max(interval.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS); + interval.cursor_PMILLIS = interval.end_PMILLIS; + } + }; + pane.mouseMove.on(dragEnd); - export function newTimelineSingleSelectionPainter( timeAxis : TimeAxis1D, interval : TimeIntervalModel, borderColor : Color, fillColor : Color ) : Painter { - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var u_Color = new UniformColor( program, 'u_Color' ); + // Finish interval-drag + // - // holds vertices for fill and border - var coords = new Float32Array( 12 + 8 ); - var coordsBuffer = newDynamicBuffer( ); + pane.mouseUp.on(function (ev: PointerEvent) { + dragOffset_MILLIS = null; + dragPointer_PMILLIS = null; + dragMode = null; + }); +} - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( hasval( interval.cursor_PMILLIS ) ) { +export function newTimelineSingleSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIntervalModel, borderColor: Color, fillColor: Color): Painter { - var fracSelection = timeAxis.tFrac( interval.cursor_PMILLIS ); - var fracWidth = 1 / viewport.w; - var fracHeight = 1 / viewport.h; - var thickWidth = 3 / viewport.w; - var highlightWidth = 7 / viewport.w; - var index = 0; + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let u_Color = new UniformColor(program, 'u_Color'); - // fill vertices - coords[ index++ ] = fracSelection - highlightWidth; - coords[ index++ ] = 1; - coords[ index++ ] = fracSelection + highlightWidth; - coords[ index++ ] = 1; - coords[ index++ ] = fracSelection - highlightWidth; - coords[ index++ ] = 0; - coords[ index++ ] = fracSelection + highlightWidth; - coords[ index++ ] = 0; + // holds vertices for fill and border + let coords = new Float32Array(12 + 8); + let coordsBuffer = newDynamicBuffer(); - // selection vertices - index = putQuadXys( coords, index, fracSelection-thickWidth/2, fracSelection+thickWidth/2, 1, 0+fracHeight ); // selection + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + if (hasval(interval.cursor_PMILLIS)) { - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); + let fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS); + let fracWidth = 1 / viewport.w; + let fracHeight = 1 / viewport.h; + let thickWidth = 3 / viewport.w; + let highlightWidth = 7 / viewport.w; + let index = 0; - program.use( gl ); - coordsBuffer.setData( coords ); - a_XyFrac.setDataAndEnable( gl, coordsBuffer, 2, GL.FLOAT ); + // fill vertices + coords[index++] = fracSelection - highlightWidth; + coords[index++] = 1; + coords[index++] = fracSelection + highlightWidth; + coords[index++] = 1; + coords[index++] = fracSelection - highlightWidth; + coords[index++] = 0; + coords[index++] = fracSelection + highlightWidth; + coords[index++] = 0; - u_Color.setData( gl, fillColor ); - gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); + // selection vertices + index = putQuadXys(coords, index, fracSelection - thickWidth / 2, fracSelection + thickWidth / 2, 1, 0 + fracHeight); // selection - u_Color.setData( gl, borderColor ); - gl.drawArrays( GL.TRIANGLES, 4, 6 ); + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); - a_XyFrac.disable( gl ); - program.endUse( gl ); + program.use(gl); + coordsBuffer.setData(coords); + a_XyFrac.setDataAndEnable(gl, coordsBuffer, 2, GL.FLOAT); + u_Color.setData(gl, fillColor); + gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4); - } - }; - } + u_Color.setData(gl, borderColor); + gl.drawArrays(GL.TRIANGLES, 4, 6); - function newTimelineRangeSelectionPainter( timeAxis : TimeAxis1D, interval : TimeIntervalModel, borderColor : Color, fillColor : Color ) : Painter { + a_XyFrac.disable(gl); + program.endUse(gl); - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var u_Color = new UniformColor( program, 'u_Color' ); - // holds vertices for fill and border - var coords = new Float32Array( 12 + 8 + 48 ); - var coordsBuffer = newDynamicBuffer( ); + } + }; +} - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - if ( hasval( interval.start_PMILLIS ) && hasval( interval.end_PMILLIS ) ) { +function newTimelineRangeSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIntervalModel, borderColor: Color, fillColor: Color): Painter { - var fracStart = timeAxis.tFrac( interval.start_PMILLIS ); - var fracEnd = timeAxis.tFrac( interval.end_PMILLIS ); - var fracSelection = timeAxis.tFrac( interval.cursor_PMILLIS ); - var fracWidth = 1 / viewport.w; - var fracHeight = 1 / viewport.h; - var thickWidth = 3 / viewport.w; - var index = 0; + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let u_Color = new UniformColor(program, 'u_Color'); - // fill vertices - coords[ index++ ] = fracStart; - coords[ index++ ] = 1; - coords[ index++ ] = fracEnd; - coords[ index++ ] = 1; - coords[ index++ ] = fracStart; - coords[ index++ ] = 0; - coords[ index++ ] = fracEnd; - coords[ index++ ] = 0; + // holds vertices for fill and border + let coords = new Float32Array(12 + 8 + 48); + let coordsBuffer = newDynamicBuffer(); - // border vertices - index = putQuadXys( coords, index, fracStart, fracEnd-fracWidth, +1, +1-fracHeight ); // top - index = putQuadXys( coords, index, fracStart+fracWidth, fracEnd, 0+fracHeight, 0 ); // bottom - index = putQuadXys( coords, index, fracStart, fracStart+fracWidth, 1-fracHeight, 0 ); // left - index = putQuadXys( coords, index, fracEnd-fracWidth, fracEnd, 1, 0+fracHeight ); // right + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + if (hasval(interval.start_PMILLIS) && hasval(interval.end_PMILLIS)) { - // selection vertices - index = putQuadXys( coords, index, fracSelection-thickWidth, fracSelection, 1, 0+fracHeight ); // selection + let fracStart = timeAxis.tFrac(interval.start_PMILLIS); + let fracEnd = timeAxis.tFrac(interval.end_PMILLIS); + let fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS); + let fracWidth = 1 / viewport.w; + let fracHeight = 1 / viewport.h; + let thickWidth = 3 / viewport.w; + let index = 0; - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); + // fill vertices + coords[index++] = fracStart; + coords[index++] = 1; + coords[index++] = fracEnd; + coords[index++] = 1; + coords[index++] = fracStart; + coords[index++] = 0; + coords[index++] = fracEnd; + coords[index++] = 0; - program.use( gl ); - coordsBuffer.setData( coords ); - a_XyFrac.setDataAndEnable( gl, coordsBuffer, 2, GL.FLOAT ); + // border vertices + index = putQuadXys(coords, index, fracStart, fracEnd - fracWidth, +1, +1 - fracHeight); // top + index = putQuadXys(coords, index, fracStart + fracWidth, fracEnd, 0 + fracHeight, 0); // bottom + index = putQuadXys(coords, index, fracStart, fracStart + fracWidth, 1 - fracHeight, 0); // left + index = putQuadXys(coords, index, fracEnd - fracWidth, fracEnd, 1, 0 + fracHeight); // right - u_Color.setData( gl, fillColor ); - gl.drawArrays( GL.TRIANGLE_STRIP, 0, 4 ); + // selection vertices + index = putQuadXys(coords, index, fracSelection - thickWidth, fracSelection, 1, 0 + fracHeight); // selection - u_Color.setData( gl, borderColor ); - gl.drawArrays( GL.TRIANGLES, 4, 30 ); + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); - a_XyFrac.disable( gl ); - program.endUse( gl ); + program.use(gl); + coordsBuffer.setData(coords); + a_XyFrac.setDataAndEnable(gl, coordsBuffer, 2, GL.FLOAT); + u_Color.setData(gl, fillColor); + gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4); - } - }; - } + u_Color.setData(gl, borderColor); + gl.drawArrays(GL.TRIANGLES, 4, 30); - function newGroupCollapseExpandArrowPainter( group : TimelineGroupModel ) { + a_XyFrac.disable(gl); + program.endUse(gl); - var program = new Program( xyFrac_VERTSHADER, solid_FRAGSHADER ); - var a_XyFrac = new Attribute( program, 'a_XyFrac' ); - var u_Color = new UniformColor( program, 'u_Color' ); - // holds vertices for triangle - var coords = new Float32Array( 6 ); - var coordsBuffer = newDynamicBuffer( ); + } + }; +} - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { +function newGroupCollapseExpandArrowPainter(group: TimelineGroupModel) { - var sizeFracX = 0.5; - var sizeX = sizeFracX * viewport.w; - var sizeY = sizeX * Math.sqrt(3)/2; - var sizeFracY = sizeY / viewport.h; + let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + let a_XyFrac = new Attribute(program, 'a_XyFrac'); + let u_Color = new UniformColor(program, 'u_Color'); - var bufferFracX = 0.05; - var bufferSize = bufferFracX * viewport.w; - var bufferFracY = bufferSize / viewport.h; + // holds vertices for triangle + let coords = new Float32Array(6); + let coordsBuffer = newDynamicBuffer(); - var centerFracX = 0.5; - var centerFracY = bufferFracY + sizeFracY/2; + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - if ( group.collapsed ) { + let sizeFracX = 0.5; + let sizeX = sizeFracX * viewport.w; + let sizeY = sizeX * Math.sqrt(3) / 2; + let sizeFracY = sizeY / viewport.h; - sizeFracX = sizeY / viewport.w; - sizeFracY = sizeX / viewport.h; + let bufferFracX = 0.05; + let bufferSize = bufferFracX * viewport.w; + let bufferFracY = bufferSize / viewport.h; - var fracStartX = centerFracX - sizeFracX / 2; - var fracEndX = centerFracX + sizeFracX / 2; + let centerFracX = 0.5; + let centerFracY = bufferFracY + sizeFracY / 2; - var fracStartY = 1 - ( centerFracY - sizeFracY / 2 ) ; - var fracEndY = 1 - ( centerFracY + sizeFracY / 2 ) ; + if (group.collapsed) { - var index = 0; - coords[ index++ ] = fracStartX; - coords[ index++ ] = fracStartY; - coords[ index++ ] = fracEndX; - coords[ index++ ] = ( fracStartY + fracEndY ) / 2; - coords[ index++ ] = fracStartX; - coords[ index++ ] = fracEndY; - } else { - var fracStartX = centerFracX - sizeFracX / 2; - var fracEndX = centerFracX + sizeFracX / 2; + sizeFracX = sizeY / viewport.w; + sizeFracY = sizeX / viewport.h; - var fracStartY = 1 - ( centerFracY - sizeFracY / 2 ) ; - var fracEndY = 1 - ( centerFracY + sizeFracY / 2 ) ; + let fracStartX = centerFracX - sizeFracX / 2; + let fracEndX = centerFracX + sizeFracX / 2; - var index = 0; - coords[ index++ ] = fracStartX; - coords[ index++ ] = fracStartY; - coords[ index++ ] = fracEndX; - coords[ index++ ] = fracStartY; - coords[ index++ ] = ( fracStartX + fracEndX ) / 2; - coords[ index++ ] = fracEndY; - } + let fracStartY = 1 - (centerFracY - sizeFracY / 2); + let fracEndY = 1 - (centerFracY + sizeFracY / 2); - program.use( gl ); - coordsBuffer.setData( coords ); - a_XyFrac.setDataAndEnable( gl, coordsBuffer, 2, GL.FLOAT ); + let index = 0; + coords[index++] = fracStartX; + coords[index++] = fracStartY; + coords[index++] = fracEndX; + coords[index++] = (fracStartY + fracEndY) / 2; + coords[index++] = fracStartX; + coords[index++] = fracEndY; + } else { + let fracStartX = centerFracX - sizeFracX / 2; + let fracEndX = centerFracX + sizeFracX / 2; - u_Color.setData( gl, white ); - gl.drawArrays( GL.TRIANGLES, 0, 3 ); + let fracStartY = 1 - (centerFracY - sizeFracY / 2); + let fracEndY = 1 - (centerFracY + sizeFracY / 2); - a_XyFrac.disable( gl ); - program.endUse( gl ); + let index = 0; + coords[index++] = fracStartX; + coords[index++] = fracStartY; + coords[index++] = fracEndX; + coords[index++] = fracStartY; + coords[index++] = (fracStartX + fracEndX) / 2; + coords[index++] = fracEndY; } - } - interface TimelineContentPaneOptions { - selectedIntervalMode : string; - rowPaneFactoryChooser : TimelineRowPaneFactoryChooser; - - font : string; - fgColor : Color; - rowLabelColor : Color; - rowLabelBgColor : Color; - groupLabelColor : Color; - groupHighlightColor : Color; - axisLabelColor : Color; - bgColor : Color; - rowBgColor : Color; - rowAltBgColor : Color; - gridColor : Color; - - gridTimeZone : string; - gridTickSpacing : number; - referenceDate : string; - - groupLabelInsets : Insets; - rowLabelInsets : Insets; - rowLabelPaneWidth : number; - rowSeparatorHeight : number; - - draggableEdgeWidth : number; - snapToDistance : number; - - mouseWheelListener : ( PointerEvent ) => void; - } + program.use(gl); + coordsBuffer.setData(coords); + a_XyFrac.setDataAndEnable(gl, coordsBuffer, 2, GL.FLOAT); - interface TimelineContentPaneArguments { - drawable : Drawable; - scrollLayout : VerticalScrollLayout; - timeAxis : TimeAxis1D; - model : TimelineModel; - ui : TimelineUi; - options : TimelineContentPaneOptions; - } + u_Color.setData(gl, white); + gl.drawArrays(GL.TRIANGLES, 0, 3); - function newTimelineContentPane( args : TimelineContentPaneArguments ) : Pane { - var drawable = args.drawable; - var scrollLayout = args.scrollLayout; - var timeAxis = args.timeAxis; - var model = args.model; - var ui = args.ui; - var options = args.options; - - var root = model.root; - - var selectedIntervalMode = options.selectedIntervalMode; - var rowPaneFactoryChooser = options.rowPaneFactoryChooser; - - var font = options.font; - var fgColor = options.fgColor; - var rowLabelColor = options.rowLabelColor; - var groupLabelColor = options.groupLabelColor; - var groupHighlightColor = options.groupHighlightColor; - var axisLabelColor = options.axisLabelColor; - var bgColor = options.bgColor; - var rowBgColor = options.rowBgColor; - var rowAltBgColor = options.rowAltBgColor; - var gridColor = options.gridColor; - - var gridTimeZone = options.gridTimeZone; - var gridTickSpacing = options.gridTickSpacing; - - var groupLabelInsets = options.groupLabelInsets; - var rowLabelInsets = options.rowLabelInsets; - var rowLabelPaneWidth = options.rowLabelPaneWidth; - var rowSeparatorHeight = options.rowSeparatorHeight; - - var draggableEdgeWidth = options.draggableEdgeWidth; - var snapToDistance = options.snapToDistance; - - var textureRenderer = new TextureRenderer( ); - var createGroupLabelTexture = createTextTextureFactory( font ); - var createRowLabelTexture = createTextTextureFactory( font ); - - // Group panes - // + a_XyFrac.disable(gl); + program.endUse(gl); + } +} + +interface TimelineContentPaneOptions { + selectedIntervalMode: string; + rowPaneFactoryChooser: TimelineRowPaneFactoryChooser; + + font: string; + fgColor: Color; + rowLabelColor: Color; + rowLabelBgColor: Color; + groupLabelColor: Color; + groupHighlightColor: Color; + axisLabelColor: Color; + bgColor: Color; + rowBgColor: Color; + rowAltBgColor: Color; + gridColor: Color; + + gridTimeZone: string; + gridTickSpacing: number; + referenceDate: string; + + groupLabelInsets: Insets; + rowLabelInsets: Insets; + rowLabelPaneWidth: number; + rowSeparatorHeight: number; + + draggableEdgeWidth: number; + snapToDistance: number; + + mouseWheelListener: (PointerEvent: PointerEvent) => void; +} + +interface TimelineContentPaneArguments { + drawable: Drawable; + scrollLayout: VerticalScrollLayout; + timeAxis: TimeAxis1D; + model: TimelineModel; + ui: TimelineUi; + options: TimelineContentPaneOptions; +} + +function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { + let drawable = args.drawable; + let scrollLayout = args.scrollLayout; + let timeAxis = args.timeAxis; + let model = args.model; + let ui = args.ui; + let options = args.options; + + let root = model.root; + + let selectedIntervalMode = options.selectedIntervalMode; + let rowPaneFactoryChooser = options.rowPaneFactoryChooser; + + let font = options.font; + let fgColor = options.fgColor; + let rowLabelColor = options.rowLabelColor; + let groupLabelColor = options.groupLabelColor; + let groupHighlightColor = options.groupHighlightColor; + let axisLabelColor = options.axisLabelColor; + let bgColor = options.bgColor; + let rowBgColor = options.rowBgColor; + let rowAltBgColor = options.rowAltBgColor; + let gridColor = options.gridColor; + + let gridTimeZone = options.gridTimeZone; + let gridTickSpacing = options.gridTickSpacing; + + let groupLabelInsets = options.groupLabelInsets; + let rowLabelInsets = options.rowLabelInsets; + let rowLabelPaneWidth = options.rowLabelPaneWidth; + let rowSeparatorHeight = options.rowSeparatorHeight; + + let draggableEdgeWidth = options.draggableEdgeWidth; + let snapToDistance = options.snapToDistance; + + let textureRenderer = new TextureRenderer(); + let createGroupLabelTexture = createTextTextureFactory(font); + let createRowLabelTexture = createTextTextureFactory(font); + + // Group panes + // - var timelineContentPane = new Pane( newRowLayout( ) ); + let timelineContentPane = new Pane(newRowLayout()); - var groupHeaderPanes : StringMap = {}; - var groupContentPanes : StringMap = {}; + let groupHeaderPanes: StringMap = {}; + let groupContentPanes: StringMap = {}; - var addGroup = function( groupGuid : string, groupIndex : number ) { - var group = model.group( groupGuid ); + let addGroup = function (groupGuid: string, groupIndex: number) { + let group = model.group(groupGuid); - var groupLabel = new Label( group.label, font, groupLabelColor ); - var groupLabelPane = new Pane( { updatePrefSize: fitToLabel( groupLabel ) }, false ); - groupLabelPane.addPainter( newLabelPainter( groupLabel, 0, 1, 0, 1 ) ); + let groupLabel = new Label(group.label, font, groupLabelColor); + let groupLabelPane = new Pane({ updatePrefSize: fitToLabel(groupLabel) }, false); + groupLabelPane.addPainter(newLabelPainter(groupLabel, 0, 1, 0, 1)); - var groupArrowPane = new Pane( { updatePrefSize: function( parentPrefSize : Size ) { + let groupArrowPane = new Pane({ + updatePrefSize: function (parentPrefSize: Size) { parentPrefSize.w = 16; parentPrefSize.h = 0; - } }, false ); - groupArrowPane.addPainter( newGroupCollapseExpandArrowPainter( group ) ); + } + }, false); + groupArrowPane.addPainter(newGroupCollapseExpandArrowPainter(group)); - var groupPane = new Pane( newColumnLayout( ), false ); - groupPane.addPane( groupArrowPane, 0 ); - groupPane.addPane( groupLabelPane, 1 ); + let groupPane = new Pane(newColumnLayout(), false); + groupPane.addPane(groupArrowPane, 0); + groupPane.addPane(groupLabelPane, 1); - var groupButton = newInsetPane( groupPane, groupLabelInsets, bgColor ); + let groupButton = newInsetPane(groupPane, groupLabelInsets, bgColor); - var redrawLabel = function( ) { - groupLabel.text = group.label; - drawable.redraw( ); - } - group.attrsChanged.on( redrawLabel ); - - /// handle rollup group row /// - - var groupHeaderHighlight = new Pane( newColumnLayout( ) ); - groupHeaderHighlight.addPane( newSolidPane( groupHighlightColor ), 1, { width: 6, height: null } ); - - var groupHeaderStripe = new Pane( newRowLayout( ) ); - groupHeaderStripe.addPane( new Pane( null ), 0, { height: null } ); - groupHeaderStripe.addPane( newSolidPane( groupLabelColor ), 1, { height: 1 } ); - groupHeaderStripe.addPane( new Pane( null ), 2, { height: null } ); - - var rollupRow = model.row( group.rollupGuid ); - if ( rollupRow ) { - - var rowBackgroundPanes = newRowBackgroundPanes( args, group.rowGuids, rollupRow ); - var rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; - var rowInsetPane = rowBackgroundPanes.rowInsetPane; - - var rollupUi = ui.rowUi( rollupRow.rowGuid ); - - // expose panes in api via TimelineRowUi - rollupUi.addPane( 'background', rowBackgroundPane ); - rollupUi.addPane( 'inset', rowInsetPane ); - - var rollupDataAxis = rollupRow.dataAxis; - - var rollupContentPane : Pane = null; - var rollupPaneFactory : TimelineRowPaneFactory = null; - var rollupContentOptions = { timelineFont: font, timelineFgColor: fgColor, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, isMaximized: false, mouseWheelListener: args.options.mouseWheelListener }; - var refreshRollupContentPane = function( ) { - var newRollupPaneFactory = ( rollupUi.paneFactory || rowPaneFactoryChooser( rollupRow ) ); - if ( newRollupPaneFactory !== rollupPaneFactory ) { - if ( rollupContentPane ) { - rollupContentPane.dispose.fire( ); - rowInsetPane.removePane( rollupContentPane ); - } - rollupPaneFactory = newRollupPaneFactory; - rollupContentPane = ( rollupPaneFactory && rollupPaneFactory( drawable, timeAxis, rollupDataAxis, model, rollupRow, ui, rollupContentOptions ) ); - if ( rollupContentPane ) { - rowInsetPane.addPane( rollupContentPane ); - } - drawable.redraw( ); - } - }; - - rollupUi.paneFactoryChanged.on( refreshRollupContentPane ); - rollupRow.attrsChanged.on( refreshRollupContentPane ); - rollupRow.eventGuids.valueAdded.on( refreshRollupContentPane ); - rollupRow.eventGuids.valueRemoved.on( refreshRollupContentPane ); - rollupRow.timeseriesGuids.valueAdded.on( refreshRollupContentPane ); - rollupRow.timeseriesGuids.valueRemoved.on( refreshRollupContentPane ); - refreshRollupContentPane( ); - - var groupButtonHeaderUnderlay = new Pane( newColumnLayout( ) ); - groupButtonHeaderUnderlay.addPane( groupHeaderHighlight, 0, { ignoreHeight: true } ); - groupButtonHeaderUnderlay.addPane( groupButton, 1 ); - groupButtonHeaderUnderlay.addPane( groupHeaderStripe, 2, { ignoreHeight: true } ); - - var groupHeaderUnderlay = new Pane( newColumnLayout( ) ); - groupHeaderUnderlay.addPainter( newBackgroundPainter( bgColor ) ); - groupHeaderUnderlay.addPane( groupButtonHeaderUnderlay, 0, { width: rowLabelPaneWidth } ); - groupHeaderUnderlay.addPane( rowBackgroundPane, 1, { width: null } ); - - var groupHeaderPane = groupHeaderUnderlay; - } - else { + let redrawLabel = function () { + groupLabel.text = group.label; + drawable.redraw(); + } + group.attrsChanged.on(redrawLabel); + /// handle rollup group row /// - var groupHeaderUnderlay = new Pane( newColumnLayout( ) ); - groupHeaderUnderlay.addPainter( newBackgroundPainter( bgColor ) ); - groupHeaderUnderlay.addPane( groupHeaderHighlight, 0, { ignoreHeight: true } ); - groupHeaderUnderlay.addPane( groupButton, 1 ); - groupHeaderUnderlay.addPane( groupHeaderStripe, 2, { ignoreHeight: true } ); + let groupHeaderHighlight = new Pane(newColumnLayout()); + groupHeaderHighlight.addPane(newSolidPane(groupHighlightColor), 1, { width: 6, height: null }); - var groupHeaderOverlay = newTimeAxisPane( args, null ); - var groupHeaderOverlayInsets = newInsets( 0, 0, 0, rowLabelPaneWidth ); + let groupHeaderStripe = new Pane(newRowLayout()); + groupHeaderStripe.addPane(new Pane(null), 0, { height: null }); + groupHeaderStripe.addPane(newSolidPane(groupLabelColor), 1, { height: 1 }); + groupHeaderStripe.addPane(new Pane(null), 2, { height: null }); - var groupHeaderPane = new Pane( newOverlayLayout( ) ); - groupHeaderPane.addPane( groupHeaderUnderlay, true ); - groupHeaderPane.addPane( newInsetPane( groupHeaderOverlay, groupHeaderOverlayInsets, null, false ), false ); + let rollupRow = model.row(group.rollupGuid); + let groupHeaderPane: Pane = null; + let groupHeaderUnderlay: Pane = null; + if (rollupRow) { - } + let rowBackgroundPanes = newRowBackgroundPanes(args, group.rowGuids, rollupRow); + let rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; + let rowInsetPane = rowBackgroundPanes.rowInsetPane; - var groupContentPane = new Pane( newRowLayout( ) ); - - timelineContentPane.updateLayoutArgs( function( layoutArg : any ) : any { - var shift = ( isNumber( layoutArg ) && layoutArg >= 2*groupIndex ); - return ( shift ? layoutArg + 2 : layoutArg ); - } ); - timelineContentPane.addPane( groupHeaderPane, 2*groupIndex ); - timelineContentPane.addPane( groupContentPane, 2*groupIndex + 1, { hide: group.collapsed } ); - groupHeaderPanes[ groupGuid ] = groupHeaderPane; - groupContentPanes[ groupGuid ] = groupContentPane; - - var groupAttrsChanged = function( group ) { - var groupContentLayoutOpts = timelineContentPane.layoutOptions( groupContentPane ); - var groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); - var redraw = false; - if(group.highlighted !== (!groupHighlightLayoutOpts.hide)) { - groupHighlightLayoutOpts.hide = !group.highlighted; - redraw = true; - } - if ( group.collapsed !== groupContentLayoutOpts.hide ) { - groupContentLayoutOpts.hide = group.collapsed; - redraw = true; - } - if(redraw) { - drawable.redraw( ); - } - }.bind(this, group); - group.attrsChanged.on( groupAttrsChanged ); - groupAttrsChanged(); + let rollupUi = ui.rowUi(rollupRow.rowGuid); - groupButton.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) ) { - group.collapsed = !group.collapsed; + // expose panes in api via TimelineRowUi + rollupUi.addPane('background', rowBackgroundPane); + rollupUi.addPane('inset', rowInsetPane); + + let rollupDataAxis = rollupRow.dataAxis; + + let rollupContentPane: Pane = null; + let rollupPaneFactory: TimelineRowPaneFactory = null; + let rollupContentOptions = { timelineFont: font, timelineFgColor: fgColor, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, isMaximized: false, mouseWheelListener: args.options.mouseWheelListener }; + let refreshRollupContentPane = function () { + let newRollupPaneFactory = (rollupUi.paneFactory || rowPaneFactoryChooser(rollupRow)); + if (newRollupPaneFactory !== rollupPaneFactory) { + if (rollupContentPane) { + rollupContentPane.dispose.fire(); + rowInsetPane.removePane(rollupContentPane); + } + rollupPaneFactory = newRollupPaneFactory; + rollupContentPane = (rollupPaneFactory && rollupPaneFactory(drawable, timeAxis, rollupDataAxis, model, rollupRow, ui, rollupContentOptions)); + if (rollupContentPane) { + rowInsetPane.addPane(rollupContentPane); + } + drawable.redraw(); } - } ); + }; - // Handle hidden property - // + rollupUi.paneFactoryChanged.on(refreshRollupContentPane); + rollupRow.attrsChanged.on(refreshRollupContentPane); + rollupRow.eventGuids.valueAdded.on(refreshRollupContentPane); + rollupRow.eventGuids.valueRemoved.on(refreshRollupContentPane); + rollupRow.timeseriesGuids.valueAdded.on(refreshRollupContentPane); + rollupRow.timeseriesGuids.valueRemoved.on(refreshRollupContentPane); + refreshRollupContentPane(); + + let groupButtonHeaderUnderlay = new Pane(newColumnLayout()); + groupButtonHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); + groupButtonHeaderUnderlay.addPane(groupButton, 1); + groupButtonHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); + + let groupHeaderUnderlay = new Pane(newColumnLayout()); + groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); + groupHeaderUnderlay.addPane(groupButtonHeaderUnderlay, 0, { width: rowLabelPaneWidth }); + groupHeaderUnderlay.addPane(rowBackgroundPane, 1, { width: null }); + + let groupHeaderPane = groupHeaderUnderlay; + } + else { - timelineContentPane.layoutOptions( groupContentPane ).hide = group.hidden; - timelineContentPane.layoutOptions( groupHeaderPane ).hide = group.hidden; + let groupHeaderUnderlay = new Pane(newColumnLayout()); + groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); + groupHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); + groupHeaderUnderlay.addPane(groupButton, 1); + groupHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); + groupHeaderUnderlay + let groupHeaderOverlay = newTimeAxisPane(args, null); + let groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); - setupRowContainerPane( args, groupContentPane, group.rowGuids, false, group.groupGuid ); + let groupHeaderPane = new Pane(newOverlayLayout()); + groupHeaderPane.addPane(groupHeaderUnderlay, true); + groupHeaderPane.addPane(newInsetPane(groupHeaderOverlay, groupHeaderOverlayInsets, null, false), false); - groupContentPane.dispose.on( function( ) { - group.attrsChanged.off( redrawLabel ); - group.attrsChanged.off( groupAttrsChanged ); - }); + } - }; - root.groupGuids.forEach( addGroup ); - root.groupGuids.valueAdded.on( addGroup ); - - var moveGroup = function( groupGuid : string, groupOldIndex : number, groupNewIndex : number ) { - var nMin = Math.min( groupOldIndex, groupNewIndex ); - var nMax = Math.max( groupOldIndex, groupNewIndex ); - for ( var n = nMin; n <= nMax; n++ ) { - var groupGuid = root.groupGuids.valueAt( n ); - timelineContentPane.setLayoutArg( groupHeaderPanes[ groupGuid ], 2*n ); - timelineContentPane.setLayoutArg( groupContentPanes[ groupGuid ], 2*n + 1 ); + let groupContentPane = new Pane(newRowLayout()); + + timelineContentPane.updateLayoutArgs(function (layoutArg: any): any { + let shift = (isNumber(layoutArg) && layoutArg >= 2 * groupIndex); + return (shift ? layoutArg + 2 : layoutArg); + }); + timelineContentPane.addPane(groupHeaderPane, 2 * groupIndex); + timelineContentPane.addPane(groupContentPane, 2 * groupIndex + 1, { hide: group.collapsed }); + groupHeaderPanes[groupGuid] = groupHeaderPane; + groupContentPanes[groupGuid] = groupContentPane; + + let groupAttrsChanged = function (group: TimelineGroup) { + let groupContentLayoutOpts = timelineContentPane.layoutOptions(groupContentPane); + let groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); + let redraw = false; + if (group.highlighted !== (!groupHighlightLayoutOpts.hide)) { + groupHighlightLayoutOpts.hide = !group.highlighted; + redraw = true; + } + if (group.collapsed !== groupContentLayoutOpts.hide) { + groupContentLayoutOpts.hide = group.collapsed; + redraw = true; } + if (redraw) { + drawable.redraw(); + } + }.bind(this, group); + group.attrsChanged.on(groupAttrsChanged); + groupAttrsChanged(); - drawable.redraw( ); - }; - root.groupGuids.valueMoved.on( moveGroup ); - - var removeGroup = function( groupGuid : string, groupIndex : number ) { - var contentPane : Pane = groupContentPanes[ groupGuid ]; - var headerPane : Pane = groupHeaderPanes[ groupGuid ]; - contentPane.dispose.fire( ); - headerPane.dispose.fire( ); - timelineContentPane.removePane( contentPane ); - timelineContentPane.removePane( headerPane ); - timelineContentPane.updateLayoutArgs( function( layoutArg : any ) : any { - var shift = ( isNumber( layoutArg ) && layoutArg > 2*groupIndex + 1 ); - return ( shift ? layoutArg - 2 : layoutArg ); - } ); - delete groupHeaderPanes[ groupGuid ]; - delete groupContentPanes[ groupGuid ]; - - drawable.redraw( ); - }; - root.groupGuids.valueRemoved.on( removeGroup ); + groupButton.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent)) { + group.collapsed = !group.collapsed; + } + }); - // Handle listing for hidden property + // Handle hidden property // - var groupAttrsChangedListeners = {}; - - var attachGroupAttrsChangedListener = function( groupGuid : string, groupIndex : number ) { - var group = model.group( groupGuid ); - var groupAttrsChangedListener = function( ) { - if ( hasval( group.hidden ) && hasval( groupContentPanes[groupGuid] ) ) { + timelineContentPane.layoutOptions(groupContentPane).hide = group.hidden; + timelineContentPane.layoutOptions(groupHeaderPane).hide = group.hidden; - timelineContentPane.layoutOptions( groupContentPanes[groupGuid] ).hide = group.hidden; - timelineContentPane.layoutOptions( groupHeaderPanes[groupGuid] ).hide = group.hidden; - drawable.redraw( ); - } - }; - groupAttrsChangedListeners[ groupGuid ] = groupAttrsChangedListener; - group.attrsChanged.on( groupAttrsChangedListener ); - }; + setupRowContainerPane(args, groupContentPane, group.rowGuids, false, group.groupGuid); - var unattachGroupAttrsChangedListener = function( groupGuid : string, groupIndex : number ) { - var group = model.group( groupGuid ); - group.attrsChanged.off( groupAttrsChangedListeners[ groupGuid ] ); - } - - root.groupGuids.forEach( attachGroupAttrsChangedListener ); - root.groupGuids.valueAdded.on( attachGroupAttrsChangedListener ); - root.groupGuids.valueRemoved.on( unattachGroupAttrsChangedListener ); - - // Dispose - // + groupContentPane.dispose.on(function () { + group.attrsChanged.off(redrawLabel); + group.attrsChanged.off(groupAttrsChanged); + }); - timelineContentPane.dispose.on( function( ) { - root.groupGuids.valueAdded.off( addGroup ); - root.groupGuids.valueMoved.off( moveGroup ); - root.groupGuids.valueRemoved.off( removeGroup ); - } ); + }; + root.groupGuids.forEach(addGroup); + root.groupGuids.valueAdded.on(addGroup); - return timelineContentPane; - } + let moveGroup = function (groupGuid: string, groupOldIndex: number, groupNewIndex: number) { + let nMin = Math.min(groupOldIndex, groupNewIndex); + let nMax = Math.max(groupOldIndex, groupNewIndex); + for (let n = nMin; n <= nMax; n++) { + let groupGuid = root.groupGuids.valueAt(n); + timelineContentPane.setLayoutArg(groupHeaderPanes[groupGuid], 2 * n); + timelineContentPane.setLayoutArg(groupContentPanes[groupGuid], 2 * n + 1); + } - // Row panes and painters + drawable.redraw(); + }; + root.groupGuids.valueMoved.on(moveGroup); + + let removeGroup = function (groupGuid: string, groupIndex: number) { + let contentPane: Pane = groupContentPanes[groupGuid]; + let headerPane: Pane = groupHeaderPanes[groupGuid]; + contentPane.dispose.fire(); + headerPane.dispose.fire(); + timelineContentPane.removePane(contentPane); + timelineContentPane.removePane(headerPane); + timelineContentPane.updateLayoutArgs(function (layoutArg: any): any { + let shift = (isNumber(layoutArg) && layoutArg > 2 * groupIndex + 1); + return (shift ? layoutArg - 2 : layoutArg); + }); + delete groupHeaderPanes[groupGuid]; + delete groupContentPanes[groupGuid]; + + drawable.redraw(); + }; + root.groupGuids.valueRemoved.on(removeGroup); + + // Handle listing for hidden property // - function newRowBackgroundPainter( args : TimelineContentPaneArguments, guidList : OrderedStringSet, row : TimelineRowModel ) { - return function( gl : WebGLRenderingContext ) { - var color = hasval( row.bgColor ) ? row.bgColor : ( guidList.indexOf( row.rowGuid ) % 2 ? args.options.rowBgColor : args.options.rowAltBgColor ); - gl.clearColor( color.r, color.g, color.b, color.a ); - gl.clear( GL.COLOR_BUFFER_BIT ); - }; - } + let groupAttrsChangedListeners = {}; - function newRowBackgroundPanes( args : TimelineContentPaneArguments, guidList : OrderedStringSet, row : TimelineRowModel ) { - var rowBackgroundPane = newTimeAxisPane( args, row ); - rowBackgroundPane.addPainter( newRowBackgroundPainter( args, guidList, row ) ); + let attachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) { + let group = model.group(groupGuid); + let groupAttrsChangedListener = function () { + if (hasval(group.hidden) && hasval(groupContentPanes[groupGuid])) { - var timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; - rowBackgroundPane.addPainter( newTimeGridPainter( args.timeAxis, false, args.options.gridTimeZone, timeGridOpts ) ); - - var rowInsetTop = args.options.rowSeparatorHeight/2; - var rowInsetBottom = args.options.rowSeparatorHeight - rowInsetTop; - var rowInsetPane = new Pane( newInsetLayout( newInsets( rowInsetTop, 0, rowInsetBottom, 0 ) ), false ); - rowInsetPane.addPainter( newBorderPainter( args.options.bgColor, { thickness: rowInsetTop, drawRight: false, drawLeft: false, drawBottom: false } ) ); - rowInsetPane.addPainter( newBorderPainter( args.options.bgColor, { thickness: rowInsetBottom, drawRight: false, drawLeft: false, drawTop: false } ) ); - rowBackgroundPane.addPane( rowInsetPane, true ); - - var rowOverlayPane = new Pane( null, false ); - rowOverlayPane.addPainter( newBorderPainter( args.options.rowLabelColor, { drawRight: false, drawTop: false, drawBottom: false } ) ); - rowBackgroundPane.addPane( rowOverlayPane, false ); + timelineContentPane.layoutOptions(groupContentPanes[groupGuid]).hide = group.hidden; + timelineContentPane.layoutOptions(groupHeaderPanes[groupGuid]).hide = group.hidden; + drawable.redraw(); + } + }; + groupAttrsChangedListeners[groupGuid] = groupAttrsChangedListener; + group.attrsChanged.on(groupAttrsChangedListener); + }; - return { rowInsetPane : rowInsetPane, rowBackgroundPane : rowBackgroundPane }; + let unattachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) { + let group = model.group(groupGuid); + group.attrsChanged.off(groupAttrsChangedListeners[groupGuid]); } - function setupRowContainerPane( args : TimelineContentPaneArguments, parentPane : Pane, guidList : OrderedStringSet, isMaximized : boolean, keyPrefix : string ) { - - var drawable = args.drawable; - var scrollLayout = args.scrollLayout; - var timeAxis = args.timeAxis; - var model = args.model; - var ui = args.ui; - var options = args.options; - - var rowPanes : StringMap = {}; - - var addRow = function( rowGuid : string, rowIndex : number ) { - var row = model.row( rowGuid ); - var rowUi = ui.rowUi( rowGuid ); - - var rowLabelColorBg : Color = hasval( row.bgLabelColor ) ? row.bgLabelColor : options.rowLabelBgColor; - var rowLabelColorFg : Color = hasval( row.fgLabelColor ) ? row.fgLabelColor : options.rowLabelColor; - var rowLabelFont : string = hasval( row.labelFont ) ? row.labelFont : options.font; - - var rowLabel = new Label( row.label, rowLabelFont, rowLabelColorFg ); - var rowLabelPane = new Pane( { updatePrefSize: fitToLabel( rowLabel ) }, false ); - rowLabelPane.addPainter( newLabelPainter( rowLabel, 0, 0.5, 0, 0.5 ) ); + root.groupGuids.forEach(attachGroupAttrsChangedListener); + root.groupGuids.valueAdded.on(attachGroupAttrsChangedListener); + root.groupGuids.valueRemoved.on(unattachGroupAttrsChangedListener); - var rowLabelBackground = new Background( rowLabelColorBg ); - var rowHeaderPane = new Pane( newInsetLayout( options.rowLabelInsets ), true ); - rowHeaderPane.addPainter( rowLabelBackground.newPainter( ) ); - rowHeaderPane.addPane( rowLabelPane ); + // Dispose + // - var rowAttrsChanged = function( ) { - rowLabel.text = row.label; - rowLabel.fgColor = hasval( row.fgLabelColor ) ? row.fgLabelColor : options.rowLabelColor; - rowLabel.font = hasval( row.labelFont ) ? row.labelFont : options.font; - rowLabelBackground.color = hasval( row.bgLabelColor ) ? row.bgLabelColor : options.bgColor; - drawable.redraw( ); + timelineContentPane.dispose.on(function () { + root.groupGuids.valueAdded.off(addGroup); + root.groupGuids.valueMoved.off(moveGroup); + root.groupGuids.valueRemoved.off(removeGroup); + }); + + return timelineContentPane; +} + +// Row panes and painters +// + +function newRowBackgroundPainter(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) { + return function (gl: WebGLRenderingContext) { + let color = hasval(row.bgColor) ? row.bgColor : (guidList.indexOf(row.rowGuid) % 2 ? args.options.rowBgColor : args.options.rowAltBgColor); + gl.clearColor(color.r, color.g, color.b, color.a); + gl.clear(GL.COLOR_BUFFER_BIT); + }; +} + +function newRowBackgroundPanes(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) { + let rowBackgroundPane = newTimeAxisPane(args, row); + rowBackgroundPane.addPainter(newRowBackgroundPainter(args, guidList, row)); + + let timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; + rowBackgroundPane.addPainter(newTimeGridPainter(args.timeAxis, false, args.options.gridTimeZone, timeGridOpts)); + + let rowInsetTop = args.options.rowSeparatorHeight / 2; + let rowInsetBottom = args.options.rowSeparatorHeight - rowInsetTop; + let rowInsetPane = new Pane(newInsetLayout(newInsets(rowInsetTop, 0, rowInsetBottom, 0)), false); + rowInsetPane.addPainter(newBorderPainter(args.options.bgColor, { thickness: rowInsetTop, drawRight: false, drawLeft: false, drawBottom: false })); + rowInsetPane.addPainter(newBorderPainter(args.options.bgColor, { thickness: rowInsetBottom, drawRight: false, drawLeft: false, drawTop: false })); + rowBackgroundPane.addPane(rowInsetPane, true); + + let rowOverlayPane = new Pane(null, false); + rowOverlayPane.addPainter(newBorderPainter(args.options.rowLabelColor, { drawRight: false, drawTop: false, drawBottom: false })); + rowBackgroundPane.addPane(rowOverlayPane, false); + + return { rowInsetPane: rowInsetPane, rowBackgroundPane: rowBackgroundPane }; +} + +function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: Pane, guidList: OrderedStringSet, isMaximized: boolean, keyPrefix: string) { + + let drawable = args.drawable; + let scrollLayout = args.scrollLayout; + let timeAxis = args.timeAxis; + let model = args.model; + let ui = args.ui; + let options = args.options; + + let rowPanes: StringMap = {}; + + let addRow = function (rowGuid: string, rowIndex: number) { + let row = model.row(rowGuid); + let rowUi = ui.rowUi(rowGuid); + + let rowLabelColorBg: Color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.rowLabelBgColor; + let rowLabelColorFg: Color = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor; + let rowLabelFont: string = hasval(row.labelFont) ? row.labelFont : options.font; + + let rowLabel = new Label(row.label, rowLabelFont, rowLabelColorFg); + let rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false); + rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5)); + + let rowLabelBackground = new Background(rowLabelColorBg); + let rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true); + rowHeaderPane.addPainter(rowLabelBackground.newPainter()); + rowHeaderPane.addPane(rowLabelPane); + + let rowAttrsChanged = function () { + rowLabel.text = row.label; + rowLabel.fgColor = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor; + rowLabel.font = hasval(row.labelFont) ? row.labelFont : options.font; + rowLabelBackground.color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.bgColor; + drawable.redraw(); + } + row.attrsChanged.on(rowAttrsChanged); + + let rowBackgroundPanes = newRowBackgroundPanes(args, guidList, row); + let rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; + let rowInsetPane = rowBackgroundPanes.rowInsetPane; + + let rowPane = new Pane(newColumnLayout()); + rowPane.addPane(rowHeaderPane, 0, { width: options.rowLabelPaneWidth }); + rowPane.addPane(rowBackgroundPane, 1, { width: null }); + + // expose panes in api via TimelineRowUi + rowUi.addPane(keyPrefix + '-background', rowBackgroundPane); + rowUi.addPane(keyPrefix + '-inset', rowInsetPane); + rowUi.addPane(keyPrefix + '-label', rowLabelPane); + rowUi.addPane(keyPrefix + '-header', rowHeaderPane); + + let rowDataAxis = row.dataAxis; + + let rowContentPane: Pane = null; + let rowPaneFactory: TimelineRowPaneFactory = null; + let rowContentOptions = { timelineFont: options.font, timelineFgColor: options.fgColor, draggableEdgeWidth: options.draggableEdgeWidth, snapToDistance: options.snapToDistance, isMaximized: isMaximized, mouseWheelListener: options.mouseWheelListener }; + let refreshRowContentPane = function () { + let newRowPaneFactory = (rowUi.paneFactory || options.rowPaneFactoryChooser(row)); + if (newRowPaneFactory !== rowPaneFactory) { + if (rowContentPane) { + rowContentPane.dispose.fire(); + rowInsetPane.removePane(rowContentPane); + } + rowPaneFactory = newRowPaneFactory; + rowContentPane = (rowPaneFactory && rowPaneFactory(drawable, timeAxis, rowDataAxis, model, row, ui, rowContentOptions)); + if (rowContentPane) { + rowInsetPane.addPane(rowContentPane); + } + drawable.redraw(); } - row.attrsChanged.on( rowAttrsChanged ); - - var rowBackgroundPanes = newRowBackgroundPanes( args, guidList, row ); - var rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; - var rowInsetPane = rowBackgroundPanes.rowInsetPane; + }; - var rowPane = new Pane( newColumnLayout( ) ); - rowPane.addPane( rowHeaderPane, 0, { width: options.rowLabelPaneWidth } ); - rowPane.addPane( rowBackgroundPane, 1, { width: null } ); + rowUi.paneFactoryChanged.on(refreshRowContentPane); + row.attrsChanged.on(refreshRowContentPane); + row.eventGuids.valueAdded.on(refreshRowContentPane); + row.eventGuids.valueRemoved.on(refreshRowContentPane); + row.timeseriesGuids.valueAdded.on(refreshRowContentPane); + row.timeseriesGuids.valueRemoved.on(refreshRowContentPane); + refreshRowContentPane(); - // expose panes in api via TimelineRowUi - rowUi.addPane( keyPrefix+'-background', rowBackgroundPane ); - rowUi.addPane( keyPrefix+'-inset', rowInsetPane ); - rowUi.addPane( keyPrefix+'-label', rowLabelPane ); - rowUi.addPane( keyPrefix+'-header', rowHeaderPane ); - - var rowDataAxis = row.dataAxis; - - var rowContentPane : Pane = null; - var rowPaneFactory : TimelineRowPaneFactory = null; - var rowContentOptions = { timelineFont: options.font, timelineFgColor: options.fgColor, draggableEdgeWidth: options.draggableEdgeWidth, snapToDistance: options.snapToDistance, isMaximized: isMaximized, mouseWheelListener: options.mouseWheelListener }; - var refreshRowContentPane = function( ) { - var newRowPaneFactory = ( rowUi.paneFactory || options.rowPaneFactoryChooser( row ) ); - if ( newRowPaneFactory !== rowPaneFactory ) { - if ( rowContentPane ) { - rowContentPane.dispose.fire( ); - rowInsetPane.removePane( rowContentPane ); - } - rowPaneFactory = newRowPaneFactory; - rowContentPane = ( rowPaneFactory && rowPaneFactory( drawable, timeAxis, rowDataAxis, model, row, ui, rowContentOptions ) ); - if ( rowContentPane ) { - rowInsetPane.addPane( rowContentPane ); - } - drawable.redraw( ); - } - }; + parentPane.updateLayoutArgs(function (layoutArg: any): any { + let shift = (isNumber(layoutArg) && layoutArg >= rowIndex); + return (shift ? layoutArg + 1 : layoutArg); + }); + parentPane.addPane(rowPane, rowIndex); + rowPanes[rowGuid] = rowPane; - rowUi.paneFactoryChanged.on( refreshRowContentPane ); - row.attrsChanged.on( refreshRowContentPane ); - row.eventGuids.valueAdded.on( refreshRowContentPane ); - row.eventGuids.valueRemoved.on( refreshRowContentPane ); - row.timeseriesGuids.valueAdded.on( refreshRowContentPane ); - row.timeseriesGuids.valueRemoved.on( refreshRowContentPane ); - refreshRowContentPane( ); - - parentPane.updateLayoutArgs( function( layoutArg : any ) : any { - var shift = ( isNumber( layoutArg ) && layoutArg >= rowIndex ); - return ( shift ? layoutArg + 1 : layoutArg ); - } ); - parentPane.addPane( rowPane, rowIndex ); - rowPanes[ rowGuid ] = rowPane; - - - // Handle hidden property - // - parentPane.layoutOptions( rowPane ).hide = row.hidden; - - drawable.redraw( ); - - rowPane.dispose.on( function( ) { - row.attrsChanged.off( rowAttrsChanged ); - rowUi.paneFactoryChanged.off( refreshRowContentPane ); - row.attrsChanged.off( refreshRowContentPane ); - row.eventGuids.valueAdded.off( refreshRowContentPane ); - row.eventGuids.valueRemoved.off( refreshRowContentPane ); - row.timeseriesGuids.valueAdded.off( refreshRowContentPane ); - row.timeseriesGuids.valueRemoved.off( refreshRowContentPane ); - - rowUi.removePane( keyPrefix+'-background' ); - rowUi.removePane( keyPrefix+'-inset' ); - rowUi.removePane( keyPrefix+'-label' ); - rowUi.removePane( keyPrefix+'-header' ); - } ); - }; - guidList.forEach( addRow ); - guidList.valueAdded.on( addRow ); - - var valueMoved = function( rowGuid : string, rowOldIndex : number, rowNewIndex : number ) { - var nMin = Math.min( rowOldIndex, rowNewIndex ); - var nMax = Math.max( rowOldIndex, rowNewIndex ); - for ( var n = nMin; n <= nMax; n++ ) { - var rowGuid = guidList.valueAt( n ); - parentPane.setLayoutArg( rowPanes[ rowGuid ], n ); - } - drawable.redraw( ); - }; - guidList.valueMoved.on( valueMoved ); - - var removeRow = function( rowGuid : string, rowIndex : number ) { - var pane : Pane = rowPanes[ rowGuid ]; - pane.dispose.fire( ); - parentPane.removePane( pane ); - parentPane.updateLayoutArgs( function( layoutArg : any ) : any { - var shift = ( isNumber( layoutArg ) && layoutArg > rowIndex ); - return ( shift ? layoutArg - 1 : layoutArg ); - } ); - delete rowPanes[ rowGuid ]; - - drawable.redraw( ); - }; - guidList.valueRemoved.on( removeRow ); - - // Handle listing for hidden property + // Handle hidden property // + parentPane.layoutOptions(rowPane).hide = row.hidden; + + drawable.redraw(); + + rowPane.dispose.on(function () { + row.attrsChanged.off(rowAttrsChanged); + rowUi.paneFactoryChanged.off(refreshRowContentPane); + row.attrsChanged.off(refreshRowContentPane); + row.eventGuids.valueAdded.off(refreshRowContentPane); + row.eventGuids.valueRemoved.off(refreshRowContentPane); + row.timeseriesGuids.valueAdded.off(refreshRowContentPane); + row.timeseriesGuids.valueRemoved.off(refreshRowContentPane); + + rowUi.removePane(keyPrefix + '-background'); + rowUi.removePane(keyPrefix + '-inset'); + rowUi.removePane(keyPrefix + '-label'); + rowUi.removePane(keyPrefix + '-header'); + }); + }; + guidList.forEach(addRow); + guidList.valueAdded.on(addRow); + + let valueMoved = function (rowGuid: string, rowOldIndex: number, rowNewIndex: number) { + let nMin = Math.min(rowOldIndex, rowNewIndex); + let nMax = Math.max(rowOldIndex, rowNewIndex); + for (let n = nMin; n <= nMax; n++) { + let rowGuid = guidList.valueAt(n); + parentPane.setLayoutArg(rowPanes[rowGuid], n); + } - var attrsChangedListeners = {}; + drawable.redraw(); + }; + guidList.valueMoved.on(valueMoved); + + let removeRow = function (rowGuid: string, rowIndex: number) { + let pane: Pane = rowPanes[rowGuid]; + pane.dispose.fire(); + parentPane.removePane(pane); + parentPane.updateLayoutArgs(function (layoutArg: any): any { + let shift = (isNumber(layoutArg) && layoutArg > rowIndex); + return (shift ? layoutArg - 1 : layoutArg); + }); + delete rowPanes[rowGuid]; + + drawable.redraw(); + }; + guidList.valueRemoved.on(removeRow); + + // Handle listing for hidden property + // - var attachAttrsChangedListener = function( rowGuid : string, rowIndex : number ) { - var row = model.row( rowGuid ); - var attrsChangedListener = function( ) { - if ( hasval( row.hidden && hasval( rowPanes[rowGuid] ) ) ) { - parentPane.layoutOptions( rowPanes[rowGuid] ).hide = row.hidden; - drawable.redraw( ); - } - }; - attrsChangedListeners[ rowGuid ] = attrsChangedListener; - row.attrsChanged.on( attrsChangedListener ); + let attrsChangedListeners = {}; + + let attachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { + let row = model.row(rowGuid); + let attrsChangedListener = function () { + if (hasval(row.hidden && hasval(rowPanes[rowGuid]))) { + parentPane.layoutOptions(rowPanes[rowGuid]).hide = row.hidden; + drawable.redraw(); + } }; + attrsChangedListeners[rowGuid] = attrsChangedListener; + row.attrsChanged.on(attrsChangedListener); + }; - var unattachAttrsChangedListener = function( rowGuid : string, rowIndex : number ) { - var row = model.row( rowGuid ); - row.attrsChanged.off( attrsChangedListeners[ rowGuid ] ); - } + let unattachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { + let row = model.row(rowGuid); + row.attrsChanged.off(attrsChangedListeners[rowGuid]); + } - guidList.forEach( attachAttrsChangedListener ); - guidList.valueAdded.on( attachAttrsChangedListener ); - guidList.valueRemoved.on( unattachAttrsChangedListener ); + guidList.forEach(attachAttrsChangedListener); + guidList.valueAdded.on(attachAttrsChangedListener); + guidList.valueRemoved.on(unattachAttrsChangedListener); - // Redraw - // + // Redraw + // - drawable.redraw( ); + drawable.redraw(); - // Dispose + // Dispose - parentPane.dispose.on( function( ) { - guidList.valueAdded.off( addRow ); - guidList.valueMoved.off( valueMoved ); - guidList.valueRemoved.off( removeRow ); + parentPane.dispose.on(function () { + guidList.valueAdded.off(addRow); + guidList.valueMoved.off(valueMoved); + guidList.valueRemoved.off(removeRow); - guidList.valueAdded.off( attachAttrsChangedListener ); - guidList.valueRemoved.off( unattachAttrsChangedListener ); - } ); - } + guidList.valueAdded.off(attachAttrsChangedListener); + guidList.valueRemoved.off(unattachAttrsChangedListener); + }); +} diff --git a/src/webglimpse/timeline/timeline_row.ts b/src/webglimpse/timeline/timeline_row.ts index deb8033..fca187e 100644 --- a/src/webglimpse/timeline/timeline_row.ts +++ b/src/webglimpse/timeline/timeline_row.ts @@ -27,27 +27,32 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Color } from '../color'; +import { PointerEvent, Drawable, Pane } from '../core'; +import { TimeAxis1D } from './time_axis'; +import { Axis1D } from '../plot/axis'; +import { TimelineModel, TimelineRowModel } from './timeline_model'; +import { TimelineUi } from './timeline_ui'; +export interface TimelineRowPaneOptions { + timelineFont: string; + timelineFgColor: Color; + draggableEdgeWidth: number; + snapToDistance: number; + isMaximized: boolean; + mouseWheelListener?: (PointerEvent: PointerEvent) => void; +} - export interface TimelineRowPaneOptions { - timelineFont : string; - timelineFgColor : Color; - draggableEdgeWidth : number; - snapToDistance : number; - isMaximized : boolean; - mouseWheelListener? : ( PointerEvent ) => void; - } +export interface TimelineRowPaneFactory { + (drawable: Drawable, + timeAxis: TimeAxis1D, + dataAxis: Axis1D, + model: TimelineModel, + row: TimelineRowModel, + ui: TimelineUi, + options: TimelineRowPaneOptions): Pane; +} - export interface TimelineRowPaneFactory { - ( drawable : Drawable, - timeAxis : TimeAxis1D, - dataAxis : Axis1D, - model : TimelineModel, - row : TimelineRowModel, - ui : TimelineUi, - options : TimelineRowPaneOptions ) : Pane; - } - - export interface TimelineRowPaneFactoryChooser { - ( row : TimelineRowModel ) : TimelineRowPaneFactory; - } +export interface TimelineRowPaneFactoryChooser { + (row: TimelineRowModel): TimelineRowPaneFactory; +} diff --git a/src/webglimpse/timeline/timeline_styles.ts b/src/webglimpse/timeline/timeline_styles.ts index 56353ce..aa1167d 100644 --- a/src/webglimpse/timeline/timeline_styles.ts +++ b/src/webglimpse/timeline/timeline_styles.ts @@ -27,86 +27,133 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { newTimeseriesPainterFactory, newTimeseriesRowPaneFactory, TimelineTimeseriesPainterFactory } from './timeline_timeseries_row'; +import { newTimeseriesAnnotationPainterFactory } from './timeline_annotation_painter'; +import { newTimeseriesCursorPainterFactory } from './timeline_cursor_painter'; +import { TimelineRowPaneFactory } from './timeline_row'; +import { newEventsRowPaneFactory, newEventLimitsPainterFactory, newEventBarsPainterFactory, newEventIconsPainterFactory, newEventLabelsPainterFactory, newEventStripedBarsPainterFactory, newEventDashedBordersPainterFactory, JointType, newCombinedEventPainterFactory } from './timeline_events_row'; +import { TimelineRowModel } from './timeline_model'; +import { Color } from '../color'; +// Default +// +export let timeseriesRowPainterFactories_DEFAULT: TimelineTimeseriesPainterFactory[] = [ + newTimeseriesPainterFactory(), + newTimeseriesAnnotationPainterFactory(), + newTimeseriesCursorPainterFactory({ + font: '16px verdana,sans-serif', + buffer_px: 6 + }) +]; - // Default - // +export let eventsRowPaneFactory_DEFAULT: TimelineRowPaneFactory = newEventsRowPaneFactory({ + laneHeight: 40, + painterFactories: [ + newEventLimitsPainterFactory(), + newEventBarsPainterFactory(), + newEventIconsPainterFactory(), + newEventLabelsPainterFactory({ + iconsSizeFactor: 0.7 + }) + ] +}); - export var timeseriesRowPainterFactories_DEFAULT = [ - newTimeseriesPainterFactory( ), - newTimeseriesAnnotationPainterFactory( ), - newTimeseriesCursorPainterFactory( { - font: '16px verdana,sans-serif', - buffer_px: 6 - } ) - ]; +export let timeseriesRowPaneFactory_DEFAULT: TimelineRowPaneFactory = newTimeseriesRowPaneFactory({ + painterFactories: timeseriesRowPainterFactories_DEFAULT, + axisOptions: { tickSpacing: 34 } +}); - export var eventsRowPaneFactory_DEFAULT : TimelineRowPaneFactory = newEventsRowPaneFactory( { - laneHeight: 40, - painterFactories: [ - newEventLimitsPainterFactory( ), - newEventBarsPainterFactory( ), - newEventIconsPainterFactory( ), - newEventLabelsPainterFactory( { - iconsSizeFactor: 0.7 - } ) - ] - } ); +export function rowPaneFactoryChooser_DEFAULT(row: TimelineRowModel): TimelineRowPaneFactory { + if (!row.eventGuids.isEmpty) { + return eventsRowPaneFactory_DEFAULT; + } + else if (!row.timeseriesGuids.isEmpty) { + return timeseriesRowPaneFactory_DEFAULT; + } + else { + return null; + } +} - export var timeseriesRowPaneFactory_DEFAULT : TimelineRowPaneFactory = newTimeseriesRowPaneFactory( { - painterFactories: timeseriesRowPainterFactories_DEFAULT, - axisOptions: { tickSpacing: 34 } - } ); - export function rowPaneFactoryChooser_DEFAULT( row : TimelineRowModel ) : TimelineRowPaneFactory { - if ( !row.eventGuids.isEmpty ) { - return eventsRowPaneFactory_DEFAULT; - } - else if ( !row.timeseriesGuids.isEmpty ) { - return timeseriesRowPaneFactory_DEFAULT; - } - else { - return null; - } - } +// Thin +// +export let eventsRowPaneFactory_THIN: TimelineRowPaneFactory = newEventsRowPaneFactory({ + rowTopPadding: 0, + rowBottomPadding: 0, + laneHeight: 23, + allowMultipleLanes: true, + painterFactories: [ + newEventLimitsPainterFactory({ + lineColor: new Color(1, 0, 0, 1), + lineThickness: 2 + }), + newEventStripedBarsPainterFactory({ + bottomMargin: 0, + topMargin: 13, + minimumVisibleWidth: 0, + stripeSlant: -1, + stripeSecondaryWidth: 10, + stripeWidth: 10 + }), + newEventDashedBordersPainterFactory({ + bottomMargin: 0, + topMargin: 13, + minimumVisibleWidth: 0, + cornerType: JointType.MITER, + dashLength: 5 + }), + newEventIconsPainterFactory({ + bottomMargin: 0, + topMargin: 13, + vAlign: 0.0 + }), + newEventLabelsPainterFactory({ + bottomMargin: 12, + topMargin: 0, + leftMargin: 2, + rightMargin: 2, + vAlign: 0.0, + spacing: 2, + extendBeyondBar: false, + textMode: 'truncate' + }) + ] +}); - // Thin - // +export function rowPaneFactoryChooser_THIN(row: TimelineRowModel): TimelineRowPaneFactory { + if (!row.eventGuids.isEmpty) { + return eventsRowPaneFactory_THIN; + } + else if (!row.timeseriesGuids.isEmpty) { + return timeseriesRowPaneFactory_DEFAULT; + } + else { + return null; + } +} - export var eventsRowPaneFactory_THIN : TimelineRowPaneFactory = newEventsRowPaneFactory( { - rowTopPadding: 0, - rowBottomPadding: 0, - laneHeight: 23, - allowMultipleLanes: true, - painterFactories: [ - newEventLimitsPainterFactory( { - lineColor: new Color( 1, 0, 0, 1 ), - lineThickness: 2 - } ), - newEventStripedBarsPainterFactory( { - bottomMargin: 0, - topMargin: 13, - minimumVisibleWidth: 0, - stripeSlant: -1, - stripeSecondaryWidth: 10, - stripeWidth: 10 - } ), - newEventDashedBordersPainterFactory( { +export let eventsRowPaneFactory_SINGLE: TimelineRowPaneFactory = newEventsRowPaneFactory({ + rowTopPadding: 0, + rowBottomPadding: 0, + laneHeight: 23, + allowMultipleLanes: false, + painterFactories: [ + newEventLimitsPainterFactory({ + lineColor: new Color(1, 0, 0, 1), + lineThickness: 2 + }), + newCombinedEventPainterFactory( + { bottomMargin: 0, topMargin: 13, minimumVisibleWidth: 0, - cornerType: JointType.MITER, - dashLength: 5 - } ), - newEventIconsPainterFactory( { - bottomMargin: 0, - topMargin: 13, - vAlign: 0.0 - } ), - newEventLabelsPainterFactory( { + cornerType: JointType.MITER + }, + { bottomMargin: 12, topMargin: 0, leftMargin: 2, @@ -114,68 +161,26 @@ vAlign: 0.0, spacing: 2, extendBeyondBar: false, - textMode: 'truncate' - } ) - ] - } ); + textMode: 'show' + }, + { + bottomMargin: 0, + topMargin: 13, + vAlign: 0.0 + } + ) + ] +}); - export function rowPaneFactoryChooser_THIN( row : TimelineRowModel ) : TimelineRowPaneFactory { - if ( !row.eventGuids.isEmpty ) { - return eventsRowPaneFactory_THIN; - } - else if ( !row.timeseriesGuids.isEmpty ) { - return timeseriesRowPaneFactory_DEFAULT; - } - else { - return null; - } +export function rowPaneFactoryChooser_SINGLE(row: TimelineRowModel): TimelineRowPaneFactory { + if (!row.eventGuids.isEmpty) { + return eventsRowPaneFactory_SINGLE; } - - export var eventsRowPaneFactory_SINGLE : TimelineRowPaneFactory = newEventsRowPaneFactory( { - rowTopPadding: 0, - rowBottomPadding: 0, - laneHeight: 23, - allowMultipleLanes: false, - painterFactories: [ - newEventLimitsPainterFactory( { - lineColor: new Color( 1, 0, 0, 1 ), - lineThickness: 2 - } ), - newCombinedEventPainterFactory( - { - bottomMargin: 0, - topMargin: 13, - minimumVisibleWidth: 0, - cornerType: JointType.MITER - }, - { - bottomMargin: 12, - topMargin: 0, - leftMargin: 2, - rightMargin: 2, - vAlign: 0.0, - spacing: 2, - extendBeyondBar: false, - textMode: 'show' - }, - { - bottomMargin: 0, - topMargin: 13, - vAlign: 0.0 - } - ) - ] - } ); - - export function rowPaneFactoryChooser_SINGLE( row : TimelineRowModel ) : TimelineRowPaneFactory { - if ( !row.eventGuids.isEmpty ) { - return eventsRowPaneFactory_SINGLE; - } - else if ( !row.timeseriesGuids.isEmpty ) { - return timeseriesRowPaneFactory_DEFAULT; - } - else { - return null; - } + else if (!row.timeseriesGuids.isEmpty) { + return timeseriesRowPaneFactory_DEFAULT; + } + else { + return null; } +} diff --git a/src/webglimpse/timeline/timeline_timeseries_row.ts b/src/webglimpse/timeline/timeline_timeseries_row.ts index 7d83ef9..e5f5d8b 100644 --- a/src/webglimpse/timeline/timeline_timeseries_row.ts +++ b/src/webglimpse/timeline/timeline_timeseries_row.ts @@ -27,740 +27,757 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Color, white, darker } from '../color'; +import { Drawable, Painter, Pane, Mask2D, PointerEvent, yFrac, isLeftMouseDown, Layout } from '../core'; +import { TimeAxis1D } from './time_axis'; +import { Axis1D, attachAxisMouseListeners1D, Axis2D } from '../plot/axis'; +import { TimelineModel, TimelineRowModel, TimelineAnnotationModel, TimelineTimeseriesFragmentModel, TimelineTimeseriesModel } from './timeline_model'; +import { TimelineUi, TimelineSelectionModel } from './timeline_ui'; +import { EdgeAxisPainterOptions, newEdgeAxisPainter } from '../plot/edge_axis_painter'; +import { TimelineRowPaneFactory, TimelineRowPaneOptions } from './timeline_row'; +import { fixedSize, Side, solid_FRAGSHADER, dash_FRAGSHADER, putQuadXys } from '../misc'; +import { BoundsUnmodifiable } from '../bounds'; +import { newColumnLayout } from '../layout/column_layout'; +import { newOverlayLayout } from '../layout/overlay_layout'; +import { TimelineAnnotationStyleUi } from './timeline_annotation_style'; +import { indexAtOrBefore, indexNearest } from '../util/sorted_arrays'; +import { concatLines, GL, ensureCapacityFloat32, hasval } from '../util/util'; +import { Program, UniformColor, UniformMatrix4f, Attribute, Uniform1f } from '../shader'; +import { newDynamicBuffer } from '../buffer'; +import { glOrthoAxis } from '../matrix'; + +export interface TimelineTimeseriesPainterOptions { + timelineFont: string; + timelineFgColor: Color; + timelineThickness: number; + rowTopPadding: number; + rowBottomPadding: number; +} + +export interface TimelineTimeseriesPainterFactory { + (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi, options: TimelineTimeseriesPainterOptions): Painter; +} + +export interface TimelineTimeseriesRowPaneOptions { + rowHeight?: number; + rowTopPadding?: number; + rowBottomPadding?: number; + axisOptions?: EdgeAxisPainterOptions; + axisWidth?: number + painterFactories?: TimelineTimeseriesPainterFactory[]; +} + +export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPaneOptions): TimelineRowPaneFactory { + return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane { + + let rowTopPadding = (hasval(rowOptions) && hasval(rowOptions.rowTopPadding) ? rowOptions.rowTopPadding : 6); + let rowBottomPadding = (hasval(rowOptions) && hasval(rowOptions.rowBottomPadding) ? rowOptions.rowBottomPadding : 6); + let axisWidth = (hasval(rowOptions) && hasval(rowOptions.axisWidth) ? rowOptions.axisWidth : 60); + let painterFactories = (hasval(rowOptions) && hasval(rowOptions.painterFactories) ? rowOptions.painterFactories : []); + let axisOptions = (hasval(rowOptions) && hasval(rowOptions.axisOptions) ? rowOptions.axisOptions : {}); + + let keyPrefix = options.isMaximized ? 'maximized-' : ''; + + let getRowHeight = function () { + // maximized rows do not specifiy a height (they should fill available space) + if (options.isMaximized) { + return null; + } + // if the row has a custom row specified, use it + else if (hasval(row.rowHeight)) { + return row.rowHeight; + } + // otherwise use the default for this RowPaneFactory + else if (hasval(rowOptions) && hasval(rowOptions.rowHeight)) { + return rowOptions.rowHeight; + } + // as a last resort use a hard coded default + else { + return 135; + } + } + let rowHeight: number = getRowHeight(); + + let timelineFont = options.timelineFont; + let timelineFgColor = options.timelineFgColor; + let draggableEdgeWidth = options.draggableEdgeWidth; + let snapToDistance = options.snapToDistance; + + let rowUi = ui.rowUi(row.rowGuid); + let input = ui.input; + let selection = ui.selection; + + if (!hasval(axisOptions.font)) axisOptions.font = timelineFont; + if (!hasval(axisOptions.tickColor)) axisOptions.tickColor = timelineFgColor; + if (!hasval(axisOptions.textColor)) axisOptions.textColor = timelineFgColor; + if (!hasval(axisOptions.showLabel)) axisOptions.showLabel = true; + if (!hasval(axisOptions.shortenLabels)) axisOptions.shortenLabels = false; + + let redraw = function () { + drawable.redraw(); + }; + + // setup pane for data (y) axis painter and mouse listener + let yAxisPane = new Pane({ updatePrefSize: fixedSize(axisWidth, rowHeight) }); + dataAxis.limitsChanged.on(redraw); + attachAxisMouseListeners1D(yAxisPane, dataAxis, true); + + // add listener to update the height of the row if the rowHeight attribute changes + let updateRowHeight = function () { + yAxisPane.layout = { updatePrefSize: fixedSize(axisWidth, getRowHeight()) }; + }; + row.attrsChanged.on(updateRowHeight); + + let isDragMode: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { + let fragment = getNearestFragment(viewport, i, j).fragment; + return hasval(fragment); + }; + + let rowContentPane = new Pane(newColumnLayout(), true, isDragMode); + let underlayPane = new Pane(newOverlayLayout(), false); + let overlayPane = new Pane(null, false); + + let painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, timelineThickness: 1, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding }; + for (let n = 0; n < painterFactories.length; n++) { + let createPainter = painterFactories[n]; + rowContentPane.addPainter(createPainter(drawable, timeAxis, dataAxis, model, row, ui, painterOptions)); + } - export interface TimelineTimeseriesPainterOptions { - timelineFont : string; - timelineFgColor : Color; - timelineThickness : number; - rowTopPadding : number; - rowBottomPadding : number; - } - - export interface TimelineTimeseriesPainterFactory { - ( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi, options : TimelineTimeseriesPainterOptions ) : Painter; - } - - export interface TimelineTimeseriesRowPaneOptions { - rowHeight? : number; - rowTopPadding? : number; - rowBottomPadding? : number; - axisOptions? : EdgeAxisPainterOptions; - axisWidth? : number - painterFactories? : TimelineTimeseriesPainterFactory[]; - } + yAxisPane.addPainter(newEdgeAxisPainter(dataAxis, Side.RIGHT, axisOptions)); + rowContentPane.addPane(yAxisPane, 0); + underlayPane.addPane(rowContentPane, true); + underlayPane.addPane(overlayPane, false); - export function newTimeseriesRowPaneFactory( rowOptions? : TimelineTimeseriesRowPaneOptions ) : TimelineRowPaneFactory { - return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, row : TimelineRowModel, ui : TimelineUi, options : TimelineRowPaneOptions ) : Pane { + rowUi.addPane(keyPrefix + 'content', rowContentPane); + rowUi.addPane(keyPrefix + 'overlay', overlayPane); + rowUi.addPane(keyPrefix + 'underlay', underlayPane); + rowUi.addPane(keyPrefix + 'y-axis', yAxisPane); - var rowTopPadding = ( hasval( rowOptions ) && hasval( rowOptions.rowTopPadding ) ? rowOptions.rowTopPadding : 6 ); - var rowBottomPadding = ( hasval( rowOptions ) && hasval( rowOptions.rowBottomPadding ) ? rowOptions.rowBottomPadding : 6 ); - var axisWidth = ( hasval( rowOptions ) && hasval( rowOptions.axisWidth ) ? rowOptions.axisWidth : 60 ); - var painterFactories = ( hasval( rowOptions ) && hasval( rowOptions.painterFactories ) ? rowOptions.painterFactories : [] ); - var axisOptions = ( hasval( rowOptions ) && hasval( rowOptions.axisOptions ) ? rowOptions.axisOptions : {} ); + row.timeseriesGuids.valueAdded.on(redraw); + row.timeseriesGuids.valueMoved.on(redraw); + row.timeseriesGuids.valueRemoved.on(redraw); - var keyPrefix = options.isMaximized ? 'maximized-' : ''; + let addFragmentRedraw = function (fragmentGuid: string) { + let fragment = model.timeseriesFragment(fragmentGuid); + fragment.dataChanged.on(redraw); + } - var getRowHeight = function( ) { - // maximized rows do not specifiy a height (they should fill available space) - if ( options.isMaximized ) { - return null; - } - // if the row has a custom row specified, use it - else if ( hasval( row.rowHeight ) ) { - return row.rowHeight; - } - // otherwise use the default for this RowPaneFactory - else if ( hasval( rowOptions ) && hasval( rowOptions.rowHeight ) ) { - return rowOptions.rowHeight; - } - // as a last resort use a hard coded default - else { - return 135; - } - } + let removeFragmentRedraw = function (fragmentGuid: string) { + let fragment = model.timeseriesFragment(fragmentGuid); + fragment.dataChanged.off(redraw); + } - var rowHeight : number = getRowHeight( ); - - var timelineFont = options.timelineFont; - var timelineFgColor = options.timelineFgColor; - var draggableEdgeWidth = options.draggableEdgeWidth; - var snapToDistance = options.snapToDistance; - - var rowUi = ui.rowUi( row.rowGuid ); - var input = ui.input; - var selection = ui.selection; - - if ( !hasval( axisOptions.font ) ) axisOptions.font = timelineFont; - if ( !hasval( axisOptions.tickColor ) ) axisOptions.tickColor = timelineFgColor; - if ( !hasval( axisOptions.textColor ) ) axisOptions.textColor = timelineFgColor; - if ( !hasval( axisOptions.showLabel ) ) axisOptions.showLabel = true; - if ( !hasval( axisOptions.shortenLabels ) ) axisOptions.shortenLabels = false; - - var redraw = function( ) { - drawable.redraw( ); - }; - - // setup pane for data (y) axis painter and mouse listener - var yAxisPane = new Pane( { updatePrefSize: fixedSize( axisWidth, rowHeight ) } ); - dataAxis.limitsChanged.on( redraw ); - attachAxisMouseListeners1D( yAxisPane, dataAxis, true ); - - // add listener to update the height of the row if the rowHeight attribute changes - var updateRowHeight = function( ) { - yAxisPane.layout = { updatePrefSize: fixedSize( axisWidth, getRowHeight( ) ) }; - }; - row.attrsChanged.on( updateRowHeight ); - - var isDragMode : Mask2D = function( viewport : BoundsUnmodifiable, i : number, j : number ) : boolean { - var fragment = getNearestFragment( viewport, i, j ).fragment; - return hasval( fragment ); - }; - - var rowContentPane = new Pane( newColumnLayout( ), true, isDragMode ); - var underlayPane = new Pane( newOverlayLayout( ), false ); - var overlayPane = new Pane( null, false ); - - var painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, timelineThickness: 1, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding }; - for ( var n = 0; n < painterFactories.length; n++ ) { - var createPainter = painterFactories[ n ]; - rowContentPane.addPainter( createPainter( drawable, timeAxis, dataAxis, model, row, ui, painterOptions ) ); + let addRedraw = function (timeseriesGuid: string) { + let timeseries = model.timeseries(timeseriesGuid); + timeseries.attrsChanged.on(redraw); + timeseries.fragmentGuids.valueAdded.on(redraw); + timeseries.fragmentGuids.valueRemoved.on(redraw); + + timeseries.fragmentGuids.forEach(addFragmentRedraw); + timeseries.fragmentGuids.valueAdded.on(addFragmentRedraw); + timeseries.fragmentGuids.valueRemoved.on(removeFragmentRedraw); + }; + row.timeseriesGuids.forEach(addRedraw); + row.timeseriesGuids.valueAdded.on(addRedraw); + + let removeRedraw = function (timeseriesGuid: string) { + let timeseries = model.timeseries(timeseriesGuid); + timeseries.attrsChanged.off(redraw); + timeseries.fragmentGuids.valueAdded.off(redraw); + timeseries.fragmentGuids.valueRemoved.off(redraw); + timeseries.fragmentGuids.forEach(removeFragmentRedraw); + }; + row.timeseriesGuids.valueRemoved.on(removeRedraw); + + let timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number { + return timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); + }; + + let timeAtPointer_PMILLIS = function (ev: PointerEvent): number { + return timeAtCoords_PMILLIS(ev.paneViewport, ev.i); + }; + + // Used by both sets of listeners to know whether a timeseries-drag is in progress + let timeseriesDragMode: string = null; + + // Hook up input notifications + // + + let recentMouseMove: PointerEvent = null; + + rowContentPane.mouseMove.on(function (ev: PointerEvent) { + input.mouseMove.fire(ev); + if (!hasval(timeseriesDragMode)) { + input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev); + input.rowHover.fire(row, ev); } - - yAxisPane.addPainter( newEdgeAxisPainter( dataAxis, Side.RIGHT, axisOptions ) ); - rowContentPane.addPane( yAxisPane, 0 ); - underlayPane.addPane( rowContentPane, true ); - underlayPane.addPane( overlayPane, false ); - - rowUi.addPane( keyPrefix+'content', rowContentPane ); - rowUi.addPane( keyPrefix+'overlay', overlayPane ); - rowUi.addPane( keyPrefix+'underlay', underlayPane ); - rowUi.addPane( keyPrefix+'y-axis', yAxisPane ); - - row.timeseriesGuids.valueAdded.on( redraw ); - row.timeseriesGuids.valueMoved.on( redraw ); - row.timeseriesGuids.valueRemoved.on( redraw ); - - var addFragmentRedraw = function( fragmentGuid : string ) { - var fragment = model.timeseriesFragment( fragmentGuid ); - fragment.dataChanged.on( redraw ); + recentMouseMove = ev; + }); + + rowContentPane.mouseExit.on(function (ev: PointerEvent) { + input.mouseExit.fire(ev); + if (!hasval(timeseriesDragMode)) { + input.timeHover.fire(null, ev); + input.rowHover.fire(null, ev); + input.eventHover.fire(null, ev); } + recentMouseMove = null; + }); - var removeFragmentRedraw = function( fragmentGuid : string ) { - var fragment = model.timeseriesFragment( fragmentGuid ); - fragment.dataChanged.off( redraw ); + let uiMillisPerPxChanged = function () { + if (!hasval(timeseriesDragMode) && recentMouseMove != null) { + let ev = recentMouseMove; + input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev); } + }; + ui.millisPerPx.changed.on(uiMillisPerPxChanged); - var addRedraw = function( timeseriesGuid : string ) { - var timeseries = model.timeseries( timeseriesGuid ); - timeseries.attrsChanged.on( redraw ); - timeseries.fragmentGuids.valueAdded.on( redraw ); - timeseries.fragmentGuids.valueRemoved.on( redraw ); - - timeseries.fragmentGuids.forEach( addFragmentRedraw ); - timeseries.fragmentGuids.valueAdded.on( addFragmentRedraw ); - timeseries.fragmentGuids.valueRemoved.on( removeFragmentRedraw ); - }; - row.timeseriesGuids.forEach( addRedraw ); - row.timeseriesGuids.valueAdded.on( addRedraw ); - - var removeRedraw = function( timeseriesGuid : string ) { - var timeseries = model.timeseries( timeseriesGuid ); - timeseries.attrsChanged.off( redraw ); - timeseries.fragmentGuids.valueAdded.off( redraw ); - timeseries.fragmentGuids.valueRemoved.off( redraw ); - timeseries.fragmentGuids.forEach( removeFragmentRedraw ); - }; - row.timeseriesGuids.valueRemoved.on( removeRedraw ); - - var timeAtCoords_PMILLIS = function( viewport : BoundsUnmodifiable, i : number ) : number { - return timeAxis.tAtFrac_PMILLIS( viewport.xFrac( i ) ); - }; - - var timeAtPointer_PMILLIS = function( ev : PointerEvent ) : number { - return timeAtCoords_PMILLIS( ev.paneViewport, ev.i ); - }; - - // Used by both sets of listeners to know whether a timeseries-drag is in progress - var timeseriesDragMode : string = null; - - // Hook up input notifications - // - - var recentMouseMove : PointerEvent = null; - - rowContentPane.mouseMove.on( function( ev : PointerEvent ) { - input.mouseMove.fire( ev ); - if ( !hasval( timeseriesDragMode ) ) { - input.timeHover.fire( timeAtPointer_PMILLIS( ev ), ev ); - input.rowHover.fire( row, ev ); - } - recentMouseMove = ev; - } ); - - rowContentPane.mouseExit.on( function( ev : PointerEvent ) { - input.mouseExit.fire( ev ); - if ( !hasval( timeseriesDragMode ) ) { - input.timeHover.fire( null, ev ); - input.rowHover.fire( null, ev ); - input.eventHover.fire( null, ev ); - } - recentMouseMove = null; - } ); - - var uiMillisPerPxChanged = function( ) { - if ( !hasval( timeseriesDragMode ) && recentMouseMove != null ) { - var ev = recentMouseMove; - input.timeHover.fire( timeAtPointer_PMILLIS( ev ), ev ); - } - }; - ui.millisPerPx.changed.on( uiMillisPerPxChanged ); - - rowContentPane.mouseUp.on( function( ev : PointerEvent ) { - input.mouseUp.fire( ev ); - } ); + rowContentPane.mouseUp.on(function (ev: PointerEvent) { + input.mouseUp.fire(ev); + }); - rowContentPane.mouseDown.on( function( ev : PointerEvent ) { - input.mouseDown.fire( ev ); - } ); + rowContentPane.mouseDown.on(function (ev: PointerEvent) { + input.mouseDown.fire(ev); + }); - rowContentPane.mouseWheel.on( options.mouseWheelListener ); + rowContentPane.mouseWheel.on(options.mouseWheelListener); - rowContentPane.contextMenu.on( function( ev : PointerEvent ) { - input.contextMenu.fire( ev ); - } ); + rowContentPane.contextMenu.on(function (ev: PointerEvent) { + input.contextMenu.fire(ev); + }); - // Begin annotation selection - // + // Begin annotation selection + // - var getNearestAnnotation = function( viewport : BoundsUnmodifiable, i : number, j : number ) { - // maximum number of pixels away from a point the mouse can be to select it - var pickBuffer_PIXEL : number = 10; - // value per pixel in x and y directions - var vppx : number = ui.millisPerPx.value; - var vppy : number = dataAxis.vSize / rowContentPane.viewport.h; - var pickBuffer_PMILLIS : number = pickBuffer_PIXEL * vppx; + let getNearestAnnotation = function (viewport: BoundsUnmodifiable, i: number, j: number) { + // maximum number of pixels away from a point the mouse can be to select it + let pickBuffer_PIXEL: number = 10; + // value per pixel in x and y directions + let vppx: number = ui.millisPerPx.value; + let vppy: number = dataAxis.vSize / rowContentPane.viewport.h; + let pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx; - var ev_time : number = timeAtCoords_PMILLIS( viewport, i ); - var ev_value : number = dataAxis.vAtFrac( viewport.yFrac( j ) ); + let ev_time: number = timeAtCoords_PMILLIS(viewport, i); + let ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j)); - var bestAnnotation : TimelineAnnotationModel = null; - var best_PIXEL : number = null; + let bestAnnotation: TimelineAnnotationModel = null; + let best_PIXEL: number = null; - if ( ev_time ) { - for ( var i = 0 ; i < row.annotationGuids.length ; i++ ) { - var annotationGuid : string = row.annotationGuids.valueAt( i ); - var annotation : TimelineAnnotationModel = model.annotation( annotationGuid ); - var styleGuid : string = annotation.styleGuid; - var style : TimelineAnnotationStyleUi = ui.annotationStyle( styleGuid ); + if (ev_time) { + for (let i = 0; i < row.annotationGuids.length; i++) { + let annotationGuid: string = row.annotationGuids.valueAt(i); + let annotation: TimelineAnnotationModel = model.annotation(annotationGuid); + let styleGuid: string = annotation.styleGuid; + let style: TimelineAnnotationStyleUi = ui.annotationStyle(styleGuid); - var dy_PIXEL = Math.abs( annotation.y - ev_value ) / vppy; - var dx_PIXEL = Math.abs( annotation.time_PMILLIS - ev_time ) / vppx; + let dy_PIXEL = Math.abs(annotation.y - ev_value) / vppy; + let dx_PIXEL = Math.abs(annotation.time_PMILLIS - ev_time) / vppx; - if ( style.uiHint == 'point' ) { - var d_PIXEL = Math.sqrt( dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL ); - } - else if ( style.uiHint == 'horizontal-line' ) { - var d_PIXEL = dy_PIXEL; - } - else if ( style.uiHint == 'vertical-line' ) { - var d_PIXEL = dx_PIXEL; - } + let d_PIXEL: number = 0; + if (style.uiHint === 'point') { + let d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL); + } + else if (style.uiHint === 'horizontal-line') { + let d_PIXEL = dy_PIXEL; + } + else if (style.uiHint === 'vertical-line') { + let d_PIXEL = dx_PIXEL; + } - if ( d_PIXEL < pickBuffer_PIXEL ) { - if ( !hasval( best_PIXEL ) || d_PIXEL < best_PIXEL ) { - bestAnnotation = annotation; - best_PIXEL = d_PIXEL; - } + if (d_PIXEL < pickBuffer_PIXEL) { + if (!hasval(best_PIXEL) || d_PIXEL < best_PIXEL) { + bestAnnotation = annotation; + best_PIXEL = d_PIXEL; } } } - - return bestAnnotation; } - var getNearestAnnotationEvent = function( ev : PointerEvent ) { - return getNearestAnnotation( ev.paneViewport, ev.i, ev.j ); - } + return bestAnnotation; + } - overlayPane.mouseMove.on( function( ev : PointerEvent ) { - // update selection.hoveredYValue - var y : number = dataAxis.vAtFrac( yFrac( ev ) ); - selection.hoveredY.value = y; + let getNearestAnnotationEvent = function (ev: PointerEvent) { + return getNearestAnnotation(ev.paneViewport, ev.i, ev.j); + } - // update selection.hoveredAnnotation - var result = getNearestAnnotationEvent( ev ); - selection.hoveredAnnotation.value = result; - } ); - selection.hoveredAnnotation.changed.on( redraw ); + overlayPane.mouseMove.on(function (ev: PointerEvent) { + // update selection.hoveredYValue + let y: number = dataAxis.vAtFrac(yFrac(ev)); + selection.hoveredY.value = y; - overlayPane.mouseExit.on( function( ) { - selection.hoveredY.value = undefined; - selection.hoveredAnnotation.value = null; - } ); + // update selection.hoveredAnnotation + let result = getNearestAnnotationEvent(ev); + selection.hoveredAnnotation.value = result; + }); + selection.hoveredAnnotation.changed.on(redraw); - // Begin timeseries-drag - // + overlayPane.mouseExit.on(function () { + selection.hoveredY.value = undefined; + selection.hoveredAnnotation.value = null; + }); - function chooseTimeseriesDragMode( ui : TimelineUi, hoveredTimeseriesFragment : TimelineTimeseriesFragmentModel ) : string { - if ( !hasval( hoveredTimeseriesFragment ) ) { - return null; - } - // return the edit mode of the selected fragment - else { - return hoveredTimeseriesFragment.userEditMode; - } + // Begin timeseries-drag + // + + function chooseTimeseriesDragMode(ui: TimelineUi, hoveredTimeseriesFragment: TimelineTimeseriesFragmentModel): string { + if (!hasval(hoveredTimeseriesFragment)) { + return null; } + // return the edit mode of the selected fragment + else { + return hoveredTimeseriesFragment.userEditMode; + } + } - var updateCursor = function( ) { - if ( !timeseriesDragMode ) { - var mouseCursors = { 'xy': 'move', 'y': 'ns-resize' }; - rowContentPane.mouseCursor = mouseCursors[ chooseTimeseriesDragMode( ui, selection.hoveredTimeseries.fragment ) ]; - } - }; - ui.millisPerPx.changed.on( updateCursor ); - selection.hoveredTimeseries.changed.on( updateCursor ); - - var getNearestFragment = function( viewport : BoundsUnmodifiable, i : number, j : number ) { - // maximum number of pixels away from a point the mouse can be to select it - var pickBuffer_PIXEL : number = 10; - // value per pixel in x and y directions - var vppx : number = ui.millisPerPx.value; - var vppy : number = dataAxis.vSize / rowContentPane.viewport.h; - var pickBuffer_PMILLIS : number = pickBuffer_PIXEL * vppx; - - var bestFragment : TimelineTimeseriesFragmentModel; - var bestIndex : number; - var best_PIXEL : number; - - var ev_time : number = timeAtCoords_PMILLIS( viewport, i ); - var ev_value : number = dataAxis.vAtFrac( viewport.yFrac( j ) ); - - if ( ev_time ) { - for ( var i = 0 ; i < row.timeseriesGuids.length ; i++ ) { - var timeseriesGuid : string = row.timeseriesGuids.valueAt( i ); - var timeseries : TimelineTimeseriesModel = model.timeseries( timeseriesGuid ); - - for ( var j = 0 ; j < timeseries.fragmentGuids.length ; j++ ) { - var fragmentGuid : string = timeseries.fragmentGuids.valueAt( j ); - var fragment : TimelineTimeseriesFragmentModel = model.timeseriesFragment( fragmentGuid ); - - // fragments should not overlap - if ( fragment.start_PMILLIS - pickBuffer_PMILLIS < ev_time && fragment.end_PMILLIS + pickBuffer_PMILLIS > ev_time ) { - // bars are drawn starting at the point and continuing to the next point, so we need to choose the closest index differently - var index : number = timeseries.uiHint == 'bars' ? indexAtOrBefore( fragment.times_PMILLIS, ev_time ) : indexNearest( fragment.times_PMILLIS, ev_time ); - var value = fragment.data[index]; - var time = fragment.times_PMILLIS[index]; - - var dy_PIXEL = ( value - ev_value ) / vppy; - var dx_PIXEL = ( time - ev_time ) / vppx; - var d_PIXEL = Math.sqrt( dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL ); - - var filter = function( ) : boolean { - if ( timeseries.uiHint == 'bars' ) { - return ( timeseries.baseline < ev_value && ev_value < value ) || - ( timeseries.baseline > ev_value && ev_value > value ); - } - else { - return d_PIXEL < pickBuffer_PIXEL; - } + let updateCursor = function () { + if (!timeseriesDragMode) { + let mouseCursors = { 'xy': 'move', 'y': 'ns-resize' }; + rowContentPane.mouseCursor = mouseCursors[chooseTimeseriesDragMode(ui, selection.hoveredTimeseries.fragment)]; + } + }; + ui.millisPerPx.changed.on(updateCursor); + selection.hoveredTimeseries.changed.on(updateCursor); + + let getNearestFragment = function (viewport: BoundsUnmodifiable, i: number, j: number) { + // maximum number of pixels away from a point the mouse can be to select it + let pickBuffer_PIXEL: number = 10; + // value per pixel in x and y directions + let vppx: number = ui.millisPerPx.value; + let vppy: number = dataAxis.vSize / rowContentPane.viewport.h; + let pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx; + + let bestFragment: TimelineTimeseriesFragmentModel; + let bestIndex: number; + let best_PIXEL: number; + + let ev_time: number = timeAtCoords_PMILLIS(viewport, i); + let ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j)); + + if (ev_time) { + for (let i = 0; i < row.timeseriesGuids.length; i++) { + let timeseriesGuid: string = row.timeseriesGuids.valueAt(i); + let timeseries: TimelineTimeseriesModel = model.timeseries(timeseriesGuid); + + for (let j = 0; j < timeseries.fragmentGuids.length; j++) { + let fragmentGuid: string = timeseries.fragmentGuids.valueAt(j); + let fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid); + + // fragments should not overlap + if (fragment.start_PMILLIS - pickBuffer_PMILLIS < ev_time && fragment.end_PMILLIS + pickBuffer_PMILLIS > ev_time) { + // bars are drawn starting at the point and continuing to the next point, so we need to choose the closest index differently + let index: number = timeseries.uiHint === 'bars' ? indexAtOrBefore(fragment.times_PMILLIS, ev_time) : indexNearest(fragment.times_PMILLIS, ev_time); + let value = fragment.data[index]; + let time = fragment.times_PMILLIS[index]; + + let dy_PIXEL = (value - ev_value) / vppy; + let dx_PIXEL = (time - ev_time) / vppx; + let d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL); + + let filter = function (): boolean { + if (timeseries.uiHint === 'bars') { + return (timeseries.baseline < ev_value && ev_value < value) || + (timeseries.baseline > ev_value && ev_value > value); } - - if ( ( !best_PIXEL || d_PIXEL < best_PIXEL ) && filter( ) ) - { - best_PIXEL = d_PIXEL; - bestFragment = fragment; - bestIndex = index; + else { + return d_PIXEL < pickBuffer_PIXEL; } } + + if ((!best_PIXEL || d_PIXEL < best_PIXEL) && filter()) { + best_PIXEL = d_PIXEL; + bestFragment = fragment; + bestIndex = index; + } } } } + } - return { fragment: bestFragment, index: bestIndex }; - }; + return { fragment: bestFragment, index: bestIndex }; + }; - var getNearestFragmentEvent = function( ev : PointerEvent ) { - return getNearestFragment( ev.paneViewport, ev.i, ev.j ); - } + let getNearestFragmentEvent = function (ev: PointerEvent) { + return getNearestFragment(ev.paneViewport, ev.i, ev.j); + } - // choose the closest data point to the mouse cursor position and fire an event when it changes - rowContentPane.mouseMove.on( function( ev : PointerEvent ) { - if ( ! hasval( timeseriesDragMode ) ) { - var result = getNearestFragmentEvent( ev ); - selection.hoveredTimeseries.setValue( result.fragment, result.index ); - } - } ); - selection.hoveredTimeseries.changed.on( redraw ); + // choose the closest data point to the mouse cursor position and fire an event when it changes + rowContentPane.mouseMove.on(function (ev: PointerEvent) { + if (!hasval(timeseriesDragMode)) { + let result = getNearestFragmentEvent(ev); + selection.hoveredTimeseries.setValue(result.fragment, result.index); + } + }); + selection.hoveredTimeseries.changed.on(redraw); - rowContentPane.mouseExit.on( function( ) { - selection.hoveredTimeseries.clearValue( ); - } ); + rowContentPane.mouseExit.on(function () { + selection.hoveredTimeseries.clearValue(); + }); - rowContentPane.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) ) { - timeseriesDragMode = chooseTimeseriesDragMode( ui, selection.hoveredTimeseries.fragment ); - } - } ); + rowContentPane.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent)) { + timeseriesDragMode = chooseTimeseriesDragMode(ui, selection.hoveredTimeseries.fragment); + } + }); - rowContentPane.mouseMove.on( function( ev : PointerEvent ) { + rowContentPane.mouseMove.on(function (ev: PointerEvent) { - if ( hasval( timeseriesDragMode ) ) { - var x : number = timeAtPointer_PMILLIS( ev ); - var y : number = dataAxis.vAtFrac( yFrac( ev ) ); + if (hasval(timeseriesDragMode)) { + let x: number = timeAtPointer_PMILLIS(ev); + let y: number = dataAxis.vAtFrac(yFrac(ev)); - var fragment = selection.hoveredTimeseries.fragment; - var fragment_time = fragment.times_PMILLIS; + let fragment = selection.hoveredTimeseries.fragment; + let fragment_time = fragment.times_PMILLIS; - if ( timeseriesDragMode === 'y' ) { - fragment.setData( selection.hoveredTimeseries.index, y ); - } - else if ( timeseriesDragMode === 'xy' ) { - var index = fragment.setData( selection.hoveredTimeseries.index, y, x ); - if ( index !== selection.hoveredTimeseries.index ) { - selection.hoveredTimeseries.setValue( fragment, index ); - } + if (timeseriesDragMode === 'y') { + fragment.setData(selection.hoveredTimeseries.index, y); + } + else if (timeseriesDragMode === 'xy') { + let index = fragment.setData(selection.hoveredTimeseries.index, y, x); + if (index !== selection.hoveredTimeseries.index) { + selection.hoveredTimeseries.setValue(fragment, index); } } - } ); + } + }); - // Finish event-drag - // + // Finish event-drag + // - rowContentPane.mouseUp.on( function( ev : PointerEvent ) { - timeseriesDragMode = null; - } ); + rowContentPane.mouseUp.on(function (ev: PointerEvent) { + timeseriesDragMode = null; + }); - rowContentPane.dispose.on( function( ) { + rowContentPane.dispose.on(function () { - rowUi.removePane( keyPrefix+'content' ); - rowUi.removePane( keyPrefix+'overlay' ); - rowUi.removePane( keyPrefix+'underlay' ); - rowUi.removePane( keyPrefix+'y-axis' ); + rowUi.removePane(keyPrefix + 'content'); + rowUi.removePane(keyPrefix + 'overlay'); + rowUi.removePane(keyPrefix + 'underlay'); + rowUi.removePane(keyPrefix + 'y-axis'); - dataAxis.limitsChanged.off( redraw ); + dataAxis.limitsChanged.off(redraw); - row.timeseriesGuids.valueAdded.off( redraw ); - row.timeseriesGuids.valueMoved.off( redraw ); - row.timeseriesGuids.valueRemoved.off( redraw ); + row.timeseriesGuids.valueAdded.off(redraw); + row.timeseriesGuids.valueMoved.off(redraw); + row.timeseriesGuids.valueRemoved.off(redraw); - row.timeseriesGuids.valueAdded.off( addRedraw ); - row.timeseriesGuids.valueRemoved.off( removeRedraw ); + row.timeseriesGuids.valueAdded.off(addRedraw); + row.timeseriesGuids.valueRemoved.off(removeRedraw); - selection.hoveredTimeseries.changed.off( redraw ); + selection.hoveredTimeseries.changed.off(redraw); - row.attrsChanged.off( updateRowHeight ); + row.attrsChanged.off(updateRowHeight); - row.timeseriesGuids.forEach( function( timeseriesGuid : string ) { - var timeseries = model.timeseries( timeseriesGuid ); - timeseries.attrsChanged.off( redraw ); - timeseries.fragmentGuids.valueAdded.off( redraw ); - timeseries.fragmentGuids.valueRemoved.off( redraw ); - } ); - } ); + row.timeseriesGuids.forEach(function (timeseriesGuid: string) { + let timeseries = model.timeseries(timeseriesGuid); + timeseries.attrsChanged.off(redraw); + timeseries.fragmentGuids.valueAdded.off(redraw); + timeseries.fragmentGuids.valueRemoved.off(redraw); + }); + }); - return underlayPane; - } + return underlayPane; } +} + +export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterOptions): TimelineTimeseriesPainterFactory { + // Painter Factory + return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter { + + let selection: TimelineSelectionModel = ui.selection; + let defaultColor = hasval(options) && hasval(options.timelineFgColor) ? options.timelineFgColor : white; + let defaultThickness = hasval(options) && hasval(options.timelineThickness) ? options.timelineThickness : 1; + + let modelview_line_VERTSHADER = concatLines( + ' uniform mat4 u_modelViewMatrix; ', + ' attribute vec4 a_Position; ', + ' attribute float a_Distance; ', + ' varying float v_Distance; ', + ' uniform float u_PointSize; ', + ' ', + ' void main( ) { ', + ' gl_PointSize = u_PointSize ; ', + ' gl_Position = u_modelViewMatrix * a_Position ; ', + ' v_Distance = a_Distance; ', + ' } ', + ' ' + ); + + let modelview_pointsize_VERTSHADER = concatLines( + ' uniform mat4 u_modelViewMatrix; ', + ' attribute vec4 a_Position; ', + ' uniform float u_PointSize; ', + ' ', + ' void main( ) { ', + ' gl_PointSize = u_PointSize ; ', + ' gl_Position = u_modelViewMatrix * a_Position ; ', + ' } ', + ' ' + ); + + let program = new Program(modelview_pointsize_VERTSHADER, solid_FRAGSHADER); + + let u_Color = new UniformColor(program, 'u_Color'); + let u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); + let a_Position = new Attribute(program, 'a_Position'); + let u_PointSize = new Uniform1f(program, 'u_PointSize'); + + let lineProgram = new Program(modelview_line_VERTSHADER, dash_FRAGSHADER); + let u_lpColor = new UniformColor(lineProgram, 'u_Color'); + let u_lpmodelViewMatrix = new UniformMatrix4f(lineProgram, 'u_modelViewMatrix'); + let a_lpPosition = new Attribute(lineProgram, 'a_Position'); + let u_lpPointSize = new Uniform1f(lineProgram, 'u_PointSize'); + let a_lpDistance = new Attribute(lineProgram, 'a_Distance'); + let u_lpDash = new Uniform1f(lineProgram, 'u_Dash'); + + let axis = new Axis2D(timeAxis, dataAxis); + + let xys = new Float32Array(0); + let dists = new Float32Array(0); + let xysBuffer = newDynamicBuffer(); + let distBuffer = newDynamicBuffer(); + + // Painter + return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { + + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + + let baseline: number = 0; + + for (let i = 0; i < rowModel.timeseriesGuids.length; i++) { + // collect fragments and sort them by time + let totalSize = 0; + let sortedFragments = new Array(); + let timeseriesGuid = rowModel.timeseriesGuids.valueAt(i); + let timeseries = model.timeseries(timeseriesGuid); + for (let j = 0; j < timeseries.fragmentGuids.length; j++) { + let timeseriesFragmentGuid = timeseries.fragmentGuids.valueAt(j); + let fragment = model.timeseriesFragment(timeseriesFragmentGuid); + + sortedFragments.push(fragment); + totalSize += fragment.times_PMILLIS.length; + } + sortedFragments.sort((a, b) => { return a.start_PMILLIS - b.start_PMILLIS; }); - export function newTimeseriesPainterFactory( options? : TimelineTimeseriesPainterOptions ) : TimelineTimeseriesPainterFactory { - // Painter Factory - return function( drawable : Drawable, timeAxis : TimeAxis1D, dataAxis : Axis1D, model : TimelineModel, rowModel : TimelineRowModel, ui : TimelineUi ) : Painter { - - var selection : TimelineSelectionModel = ui.selection; - var defaultColor = hasval( options ) && hasval( options.timelineFgColor ) ? options.timelineFgColor : white; - var defaultThickness = hasval( options ) && hasval( options.timelineThickness ) ? options.timelineThickness : 1; - - var modelview_line_VERTSHADER = concatLines( - ' uniform mat4 u_modelViewMatrix; ', - ' attribute vec4 a_Position; ', - ' attribute float a_Distance; ', - ' varying float v_Distance; ', - ' uniform float u_PointSize; ', - ' ', - ' void main( ) { ', - ' gl_PointSize = u_PointSize ; ', - ' gl_Position = u_modelViewMatrix * a_Position ; ', - ' v_Distance = a_Distance; ', - ' } ', - ' ' - ); - - var modelview_pointsize_VERTSHADER = concatLines( - ' uniform mat4 u_modelViewMatrix; ', - ' attribute vec4 a_Position; ', - ' uniform float u_PointSize; ', - ' ', - ' void main( ) { ', - ' gl_PointSize = u_PointSize ; ', - ' gl_Position = u_modelViewMatrix * a_Position ; ', - ' } ', - ' ' - ); - - var program = new Program( modelview_pointsize_VERTSHADER, solid_FRAGSHADER ); - - var u_Color = new UniformColor( program, 'u_Color' ); - var u_modelViewMatrix = new UniformMatrix4f( program, 'u_modelViewMatrix' ); - var a_Position = new Attribute( program, 'a_Position' ); - var u_PointSize = new Uniform1f( program, 'u_PointSize' ); - - var lineProgram = new Program( modelview_line_VERTSHADER, dash_FRAGSHADER ); - var u_lpColor = new UniformColor( lineProgram, 'u_Color' ); - var u_lpmodelViewMatrix = new UniformMatrix4f( lineProgram, 'u_modelViewMatrix' ); - var a_lpPosition = new Attribute( lineProgram, 'a_Position' ); - var u_lpPointSize = new Uniform1f( lineProgram, 'u_PointSize' ); - var a_lpDistance = new Attribute( lineProgram, 'a_Distance' ); - var u_lpDash = new Uniform1f( lineProgram, 'u_Dash' ); - - var axis = new Axis2D( timeAxis, dataAxis ); - - var xys = new Float32Array( 0 ); - var dists = new Float32Array( 0 ); - var xysBuffer = newDynamicBuffer( ); - var distBuffer = newDynamicBuffer( ); - - // Painter - return function( gl : WebGLRenderingContext, viewport : BoundsUnmodifiable ) { - - gl.blendFuncSeparate( GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA ); - gl.enable( GL.BLEND ); - - for ( var i = 0 ; i < rowModel.timeseriesGuids.length ; i++ ) { - // collect fragments and sort them by time - var totalSize = 0; - var sortedFragments = new Array( ); - var timeseriesGuid = rowModel.timeseriesGuids.valueAt(i); - var timeseries = model.timeseries( timeseriesGuid ); - for ( var j = 0 ; j < timeseries.fragmentGuids.length ; j++ ) { - var timeseriesFragmentGuid = timeseries.fragmentGuids.valueAt(j); - var fragment = model.timeseriesFragment( timeseriesFragmentGuid ); - - sortedFragments.push( fragment ); - totalSize += fragment.times_PMILLIS.length; - } - sortedFragments.sort( ( a,b ) => { return a.start_PMILLIS - b.start_PMILLIS; } ); - - if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { - - // enable the shader - lineProgram.use( gl ); - - u_lpmodelViewMatrix.setData( gl, glOrthoAxis( axis ) ); - var size = totalSize * 2; - - xys = ensureCapacityFloat32( xys, size ); - dists = ensureCapacityFloat32( dists, totalSize ); - - var index = 0; - for ( var j = 0 ; j < sortedFragments.length ; j++ ) { - var fragment = sortedFragments[j]; - var data : number[] = fragment.data; - var times_PMILLIS : number[] = fragment.times_PMILLIS; - - for ( var k = 0 ; k < data.length ; k++,index+=2 ) { - xys[index] = timeAxis.vAtTime( times_PMILLIS[k] ); - xys[index+1] = data[k]; - if(k != 0) { - var x = (timeAxis.vAtTime( times_PMILLIS[k] ) - timeAxis.vAtTime( times_PMILLIS[k - 1] )); - var y = data[k] - data[k - 1]; - dists[k] = dists[k - 1] + Math.sqrt(x * x + y * y); - } - else { - dists[k] = 0; - } + if (timeseries.uiHint === 'lines' || timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) { + + // enable the shader + lineProgram.use(gl); + + u_lpmodelViewMatrix.setData(gl, glOrthoAxis(axis)); + let size = totalSize * 2; + + xys = ensureCapacityFloat32(xys, size); + dists = ensureCapacityFloat32(dists, totalSize); + + let index = 0; + for (let j = 0; j < sortedFragments.length; j++) { + let fragment = sortedFragments[j]; + let data: number[] = fragment.data; + let times_PMILLIS: number[] = fragment.times_PMILLIS; + + for (let k = 0; k < data.length; k++ , index += 2) { + xys[index] = timeAxis.vAtTime(times_PMILLIS[k]); + xys[index + 1] = data[k]; + if (k !== 0) { + let x = (timeAxis.vAtTime(times_PMILLIS[k]) - timeAxis.vAtTime(times_PMILLIS[k - 1])); + let y = data[k] - data[k - 1]; + dists[k] = dists[k - 1] + Math.sqrt(x * x + y * y); + } + else { + dists[k] = 0; } } + } - var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; - u_lpColor.setData( gl, lineColor ); + let lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + u_lpColor.setData(gl, lineColor); - var dash = hasval( timeseries.dash ) ? timeseries.dash : 0; - u_lpDash.setData(gl, dash); + let dash = hasval(timeseries.dash) ? timeseries.dash : 0; + u_lpDash.setData(gl, dash); - var lineThickness = hasval( timeseries.lineThickness ) ? timeseries.lineThickness : defaultThickness; - gl.lineWidth( lineThickness ); + let lineThickness = hasval(timeseries.lineThickness) ? timeseries.lineThickness : defaultThickness; + gl.lineWidth(lineThickness); - xysBuffer.setData( xys.subarray( 0, index ) ); - a_lpPosition.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + xysBuffer.setData(xys.subarray(0, index)); + a_lpPosition.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); - distBuffer.setData( dists.subarray( 0, totalSize) ); - a_lpDistance.setDataAndEnable( gl, distBuffer, 1, GL.FLOAT ); + distBuffer.setData(dists.subarray(0, totalSize)); + a_lpDistance.setDataAndEnable(gl, distBuffer, 1, GL.FLOAT); - if ( timeseries.uiHint == 'lines' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { - // draw the lines - gl.drawArrays( GL.LINE_STRIP, 0, size / 2 ); - } + if (timeseries.uiHint === 'lines' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) { + // draw the lines + gl.drawArrays(GL.LINE_STRIP, 0, size / 2); + } - // point size works in WebKit and actually works in Minefield as well even though - // VERTEX_PROGRAM_POINT_SIZE and POINT_SMOOTH aren't defined - if ( timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' ) { + // point size works in WebKit and actually works in Minefield as well even though + // VERTEX_PROGRAM_POINT_SIZE and POINT_SMOOTH aren't defined + if (timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points') { - var pointColor = hasval( timeseries.pointColor ) ? timeseries.pointColor : defaultColor; - u_Color.setData( gl, pointColor ); + let pointColor = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor; + u_Color.setData(gl, pointColor); - u_PointSize.setData( gl, timeseries.pointSize ); + u_PointSize.setData(gl, timeseries.pointSize); - gl.drawArrays( GL.POINTS, 0, size / 2 ); - } - lineProgram.endUse( gl ); + gl.drawArrays(GL.POINTS, 0, size / 2); } - else if ( timeseries.uiHint == 'bars' ) { - // enable the shader - program.use( gl ); - u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); - // The last data point defines the right edge of the bar - // but it does not have its own bar drawn, so we need at - // least 2 data points to draw any bars - if ( totalSize >= 2 ) { - var baseline : number = timeseries.baseline; - - var size = (totalSize-1) * 12; - xys = ensureCapacityFloat32( xys, size ); - - var index = 0; - for ( var j = 0 ; j < sortedFragments.length ; j++ ) { - var fragment = sortedFragments[j]; - var data : number[] = fragment.data; - var times_PMILLIS : number[] = fragment.times_PMILLIS; - - for ( var k = 0 ; k < data.length-1 ; k++ ) { - var x1 = timeAxis.vAtTime( times_PMILLIS[k] ); - var y1 = data[k]; - - var x2 = timeAxis.vAtTime( times_PMILLIS[k+1] ); - var y2 = data[k+1]; - - index = putQuadXys( xys, index, x1, x2, y1, baseline ); - } + lineProgram.endUse(gl); + } + else if (timeseries.uiHint === 'bars') { + // enable the shader + program.use(gl); + u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); + // The last data point defines the right edge of the bar + // but it does not have its own bar drawn, so we need at + // least 2 data points to draw any bars + if (totalSize >= 2) { + let baseline: number = timeseries.baseline; + + let size = (totalSize - 1) * 12; + xys = ensureCapacityFloat32(xys, size); + + let index = 0; + for (let j = 0; j < sortedFragments.length; j++) { + let fragment = sortedFragments[j]; + let data: number[] = fragment.data; + let times_PMILLIS: number[] = fragment.times_PMILLIS; + + for (let k = 0; k < data.length - 1; k++) { + let x1 = timeAxis.vAtTime(times_PMILLIS[k]); + let y1 = data[k]; + + let x2 = timeAxis.vAtTime(times_PMILLIS[k + 1]); + let y2 = data[k + 1]; + + index = putQuadXys(xys, index, x1, x2, y1, baseline); } + } - var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; - u_Color.setData( gl, lineColor ); + let lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + u_Color.setData(gl, lineColor); - xysBuffer.setData( xys.subarray( 0, index ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + xysBuffer.setData(xys.subarray(0, index)); + a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); - gl.drawArrays( GL.TRIANGLES, 0, size / 2 ); - } - program.endUse( gl ); + gl.drawArrays(GL.TRIANGLES, 0, size / 2); } - else if ( timeseries.uiHint == 'area' ) { - // enable the shader - program.use( gl ); - u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); + program.endUse(gl); + } + else if (timeseries.uiHint === 'area') { + // enable the shader + program.use(gl); + u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); - var baseline : number = timeseries.baseline; + let baseline: number = timeseries.baseline; - var size = totalSize * 4; + let size = totalSize * 4; - // the last data point defines the right edge of the bar - // but it does not have its own bar drawn - xys = ensureCapacityFloat32( xys, size ); + // the last data point defines the right edge of the bar + // but it does not have its own bar drawn + xys = ensureCapacityFloat32(xys, size); - var index = 0; - for ( var j = 0 ; j < sortedFragments.length ; j++ ) { - var fragment = sortedFragments[j]; - var data : number[] = fragment.data; - var times_PMILLIS : number[] = fragment.times_PMILLIS; + let index = 0; + for (let j = 0; j < sortedFragments.length; j++) { + let fragment = sortedFragments[j]; + let data: number[] = fragment.data; + let times_PMILLIS: number[] = fragment.times_PMILLIS; - for ( var k = 0 ; k < data.length ; k++,index+=4 ) { - var x1 = timeAxis.vAtTime( times_PMILLIS[k] ); - var y1 = data[k]; + for (let k = 0; k < data.length; k++ , index += 4) { + let x1 = timeAxis.vAtTime(times_PMILLIS[k]); + let y1 = data[k]; - xys[index] = x1; - xys[index+1] = baseline; + xys[index] = x1; + xys[index + 1] = baseline; - xys[index+2] = x1; - xys[index+3] = y1; - } + xys[index + 2] = x1; + xys[index + 3] = y1; } + } - var lineColor = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; - u_Color.setData( gl, lineColor ); + let lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + u_Color.setData(gl, lineColor); - xysBuffer.setData( xys.subarray( 0, index ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + xysBuffer.setData(xys.subarray(0, index)); + a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); - gl.drawArrays( GL.TRIANGLE_STRIP, 0, size / 2 ); + gl.drawArrays(GL.TRIANGLE_STRIP, 0, size / 2); - program.endUse( gl ); - } + program.endUse(gl); + } - // highlight hovered point - if ( selection.hoveredTimeseries.fragment && timeseries.fragmentGuids.hasValue( selection.hoveredTimeseries.fragment.fragmentGuid ) ) - { - // enable the shader - program.use( gl ); - u_modelViewMatrix.setData( gl, glOrthoAxis( axis ) ); + // highlight hovered point + if (selection.hoveredTimeseries.fragment && timeseries.fragmentGuids.hasValue(selection.hoveredTimeseries.fragment.fragmentGuid)) { + // enable the shader + program.use(gl); + u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); - if ( timeseries.uiHint == 'area' || timeseries.uiHint == 'lines' || timeseries.uiHint == 'points' || timeseries.uiHint == 'lines-and-points' || timeseries.uiHint == undefined ) { - var size = 8; - xys = ensureCapacityFloat32( xys, size ); + if (timeseries.uiHint === 'area' || timeseries.uiHint === 'lines' || timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) { + let size = 8; + xys = ensureCapacityFloat32(xys, size); - var vppx : number = timeAxis.vSize / viewport.w; - var vppy : number = dataAxis.vSize / viewport.h; + let vppx: number = timeAxis.vSize / viewport.w; + let vppy: number = dataAxis.vSize / viewport.h; - var highlightSize = hasval( timeseries.pointSize ) ? timeseries.pointSize : 5; + let highlightSize = hasval(timeseries.pointSize) ? timeseries.pointSize : 5; - var bufferx = ( highlightSize / 2 ) * vppx; - var buffery = ( highlightSize / 2 ) * vppy; + let bufferx = (highlightSize / 2) * vppx; + let buffery = (highlightSize / 2) * vppy; - var fragment = selection.hoveredTimeseries.fragment; - var y = selection.hoveredTimeseries.data; - var x = timeAxis.vAtTime( selection.hoveredTimeseries.times_PMILLIS ); + let fragment = selection.hoveredTimeseries.fragment; + let y = selection.hoveredTimeseries.data; + let x = timeAxis.vAtTime(selection.hoveredTimeseries.times_PMILLIS); - xys[0] = x-bufferx; xys[1] = y-buffery; - xys[2] = x+bufferx; xys[3] = y-buffery; - xys[4] = x+bufferx; xys[5] = y+buffery; - xys[6] = x-bufferx; xys[7] = y+buffery; + xys[0] = x - bufferx; xys[1] = y - buffery; + xys[2] = x + bufferx; xys[3] = y - buffery; + xys[4] = x + bufferx; xys[5] = y + buffery; + xys[6] = x - bufferx; xys[7] = y + buffery; - var color = hasval( timeseries.pointColor ) ? timeseries.pointColor : defaultColor; - u_Color.setData( gl, darker( color, 0.8 ) ); + let color = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor; + u_Color.setData(gl, darker(color, 0.8)); - xysBuffer.setData( xys.subarray( 0, size ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + xysBuffer.setData(xys.subarray(0, size)); + a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); - gl.drawArrays( GL.LINE_LOOP, 0, size / 2 ); - } - else if ( timeseries.uiHint == 'bars' ) { - var size = 8; - xys = ensureCapacityFloat32( xys, size ); + gl.drawArrays(GL.LINE_LOOP, 0, size / 2); + } + else if (timeseries.uiHint === 'bars') { + let size = 8; + xys = ensureCapacityFloat32(xys, size); - var fragment = selection.hoveredTimeseries.fragment; - var index = selection.hoveredTimeseries.index; + let fragment = selection.hoveredTimeseries.fragment; + let index = selection.hoveredTimeseries.index; - if ( index < fragment.data.length ) - { - var x1 = timeAxis.vAtTime( fragment.times_PMILLIS[index] ); - var y1 = fragment.data[index]; + if (index < fragment.data.length) { + let x1 = timeAxis.vAtTime(fragment.times_PMILLIS[index]); + let y1 = fragment.data[index]; - var x2 = timeAxis.vAtTime( fragment.times_PMILLIS[index+1] ); - var y2 = fragment.data[index+1]; + let x2 = timeAxis.vAtTime(fragment.times_PMILLIS[index + 1]); + let y2 = fragment.data[index + 1]; - xys[0] = x1; xys[1] = y1; - xys[2] = x2; xys[3] = y1; - xys[4] = x2; xys[5] = baseline; - xys[6] = x1; xys[7] = baseline; + xys[0] = x1; xys[1] = y1; + xys[2] = x2; xys[3] = y1; + xys[4] = x2; xys[5] = baseline; + xys[6] = x1; xys[7] = baseline; - var color = hasval( timeseries.lineColor ) ? timeseries.lineColor : defaultColor; - u_Color.setData( gl, darker( color, 0.8 ) ); + let color = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + u_Color.setData(gl, darker(color, 0.8)); - xysBuffer.setData( xys.subarray( 0, size ) ); - a_Position.setDataAndEnable( gl, xysBuffer, 2, GL.FLOAT ); + xysBuffer.setData(xys.subarray(0, size)); + a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT); - gl.drawArrays( GL.LINE_LOOP, 0, size / 2 ); - } + gl.drawArrays(GL.LINE_LOOP, 0, size / 2); } - program.endUse( gl ); } + program.endUse(gl); } - - // disable shader and attribute buffers - a_Position.disable( gl ); - a_lpDistance.disable( gl ); } + + // disable shader and attribute buffers + a_Position.disable(gl); + a_lpDistance.disable(gl); } } +} diff --git a/src/webglimpse/timeline/timeline_ui.ts b/src/webglimpse/timeline/timeline_ui.ts index 6359bf8..1979d49 100644 --- a/src/webglimpse/timeline/timeline_ui.ts +++ b/src/webglimpse/timeline/timeline_ui.ts @@ -27,490 +27,498 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { OrderedSet } from '../util/ordered_set'; +import { TimelineEventStyleUi } from './timeline_event_style'; +import { TimelineAnnotationStyleUi } from './timeline_annotation_style'; +import { SimpleModel, XyModel } from '../misc'; +import { StringMap, GL, hasval, getObjectId } from '../util/util'; +import { Texture2D } from '../texture'; +import { Notification, Notification1, Notification2 } from '../util/notification'; +import { Pane, PointerEvent, isLeftMouseDown } from '../core'; +import { TimelineModel, TimelineGroupModel, TimelineRowModel, TimelineEventModel, TimelineAnnotationModel, TimelineTimeseriesFragmentModel } from './timeline_model'; +import { TimelineRowPaneFactory } from './timeline_row'; + +export interface TimelineUiOptions { + allowEventMultiSelection?: boolean; +} + +export class TimelineUi { + private _input: TimelineInput; + private _selection: TimelineSelectionModel; + + private _groupUis: OrderedSet; + private _rowUis: OrderedSet; + private _eventStyles: OrderedSet; + private _annotationStyles: OrderedSet; + + private _millisPerPx: SimpleModel; + + private _imageStatus: StringMap; + private _imageCache: StringMap; + + private _dispose: Notification; + + private _panes: OrderedSet; + + constructor(model: TimelineModel, options: TimelineUiOptions = {}) { + this._dispose = new Notification(); + this._input = new TimelineInput(); + + let getPaneId = function (pane: Pane): string { + let paneId = pane['webglimpse_PaneId'] + return hasval(paneId) ? paneId : getObjectId(pane); + } + + this._panes = new OrderedSet([], getPaneId); + + this._selection = new TimelineSelectionModel(); + attachTimelineInputToSelection(this._input, this._selection, options); + + this._groupUis = new OrderedSet([], (g) => g.groupGuid); + let groupUis = this._groupUis; + let addGroupUi = function (group: TimelineGroupModel) { groupUis.add(new TimelineGroupUi(group.groupGuid)); }; + let removeGroupUi = function (group: TimelineGroupModel) { groupUis.removeId(group.groupGuid); }; + model.groups.forEach(addGroupUi); + model.groups.valueAdded.on(addGroupUi); + model.groups.valueRemoved.on(removeGroupUi); + + this._rowUis = new OrderedSet([], (r) => r.rowGuid); + let rowUis = this._rowUis; + let addRowUi = function (row: TimelineRowModel) { rowUis.add(new TimelineRowUi(row.rowGuid)); } + let removeRowUi = function (row: TimelineRowModel) { rowUis.removeId(row.rowGuid); } + model.rows.forEach(addRowUi); + model.rows.valueAdded.on(addRowUi); + model.rows.valueRemoved.on(removeRowUi); + + this._eventStyles = new OrderedSet([], (s) => s.styleGuid); + this._annotationStyles = new OrderedSet([], (s) => s.styleGuid); + + this._millisPerPx = new SimpleModel(1000); + + this._imageStatus = {}; + this._imageCache = {}; + + this._dispose.on(function () { + model.groups.valueAdded.off(addGroupUi); + model.groups.valueRemoved.off(removeGroupUi); + model.rows.valueAdded.off(addRowUi); + model.rows.valueRemoved.off(removeRowUi); + }); + } + get input(): TimelineInput { + return this._input; + } - - export interface TimelineUiOptions { - allowEventMultiSelection? : boolean; + get selection(): TimelineSelectionModel { + return this._selection; } - export class TimelineUi { - private _input : TimelineInput; - private _selection : TimelineSelectionModel; + get groupUis(): OrderedSet { + return this._groupUis; + } - private _groupUis : OrderedSet; - private _rowUis : OrderedSet; - private _eventStyles : OrderedSet; - private _annotationStyles : OrderedSet; + groupUi(groupGuid: string): TimelineGroupUi { + return this._groupUis.valueFor(groupGuid); + } - private _millisPerPx : SimpleModel; + get rowUis(): OrderedSet { + return this._rowUis; + } - private _imageStatus : StringMap; - private _imageCache : StringMap; + rowUi(rowGuid: string): TimelineRowUi { + return this._rowUis.valueFor(rowGuid); + } - private _dispose : Notification; + get eventStyles(): OrderedSet { + return this._eventStyles; + } - private _panes : OrderedSet; + eventStyle(styleGuid: string): TimelineEventStyleUi { + return ((hasval(styleGuid) && this._eventStyles.valueFor(styleGuid)) || timelineEventStyle_DEFAULT); + } - constructor( model : TimelineModel, options : TimelineUiOptions = { } ) { - this._dispose = new Notification( ); - this._input = new TimelineInput( ); + get annotationStyles(): OrderedSet { + return this._annotationStyles; + } - var getPaneId = function( pane ) { - var paneId = pane['webglimpse_PaneId'] - return hasval( paneId ) ? paneId : getObjectId( pane ); - } + annotationStyle(styleGuid: string): TimelineAnnotationStyleUi { + return ((hasval(styleGuid) && this._annotationStyles.valueFor(styleGuid)) || timelineAnnotationStyle_DEFAULT); + } - this._panes = new OrderedSet( [], getPaneId ); - - this._selection = new TimelineSelectionModel( ); - attachTimelineInputToSelection( this._input, this._selection, options ); - - this._groupUis = new OrderedSet( [], (g)=>g.groupGuid ); - var groupUis = this._groupUis; - var addGroupUi = function( group : TimelineGroupModel ) { groupUis.add( new TimelineGroupUi( group.groupGuid ) ); }; - var removeGroupUi = function( group : TimelineGroupModel ) { groupUis.removeId( group.groupGuid ); }; - model.groups.forEach( addGroupUi ); - model.groups.valueAdded.on( addGroupUi ); - model.groups.valueRemoved.on( removeGroupUi ); - - this._rowUis = new OrderedSet( [], (r)=>r.rowGuid ); - var rowUis = this._rowUis; - var addRowUi = function( row : TimelineRowModel ) { rowUis.add( new TimelineRowUi( row.rowGuid ) ); } - var removeRowUi = function( row : TimelineRowModel ) { rowUis.removeId( row.rowGuid ); } - model.rows.forEach( addRowUi ); - model.rows.valueAdded.on( addRowUi ); - model.rows.valueRemoved.on( removeRowUi ); - - this._eventStyles = new OrderedSet( [], (s)=>s.styleGuid ); - this._annotationStyles = new OrderedSet( [], (s)=>s.styleGuid ); - - this._millisPerPx = new SimpleModel( 1000 ); - - this._imageStatus = {}; - this._imageCache = {}; - - this._dispose.on( function( ) { - model.groups.valueAdded.off( addGroupUi ); - model.groups.valueRemoved.off( removeGroupUi ); - model.rows.valueAdded.off( addRowUi ); - model.rows.valueRemoved.off( removeRowUi ); - } ); - } + get millisPerPx(): SimpleModel { + return this._millisPerPx; + } - get input( ) : TimelineInput { - return this._input; - } + loadImage(url: string, onLoaded: () => void): Texture2D { + if (!hasval(this._imageStatus[url])) { + this._imageStatus[url] = true; + + let imageCache = this._imageCache; + let image = new Image(); + image.onload = function () { + let w = image.naturalWidth; + let h = image.naturalHeight; + imageCache[url] = new Texture2D(w, h, GL.LINEAR, GL.LINEAR, function (g) { g.drawImage(image, 0, 0); }); + if (onLoaded) onLoaded(); + }; + image.src = url; + } + return this._imageCache[url]; + } - get selection( ) : TimelineSelectionModel { - return this._selection; - } + get panes(): OrderedSet { + return this._panes; + } - get groupUis( ) : OrderedSet { - return this._groupUis; - } + addPane(paneId: string, pane: Pane) { + pane['webglimpse_PaneId'] = paneId; + this._panes.removeId(paneId); + this._panes.add(pane); + } - groupUi( groupGuid : string ) : TimelineGroupUi { - return this._groupUis.valueFor( groupGuid ); - } + removePane(paneId: string) { + this._panes.removeId(paneId); + } - get rowUis( ) : OrderedSet { - return this._rowUis; - } + getPane(paneId: string): Pane { + return this._panes.valueFor(paneId); + } - rowUi( rowGuid : string ) : TimelineRowUi { - return this._rowUis.valueFor( rowGuid ); - } + get dispose() { return this._dispose; } +} - get eventStyles( ) : OrderedSet { - return this._eventStyles; - } - eventStyle( styleGuid : string ) : TimelineEventStyleUi { - return ( ( hasval( styleGuid ) && this._eventStyles.valueFor( styleGuid ) ) || timelineEventStyle_DEFAULT ); - } - get annotationStyles( ) : OrderedSet { - return this._annotationStyles; - } +export class TimelineGroupUi { + private _groupGuid: string; - annotationStyle( styleGuid : string ) : TimelineAnnotationStyleUi { - return ( ( hasval( styleGuid ) && this._annotationStyles.valueFor( styleGuid ) ) || timelineAnnotationStyle_DEFAULT ); - } + constructor(groupGuid: string) { + this._groupGuid = groupGuid; + } - get millisPerPx( ) : SimpleModel { - return this._millisPerPx; - } + get groupGuid(): string { + return this._groupGuid; + } +} - loadImage( url : string, onLoaded : ()=>void ) : Texture2D { - if ( !hasval( this._imageStatus[ url ] ) ) { - this._imageStatus[ url ] = true; - - var imageCache = this._imageCache; - var image = new Image( ); - image.onload = function( ) { - var w = image.naturalWidth; - var h = image.naturalHeight; - imageCache[ url ] = new Texture2D( w, h, GL.LINEAR, GL.LINEAR, function( g ) { g.drawImage( image, 0, 0 ); } ); - if ( onLoaded ) onLoaded( ); - }; - image.src = url; - } - return this._imageCache[ url ]; - } - get panes( ) : OrderedSet { - return this._panes; - } - addPane( paneId : string, pane : Pane ) { - pane['webglimpse_PaneId'] = paneId; - this._panes.removeId( paneId ); - this._panes.add( pane ); - } +export class TimelineRowUi { + private _rowGuid: string; + private _paneFactoryChanged: Notification; + private _paneFactory: TimelineRowPaneFactory; + private _panes: OrderedSet; - removePane( paneId : string ) { - this._panes.removeId( paneId ); - } + constructor(rowGuid: string) { + this._rowGuid = rowGuid; + this._paneFactoryChanged = new Notification(); + this._paneFactory = null; - getPane( paneId : string ) : Pane { - return this._panes.valueFor( paneId ); + let getPaneId = function (pane: Pane): string { + let paneId = pane['webglimpse_PaneId'] + return hasval(paneId) ? paneId : getObjectId(pane); } - get dispose( ) { return this._dispose; } + this._panes = new OrderedSet([], getPaneId); } + get rowGuid(): string { + return this._rowGuid; + } + get paneFactoryChanged(): Notification { + return this._paneFactoryChanged; + } - export class TimelineGroupUi { - private _groupGuid : string; - - constructor( groupGuid : string ) { - this._groupGuid = groupGuid; - } + get paneFactory(): TimelineRowPaneFactory { + return this._paneFactory; + } - get groupGuid( ) : string { - return this._groupGuid; + set paneFactory(paneFactory: TimelineRowPaneFactory) { + if (paneFactory !== this._paneFactory) { + this._paneFactory = paneFactory; + this._paneFactoryChanged.fire(); } } + get panes(): OrderedSet { + return this._panes; + } + addPane(paneId: string, pane: Pane) { + pane['webglimpse_PaneId'] = paneId; + this._panes.removeId(paneId); + this._panes.add(pane); + } - export class TimelineRowUi { - private _rowGuid : string; - private _paneFactoryChanged : Notification; - private _paneFactory : TimelineRowPaneFactory; - private _panes : OrderedSet; - - constructor( rowGuid : string ) { - this._rowGuid = rowGuid; - this._paneFactoryChanged = new Notification( ); - this._paneFactory = null; - - var getPaneId = function( pane ) { - var paneId = pane['webglimpse_PaneId'] - return hasval( paneId ) ? paneId : getObjectId( pane ); - } + removePane(paneId: string) { + this._panes.removeId(paneId); + } - this._panes = new OrderedSet( [], getPaneId ); - } + getPane(paneId: string): Pane { + return this._panes.valueFor(paneId); + } +} - get rowGuid( ) : string { - return this._rowGuid; - } - get paneFactoryChanged( ) : Notification { - return this._paneFactoryChanged; - } +let timelineAnnotationStyle_DEFAULT = new TimelineAnnotationStyleUi({ + styleGuid: 'DEFAULT', + color: 'white', + icons: [] +}); - get paneFactory( ) : TimelineRowPaneFactory { - return this._paneFactory; - } - set paneFactory( paneFactory : TimelineRowPaneFactory ) { - if ( paneFactory !== this._paneFactory ) { - this._paneFactory = paneFactory; - this._paneFactoryChanged.fire( ); - } - } +let timelineEventStyle_DEFAULT = new TimelineEventStyleUi({ + styleGuid: 'DEFAULT', + icons: [] +}); - get panes( ) : OrderedSet { - return this._panes; - } - addPane( paneId : string, pane : Pane ) { - pane['webglimpse_PaneId'] = paneId; - this._panes.removeId( paneId ); - this._panes.add( pane ); - } - removePane( paneId : string ) { - this._panes.removeId( paneId ); - } +export class TimelineInput { + private _mouseMove = new Notification1(); + private _mouseExit = new Notification1(); + private _timeHover = new Notification2(); + private _rowHover = new Notification2(); + private _eventHover = new Notification2(); + private _mouseDown = new Notification1(); + private _mouseUp = new Notification1(); + private _contextMenu = new Notification1(); - getPane( paneId : string ) : Pane { - return this._panes.valueFor( paneId ); - } - } + get mouseMove(): Notification1 { return this._mouseMove; } + get mouseExit(): Notification1 { return this._mouseExit; } + get timeHover(): Notification2 { return this._timeHover; } + get rowHover(): Notification2 { return this._rowHover; } + get eventHover(): Notification2 { return this._eventHover; } + get mouseDown(): Notification1 { return this._mouseDown; } + get mouseUp(): Notification1 { return this._mouseUp; } + get contextMenu(): Notification1 { return this._contextMenu; } +} - var timelineAnnotationStyle_DEFAULT = new TimelineAnnotationStyleUi( { - styleGuid: 'DEFAULT', - color: 'white', - icons: [] - } ); +export class TimelineSelectionModel { + private _mousePos = new XyModel(); - var timelineEventStyle_DEFAULT = new TimelineEventStyleUi( { - styleGuid: 'DEFAULT', - icons: [] - } ); + private _hoveredY = new SimpleModel(); + private _hoveredTime_PMILLIS = new SimpleModel(); + private _selectedInterval = new TimeIntervalModel(0, 0); + private _hoveredRow = new SimpleModel(); + private _hoveredEvent = new SimpleModel(); + private _selectedEvents = new OrderedSet([], (e) => e.eventGuid); - export class TimelineInput { - private _mouseMove = new Notification1( ); - private _mouseExit = new Notification1( ); - private _timeHover = new Notification2( ); - private _rowHover = new Notification2( ); - private _eventHover = new Notification2( ); - private _mouseDown = new Notification1( ); - private _mouseUp = new Notification1( ); - private _contextMenu = new Notification1( ); + private _hoveredTimeseries = new TimelineTimeseriesFragmentSelectionModel(); - get mouseMove( ) : Notification1 { return this._mouseMove; } - get mouseExit( ) : Notification1 { return this._mouseExit; } - get timeHover( ) : Notification2 { return this._timeHover; } - get rowHover( ) : Notification2 { return this._rowHover; } - get eventHover( ) : Notification2 { return this._eventHover; } - get mouseDown( ) : Notification1 { return this._mouseDown; } - get mouseUp( ) : Notification1 { return this._mouseUp; } - get contextMenu( ) : Notification1 { return this._contextMenu; } - } + private _hoveredAnnotation = new SimpleModel(); + get mousePos(): XyModel { return this._mousePos; } + get hoveredY(): SimpleModel { return this._hoveredY; } + get hoveredTime_PMILLIS(): SimpleModel { return this._hoveredTime_PMILLIS; } + get selectedInterval(): TimeIntervalModel { return this._selectedInterval; } - export class TimelineSelectionModel { - private _mousePos = new XyModel( ); + get hoveredRow(): SimpleModel { return this._hoveredRow; } - private _hoveredY = new SimpleModel( ); - private _hoveredTime_PMILLIS = new SimpleModel( ); - private _selectedInterval = new TimeIntervalModel( 0, 0 ); + get hoveredEvent(): SimpleModel { return this._hoveredEvent; } + get selectedEvents(): OrderedSet { return this._selectedEvents; } - private _hoveredRow = new SimpleModel( ); + get hoveredTimeseries(): TimelineTimeseriesFragmentSelectionModel { return this._hoveredTimeseries; } - private _hoveredEvent = new SimpleModel( ); - private _selectedEvents = new OrderedSet( [], (e)=>e.eventGuid ); + get hoveredAnnotation(): SimpleModel { return this._hoveredAnnotation; } +} - private _hoveredTimeseries = new TimelineTimeseriesFragmentSelectionModel( ); - private _hoveredAnnotation = new SimpleModel( ); +export class TimelineTimeseriesFragmentSelectionModel { + private _fragment: TimelineTimeseriesFragmentModel; + private _index: number; + private _changed: Notification; - get mousePos( ) : XyModel { return this._mousePos; } - - get hoveredY( ) : SimpleModel { return this._hoveredY; } - get hoveredTime_PMILLIS( ) : SimpleModel { return this._hoveredTime_PMILLIS; } - get selectedInterval( ) : TimeIntervalModel { return this._selectedInterval; } - - get hoveredRow( ) : SimpleModel { return this._hoveredRow; } - - get hoveredEvent( ) : SimpleModel { return this._hoveredEvent; } - get selectedEvents( ) : OrderedSet { return this._selectedEvents; } - - get hoveredTimeseries( ) : TimelineTimeseriesFragmentSelectionModel { return this._hoveredTimeseries; } - - get hoveredAnnotation( ) : SimpleModel { return this._hoveredAnnotation; } + constructor(fragment: TimelineTimeseriesFragmentModel = null, index: number = -1) { + this._fragment = fragment; + this._index = index; + this._changed = new Notification(); } - - export class TimelineTimeseriesFragmentSelectionModel { - private _fragment : TimelineTimeseriesFragmentModel; - private _index : number; - private _changed : Notification; - - constructor( fragment : TimelineTimeseriesFragmentModel = null, index : number = -1 ) { + setValue(fragment: TimelineTimeseriesFragmentModel, index: number) { + if (fragment !== this._fragment || index !== this._index) { this._fragment = fragment; this._index = index; - this._changed = new Notification( ); - } - - setValue( fragment : TimelineTimeseriesFragmentModel, index : number ) { - if ( fragment !== this._fragment || index !== this._index ) { - this._fragment = fragment; - this._index = index; - this._changed.fire( ); - } + this._changed.fire(); } + } - clearValue( ) { - this.setValue( null, -1 ); - } + clearValue() { + this.setValue(null, -1); + } - get fragment( ) : TimelineTimeseriesFragmentModel { return this._fragment; } - get index( ) : number { return this._index; } - get changed( ) : Notification { return this._changed; } + get fragment(): TimelineTimeseriesFragmentModel { return this._fragment; } + get index(): number { return this._index; } + get changed(): Notification { return this._changed; } - get times_PMILLIS( ) : number { - if ( this._fragment ) { - return this._fragment.times_PMILLIS[ this._index ]; - } - else { - return undefined; - } + get times_PMILLIS(): number { + if (this._fragment) { + return this._fragment.times_PMILLIS[this._index]; } - get data( ) : number { - if ( this._fragment ) { - return this._fragment.data[ this._index ]; - } - else { - return undefined; - } + else { + return undefined; } } - - export class TimeIntervalModel { - private _start_PMILLIS : number; - private _end_PMILLIS : number; - private _cursor_PMILLIS : number; - private _changed : Notification; - - constructor( start_PMILLIS : number, end_PMILLIS : number, cursor_PMILLIS? : number ) { - this._start_PMILLIS = start_PMILLIS; - this._end_PMILLIS = end_PMILLIS; - this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS; - this._changed = new Notification( ); + get data(): number { + if (this._fragment) { + return this._fragment.data[this._index]; } + else { + return undefined; + } + } +} + +export class TimeIntervalModel { + private _start_PMILLIS: number; + private _end_PMILLIS: number; + private _cursor_PMILLIS: number; + private _changed: Notification; + + constructor(start_PMILLIS: number, end_PMILLIS: number, cursor_PMILLIS?: number) { + this._start_PMILLIS = start_PMILLIS; + this._end_PMILLIS = end_PMILLIS; + this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS; + this._changed = new Notification(); + } - get start_PMILLIS( ) : number { return this._start_PMILLIS; } - get end_PMILLIS( ) : number { return this._end_PMILLIS; } - get cursor_PMILLIS( ) : number { return this._cursor_PMILLIS; } - get duration_MILLIS( ) : number { return this._end_PMILLIS - this._start_PMILLIS; } - get changed( ) : Notification { return this._changed; } + get start_PMILLIS(): number { return this._start_PMILLIS; } + get end_PMILLIS(): number { return this._end_PMILLIS; } + get cursor_PMILLIS(): number { return this._cursor_PMILLIS; } + get duration_MILLIS(): number { return this._end_PMILLIS - this._start_PMILLIS; } + get changed(): Notification { return this._changed; } - set start_PMILLIS( start_PMILLIS : number ) { - if ( start_PMILLIS !== this._start_PMILLIS ) { - this._start_PMILLIS = start_PMILLIS; - this._changed.fire( ); - } + set start_PMILLIS(start_PMILLIS: number) { + if (start_PMILLIS !== this._start_PMILLIS) { + this._start_PMILLIS = start_PMILLIS; + this._changed.fire(); } + } - set end_PMILLIS( end_PMILLIS : number ) { - if ( end_PMILLIS !== this._end_PMILLIS ) { - this._end_PMILLIS = end_PMILLIS; - this._changed.fire( ); - } + set end_PMILLIS(end_PMILLIS: number) { + if (end_PMILLIS !== this._end_PMILLIS) { + this._end_PMILLIS = end_PMILLIS; + this._changed.fire(); } + } - set cursor_PMILLIS( cursor_PMILLIS : number ) { - if ( cursor_PMILLIS !== this._cursor_PMILLIS ) { - this._cursor_PMILLIS = cursor_PMILLIS; - this._changed.fire( ); - } + set cursor_PMILLIS(cursor_PMILLIS: number) { + if (cursor_PMILLIS !== this._cursor_PMILLIS) { + this._cursor_PMILLIS = cursor_PMILLIS; + this._changed.fire(); } + } - setInterval( start_PMILLIS : number, end_PMILLIS : number, cursor_PMILLIS? : number ) { - if ( start_PMILLIS !== this._start_PMILLIS || - end_PMILLIS !== this._end_PMILLIS || - ( cursor_PMILLIS && cursor_PMILLIS != this._cursor_PMILLIS ) ) { + setInterval(start_PMILLIS: number, end_PMILLIS: number, cursor_PMILLIS?: number) { + if (start_PMILLIS !== this._start_PMILLIS || + end_PMILLIS !== this._end_PMILLIS || + (cursor_PMILLIS && cursor_PMILLIS !== this._cursor_PMILLIS)) { - this._start_PMILLIS = start_PMILLIS; - this._end_PMILLIS = end_PMILLIS; - this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS; - this._changed.fire( ); - } + this._start_PMILLIS = start_PMILLIS; + this._end_PMILLIS = end_PMILLIS; + this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS; + this._changed.fire(); } + } - overlaps( start_PMILLIS : number, end_PMILLIS : number ) : boolean { - return ( this._start_PMILLIS <= end_PMILLIS && start_PMILLIS <= this._end_PMILLIS ); - } + overlaps(start_PMILLIS: number, end_PMILLIS: number): boolean { + return (this._start_PMILLIS <= end_PMILLIS && start_PMILLIS <= this._end_PMILLIS); + } - contains( time_PMILLIS : number ) : boolean { - return ( this._start_PMILLIS <= time_PMILLIS && time_PMILLIS <= this._end_PMILLIS ); - } + contains(time_PMILLIS: number): boolean { + return (this._start_PMILLIS <= time_PMILLIS && time_PMILLIS <= this._end_PMILLIS); + } - pan( amount_MILLIS : number ) { - if ( amount_MILLIS !== 0 ) { - this._start_PMILLIS += amount_MILLIS; - this._end_PMILLIS += amount_MILLIS; - this._cursor_PMILLIS += amount_MILLIS; - this._changed.fire( ); - } + pan(amount_MILLIS: number) { + if (amount_MILLIS !== 0) { + this._start_PMILLIS += amount_MILLIS; + this._end_PMILLIS += amount_MILLIS; + this._cursor_PMILLIS += amount_MILLIS; + this._changed.fire(); } + } - scale( factor : number, anchor_PMILLIS : number ) { - if ( anchor_PMILLIS !== 1 ) { - this._start_PMILLIS = anchor_PMILLIS + factor * ( this._start_PMILLIS - anchor_PMILLIS ); - this._end_PMILLIS = anchor_PMILLIS + factor * ( this._end_PMILLIS - anchor_PMILLIS ); - this._cursor_PMILLIS = anchor_PMILLIS + factor * ( this._cursor_PMILLIS - anchor_PMILLIS ); - this._changed.fire( ); - } + scale(factor: number, anchor_PMILLIS: number) { + if (anchor_PMILLIS !== 1) { + this._start_PMILLIS = anchor_PMILLIS + factor * (this._start_PMILLIS - anchor_PMILLIS); + this._end_PMILLIS = anchor_PMILLIS + factor * (this._end_PMILLIS - anchor_PMILLIS); + this._cursor_PMILLIS = anchor_PMILLIS + factor * (this._cursor_PMILLIS - anchor_PMILLIS); + this._changed.fire(); } } - - - - function attachTimelineInputToSelection( input : TimelineInput, selection : TimelineSelectionModel, options : TimelineUiOptions ) { - - var allowEventMultiSelection = ( hasval( options ) && hasval( options.allowEventMultiSelection ) ? options.allowEventMultiSelection : true ); - - // Mouse-pos & Time - // - input.mouseMove.on( function( ev : PointerEvent ) { - selection.mousePos.setXy( ev.i, ev.j ); - } ); - input.mouseExit.on( function( ev : PointerEvent ) { - selection.mousePos.setXy( null, null ); - } ); - input.rowHover.on( function( row : TimelineRowModel, ev : PointerEvent ) { - selection.hoveredRow.value = row; - } ); - input.timeHover.on( function( time_PMILLIS : number, ev : PointerEvent ) { - selection.hoveredTime_PMILLIS.value = time_PMILLIS; - } ); - - // Events - // - input.eventHover.on( function( event : TimelineEventModel ) { - selection.hoveredEvent.value = event; - } ); - - if ( options.allowEventMultiSelection ) { - input.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) ) { - var event = selection.hoveredEvent.value; - if ( hasval( event ) ) { - var multiSelectMode = ( ev.mouseEvent && ( ev.mouseEvent.ctrlKey || ev.mouseEvent.shiftKey ) ); - var unselectedEventClicked = !selection.selectedEvents.hasValue( event ); - if ( multiSelectMode ) { - if ( selection.selectedEvents.hasValue( event ) ) { - selection.selectedEvents.removeValue( event ); - } - else { - selection.selectedEvents.add( event ); - } - } - else if ( unselectedEventClicked ) { - selection.selectedEvents.retainValues( [ event ] ); - selection.selectedEvents.add( event ); +} + + + +function attachTimelineInputToSelection(input: TimelineInput, selection: TimelineSelectionModel, options: TimelineUiOptions) { + + let allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true); + + // Mouse-pos & Time + // + input.mouseMove.on(function (ev: PointerEvent) { + selection.mousePos.setXy(ev.i, ev.j); + }); + input.mouseExit.on(function (ev: PointerEvent) { + selection.mousePos.setXy(null, null); + }); + input.rowHover.on(function (row: TimelineRowModel, ev: PointerEvent) { + selection.hoveredRow.value = row; + }); + input.timeHover.on(function (time_PMILLIS: number, ev: PointerEvent) { + selection.hoveredTime_PMILLIS.value = time_PMILLIS; + }); + + // Events + // + input.eventHover.on(function (event: TimelineEventModel) { + selection.hoveredEvent.value = event; + }); + + if (options.allowEventMultiSelection) { + input.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent)) { + let event = selection.hoveredEvent.value; + if (hasval(event)) { + let multiSelectMode = (ev.mouseEvent && (ev.mouseEvent.ctrlKey || ev.mouseEvent.shiftKey)); + let unselectedEventClicked = !selection.selectedEvents.hasValue(event); + if (multiSelectMode) { + if (selection.selectedEvents.hasValue(event)) { + selection.selectedEvents.removeValue(event); } else { - // if a selected event is clicked, do nothing (the user is probably initiating a drag) - // if they wish to deselect the event, they need to ctrl+click the event or click on - // a deselected event + selection.selectedEvents.add(event); } } - } - } ); - } - else { - input.mouseDown.on( function( ev : PointerEvent ) { - if ( isLeftMouseDown( ev.mouseEvent ) ) { - var event = selection.hoveredEvent.value; - if ( hasval( event ) ) { - selection.selectedEvents.retainValues( [ event ] ); - selection.selectedEvents.add( event ); + else if (unselectedEventClicked) { + selection.selectedEvents.retainValues([event]); + selection.selectedEvents.add(event); + } + else { + // if a selected event is clicked, do nothing (the user is probably initiating a drag) + // if they wish to deselect the event, they need to ctrl+click the event or click on + // a deselected event } } - } ); - } + } + }); + } + else { + input.mouseDown.on(function (ev: PointerEvent) { + if (isLeftMouseDown(ev.mouseEvent)) { + let event = selection.hoveredEvent.value; + if (hasval(event)) { + selection.selectedEvents.retainValues([event]); + selection.selectedEvents.add(event); + } + } + }); } +} diff --git a/src/webglimpse/util/binary_tree.ts b/src/webglimpse/util/binary_tree.ts index 955375d..6de4b53 100644 --- a/src/webglimpse/util/binary_tree.ts +++ b/src/webglimpse/util/binary_tree.ts @@ -29,550 +29,550 @@ */ - // AA Binary Tree - // - // see: http://user.it.uu.se/~arnea/ps/simp.pdf - // http://en.wikipedia.org/wiki/AA_tree - // - // Tree is self-balancing. Nodes are assigned a level number to assist balancing. - // - // The following invariants hold for AA tree level numbers: - // 1) Leaf node level is 1 - // 2) node.left.level = node.level - 1 - // 3) node.right.level = node.level or node.right.level = node.level - 1 - // 4) grandchild nodes have level less than their grandparents - // 5) every node of level greater than 1 has two children - // - // Requirements 2 and 3 allow "right horizontal links" but not "left horizontal links". - // The "skew" rotation operation turns a left horizontal link that may arise from insertion/deletion into a right horizontal link. - // The" skew" operation might result in two subsequent horizontal links (which is not permitted by requirement 4. This - // condition is fixed by the "splay" rotation operation. - // - // Duplicate values (as determined by the Comparator) are not permitted (insertion of a duplicate value will be ignored). - // Supports O(log n) insertion and deletion and O(1) size retrieval. - // - export class BinaryTree { +// AA Binary Tree +// +// see: http://user.it.uu.se/~arnea/ps/simp.pdf +// http://en.wikipedia.org/wiki/AA_tree +// +// Tree is self-balancing. Nodes are assigned a level number to assist balancing. +// +// The following invariants hold for AA tree level numbers: +// 1) Leaf node level is 1 +// 2) node.left.level = node.level - 1 +// 3) node.right.level = node.level or node.right.level = node.level - 1 +// 4) grandchild nodes have level less than their grandparents +// 5) every node of level greater than 1 has two children +// +// Requirements 2 and 3 allow "right horizontal links" but not "left horizontal links". +// The "skew" rotation operation turns a left horizontal link that may arise from insertion/deletion into a right horizontal link. +// The" skew" operation might result in two subsequent horizontal links (which is not permitted by requirement 4. This +// condition is fixed by the "splay" rotation operation. +// +// Duplicate values (as determined by the Comparator) are not permitted (insertion of a duplicate value will be ignored). +// Supports O(log n) insertion and deletion and O(1) size retrieval. +// +export class BinaryTree { + + private _root: TreeNode; + private _comp: Comparator; + private _size: number; + + constructor(comparator: Comparator) { + this._root = null; + this._comp = comparator; + this._size = 0; + } - private _root : TreeNode; - private _comp : Comparator; - private _size : number; + // Inserts the value into the tree. Nothing is inserted if the value already exists + insert(value: V) { + this._root = this.insert0(value, this._root); + } - constructor( comparator : Comparator ) { - this._root = null; - this._comp = comparator; - this._size = 0; - } + // Removes the value from the tree (if it exists) + remove(value: V) { + this._root = this.remove0(value, this._root); + } - // Inserts the value into the tree. Nothing is inserted if the value already exists - insert( value : V ) { - this._root = this.insert0( value, this._root ); - } + // Removes all values from the tree (size will be 0) + removeAll() { + this._root = null; + this._size = 0; + } - // Removes the value from the tree (if it exists) - remove( value : V ) { - this._root = this.remove0( value, this._root ); - } + contains(value: V): boolean { + return this.contains0(value, this._root) !== null; + } - // Removes all values from the tree (size will be 0) - removeAll( ) { - this._root = null; - this._size = 0; - } + // Gets the actual value stored in the tree or null if it does not exist. + // Normally this is not useful. This method is provided for trees which store additional + // data in their values besides their sort order. + getValue(value: V): V { + return this.contains0(value, this._root); + } - contains( value : V ) : boolean { - return this.contains0( value, this._root ) !== null; - } + get size(): number { + return this._size; + } - // Gets the actual value stored in the tree or null if it does not exist. - // Normally this is not useful. This method is provided for trees which store additional - // data in their values besides their sort order. - getValue( value : V ) : V { - return this.contains0( value, this._root ); - } + get isEmpty(): boolean { + return (this._size === 0); + } - get size( ) : number { - return this._size; - } + // Returns the lowest element greater than or equal to the given value, or null if no such element exists + ceiling(value: V): V { + return this.higher0(value, this._root, true); + } - get isEmpty( ) : boolean { - return ( this._size === 0 ); - } + // Returns the greatest element less than or equal to the given value, or null if no such element exists + floor(value: V): V { + return this.lower0(value, this._root, true); + } - // Returns the lowest element greater than or equal to the given value, or null if no such element exists - ceiling( value : V ) : V { - return this.higher0( value, this._root, true ); - } + // Returns the greatest element strictly less than the given value, or null if no such element exists + lower(value: V): V { + return this.lower0(value, this._root, false); + } - // Returns the greatest element less than or equal to the given value, or null if no such element exists - floor( value : V ) : V { - return this.lower0( value, this._root, true ); - } + // Returns the lowest element strictly greater than the given value, or null if no such element exists + higher(value: V): V { + return this.higher0(value, this._root, false); + } - // Returns the greatest element strictly less than the given value, or null if no such element exists - lower( value : V ) : V { - return this.lower0( value, this._root, false ); - } + // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) + headSet(value: V, inclusive: boolean = true): V[] { + let results: V[] = new Array(); + this.head0(value, inclusive, this._root, results); + return results; + } - // Returns the lowest element strictly greater than the given value, or null if no such element exists - higher( value : V ) : V { - return this.higher0( value, this._root, false ); - } + // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) + tailSet(value: V, inclusive: boolean = false): V[] { + let results: V[] = new Array(); + this.tail0(value, inclusive, this._root, results); + return results; + } - // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) - headSet( value : V, inclusive : boolean = true ) : V[] { - var results : V[] = new Array( ); - this.head0( value, inclusive, this._root, results ); - return results; - } + // Returns all elements between the provided values (sorted from low to high) + subSet(low: V, high: V, lowInclusive: boolean = true, highInclusive: boolean = false): V[] { + let results: V[] = new Array(); + this.sub0(low, high, lowInclusive, highInclusive, this._root, results); + return results; + } - // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) - tailSet( value : V, inclusive : boolean = false ) : V[] { - var results : V[] = new Array( ); - this.tail0( value, inclusive, this._root, results ); - return results; - } + // Returns all elements in the tree (sorted from low to high) + toArray(): V[] { + let results: V[] = new Array(); + this.addAll0(this._root, results); + return results; + } - // Returns all elements between the provided values (sorted from low to high) - subSet( low : V, high : V, lowInclusive : boolean = true, highInclusive : boolean = false ) : V[] { - var results : V[] = new Array( ); - this.sub0( low, high, lowInclusive, highInclusive, this._root, results ); - return results; - } + iterator(): Iterator { - // Returns all elements in the tree (sorted from low to high) - toArray( ) : V[] { - var results : V[] = new Array( ); - this.addAll0( this._root, results ); - return results; + // find the first node by traversing left links down the tree + let node: TreeNode = this._root; + let down: boolean; + let stack: TreeNode[] = new Array>(); + while (node != null && node.left != null) { + stack.push(node); + node = node.left; } + down = node.right != null; - iterator( ) : Iterator { + return { + next: function (): V { + let value = node.value; - // find the first node by traversing left links down the tree - var node : TreeNode = this._root; - var down : boolean; - var stack : TreeNode[] = new Array>( ); - while ( node != null && node.left != null ) { - stack.push( node ); - node = node.left; - } - down = node.right != null; - - return { - next: function( ) : V { - var value = node.value; - - // down indicates we should follow the right link - if ( down && node != null && node.right != null ) { - node = node.right; - while ( node != null && node.left != null ) { - stack.push( node ); - node = node.left; - } - down = node.right != null; - } - // up indicates the right link has been followed and we should move up to parent - else { - node = stack.pop( ); - down = true; + // down indicates we should follow the right link + if (down && node != null && node.right != null) { + node = node.right; + while (node != null && node.left != null) { + stack.push(node); + node = node.left; } - - return value; - }, - hasNext: function( ) : boolean { - return node != null; + down = node.right != null; + } + // up indicates the right link has been followed and we should move up to parent + else { + node = stack.pop(); + down = true; } + + return value; + }, + hasNext: function (): boolean { + return node != null; } } + } - compare( node1 : V, node2 : V ) : number { - return this._comp.compare( node1, node2 ); + compare(node1: V, node2: V): number { + return this._comp.compare(node1, node2); + } + + private contains0(value: V, node: TreeNode): V { + if (node == null) { + return null; } - private contains0( value : V, node : TreeNode ) : V { - if ( node == null ) { - return null; - } + let comp: number = this.compare(value, node.value); + if (comp > 0) { + return this.contains0(value, node.right); + } + else if (comp < 0) { + return this.contains0(value, node.left); + } + else { + return node.value; + } + } - var comp : number = this.compare( value, node.value ); - if ( comp > 0 ) { - return this.contains0( value, node.right ); - } - else if ( comp < 0 ) { - return this.contains0( value, node.left ); - } - else { - return node.value; - } + private lower0(value: V, node: TreeNode, inclusive: boolean): V { + if (node == null) { + return null; } - private lower0( value : V, node : TreeNode, inclusive : boolean ) : V { - if ( node == null ) { - return null; - } + let comp: number = this.compare(value, node.value); + let candidate: V; + if (comp > 0) { + candidate = this.lower0(value, node.right, inclusive); + // don't need to compare again, candidate will be closer to value + return candidate != null ? candidate : node.value; + } + else if (comp < 0 || (!inclusive && comp === 0)) { + // current node's value is lower -- if we don't find a better value: + // * return this node's value if lower + // * otherwise return null + candidate = this.lower0(value, node.left, inclusive); + if (candidate == null) candidate = node.value; + comp = this.compare(value, candidate); + return comp > 0 || (inclusive && comp === 0) ? candidate : null; + } + else { + // the node's value equals the search value and inclusive is true + return node.value; + } + } - var comp : number = this.compare( value, node.value ); - var candidate : V; - if ( comp > 0 ) { - candidate = this.lower0( value, node.right, inclusive ); - // don't need to compare again, candidate will be closer to value - return candidate != null ? candidate : node.value; - } - else if ( comp < 0 || ( !inclusive && comp == 0 ) ) { - // current node's value is lower -- if we don't find a better value: - // * return this node's value if lower - // * otherwise return null - candidate = this.lower0( value, node.left, inclusive ); - if ( candidate == null ) candidate = node.value; - comp = this.compare( value, candidate ); - return comp > 0 || ( inclusive && comp == 0 ) ? candidate : null; - } - else { - // the node's value equals the search value and inclusive is true - return node.value; - } + private higher0(value: V, node: TreeNode, inclusive: boolean): V { + if (node == null) { + return null; } - private higher0( value : V, node : TreeNode, inclusive : boolean ) : V { - if ( node == null ) { - return null; - } + let comp: number = this.compare(value, node.value); + let candidate: V; + if (comp < 0) { + candidate = this.higher0(value, node.left, inclusive); + // don't need to compare again, candidate will be closer to value + return candidate != null ? candidate : node.value; + } + else if (comp > 0 || (!inclusive && comp === 0)) { + // current node's value is lower -- if we don't find a better value: + // * return this node's value if higher + // * otherwise return null + candidate = this.higher0(value, node.right, inclusive); + if (candidate == null) candidate = node.value; + comp = this.compare(value, candidate); + return comp < 0 || (inclusive && comp === 0) ? candidate : null; + } + else { + // the node's value equals the search value and inclusive is true + return node.value; + } + } - var comp : number = this.compare( value, node.value ); - var candidate : V; - if ( comp < 0 ) { - candidate = this.higher0( value, node.left, inclusive ); - // don't need to compare again, candidate will be closer to value - return candidate != null ? candidate : node.value; - } - else if ( comp > 0 || ( !inclusive && comp == 0 ) ) { - // current node's value is lower -- if we don't find a better value: - // * return this node's value if higher - // * otherwise return null - candidate = this.higher0( value, node.right, inclusive ); - if ( candidate == null ) candidate = node.value; - comp = this.compare( value, candidate ); - return comp < 0 || ( inclusive && comp == 0 ) ? candidate : null; - } - else { - // the node's value equals the search value and inclusive is true - return node.value; - } + private sub0(low: V, high: V, lowInclusive: boolean, highInclusive: boolean, node: TreeNode, results: V[]): any { + if (node == null) { + return; } - private sub0( low : V, high : V, lowInclusive : boolean, highInclusive : boolean, node : TreeNode, results : V[] ) { - if ( node == null ) { - return; - } + // low end of range is above node value + let compLow: number = this.compare(low, node.value); + if (compLow > 0 || (compLow === 0 && !lowInclusive)) { + return this.sub0(low, high, lowInclusive, highInclusive, node.right, results); + } - // low end of range is above node value - var compLow : number = this.compare( low, node.value ); - if ( compLow > 0 || ( compLow == 0 && !lowInclusive ) ) { - return this.sub0( low, high, lowInclusive, highInclusive, node.right, results ); - } + // high end of range is below node value + let compHigh: number = this.compare(high, node.value); + if (compHigh < 0 || (compHigh === 0 && !highInclusive)) { + return this.sub0(low, high, lowInclusive, highInclusive, node.left, results); + } - // high end of range is below node value - var compHigh : number = this.compare( high, node.value ); - if ( compHigh < 0 || ( compHigh == 0 && !highInclusive ) ) { - return this.sub0( low, high, lowInclusive, highInclusive, node.left, results ); - } + // value is within range + this.sub0(low, high, lowInclusive, highInclusive, node.left, results); + results.push(node.value); + this.sub0(low, high, lowInclusive, highInclusive, node.right, results); + } - // value is within range - this.sub0( low, high, lowInclusive, highInclusive, node.left, results ); - results.push( node.value ); - this.sub0( low, high, lowInclusive, highInclusive, node.right, results ); + private head0(value: V, inclusive: boolean, node: TreeNode, results: V[]) { + if (node == null) { + return; } - private head0( value : V, inclusive : boolean, node : TreeNode, results : V[] ) { - if ( node == null ) { - return; - } + let comp: number = this.compare(value, node.value); + if (comp < 0 || (comp === 0 && inclusive)) { + this.head0(value, inclusive, node.left, results); + results.push(node.value); + this.addAll0(node.right, results); + } + else if (comp > 0) { + this.head0(value, inclusive, node.right, results); + } + } - var comp : number = this.compare( value, node.value ); - if ( comp < 0 || ( comp == 0 && inclusive ) ) { - this.head0( value, inclusive, node.left, results ); - results.push( node.value ); - this.addAll0( node.right, results ); - } - else if ( comp > 0 ) { - this.head0( value, inclusive, node.right, results ); - } + private tail0(value: V, inclusive: boolean, node: TreeNode, results: V[]) { + if (node == null) { + return; } - private tail0( value : V, inclusive : boolean, node : TreeNode, results : V[] ) { - if ( node == null ) { - return; - } + let comp: number = this.compare(value, node.value); + if (comp > 0 || (comp === 0 && inclusive)) { + this.addAll0(node.left, results); + results.push(node.value); + this.tail0(value, inclusive, node.right, results); + } + else if (comp < 0) { + this.tail0(value, inclusive, node.left, results); + } + } - var comp : number = this.compare( value, node.value ); - if ( comp > 0 || ( comp == 0 && inclusive ) ) { - this.addAll0( node.left, results ); - results.push( node.value ); - this.tail0( value, inclusive, node.right, results ); - } - else if ( comp < 0 ) { - this.tail0( value, inclusive, node.left, results ); - } + private addAll0(node: TreeNode, results: V[]) { + if (node == null) { + return; } - private addAll0( node : TreeNode, results : V[] ) { - if ( node == null ) { - return; - } + this.addAll0(node.left, results); + results.push(node.value); + this.addAll0(node.right, results); + } - this.addAll0( node.left, results ); - results.push( node.value ); - this.addAll0( node.right, results ); + // 1) turn deletion of internal node into deletion of leaf node by swapping with closest successor or predecessor + // (which will always be in level 1) + // 2) lower level of nodes whose children are two levels below them (not allowed by invariants 2 and 3) + // also lower level of nodes who are now leaf nodes (level > 1 not allowed by invariant 1) + // 3) skew and split the entire level + private remove0(value: V, node: TreeNode): TreeNode { + if (node == null) { + return node; } - // 1) turn deletion of internal node into deletion of leaf node by swapping with closest successor or predecessor - // (which will always be in level 1) - // 2) lower level of nodes whose children are two levels below them (not allowed by invariants 2 and 3) - // also lower level of nodes who are now leaf nodes (level > 1 not allowed by invariant 1) - // 3) skew and split the entire level - private remove0( value : V, node : TreeNode ) : TreeNode { - if ( node == null ) { - return node; - } - - // find and remove the node - var comp : number = this.compare( value, node.value ); - if ( comp < 0 ) { - node.left = this.remove0( value, node.left ); + // find and remove the node + let comp: number = this.compare(value, node.value); + if (comp < 0) { + node.left = this.remove0(value, node.left); + } + else if (comp > 0) { + node.right = this.remove0(value, node.right); + } + else { + if (node.isLeaf()) { + return null; } - else if ( comp > 0 ) { - node.right = this.remove0( value, node.right ); + else if (node.left == null) { + let lower = node.getSuccessor(); + node.right = this.remove0(lower.value, node.right); + node.value = lower.value; } else { - if ( node.isLeaf( ) ) { - return null; - } - else if ( node.left == null ) { - var lower = node.getSuccessor( ); - node.right = this.remove0( lower.value, node.right ); - node.value = lower.value; - } - else { - var lower = node.getPredecessor( ); - node.left = this.remove0( lower.value, node.left ); - node.value = lower.value; - } - this._size -= 1; + let lower = node.getPredecessor(); + node.left = this.remove0(lower.value, node.left); + node.value = lower.value; } + this._size -= 1; + } - // rebalance the tree - node = this.decreaseLevel0( node ); + // rebalance the tree + node = this.decreaseLevel0(node); - node = this.skew0( node ); - node.right = this.skew0( node.right ); - if ( node.right != null ) { - node.right.right = this.skew0( node.right.right ); - } + node = this.skew0(node); + node.right = this.skew0(node.right); + if (node.right != null) { + node.right.right = this.skew0(node.right.right); + } - node = this.split0( node ); - node.right = this.split0( node.right ); + node = this.split0(node); + node.right = this.split0(node.right); - return node; + return node; + } + + // return the level of the node, or 0 if null + private level0(node: TreeNode) { + if (node == null) { + return 0; + } + else { + return node.level; } + } - // return the level of the node, or 0 if null - private level0( node : TreeNode ) { - if ( node == null ) { - return 0; - } - else { - return node.level; + // lower the level of nodes which violate invariants 1, 2, and/or 3 + private decreaseLevel0(node: TreeNode): TreeNode { + let correctLevel = Math.min(this.level0(node.left), this.level0(node.right)) + 1; + + if (correctLevel < node.level) { + node.level = correctLevel; + if (node.right != null && correctLevel < node.right.level) { + node.right.level = correctLevel; } } - // lower the level of nodes which violate invariants 1, 2, and/or 3 - private decreaseLevel0( node : TreeNode ) : TreeNode { - var correctLevel = Math.min( this.level0( node.left ), this.level0( node.right ) ) + 1; + return node; + } - if ( correctLevel < node.level ) { - node.level = correctLevel; - if ( node.right != null && correctLevel < node.right.level ) { - node.right.level = correctLevel; - } - } + // 1) insert the value as you would in a binary tree + // 2) walk back to the root performing skew() then split() operations + // returns an updated version of the provided node (after the insert) + private insert0(value: V, node: TreeNode): TreeNode { + if (node == null) { + this._size += 1; + return this.newTreeNode0(value); + } - return node; + // find the appropriate spot and insert the node + let comp: number = this.compare(value, node.value); + if (comp < 0) { + node.left = this.insert0(value, node.left); + } + else if (comp > 0) { + node.right = this.insert0(value, node.right); } - // 1) insert the value as you would in a binary tree - // 2) walk back to the root performing skew() then split() operations - // returns an updated version of the provided node (after the insert) - private insert0( value : V, node : TreeNode ) : TreeNode { - if ( node == null ) { - this._size += 1; - return this.newTreeNode0( value ); - } + // always perform a skew then split to rebalance tree + // (if no balancing is necessary, these operations will return the node unchanged) + node = this.skew0(node); + node = this.split0(node); - // find the appropriate spot and insert the node - var comp : number = this.compare( value, node.value ); - if ( comp < 0 ) { - node.left = this.insert0( value, node.left ); - } - else if ( comp > 0 ) { - node.right = this.insert0( value, node.right ); - } + return node; + } - // always perform a skew then split to rebalance tree - // (if no balancing is necessary, these operations will return the node unchanged) - node = this.skew0( node ); - node = this.split0( node ); + newTreeNode0(value: V) { + return new TreeNode(value); + } + private skew0(node: TreeNode) { + if (node == null) { + return null; + } + else if (node.left == null) { return node; } - - newTreeNode0( value : V ) { - return new TreeNode( value ); + else if (node.left.level === node.level) { + // swap the pointers of the horizontal (same level value) left links + let left = node.left; + node.left = left.right; + left.right = node; + return left; } - - private skew0( node : TreeNode ) { - if ( node == null ) { - return null; - } - else if ( node.left == null ) { - return node; - } - else if ( node.left.level == node.level ) { - // swap the pointers of the horizontal (same level value) left links - var left = node.left; - node.left = left.right; - left.right = node; - return left; - } - else { - return node; - } + else { + return node; } + } - private split0( node : TreeNode ) { - if ( node == null ) { - return null; - } - else if ( node.right == null || node.right.right == null ) { - return node; - } - else if ( node.level == node.right.right.level ) { - // two horizontal (same level value) right links - // take the middle node, elevate it, and return it - var right = node.right; - node.right = right.left; - right.left = node; - right.level = right.level + 1; - return right; - } - else { - return node; - } + private split0(node: TreeNode) { + if (node == null) { + return null; + } + else if (node.right == null || node.right.right == null) { + return node; + } + else if (node.level === node.right.right.level) { + // two horizontal (same level value) right links + // take the middle node, elevate it, and return it + let right = node.right; + node.right = right.left; + right.left = node; + right.level = right.level + 1; + return right; + } + else { + return node; } } +} - export class TreeNode { - - private _level : number; - private _right : TreeNode; - private _left : TreeNode; - private _value : V; - - constructor( value : V, level : number = 1, left : TreeNode = null, right : TreeNode = null ) { - this._level = level; - this._right = right; - this._left = left; - this._value = value; - } - - get level( ) : number { - return this._level; - } +export class TreeNode { - get right( ) : TreeNode { - return this._right; - } - - get left( ) : TreeNode { - return this._left; - } - - get value( ) : V { - return this._value; - } + private _level: number; + private _right: TreeNode; + private _left: TreeNode; + private _value: V; - set right( node : TreeNode ) { - this._right = node; - } + constructor(value: V, level: number = 1, left: TreeNode = null, right: TreeNode = null) { + this._level = level; + this._right = right; + this._left = left; + this._value = value; + } - set left( node : TreeNode ) { - this._left = node; - } + get level(): number { + return this._level; + } - set level( level : number ) { - this._level = level; - } + get right(): TreeNode { + return this._right; + } - set value( value : V ) { - this._value = value; - } + get left(): TreeNode { + return this._left; + } - isLeaf( ) : boolean { - return this.right == null && this.left == null; - } + get value(): V { + return this._value; + } - getSuccessor( ) : TreeNode { - var node : TreeNode = this.right; - while ( node != null && node.left != null ) { - node = node.left; - } - return node; - } + set right(node: TreeNode) { + this._right = node; + } - getPredecessor( ) : TreeNode { - var node : TreeNode = this.left; - while ( node != null && node.right != null ) { - node = node.right; - } - return node; - } + set left(node: TreeNode) { + this._left = node; + } - toString( ) : string { - return this.value.toString( ) + ':' + this.level.toString( ); - } + set level(level: number) { + this._level = level; } - export interface Iterator { - hasNext( ) : boolean; - next( ) : V; + set value(value: V) { + this._value = value; } - // follows Java Comparator interface contract: - // positive if node1 > node2 - // 0 if node1 = node2 - // negative if node1 < node2 - export interface Comparator { - compare( node1 : V, node2 : V ) : number; + isLeaf(): boolean { + return this.right == null && this.left == null; } - export class StringComparator implements Comparator { - compare( value1 : string, value2 : string ) : number { - return value1.toLocaleLowerCase( ).localeCompare( value2.toLocaleLowerCase( ) ); + getSuccessor(): TreeNode { + let node: TreeNode = this.right; + while (node != null && node.left != null) { + node = node.left; } + return node; } - export class NumberComparator implements Comparator { - compare( value1 : number, value2 : number ) : number { - return value1 - value2; + getPredecessor(): TreeNode { + let node: TreeNode = this.left; + while (node != null && node.right != null) { + node = node.right; } + return node; } - export function createStringTree( ) : BinaryTree { - return new BinaryTree( new StringComparator( ) ); + toString(): string { + return this.value.toString() + ':' + this.level.toString(); + } +} + +export interface Iterator { + hasNext(): boolean; + next(): V; +} + +// follows Java Comparator interface contract: +// positive if node1 > node2 +// 0 if node1 = node2 +// negative if node1 < node2 +export interface Comparator { + compare(node1: V, node2: V): number; +} + +export class StringComparator implements Comparator { + compare(value1: string, value2: string): number { + return value1.toLocaleLowerCase().localeCompare(value2.toLocaleLowerCase()); } +} - export function createNumberTree( ) : BinaryTree { - return new BinaryTree( new NumberComparator( ) ); +export class NumberComparator implements Comparator { + compare(value1: number, value2: number): number { + return value1 - value2; } +} + +export function createStringTree(): BinaryTree { + return new BinaryTree(new StringComparator()); +} + +export function createNumberTree(): BinaryTree { + return new BinaryTree(new NumberComparator()); +} diff --git a/src/webglimpse/util/cache.ts b/src/webglimpse/util/cache.ts index 2c7f502..dff3ad9 100644 --- a/src/webglimpse/util/cache.ts +++ b/src/webglimpse/util/cache.ts @@ -30,117 +30,117 @@ - export interface CacheHelper { - create( key : string ) : V; - dispose( value : V, key : string ); - } +export interface CacheHelper { + create(key: string): V; + dispose(value: V, key: string): void; +} - class CacheEntry { - value : V; - touched : boolean = false; +class CacheEntry { + value: V; + touched: boolean = false; - constructor( value : V ) { - this.value = value; - } + constructor(value: V) { + this.value = value; } +} - export class Cache { - private helper : CacheHelper; - private map : { [ k : string ] : CacheEntry; }; - - constructor( helper : CacheHelper ) { - this.helper = helper; - this.map = { }; - } +export class Cache { + private helper: CacheHelper; + private map: { [k: string]: CacheEntry; }; - value( key : string ) : V { - if ( !this.map.hasOwnProperty( key ) ) { - this.map[ key ] = new CacheEntry( this.helper.create( key ) ); - } - var en = this.map[ key ]; + constructor(helper: CacheHelper) { + this.helper = helper; + this.map = {}; + } - en.touched = true; - return en.value; + value(key: string): V { + if (!this.map.hasOwnProperty(key)) { + this.map[key] = new CacheEntry(this.helper.create(key)); } + let en = this.map[key]; - clear( ) { - for ( var k in this.map ) { - if ( this.map.hasOwnProperty( k ) ) { - this.helper.dispose( this.map[ k ].value, k ); - } + en.touched = true; + return en.value; + } + + clear() { + for (let k in this.map) { + if (this.map.hasOwnProperty(k)) { + this.helper.dispose(this.map[k].value, k); } - this.map = { }; } + this.map = {}; + } - remove( key : string ) { - if ( this.map.hasOwnProperty( key ) ) { - this.helper.dispose( this.map[ key ].value, key ); - delete this.map[ key ]; - } + remove(key: string) { + if (this.map.hasOwnProperty(key)) { + this.helper.dispose(this.map[key].value, key); + delete this.map[key]; } + } - removeAll( keys : string[] ) { - for ( var i = 0; i < keys.length; i++ ) { - this.remove( keys[ i ] ); - } + removeAll(keys: string[]) { + for (let i = 0; i < keys.length; i++) { + this.remove(keys[i]); } + } - retain( key : string ) { - var newMap : { [ k : string ] : CacheEntry; } = { }; - if ( this.map.hasOwnProperty( key ) ) { - newMap[ key ] = this.map[ key ]; - delete this.map[ key ]; - } - for ( var k in this.map ) { - if ( this.map.hasOwnProperty( k ) ) { - this.helper.dispose( this.map[ k ].value, k ); - } + retain(key: string) { + let newMap: { [k: string]: CacheEntry; } = {}; + if (this.map.hasOwnProperty(key)) { + newMap[key] = this.map[key]; + delete this.map[key]; + } + for (let k in this.map) { + if (this.map.hasOwnProperty(k)) { + this.helper.dispose(this.map[k].value, k); } - this.map = newMap; } + this.map = newMap; + } - retainAll( keys : string[] ) { - var newMap : { [ key : string ] : CacheEntry; } = { }; - for ( var i = 0; i < keys.length; i++ ) { - var k = keys[ i ]; - if ( this.map.hasOwnProperty( k ) ) { - newMap[ k ] = this.map[ k ]; - delete this.map[ k ]; - } + retainAll(keys: string[]) { + let newMap: { [key: string]: CacheEntry; } = {}; + for (let i = 0; i < keys.length; i++) { + let k = keys[i]; + if (this.map.hasOwnProperty(k)) { + newMap[k] = this.map[k]; + delete this.map[k]; } - for ( var k2 in this.map ) { - if ( this.map.hasOwnProperty( k2 ) ) { - this.helper.dispose( this.map[ k2 ].value, k2 ); - } + } + for (let k2 in this.map) { + if (this.map.hasOwnProperty(k2)) { + this.helper.dispose(this.map[k2].value, k2); } - this.map = newMap; } + this.map = newMap; + } - resetTouches( ) { - for ( var k in this.map ) { - if ( this.map.hasOwnProperty( k ) ) { - this.map[ k ].touched = false; - } + resetTouches() { + for (let k in this.map) { + if (this.map.hasOwnProperty(k)) { + this.map[k].touched = false; } } + } - retainTouched( ) { - var newMap : { [ k : string ] : CacheEntry; } = { }; - for ( var k in this.map ) { - if ( this.map.hasOwnProperty( k ) ) { - var en = this.map[ k ]; - if ( en.touched ) { - newMap[ k ] = this.map[ k ]; - } - else { - this.helper.dispose( en.value, k ); - } + retainTouched() { + let newMap: { [k: string]: CacheEntry; } = {}; + for (let k in this.map) { + if (this.map.hasOwnProperty(k)) { + let en = this.map[k]; + if (en.touched) { + newMap[k] = this.map[k]; + } + else { + this.helper.dispose(en.value, k); } } - this.map = newMap; } + this.map = newMap; } +} diff --git a/src/webglimpse/util/multikey_cache.ts b/src/webglimpse/util/multikey_cache.ts index e8e35ca..02428ef 100644 --- a/src/webglimpse/util/multikey_cache.ts +++ b/src/webglimpse/util/multikey_cache.ts @@ -30,173 +30,173 @@ - export interface MultiKeyCacheHelper { - create( keyParts : string[] ) : V; - dispose( value : V, keyParts : string[] ); - } +export interface MultiKeyCacheHelper { + create(keyParts: string[]): V; + dispose(value: V, keyParts: string[]): void; +} - class MultiKeyCacheEntry { - keyParts : string[]; - value : V; - touched : boolean = false; +class MultiKeyCacheEntry { + keyParts: string[]; + value: V; + touched: boolean = false; - constructor( keyParts : string[], value : V ) { - this.keyParts = keyParts; - this.value = value; - } + constructor(keyParts: string[], value: V) { + this.keyParts = keyParts; + this.value = value; } +} - export class MultiKeyCache { - private helper : MultiKeyCacheHelper; - private map : { [ key : string ] : MultiKeyCacheEntry; }; +export class MultiKeyCache { + private helper: MultiKeyCacheHelper; + private map: { [key: string]: MultiKeyCacheEntry; }; - constructor( helper : MultiKeyCacheHelper ) { - this.helper = helper; - this.map = { }; - } + constructor(helper: MultiKeyCacheHelper) { + this.helper = helper; + this.map = {}; + } - private combineKeyParts( keyParts : string[] ) : string { - var esc = '\\'; - var sep = ';'; - var escapedEsc = esc + esc; - var escapedSep = esc + sep; + private combineKeyParts(keyParts: string[]): string { + let esc = '\\'; + let sep = ';'; + let escapedEsc = esc + esc; + let escapedSep = esc + sep; - var escapedParts = [ ]; - for ( var n = 0; n < keyParts.length; n++ ) { - escapedParts[ n ] = keyParts[ n ].replace( esc, escapedEsc ).replace( sep, escapedSep ); - } - return escapedParts.join( sep ); + let escapedParts = []; + for (let n = 0; n < keyParts.length; n++) { + escapedParts[n] = keyParts[n].replace(esc, escapedEsc).replace(sep, escapedSep); } + return escapedParts.join(sep); + } - value( ...keyParts : string[] ) : V { - var key = this.combineKeyParts( keyParts ); - if ( !this.map.hasOwnProperty( key ) ) { - this.map[ key ] = new MultiKeyCacheEntry( keyParts, this.helper.create( keyParts ) ); - } - var en = this.map[ key ]; - - en.touched = true; - return en.value; + value(...keyParts: string[]): V { + let key = this.combineKeyParts(keyParts); + if (!this.map.hasOwnProperty(key)) { + this.map[key] = new MultiKeyCacheEntry(keyParts, this.helper.create(keyParts)); } + let en = this.map[key]; - remove( ...keyParts : string[] ) { - var key = this.combineKeyParts( keyParts ); - if ( this.map.hasOwnProperty( key ) ) { - var en = this.map[ key ]; - this.helper.dispose( en.value, en.keyParts ); - delete this.map[ key ]; - } + en.touched = true; + return en.value; + } + + remove(...keyParts: string[]) { + let key = this.combineKeyParts(keyParts); + if (this.map.hasOwnProperty(key)) { + let en = this.map[key]; + this.helper.dispose(en.value, en.keyParts); + delete this.map[key]; } + } - retain( ...keyParts : string[] ) { - var newMap : { [ k : string ] : MultiKeyCacheEntry; } = { }; - var retainKey = this.combineKeyParts( keyParts ); - if ( this.map.hasOwnProperty( retainKey ) ) { - newMap[ retainKey ] = this.map[ retainKey ]; - delete this.map[ retainKey ]; - } - for ( var key in this.map ) { - if ( this.map.hasOwnProperty( key ) ) { - var en = this.map[ key ]; - this.helper.dispose( en.value, en.keyParts ); - } + retain(...keyParts: string[]) { + let newMap: { [k: string]: MultiKeyCacheEntry; } = {}; + let retainKey = this.combineKeyParts(keyParts); + if (this.map.hasOwnProperty(retainKey)) { + newMap[retainKey] = this.map[retainKey]; + delete this.map[retainKey]; + } + for (let key in this.map) { + if (this.map.hasOwnProperty(key)) { + let en = this.map[key]; + this.helper.dispose(en.value, en.keyParts); } - this.map = newMap; } + this.map = newMap; + } - resetTouches( ) { - for ( var key in this.map ) { - if ( this.map.hasOwnProperty( key ) ) { - this.map[ key ].touched = false; - } + resetTouches() { + for (let key in this.map) { + if (this.map.hasOwnProperty(key)) { + this.map[key].touched = false; } } + } - retainTouched( ) { - var newMap : { [ key : string ] : MultiKeyCacheEntry; } = { }; - for ( var key in this.map ) { - if ( this.map.hasOwnProperty( key ) ) { - var en = this.map[ key ]; - if ( en.touched ) { - newMap[ key ] = this.map[ key ]; - } - else { - this.helper.dispose( en.value, en.keyParts ); - } + retainTouched() { + let newMap: { [key: string]: MultiKeyCacheEntry; } = {}; + for (let key in this.map) { + if (this.map.hasOwnProperty(key)) { + let en = this.map[key]; + if (en.touched) { + newMap[key] = this.map[key]; + } + else { + this.helper.dispose(en.value, en.keyParts); } } - this.map = newMap; } + this.map = newMap; + } - clear( ) { - for ( var key in this.map ) { - if ( this.map.hasOwnProperty( key ) ) { - var en = this.map[ key ]; - this.helper.dispose( en.value, en.keyParts ); - } + clear() { + for (let key in this.map) { + if (this.map.hasOwnProperty(key)) { + let en = this.map[key]; + this.helper.dispose(en.value, en.keyParts); } - this.map = { }; } + this.map = {}; } +} - export interface TwoKeyCacheHelper { - create( keyPart1 : string, keyPart2 : string ) : V; - dispose( value : V, keyPart1 : string, keyPart2 : string ); - } +export interface TwoKeyCacheHelper { + create(keyPart1: string, keyPart2: string): V; + dispose(value: V, keyPart1: string, keyPart2: string): void; +} - export class TwoKeyCache { - private cache : MultiKeyCache; +export class TwoKeyCache { + private cache: MultiKeyCache; - constructor( helper : TwoKeyCacheHelper ) { - this.cache = new MultiKeyCache( { - create: function( keyParts : string[] ) : V { - return helper.create( keyParts[ 0 ], keyParts[ 1 ] ); - }, - dispose: function( value : V, keyParts : string[] ) { - helper.dispose( value, keyParts[ 0 ], keyParts[ 1 ] ); - } - } ); - } - - value( keyPart1 : string, keyPart2 : string ) : V { return this.cache.value( keyPart1, keyPart2 ); } - remove( keyPart1 : string, keyPart2 : string ) { this.cache.remove( keyPart1, keyPart2 ); } - retain( keyPart1 : string, keyPart2 : string ) { this.cache.retain( keyPart1, keyPart2 ); } - resetTouches( ) { this.cache.resetTouches( ); } - retainTouched( ) { this.cache.retainTouched( ); } - clear( ) { this.cache.clear( ); } + constructor(helper: TwoKeyCacheHelper) { + this.cache = new MultiKeyCache({ + create: function (keyParts: string[]): V { + return helper.create(keyParts[0], keyParts[1]); + }, + dispose: function (value: V, keyParts: string[]) { + helper.dispose(value, keyParts[0], keyParts[1]); + } + }); } + value(keyPart1: string, keyPart2: string): V { return this.cache.value(keyPart1, keyPart2); } + remove(keyPart1: string, keyPart2: string) { this.cache.remove(keyPart1, keyPart2); } + retain(keyPart1: string, keyPart2: string) { this.cache.retain(keyPart1, keyPart2); } + resetTouches() { this.cache.resetTouches(); } + retainTouched() { this.cache.retainTouched(); } + clear() { this.cache.clear(); } +} - export interface ThreeKeyCacheHelper { - create( keyPart1 : string, keyPart2 : string, keyPart3 : string ) : V; - dispose( value : V, keyPart1 : string, keyPart2 : string, keyPart3 : string ); - } +export interface ThreeKeyCacheHelper { + create(keyPart1: string, keyPart2: string, keyPart3: string): V; + dispose(value: V, keyPart1: string, keyPart2: string, keyPart3: string): void; +} - export class ThreeKeyCache { - private cache : MultiKeyCache; - constructor( helper : ThreeKeyCacheHelper ) { - this.cache = new MultiKeyCache( { - create: function( keyParts : string[] ) : V { - return helper.create( keyParts[ 0 ], keyParts[ 1 ], keyParts[ 2 ] ); - }, - dispose: function( value : V, keyParts : string[] ) { - helper.dispose( value, keyParts[ 0 ], keyParts[ 1 ], keyParts[ 2 ] ); - } - } ); - } +export class ThreeKeyCache { + private cache: MultiKeyCache; - value( keyPart1 : string, keyPart2 : string, keyPart3 : string ) : V { return this.cache.value( keyPart1, keyPart2, keyPart3 ); } - remove( keyPart1 : string, keyPart2 : string, keyPart3 : string ) { this.cache.remove( keyPart1, keyPart2, keyPart3 ); } - retain( keyPart1 : string, keyPart2 : string, keyPart3 : string ) { this.cache.retain( keyPart1, keyPart2, keyPart3 ); } - resetTouches( ) { this.cache.resetTouches( ); } - retainTouched( ) { this.cache.retainTouched( ); } - clear( ) { this.cache.clear( ); } + constructor(helper: ThreeKeyCacheHelper) { + this.cache = new MultiKeyCache({ + create: function (keyParts: string[]): V { + return helper.create(keyParts[0], keyParts[1], keyParts[2]); + }, + dispose: function (value: V, keyParts: string[]) { + helper.dispose(value, keyParts[0], keyParts[1], keyParts[2]); + } + }); } + value(keyPart1: string, keyPart2: string, keyPart3: string): V { return this.cache.value(keyPart1, keyPart2, keyPart3); } + remove(keyPart1: string, keyPart2: string, keyPart3: string) { this.cache.remove(keyPart1, keyPart2, keyPart3); } + retain(keyPart1: string, keyPart2: string, keyPart3: string) { this.cache.retain(keyPart1, keyPart2, keyPart3); } + resetTouches() { this.cache.resetTouches(); } + retainTouched() { this.cache.retainTouched(); } + clear() { this.cache.clear(); } +} + diff --git a/src/webglimpse/util/notification.ts b/src/webglimpse/util/notification.ts index 1c25df3..13d609e 100644 --- a/src/webglimpse/util/notification.ts +++ b/src/webglimpse/util/notification.ts @@ -27,247 +27,247 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { OrderedSet } from './ordered_set'; +import { getObjectId } from './util'; +export interface Listener { + /** + * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified + */ + (): any; +} - export interface Listener { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - ( ) : any; - } +export interface Listener1 { + /** + * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified + */ + (a: A): any; +} - export interface Listener1 { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - ( a : A ) : any; - } +export interface Listener2 { + /** + * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified + */ + (a: A, b: B): any; +} - export interface Listener2 { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - ( a : A, b : B ) : any; - } +export interface Listener3 { + /** + * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified + */ + (a: A, b: B, c: C): any; +} - export interface Listener3 { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - ( a : A, b : B, c : C ) : any; - } - - - interface Action { - ( ) : void; - } +interface Action { + (): void; +} - export class Notification { - private _listeners : OrderedSet = new OrderedSet( [], getObjectId, false ); - private _deferring : boolean = false; - private _deferred : Action[] = []; +export class Notification { + private _listeners: OrderedSet = new OrderedSet([], getObjectId, false); + private _deferring: boolean = false; + private _deferred: Action[] = []; - on( listener : Listener ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.add( listener ); } ); - } - else { - this._listeners.add( listener ); - } + on(listener: Listener) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.add(listener); }); } - - off( listener : Listener ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.removeValue( listener ); } ); - } - else { - this._listeners.removeValue( listener ); - } + else { + this._listeners.add(listener); } + } - dispose( ) { - this._listeners.removeAll( ); + off(listener: Listener) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.removeValue(listener); }); + } + else { + this._listeners.removeValue(listener); } + } - fire( ) : any { - this._deferring = true; - try { - for ( var n = 0; n < this._listeners.length; n++ ) { - var consumed = this._listeners.valueAt( n )( ); - if ( consumed ) return consumed; - } - return false; + dispose() { + this._listeners.removeAll(); + } + + fire(): any { + this._deferring = true; + try { + for (let n = 0; n < this._listeners.length; n++) { + let consumed = this._listeners.valueAt(n)(); + if (consumed) return consumed; } - finally { - if ( this._deferred.length > 0 ) { - for ( var n = 0; n < this._deferred.length; n++ ) { - this._deferred[ n ]( ); - } - this._deferred = []; + return false; + } + finally { + if (this._deferred.length > 0) { + for (let n = 0; n < this._deferred.length; n++) { + this._deferred[n](); } - this._deferring = false; + this._deferred = []; } + this._deferring = false; } } +} - export class Notification1 { - private _listeners : OrderedSet> = new OrderedSet>( [], getObjectId, false ); - private _deferring : boolean = false; - private _deferred : Action[] = []; +export class Notification1 { + private _listeners: OrderedSet> = new OrderedSet>([], getObjectId, false); + private _deferring: boolean = false; + private _deferred: Action[] = []; - on( listener : Listener1 ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.add( listener ); } ); - } - else { - this._listeners.add( listener ); - } + on(listener: Listener1) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.add(listener); }); } - - off( listener : Listener1 ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.removeValue( listener ); } ); - } - else { - this._listeners.removeValue( listener ); - } + else { + this._listeners.add(listener); } + } - dispose( ) { - this._listeners.removeAll( ); + off(listener: Listener1) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.removeValue(listener); }); } + else { + this._listeners.removeValue(listener); + } + } - fire( a : A ) : any { - this._deferring = true; - try { - for ( var n = 0; n < this._listeners.length; n++ ) { - var consumed = this._listeners.valueAt( n )( a ); - if ( consumed ) return consumed; - } - return false; + dispose() { + this._listeners.removeAll(); + } + + fire(a: A): any { + this._deferring = true; + try { + for (let n = 0; n < this._listeners.length; n++) { + let consumed = this._listeners.valueAt(n)(a); + if (consumed) return consumed; } - finally { - if ( this._deferred.length > 0 ) { - for ( var n = 0; n < this._deferred.length; n++ ) { - this._deferred[ n ]( ); - } - this._deferred = []; + return false; + } + finally { + if (this._deferred.length > 0) { + for (let n = 0; n < this._deferred.length; n++) { + this._deferred[n](); } - this._deferring = false; + this._deferred = []; } + this._deferring = false; } } +} - export class Notification2 { - private _listeners : OrderedSet> = new OrderedSet>( [], getObjectId, false ); - private _deferring : boolean = false; - private _deferred : Action[] = []; +export class Notification2 { + private _listeners: OrderedSet> = new OrderedSet>([], getObjectId, false); + private _deferring: boolean = false; + private _deferred: Action[] = []; - on( listener : Listener2 ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.add( listener ); } ); - } - else { - this._listeners.add( listener ); - } + on(listener: Listener2) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.add(listener); }); } - - off( listener : Listener2 ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.removeValue( listener ); } ); - } - else { - this._listeners.removeValue( listener ); - } + else { + this._listeners.add(listener); } + } - dispose( ) { - this._listeners.removeAll( ); + off(listener: Listener2) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.removeValue(listener); }); } + else { + this._listeners.removeValue(listener); + } + } - fire( a : A, b : B ) : any { - this._deferring = true; - try { - for ( var n = 0; n < this._listeners.length; n++ ) { - var consumed = this._listeners.valueAt( n )( a, b ); - if ( consumed ) return consumed; - } - return false; + dispose() { + this._listeners.removeAll(); + } + + fire(a: A, b: B): any { + this._deferring = true; + try { + for (let n = 0; n < this._listeners.length; n++) { + let consumed = this._listeners.valueAt(n)(a, b); + if (consumed) return consumed; } - finally { - if ( this._deferred.length > 0 ) { - for ( var n = 0; n < this._deferred.length; n++ ) { - this._deferred[ n ]( ); - } - this._deferred = []; + return false; + } + finally { + if (this._deferred.length > 0) { + for (let n = 0; n < this._deferred.length; n++) { + this._deferred[n](); } - this._deferring = false; + this._deferred = []; } + this._deferring = false; } } +} - export class Notification3 { - private _listeners : OrderedSet> = new OrderedSet>( [], getObjectId, false ); - private _deferring : boolean = false; - private _deferred : Action[] = []; +export class Notification3 { + private _listeners: OrderedSet> = new OrderedSet>([], getObjectId, false); + private _deferring: boolean = false; + private _deferred: Action[] = []; - on( listener : Listener3 ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.add( listener ); } ); - } - else { - this._listeners.add( listener ); - } + on(listener: Listener3) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.add(listener); }); } - - off( listener : Listener3 ) { - if ( this._deferring ) { - var self = this; - this._deferred.push( function( ) { self._listeners.removeValue( listener ); } ); - } - else { - this._listeners.removeValue( listener ); - } + else { + this._listeners.add(listener); } + } - dispose( ) { - this._listeners.removeAll( ); + off(listener: Listener3) { + if (this._deferring) { + let self = this; + this._deferred.push(function () { self._listeners.removeValue(listener); }); } + else { + this._listeners.removeValue(listener); + } + } - fire( a : A, b : B, c : C ) : any { - this._deferring = true; - try { - for ( var n = 0; n < this._listeners.length; n++ ) { - var consumed = this._listeners.valueAt( n )( a, b, c ); - if ( consumed ) return consumed; - } - return false; + dispose() { + this._listeners.removeAll(); + } + + fire(a: A, b: B, c: C): any { + this._deferring = true; + try { + for (let n = 0; n < this._listeners.length; n++) { + let consumed = this._listeners.valueAt(n)(a, b, c); + if (consumed) return consumed; } - finally { - if ( this._deferred.length > 0 ) { - for ( var n = 0; n < this._deferred.length; n++ ) { - this._deferred[ n ]( ); - } - this._deferred = []; + return false; + } + finally { + if (this._deferred.length > 0) { + for (let n = 0; n < this._deferred.length; n++) { + this._deferred[n](); } - this._deferring = false; + this._deferred = []; } + this._deferring = false; } } +} diff --git a/src/webglimpse/util/ordered_set.ts b/src/webglimpse/util/ordered_set.ts index 27d9f57..4d7c2a0 100644 --- a/src/webglimpse/util/ordered_set.ts +++ b/src/webglimpse/util/ordered_set.ts @@ -27,569 +27,570 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { IdFunction, StringMap, isString, getObjectId, copyArray, hasval } from './util'; +import { Notification2, Notification3 } from './notification'; +import { indexOf } from './sorted_arrays'; - - - function requireString( s : string ) : string { - if ( isString( s ) ) { - return s; - } - else { - throw new Error( 'Expected a string, but value is ' + s ); - } - } - - - export class OrderedSet { - private _idOf : IdFunction; - private _ids : string[]; - private _indexes : StringMap; - private _valuesArray : V[]; - private _valuesMap : StringMap; - private _valueAdded : Notification2; - private _valueMoved : Notification3; - private _valueRemoved : Notification2; - - constructor( values : V[] = [], idFn : IdFunction = getObjectId, useNotifications : boolean = true ) { - this._idOf = idFn; - this._valuesArray = copyArray( values ); - this._ids = []; - this._indexes = {}; - this._valuesMap = {}; - for ( var n = 0; n < this._valuesArray.length; n++ ) { - var value = this._valuesArray[ n ]; - var id = requireString( this._idOf( value ) ); - this._ids[ n ] = id; - this._indexes[ id ] = n; - this._valuesMap[ id ] = value; - } - if ( useNotifications ) { - this._valueAdded = new Notification2( ); - this._valueMoved = new Notification3( ); - this._valueRemoved = new Notification2( ); - } +function requireString(s: string): string { + if (isString(s)) { + return s; + } + else { + throw new Error('Expected a string, but value is ' + s); + } +} + + +export class OrderedSet { + private _idOf: IdFunction; + private _ids: string[]; + private _indexes: StringMap; + private _valuesArray: V[]; + private _valuesMap: StringMap; + private _valueAdded: Notification2; + private _valueMoved: Notification3; + private _valueRemoved: Notification2; + + constructor(values: V[] = [], idFn: IdFunction = getObjectId, useNotifications: boolean = true) { + this._idOf = idFn; + this._valuesArray = copyArray(values); + this._ids = []; + this._indexes = {}; + this._valuesMap = {}; + for (let n = 0; n < this._valuesArray.length; n++) { + let value = this._valuesArray[n]; + let id = requireString(this._idOf(value)); + this._ids[n] = id; + this._indexes[id] = n; + this._valuesMap[id] = value; + } + if (useNotifications) { + this._valueAdded = new Notification2(); + this._valueMoved = new Notification3(); + this._valueRemoved = new Notification2(); } + } - get valueAdded( ) : Notification2 { - return this._valueAdded; - } + get valueAdded(): Notification2 { + return this._valueAdded; + } - get valueMoved( ) : Notification3 { - return this._valueMoved; - } + get valueMoved(): Notification3 { + return this._valueMoved; + } - get valueRemoved( ) : Notification2 { - return this._valueRemoved; - } + get valueRemoved(): Notification2 { + return this._valueRemoved; + } - get length( ) : number { - return this._valuesArray.length; - } + get length(): number { + return this._valuesArray.length; + } - get isEmpty( ) : boolean { - return ( this._valuesArray.length === 0 ); - } + get isEmpty(): boolean { + return (this._valuesArray.length === 0); + } - toArray( ) : V[] { - return copyArray( this._valuesArray ); - } + toArray(): V[] { + return copyArray(this._valuesArray); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - every( callbackFn : (value:V,index:number,array:V[])=>boolean, thisArg? : any ) : boolean { - return this._valuesArray.every( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + every(callbackFn: (value: V, index: number, array: V[]) => boolean, thisArg?: any): boolean { + return this._valuesArray.every(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - some( callbackFn : (value:V,index:number,array:V[])=>boolean, thisArg? : any ) : boolean { - return this._valuesArray.some( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + some(callbackFn: (value: V, index: number, array: V[]) => boolean, thisArg?: any): boolean { + return this._valuesArray.some(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - forEach( callbackFn : (value:V,index:number,array:V[])=>void, thisArg? : any) : void { - this._valuesArray.forEach( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + forEach(callbackFn: (value: V, index: number, array: V[]) => void, thisArg?: any): void { + this._valuesArray.forEach(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - map( callbackFn : (value:V,index:number,array:V[])=>U, thisArg? : any ) : U[] { - return this._valuesArray.map( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + map(callbackFn: (value: V, index: number, array: V[]) => U, thisArg?: any): U[] { + return this._valuesArray.map(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - filter( callbackFn : (value:V,index:number,array:V[])=>boolean, thisArg? : any ) : V[] { - return this._valuesArray.filter( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + filter(callbackFn: (value: V, index: number, array: V[]) => boolean, thisArg?: any): V[] { + return this._valuesArray.filter(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - reduce( callbackFn: (previousValue:U,currentValue:V,currentIndex:number,array:V[])=>U, initialValue : U ) : U { - return this._valuesArray.reduce( callbackFn, initialValue ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + reduce(callbackFn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue: U): U { + return this._valuesArray.reduce(callbackFn, initialValue); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedSet is undefined. - */ - reduceRight( callbackFn : (previousValue:U,currentValue:V,currentIndex:number,array:V[])=>U, initialValue : U ) : U { - return this._valuesArray.reduceRight( callbackFn, initialValue ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedSet is undefined. + */ + reduceRight(callbackFn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue: U): U { + return this._valuesArray.reduceRight(callbackFn, initialValue); + } - idAt( index : number ) : string { - return this._ids[ index ]; - } + idAt(index: number): string { + return this._ids[index]; + } - valueAt( index : number ) : V { - return this._valuesArray[ index ]; - } + valueAt(index: number): V { + return this._valuesArray[index]; + } - indexFor( id : string ) : number { - return ( isString( id ) ? this._indexes[ id ] : undefined ); - } + indexFor(id: string): number { + return (isString(id) ? this._indexes[id] : undefined); + } - valueFor( id : string ) : V { - return ( isString( id ) ? this._valuesMap[ id ] : undefined ); - } + valueFor(id: string): V { + return (isString(id) ? this._valuesMap[id] : undefined); + } - idOf( value : V ) : string { - return requireString( this._idOf( value ) ); - } + idOf(value: V): string { + return requireString(this._idOf(value)); + } - indexOf( value : V ) : number { - return this._indexes[ requireString( this._idOf( value ) ) ]; - } + indexOf(value: V): number { + return this._indexes[requireString(this._idOf(value))]; + } - hasValue( value : V ) : boolean { - return this.hasId( requireString( this._idOf( value ) ) ); - } + hasValue(value: V): boolean { + return this.hasId(requireString(this._idOf(value))); + } - hasValues( values : V[] ) : boolean { - for ( var n = 0; n < values.length; n++ ) { - if ( !this.hasValue( values[ n ] ) ) { - return false; - } + hasValues(values: V[]): boolean { + for (let n = 0; n < values.length; n++) { + if (!this.hasValue(values[n])) { + return false; } - return true; } + return true; + } - hasId( id : string ) : boolean { - return ( isString( id ) && hasval( this._valuesMap[ id ] ) ); - } + hasId(id: string): boolean { + return (isString(id) && hasval(this._valuesMap[id])); + } - hasIds( ids : string[] ) : boolean { - for ( var n = 0; n < ids.length; n++ ) { - if ( !this.hasId( ids[ n ] ) ) { - return false; - } + hasIds(ids: string[]): boolean { + for (let n = 0; n < ids.length; n++) { + if (!this.hasId(ids[n])) { + return false; } - return true; } + return true; + } - add( value : V, index? : number, moveIfExists? : boolean ) { - var index = ( hasval( index ) ? index : this._valuesArray.length ); - if ( !hasval( moveIfExists ) ) moveIfExists = false; - this._add( value, index, moveIfExists ); - } + add(value: V, index?: number, moveIfExists?: boolean) { + index = (hasval(index) ? index : this._valuesArray.length); + if (!hasval(moveIfExists)) moveIfExists = false; + this._add(value, index, moveIfExists); + } - addAll( values : V[], index? : number, moveIfExists? : boolean ) { - var index = ( hasval( index ) ? index : this._valuesArray.length ); - if ( !hasval( moveIfExists ) ) moveIfExists = false; - for ( var n = 0; n < values.length; n++ ) { - var actualIndex = this._add( values[ n ], index, moveIfExists ); - index = actualIndex + 1; - } + addAll(values: V[], index?: number, moveIfExists?: boolean) { + index = (hasval(index) ? index : this._valuesArray.length); + if (!hasval(moveIfExists)) moveIfExists = false; + for (let n = 0; n < values.length; n++) { + let actualIndex = this._add(values[n], index, moveIfExists); + index = actualIndex + 1; } + } - private _add( value : V, newIndex : number, moveIfExists : boolean ) : number { - var id = requireString( this._idOf( value ) ); - - var oldIndex = this._indexes[ id ]; - if ( !hasval( oldIndex ) ) { - this._ids.splice( newIndex, 0, id ); - this._valuesArray.splice( newIndex, 0, value ); - this._valuesMap[ id ] = value; - for ( var n = newIndex; n < this._ids.length; n++ ) { - this._indexes[ this._ids[ n ] ] = n; - } - if ( this._valueAdded ) { - this._valueAdded.fire( value, newIndex ); + private _add(value: V, newIndex: number, moveIfExists: boolean): number { + let id = requireString(this._idOf(value)); + + let oldIndex = this._indexes[id]; + if (!hasval(oldIndex)) { + this._ids.splice(newIndex, 0, id); + this._valuesArray.splice(newIndex, 0, value); + this._valuesMap[id] = value; + for (let n = newIndex; n < this._ids.length; n++) { + this._indexes[this._ids[n]] = n; + } + if (this._valueAdded) { + this._valueAdded.fire(value, newIndex); + } + } + else if (newIndex !== oldIndex && moveIfExists) { + this._ids.splice(oldIndex, 1); + this._valuesArray.splice(oldIndex, 1); + if (newIndex > oldIndex) { + newIndex--; + this._ids.splice(newIndex, 0, id); + this._valuesArray.splice(newIndex, 0, value); + for (let n = oldIndex; n <= newIndex; n++) { + this._indexes[this._ids[n]] = n; } } - else if ( newIndex !== oldIndex && moveIfExists ) { - this._ids.splice( oldIndex, 1 ); - this._valuesArray.splice( oldIndex, 1 ); - if ( newIndex > oldIndex ) { - newIndex--; - this._ids.splice( newIndex, 0, id ); - this._valuesArray.splice( newIndex, 0, value ); - for ( var n = oldIndex; n <= newIndex; n++ ) { - this._indexes[ this._ids[ n ] ] = n; - } - } - else { - this._ids.splice( newIndex, 0, id ); - this._valuesArray.splice( newIndex, 0, value ); - for ( var n = newIndex; n <= oldIndex; n++ ) { - this._indexes[ this._ids[ n ] ] = n; - } - } - if ( this._valueMoved ) { - this._valueMoved.fire( value, oldIndex, newIndex ); + else { + this._ids.splice(newIndex, 0, id); + this._valuesArray.splice(newIndex, 0, value); + for (let n = newIndex; n <= oldIndex; n++) { + this._indexes[this._ids[n]] = n; } } - else { - newIndex = oldIndex; + if (this._valueMoved) { + this._valueMoved.fire(value, oldIndex, newIndex); } - - // Return the actual insertion index -- may differ from the originally - // requested index if an existing value had to be moved - return newIndex; } - - removeValue( value : V ) { - this.removeId( requireString( this._idOf( value ) ) ); + else { + newIndex = oldIndex; } - removeId( id : string ) { - if ( isString( id ) ) { - var index = this._indexes[ id ]; - if ( hasval( index ) ) { - this._remove( id, index ); - } + // Return the actual insertion index -- may differ from the originally + // requested index if an existing value had to be moved + return newIndex; + } + + removeValue(value: V) { + this.removeId(requireString(this._idOf(value))); + } + + removeId(id: string) { + if (isString(id)) { + let index = this._indexes[id]; + if (hasval(index)) { + this._remove(id, index); } } + } - removeIndex( index : number ) { - var id = this._ids[ index ]; - if ( isString( id ) ) { - this._remove( id, index ); - } + removeIndex(index: number) { + let id = this._ids[index]; + if (isString(id)) { + this._remove(id, index); } + } - removeAll( ) { - // Remove from last to first, to minimize index shifting - for ( var n = this._valuesArray.length-1; n >= 0; n-- ) { - var id = this._ids[ n ]; - this._remove( id, n ); - } + removeAll() { + // Remove from last to first, to minimize index shifting + for (let n = this._valuesArray.length - 1; n >= 0; n--) { + let id = this._ids[n]; + this._remove(id, n); } + } - retainValues( values : V[] ) { - var idsToRetain : StringMap = {}; - for ( var n = 0; n < values.length; n++ ) { - var id = this._idOf( values[ n ] ); - if ( isString( id ) ) { - idsToRetain[ id ] = true; - } + retainValues(values: V[]) { + let idsToRetain: StringMap = {}; + for (let n = 0; n < values.length; n++) { + let id = this._idOf(values[n]); + if (isString(id)) { + idsToRetain[id] = true; } - this._retain( idsToRetain ); } + this._retain(idsToRetain); + } - retainIds( ids : string[] ) { - var idsToRetain : StringMap = {}; - for ( var n = 0; n < ids.length; n++ ) { - var id = ids[ n ]; - if ( isString( id ) ) { - idsToRetain[ id ] = true; - } + retainIds(ids: string[]) { + let idsToRetain: StringMap = {}; + for (let n = 0; n < ids.length; n++) { + let id = ids[n]; + if (isString(id)) { + idsToRetain[id] = true; } - this._retain( idsToRetain ); } + this._retain(idsToRetain); + } - retainIndices( indices : number[] ) { - var idsToRetain : StringMap = {}; - for ( var n = 0; n < indices.length; n++ ) { - var id = this._ids[ indices[ n ] ]; - idsToRetain[ id ] = true; - } - this._retain( idsToRetain ); + retainIndices(indices: number[]) { + let idsToRetain: StringMap = {}; + for (let n = 0; n < indices.length; n++) { + let id = this._ids[indices[n]]; + idsToRetain[id] = true; } + this._retain(idsToRetain); + } - private _retain( ids : StringMap ) { - // Remove from last to first, to minimize index shifting - for ( var n = this._valuesArray.length-1; n >= 0; n-- ) { - var id = this._ids[ n ]; - if ( !ids.hasOwnProperty( id ) ) { - this._remove( id, n ); - } + private _retain(ids: StringMap) { + // Remove from last to first, to minimize index shifting + for (let n = this._valuesArray.length - 1; n >= 0; n--) { + let id = this._ids[n]; + if (!ids.hasOwnProperty(id)) { + this._remove(id, n); } } + } - private _remove( id : string, index : number ) { - var value = this._valuesArray[ index ]; - this._ids.splice( index, 1 ); - this._valuesArray.splice( index, 1 ); - delete this._indexes[ id ]; - delete this._valuesMap[ id ]; - for ( var n = index; n < this._ids.length; n++ ) { - this._indexes[ this._ids[ n ] ] = n; - } - if ( this._valueRemoved ) { - this._valueRemoved.fire( value, index ); - } + private _remove(id: string, index: number) { + let value = this._valuesArray[index]; + this._ids.splice(index, 1); + this._valuesArray.splice(index, 1); + delete this._indexes[id]; + delete this._valuesMap[id]; + for (let n = index; n < this._ids.length; n++) { + this._indexes[this._ids[n]] = n; + } + if (this._valueRemoved) { + this._valueRemoved.fire(value, index); } } +} - export class OrderedStringSet { - private _indexes : StringMap; - private _valuesArray : string[]; - private _valueAdded : Notification2; - private _valueMoved : Notification3; - private _valueRemoved : Notification2; +export class OrderedStringSet { + private _indexes: StringMap; + private _valuesArray: string[]; + private _valueAdded: Notification2; + private _valueMoved: Notification3; + private _valueRemoved: Notification2; - constructor( values : string[] = [], useNotifications : boolean = true ) { - this._valuesArray = []; - this._indexes = {}; - for ( var n = 0; n < values.length; n++ ) { - var value = requireString( values[ n ] ); - this._valuesArray[ n ] = value; - this._indexes[ value ] = n; - } - if ( useNotifications ) { - this._valueAdded = new Notification2( ); - this._valueMoved = new Notification3( ); - this._valueRemoved = new Notification2( ); - } + constructor(values: string[] = [], useNotifications: boolean = true) { + this._valuesArray = []; + this._indexes = {}; + for (let n = 0; n < values.length; n++) { + let value = requireString(values[n]); + this._valuesArray[n] = value; + this._indexes[value] = n; } - - get valueAdded( ) : Notification2 { - return this._valueAdded; + if (useNotifications) { + this._valueAdded = new Notification2(); + this._valueMoved = new Notification3(); + this._valueRemoved = new Notification2(); } + } - get valueMoved( ) : Notification3 { - return this._valueMoved; - } + get valueAdded(): Notification2 { + return this._valueAdded; + } - get valueRemoved( ) : Notification2 { - return this._valueRemoved; - } + get valueMoved(): Notification3 { + return this._valueMoved; + } - get length( ) : number { - return this._valuesArray.length; - } + get valueRemoved(): Notification2 { + return this._valueRemoved; + } - get isEmpty( ) : boolean { - return ( this._valuesArray.length === 0 ); - } + get length(): number { + return this._valuesArray.length; + } - toArray( ) : string[] { - return copyArray( this._valuesArray ); - } + get isEmpty(): boolean { + return (this._valuesArray.length === 0); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - every( callbackFn : (value:string,index:number,array:string[])=>boolean, thisArg? : any ) : boolean { - return this._valuesArray.every( callbackFn, thisArg ); - } + toArray(): string[] { + return copyArray(this._valuesArray); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - some( callbackFn : (value:string,index:number,array:string[])=>boolean, thisArg? : any ) : boolean { - return this._valuesArray.some( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + every(callbackFn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean { + return this._valuesArray.every(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - forEach( callbackFn : (value:string,index:number,array:string[])=>void, thisArg? : any) : void { - this._valuesArray.forEach( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + some(callbackFn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean { + return this._valuesArray.some(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - map( callbackFn : (value:string,index:number,array:string[])=>U, thisArg? : any ) : U[] { - return this._valuesArray.map( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + forEach(callbackFn: (value: string, index: number, array: string[]) => void, thisArg?: any): void { + this._valuesArray.forEach(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - filter( callbackFn : (value:string,index:number,array:string[])=>boolean, thisArg? : any ) : string[] { - return this._valuesArray.filter( callbackFn, thisArg ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + map(callbackFn: (value: string, index: number, array: string[]) => U, thisArg?: any): U[] { + return this._valuesArray.map(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - reduce( callbackFn: (previousValue:U,currentValue:string,currentIndex:number,array:string[])=>U, initialValue : U ) : U { - return this._valuesArray.reduce( callbackFn, initialValue ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + filter(callbackFn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): string[] { + return this._valuesArray.filter(callbackFn, thisArg); + } - /** - * The callback should not modify its array arg; if it does, the subsequent behavior - * of this OrderedStringSet is undefined. - */ - reduceRight( callbackFn : (previousValue:U,currentValue:string,currentIndex:number,array:string[])=>U, initialValue : U ) : U { - return this._valuesArray.reduceRight( callbackFn, initialValue ); - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + reduce(callbackFn: (previousValue: U, currentValue: string, currentIndex: number, array: string[]) => U, initialValue: U): U { + return this._valuesArray.reduce(callbackFn, initialValue); + } - valueAt( index : number ) : string { - return this._valuesArray[ index ]; - } + /** + * The callback should not modify its array arg; if it does, the subsequent behavior + * of this OrderedStringSet is undefined. + */ + reduceRight(callbackFn: (previousValue: U, currentValue: string, currentIndex: number, array: string[]) => U, initialValue: U): U { + return this._valuesArray.reduceRight(callbackFn, initialValue); + } - indexOf( value : string ) : number { - return ( isString( value ) ? this._indexes[ value ] : undefined ); - } + valueAt(index: number): string { + return this._valuesArray[index]; + } - hasValue( value : string ) : boolean { - return ( isString( value ) && hasval( this._indexes[ value ] ) ); - } + indexOf(value: string): number { + return (isString(value) ? this._indexes[value] : undefined); + } - hasValues( values : string[] ) : boolean { - for ( var n = 0; n < values.length; n++ ) { - if ( !this.hasValue( values[ n ] ) ) { - return false; - } + hasValue(value: string): boolean { + return (isString(value) && hasval(this._indexes[value])); + } + + hasValues(values: string[]): boolean { + for (let n = 0; n < values.length; n++) { + if (!this.hasValue(values[n])) { + return false; } - return true; } + return true; + } - add( value : string, index? : number, moveIfExists? : boolean ) { - var index = ( hasval( index ) ? index : this._valuesArray.length ); - if ( !hasval( moveIfExists ) ) moveIfExists = false; - this._add( value, index, moveIfExists ); - } + add(value: string, index?: number, moveIfExists?: boolean) { + index = (hasval(index) ? index : this._valuesArray.length); + if (!hasval(moveIfExists)) moveIfExists = false; + this._add(value, index, moveIfExists); + } - addAll( values : string[], index? : number, moveIfExists? : boolean ) { - var index = ( hasval( index ) ? index : this._valuesArray.length ); - if ( !hasval( moveIfExists ) ) moveIfExists = false; - for ( var n = 0; n < values.length; n++ ) { - var actualIndex = this._add( values[ n ], index, moveIfExists ); - index = actualIndex + 1; - } + addAll(values: string[], index?: number, moveIfExists?: boolean) { + index = (hasval(index) ? index : this._valuesArray.length); + if (!hasval(moveIfExists)) moveIfExists = false; + for (let n = 0; n < values.length; n++) { + let actualIndex = this._add(values[n], index, moveIfExists); + index = actualIndex + 1; } + } - private _add( value : string, newIndex : number, moveIfExists : boolean ) : number { - requireString( value ); + private _add(value: string, newIndex: number, moveIfExists: boolean): number { + requireString(value); - var oldIndex = this._indexes[ value ]; - if ( !hasval( oldIndex ) ) { - this._valuesArray.splice( newIndex, 0, value ); - for ( var n = newIndex; n < this._valuesArray.length; n++ ) { - this._indexes[ this._valuesArray[ n ] ] = n; - } - if ( this._valueAdded ) { - this._valueAdded.fire( value, newIndex ); - } + let oldIndex = this._indexes[value]; + if (!hasval(oldIndex)) { + this._valuesArray.splice(newIndex, 0, value); + for (let n = newIndex; n < this._valuesArray.length; n++) { + this._indexes[this._valuesArray[n]] = n; } - else if ( newIndex !== oldIndex && moveIfExists ) { - this._valuesArray.splice( oldIndex, 1 ); - if ( newIndex > oldIndex ) { - newIndex--; - this._valuesArray.splice( newIndex, 0, value ); - for ( var n = oldIndex; n <= newIndex; n++ ) { - this._indexes[ this._valuesArray[ n ] ] = n; - } - } - else { - this._valuesArray.splice( newIndex, 0, value ); - for ( var n = newIndex; n <= oldIndex; n++ ) { - this._indexes[ this._valuesArray[ n ] ] = n; - } - } - if ( this._valueMoved ) { - this._valueMoved.fire( value, oldIndex, newIndex ); + if (this._valueAdded) { + this._valueAdded.fire(value, newIndex); + } + } + else if (newIndex !== oldIndex && moveIfExists) { + this._valuesArray.splice(oldIndex, 1); + if (newIndex > oldIndex) { + newIndex--; + this._valuesArray.splice(newIndex, 0, value); + for (let n = oldIndex; n <= newIndex; n++) { + this._indexes[this._valuesArray[n]] = n; } } else { - newIndex = oldIndex; + this._valuesArray.splice(newIndex, 0, value); + for (let n = newIndex; n <= oldIndex; n++) { + this._indexes[this._valuesArray[n]] = n; + } + } + if (this._valueMoved) { + this._valueMoved.fire(value, oldIndex, newIndex); } - - // Return the actual insertion index -- may differ from the originally - // requested index if an existing value had to be moved - return newIndex; + } + else { + newIndex = oldIndex; } - removeValue( value : string ) { - if ( isString( value ) ) { - var index = this._indexes[ value ]; - if ( hasval( index ) ) { - this._remove( value, index ); - } + // Return the actual insertion index -- may differ from the originally + // requested index if an existing value had to be moved + return newIndex; + } + + removeValue(value: string) { + if (isString(value)) { + let index = this._indexes[value]; + if (hasval(index)) { + this._remove(value, index); } } + } - removeIndex( index : number ) { - var value = this._valuesArray[ index ]; - if ( isString( value ) ) { - this._remove( value, index ); - } + removeIndex(index: number) { + let value = this._valuesArray[index]; + if (isString(value)) { + this._remove(value, index); } + } - removeAll( ) { - // Remove from last to first, to minimize index shifting - for ( var n = this._valuesArray.length-1; n >= 0; n-- ) { - var value = this._valuesArray[ n ]; - this._remove( value, n ); - } + removeAll() { + // Remove from last to first, to minimize index shifting + for (let n = this._valuesArray.length - 1; n >= 0; n--) { + let value = this._valuesArray[n]; + this._remove(value, n); } + } - retainValues( values : string[] ) { - var valuesToRetain : StringMap = {}; - for ( var n = 0; n < values.length; n++ ) { - var value = values[ n ]; - if ( isString( value ) ) { - valuesToRetain[ value ] = true; - } + retainValues(values: string[]) { + let valuesToRetain: StringMap = {}; + for (let n = 0; n < values.length; n++) { + let value = values[n]; + if (isString(value)) { + valuesToRetain[value] = true; } - this._retain( valuesToRetain ); } + this._retain(valuesToRetain); + } - retainIndices( indices : number[] ) { - var valuesToRetain : StringMap = {}; - for ( var n = 0; n < indices.length; n++ ) { - var value = this._valuesArray[ indices[ n ] ]; - valuesToRetain[ value ] = true; - } - this._retain( valuesToRetain ); + retainIndices(indices: number[]) { + let valuesToRetain: StringMap = {}; + for (let n = 0; n < indices.length; n++) { + let value = this._valuesArray[indices[n]]; + valuesToRetain[value] = true; } + this._retain(valuesToRetain); + } - private _retain( values : StringMap ) { - // Remove from last to first, to minimize index shifting - for ( var n = this._valuesArray.length-1; n >= 0; n-- ) { - var value = this._valuesArray[ n ]; - if ( !values.hasOwnProperty( value ) ) { - this._remove( value, n ); - } + private _retain(values: StringMap) { + // Remove from last to first, to minimize index shifting + for (let n = this._valuesArray.length - 1; n >= 0; n--) { + let value = this._valuesArray[n]; + if (!values.hasOwnProperty(value)) { + this._remove(value, n); } } + } - private _remove( value : string, index : number ) { - this._valuesArray.splice( index, 1 ); - delete this._indexes[ value ]; - for ( var n = index; n < this._valuesArray.length; n++ ) { - this._indexes[ this._valuesArray[ n ] ] = n; - } - if ( this._valueRemoved ) { - this._valueRemoved.fire( value, index ); - } + private _remove(value: string, index: number) { + this._valuesArray.splice(index, 1); + delete this._indexes[value]; + for (let n = index; n < this._valuesArray.length; n++) { + this._indexes[this._valuesArray[n]] = n; + } + if (this._valueRemoved) { + this._valueRemoved.fire(value, index); } } +} diff --git a/src/webglimpse/util/sorted_arrays.ts b/src/webglimpse/util/sorted_arrays.ts index b2937a9..03fe25f 100644 --- a/src/webglimpse/util/sorted_arrays.ts +++ b/src/webglimpse/util/sorted_arrays.ts @@ -29,96 +29,96 @@ */ - // XXX: These probably belong in their own namespace - - - export function indexOf( vs : number[], x : number ) : number { - var a = 0; - var b = vs.length - 1; - - while ( a <= b ) { - // Bitwise-or-zero truncates to integer - var pivot = ( ( a + b ) / 2 ) | 0; - var vPivot = vs[ pivot ]; - - if ( vPivot < x ) { - a = pivot + 1; - } - else if ( vPivot > x ) { - b = pivot - 1; - } - else { - // This is a little sloppy if either value is NaN, or if one is +0.0 and the other is -0.0 - return pivot; - } - } +// XXX: These probably belong in their own namespace + + +export function indexOf(vs: number[], x: number): number { + let a = 0; + let b = vs.length - 1; + + while (a <= b) { + // Bitwise-or-zero truncates to integer + let pivot = ((a + b) / 2) | 0; + let vPivot = vs[pivot]; - return -( a + 1 ); + if (vPivot < x) { + a = pivot + 1; + } + else if (vPivot > x) { + b = pivot - 1; + } + else { + // This is a little sloppy if either value is NaN, or if one is +0.0 and the other is -0.0 + return pivot; + } } + return -(a + 1); +} - export function indexNearest( vs : number[], x : number ) : number { - var i = indexOf( vs, x ); - // Exact value found - if ( i >= 0 ) return i; +export function indexNearest(vs: number[], x: number): number { + let i = indexOf(vs, x); - // Find the closer of the adjacent values - var iAfter = -i - 1; - var iBefore = iAfter - 1; + // Exact value found + if (i >= 0) return i; - if ( iAfter >= vs.length ) return iBefore; - if ( iBefore < 0 ) return iAfter; + // Find the closer of the adjacent values + let iAfter = -i - 1; + let iBefore = iAfter - 1; - var diffAfter = vs[ iAfter ] - x; - var diffBefore = x - vs[ iBefore ]; + if (iAfter >= vs.length) return iBefore; + if (iBefore < 0) return iAfter; - return ( diffAfter <= diffBefore ? iAfter : iBefore ); - } + let diffAfter = vs[iAfter] - x; + let diffBefore = x - vs[iBefore]; + return (diffAfter <= diffBefore ? iAfter : iBefore); +} - export function indexAfter( vs : number[], x : number ) : number { - var i = indexOf( vs, x ); - // Exact value not found - if ( i < 0 ) return ( -i - 1 ); +export function indexAfter(vs: number[], x: number): number { + let i = indexOf(vs, x); - // If the exact value was found, find the value's last occurrence - var n = vs.length; - for ( var j = i + 1; j < n; j++ ) { - if ( vs[ j ] > x ) return j; - } - return n; + // Exact value not found + if (i < 0) return (-i - 1); + + // If the exact value was found, find the value's last occurrence + let n = vs.length; + for (let j = i + 1; j < n; j++) { + if (vs[j] > x) return j; } + return n; +} - export function indexAtOrAfter( vs : number[], x : number ) : number { - var i = indexOf( vs, x ); +export function indexAtOrAfter(vs: number[], x: number): number { + let i = indexOf(vs, x); - // Exact value not found - if ( i < 0 ) return ( -i - 1 ); + // Exact value not found + if (i < 0) return (-i - 1); - // If the exact value was found, find the value's first occurrence - var n = vs.length; - for ( var j = i; j > 0; j-- ) { - if ( vs[ j - 1 ] < x ) return j; - } - return 0; + // If the exact value was found, find the value's first occurrence + let n = vs.length; + for (let j = i; j > 0; j--) { + if (vs[j - 1] < x) return j; } + return 0; +} - export function indexBefore( vs : number[], x : number ) : number { - return indexAtOrAfter( vs, x ) - 1; - } +export function indexBefore(vs: number[], x: number): number { + return indexAtOrAfter(vs, x) - 1; +} - export function indexAtOrBefore( vs : number[], x : number ) : number { - return indexAfter( vs, x ) - 1; - } +export function indexAtOrBefore(vs: number[], x: number): number { + return indexAfter(vs, x) - 1; +} diff --git a/src/webglimpse/util/sorted_multimap.ts b/src/webglimpse/util/sorted_multimap.ts index f1134f1..6484771 100644 --- a/src/webglimpse/util/sorted_multimap.ts +++ b/src/webglimpse/util/sorted_multimap.ts @@ -27,209 +27,210 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { BinaryTree, Comparator, Iterator } from './binary_tree'; +import { IdFunction, StringMap, getObjectId } from './util'; +// A sorted map which allows multiple string values per key (K) +export class SortedMultimap { - // A sorted map which allows multiple string values per key (K) - export class SortedMultimap { + private _tree: BinaryTree>; + private _idFn: IdFunction; - private _tree : BinaryTree>; - private _idFn : IdFunction; - - constructor( comparator : Comparator, idFn : IdFunction = getObjectId ) { - this._tree = new BinaryTree>( this.createContainerComparator( comparator ) ); - this._idFn = idFn; - } + constructor(comparator: Comparator, idFn: IdFunction = getObjectId) { + this._tree = new BinaryTree>(this.createContainerComparator(comparator)); + this._idFn = idFn; + } - private createContainerComparator( comparator : Comparator ) : Comparator> { - return { - compare : function( container1 : Container, container2 : Container ) : number { - return comparator.compare( container1.key, container2.key ); - } + private createContainerComparator(comparator: Comparator): Comparator> { + return { + compare: function (container1: Container, container2: Container): number { + return comparator.compare(container1.key, container2.key); } } + } - // Inserts the value into the tree. Nothing is inserted if the value already exists - insert( key : K, value : V ) { - var wrappedKey = new Container( key ); - var values : Container = this._tree.getValue( wrappedKey ); - - if ( values === null ) { - values = wrappedKey; - this._tree.insert( values ); - } + // Inserts the value into the tree. Nothing is inserted if the value already exists + insert(key: K, value: V) { + let wrappedKey = new Container(key); + let values: Container = this._tree.getValue(wrappedKey); - values.add( value, this._idFn ); + if (values === null) { + values = wrappedKey; + this._tree.insert(values); } - remove( key : K, value : V ) { - var wrappedKey = new Container( key ); - var values : Container = this._tree.getValue( wrappedKey ); - - if ( values === null ) return; + values.add(value, this._idFn); + } - values.remove( value, this._idFn ); + remove(key: K, value: V) { + let wrappedKey = new Container(key); + let values: Container = this._tree.getValue(wrappedKey); - if ( values.size === 0 ) { - this._tree.remove( values ); - } - } + if (values === null) return; - contains( key : K, value : V ) { - var wrappedKey = new Container( key ); - var values : Container = this._tree.getValue( wrappedKey ); + values.remove(value, this._idFn); - if ( values === null ) { - return false; - } - else { - return values.contains( value, this._idFn ); - } + if (values.size === 0) { + this._tree.remove(values); } + } - // Returns the lowest element greater than or equal to the given value, or null if no such element exists - ceiling( key : K ) : V[] { - return this.unwrap( this._tree.ceiling( this.wrap( key ) ) ); - } + contains(key: K, value: V) { + let wrappedKey = new Container(key); + let values: Container = this._tree.getValue(wrappedKey); - // Returns the greatest element less than or equal to the given value, or null if no such element exists - floor( key : K ) : V[] { - return this.unwrap( this._tree.floor( this.wrap( key ) ) ); + if (values === null) { + return false; } - - // Returns the greatest element strictly less than the given value, or null if no such element exists - lower( key : K ) : V[] { - return this.unwrap( this._tree.lower( this.wrap( key ) ) ); + else { + return values.contains(value, this._idFn); } + } - // Returns the lowest element strictly greater than the given value, or null if no such element exists - higher( key : K ) : V[] { - return this.unwrap( this._tree.higher( this.wrap( key ) ) ); - } + // Returns the lowest element greater than or equal to the given value, or null if no such element exists + ceiling(key: K): V[] { + return this.unwrap(this._tree.ceiling(this.wrap(key))); + } - // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) - headSet( key : K, inclusive : boolean = true ) : V[] { - return this.unwrapArray( this._tree.headSet( this.wrap( key ), inclusive ) ); - } + // Returns the greatest element less than or equal to the given value, or null if no such element exists + floor(key: K): V[] { + return this.unwrap(this._tree.floor(this.wrap(key))); + } - // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) - tailSet( key : K, inclusive : boolean = false ) : V[] { - return this.unwrapArray( this._tree.tailSet( this.wrap( key ), inclusive ) ); - } + // Returns the greatest element strictly less than the given value, or null if no such element exists + lower(key: K): V[] { + return this.unwrap(this._tree.lower(this.wrap(key))); + } - // Returns all elements between the provided values (sorted from low to high) - subSet( low : K, high : K, lowInclusive : boolean = true, highInclusive : boolean = false ) : V[] { - var wrappedLow = new Container( low ); - var wrappedHigh = new Container( high ); - var values : Container[] = this._tree.subSet( wrappedLow, wrappedHigh, lowInclusive, highInclusive ); - return this.unwrapArray( values ); - } + // Returns the lowest element strictly greater than the given value, or null if no such element exists + higher(key: K): V[] { + return this.unwrap(this._tree.higher(this.wrap(key))); + } - // Returns all keys in the tree (sorted from low to high) - toArray( ) : V[] { - return this.unwrapArray( this._tree.toArray( ) ); - } + // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) + headSet(key: K, inclusive: boolean = true): V[] { + return this.unwrapArray(this._tree.headSet(this.wrap(key), inclusive)); + } + + // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) + tailSet(key: K, inclusive: boolean = false): V[] { + return this.unwrapArray(this._tree.tailSet(this.wrap(key), inclusive)); + } - iterator( ) : Iterator { + // Returns all elements between the provided values (sorted from low to high) + subSet(low: K, high: K, lowInclusive: boolean = true, highInclusive: boolean = false): V[] { + let wrappedLow = new Container(low); + let wrappedHigh = new Container(high); + let values: Container[] = this._tree.subSet(wrappedLow, wrappedHigh, lowInclusive, highInclusive); + return this.unwrapArray(values); + } - var iter : Iterator> = this._tree.iterator( ); - var currentArray : V[] = null; - var currentIndex : number = 0; + // Returns all keys in the tree (sorted from low to high) + toArray(): V[] { + return this.unwrapArray(this._tree.toArray()); + } - return { - next: function( ) : V { + iterator(): Iterator { - var value : V; + let iter: Iterator> = this._tree.iterator(); + let currentArray: V[] = null; + let currentIndex: number = 0; - if ( currentArray == null || currentIndex >= currentArray.length ) { - currentArray = iter.next( ).toArray( ); - currentIndex = 0; - value = currentArray[currentIndex]; - } - else { - value = currentArray[currentIndex]; - } + return { + next: function (): V { - currentIndex += 1; + let value: V; - return value; - }, - hasNext: function( ) : boolean { - return iter.hasNext( ) || ( currentArray != null && currentIndex < currentArray.length ); + if (currentArray == null || currentIndex >= currentArray.length) { + currentArray = iter.next().toArray(); + currentIndex = 0; + value = currentArray[currentIndex]; + } + else { + value = currentArray[currentIndex]; } - } - } - private wrap( key : K ) : Container { - return new Container( key ); - } + currentIndex += 1; - private unwrap( values : Container ) : V[] { - if ( values === null ) { - return []; - } - else { - return values.toArray( ); + return value; + }, + hasNext: function (): boolean { + return iter.hasNext() || (currentArray != null && currentIndex < currentArray.length); } } + } - private unwrapArray( values : Container[] ) : V[] { - var unwrappedValues : V[] = new Array( ); - values.forEach( function( value : Container ) { - value.toArray( ).forEach( function ( value : V ) { - unwrappedValues.push( value ); - }); - } ); + private wrap(key: K): Container { + return new Container(key); + } - return unwrappedValues; + private unwrap(values: Container): V[] { + if (values === null) { + return []; + } + else { + return values.toArray(); } } - export class SortedStringMultimap extends SortedMultimap { - constructor( comparator : Comparator ) { - super( comparator, (value)=>value ); - } + private unwrapArray(values: Container[]): V[] { + let unwrappedValues: V[] = new Array(); + values.forEach(function (value: Container) { + value.toArray().forEach(function (value: V) { + unwrappedValues.push(value); + }); + }); + + return unwrappedValues; } +} - // a container which stores a set of values (V) associated with a sorted key (K) - // OrderedSet or even BinaryTree could be used here instead - // more sophisticated set implementation: http://stackoverflow.com/questions/7958292/mimicking-sets-in-javascript - class Container { +export class SortedStringMultimap extends SortedMultimap { + constructor(comparator: Comparator) { + super(comparator, (value) => value); + } +} - private _key : K; - private _values : StringMap; +// a container which stores a set of values (V) associated with a sorted key (K) +// OrderedSet or even BinaryTree could be used here instead +// more sophisticated set implementation: http://stackoverflow.com/questions/7958292/mimicking-sets-in-javascript +class Container { - constructor( key : K ) { - this._key = key; - this._values = {}; - } + private _key: K; + private _values: StringMap; - get size( ) : number { - return this.toArray( ).length; - } + constructor(key: K) { + this._key = key; + this._values = {}; + } - get key( ) : K { - return this._key; - } + get size(): number { + return this.toArray().length; + } - get values( ) : StringMap { - return this._values; - } + get key(): K { + return this._key; + } - toArray( ) : V[] { - return Object.keys(this._values).map(key => this._values[key]); - } + get values(): StringMap { + return this._values; + } - contains( value : V, idFn : IdFunction ) : boolean { - // safer than 'value in this._values' because of potential conflict with built in properties/methods - return Object.prototype.hasOwnProperty.call( this._values, idFn( value ) ); - } + toArray(): V[] { + return Object.keys(this._values).map(key => this._values[key]); + } - add( value : V, idFn : IdFunction ) { - this._values[ idFn( value ) ] = value; - } + contains(value: V, idFn: IdFunction): boolean { + // safer than 'value in this._values' because of potential conflict with built in properties/methods + return Object.prototype.hasOwnProperty.call(this._values, idFn(value)); + } - remove( value : V, idFn : IdFunction ) { - delete this._values[ idFn( value ) ]; - } + add(value: V, idFn: IdFunction) { + this._values[idFn(value)] = value; + } + + remove(value: V, idFn: IdFunction) { + delete this._values[idFn(value)]; } +} diff --git a/src/webglimpse/util/split.ts b/src/webglimpse/util/split.ts index 485d713..c58faa8 100644 --- a/src/webglimpse/util/split.ts +++ b/src/webglimpse/util/split.ts @@ -27,231 +27,230 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import { Notification } from './notification'; +export function initSplitContainer(container: HTMLElement): Notification { + let tilesResized = new Notification(); + _initSplitContainer(container, tilesResized); - export function initSplitContainer( container : HTMLElement ) : Notification { - var tilesResized = new Notification( ); + window.addEventListener('resize', function () { + tilesResized.fire(); + }); + tilesResized.fire(); - _initSplitContainer( container, tilesResized ); - - window.addEventListener( 'resize', function( ) { - tilesResized.fire( ); - } ); - tilesResized.fire( ); - - return tilesResized; - } + return tilesResized; +} - function _initSplitContainer( container : HTMLElement, tilesResized : Notification ) { - var tileA : HTMLElement = null; - var tileB : HTMLElement = null; - var sep : HTMLElement = null; - var children = container.childNodes; - for ( var n = 0; n < children.length; n++ ) { - var child = children[ n ]; - if ( child.nodeType === 1 && ( child ).classList ) { - var element = child; - if ( tileA == null ) { - if ( element.classList.contains( 'splitContainerNS' ) || element.classList.contains( 'splitContainerEW' ) || element.classList.contains( 'splitTile' ) ) { - tileA = element; - } +function _initSplitContainer(container: HTMLElement, tilesResized: Notification) { + let tileA: HTMLElement = null; + let tileB: HTMLElement = null; + let sep: HTMLElement = null; + let children = container.childNodes; + for (let n = 0; n < children.length; n++) { + let child = children[n]; + if (child.nodeType === 1 && (child).classList) { + let element = child; + if (tileA == null) { + if (element.classList.contains('splitContainerNS') || element.classList.contains('splitContainerEW') || element.classList.contains('splitTile')) { + tileA = element; } - else if ( sep == null ) { - if ( element.classList.contains( 'splitSep' ) ) { - sep = element; - } - } - else if ( tileB == null ) { - if ( element.classList.contains( 'splitContainerNS' ) || element.classList.contains( 'splitContainerEW' ) || element.classList.contains( 'splitTile' ) ) { - tileB = element; - } + } + else if (sep == null) { + if (element.classList.contains('splitSep')) { + sep = element; } - else { - break; + } + else if (tileB == null) { + if (element.classList.contains('splitContainerNS') || element.classList.contains('splitContainerEW') || element.classList.contains('splitTile')) { + tileB = element; } } + else { + break; + } } - if ( tileA == null ) throw new Error( 'Failed to init split-container: could not find first tile' ); - if ( sep == null ) throw new Error( 'Failed to init split-container: could not find separator' ); - if ( tileB == null ) throw new Error( 'Failed to init split-container: could not find second tile' ); + } + if (tileA == null) throw new Error('Failed to init split-container: could not find first tile'); + if (sep == null) throw new Error('Failed to init split-container: could not find separator'); + if (tileB == null) throw new Error('Failed to init split-container: could not find second tile'); - if ( container.classList.contains( 'splitContainerNS' ) ) { - _initSplitNS( container, tileA, sep, tileB, tilesResized ); - } - else if ( container.classList.contains( 'splitContainerEW' ) ) { - _initSplitEW( container, tileA, sep, tileB, tilesResized ); - } + if (container.classList.contains('splitContainerNS')) { + _initSplitNS(container, tileA, sep, tileB, tilesResized); + } + else if (container.classList.contains('splitContainerEW')) { + _initSplitEW(container, tileA, sep, tileB, tilesResized); + } - if ( tileA.classList.contains( 'splitContainerNS' ) || tileA.classList.contains( 'splitContainerEW' ) ) { - _initSplitContainer( tileA, tilesResized ); - } + if (tileA.classList.contains('splitContainerNS') || tileA.classList.contains('splitContainerEW')) { + _initSplitContainer(tileA, tilesResized); + } - if ( tileB.classList.contains( 'splitContainerNS' ) || tileB.classList.contains( 'splitContainerEW' ) ) { - _initSplitContainer( tileB, tilesResized ); - } + if (tileB.classList.contains('splitContainerNS') || tileB.classList.contains('splitContainerEW')) { + _initSplitContainer(tileB, tilesResized); } +} - function _initSplitNS( container : HTMLElement, tileA : HTMLElement, sep : HTMLElement, tileB : HTMLElement, tilesResized : Notification ) : void { - sep.classList.add( 'splitSepNS' ); - sep.style.left = '0px'; - sep.style.right = '0px'; - tileA.style.left = '0px'; - tileA.style.right = '0px'; - tileB.style.left = '0px'; - tileB.style.right = '0px'; +function _initSplitNS(container: HTMLElement, tileA: HTMLElement, sep: HTMLElement, tileB: HTMLElement, tilesResized: Notification): void { + sep.classList.add('splitSepNS'); + sep.style.left = '0px'; + sep.style.right = '0px'; + tileA.style.left = '0px'; + tileA.style.right = '0px'; + tileB.style.left = '0px'; + tileB.style.right = '0px'; - var minHeightA = 1; - var minHeightB = 1; - var recentFracA : number = null; + let minHeightA = 1; + let minHeightB = 1; + let recentFracA: number = null; - function layoutTiles( prelimHeightA? : number ) { - var heightSep = sep.getBoundingClientRect( ).height; - var heightContainer = container.getBoundingClientRect( ).height; - var heightContent = heightContainer - heightSep; - if ( recentFracA == null ) { - recentFracA = tileA.getBoundingClientRect( ).height / heightContent; - } + function layoutTiles(prelimHeightA?: number) { + let heightSep = sep.getBoundingClientRect().height; + let heightContainer = container.getBoundingClientRect().height; + let heightContent = heightContainer - heightSep; + if (recentFracA == null) { + recentFracA = tileA.getBoundingClientRect().height / heightContent; + } - var keepFracA = ( prelimHeightA == null ); - if ( keepFracA ) { - prelimHeightA = Math.round( recentFracA * heightContent ); - } + let keepFracA = (prelimHeightA == null); + if (keepFracA) { + prelimHeightA = Math.round(recentFracA * heightContent); + } - var maxHeightA = heightContainer - heightSep - minHeightB; + let maxHeightA = heightContainer - heightSep - minHeightB; - var topA = 0; - var heightA = Math.max( minHeightA, Math.min( maxHeightA, prelimHeightA ) ); - tileA.style.top = topA + 'px'; - tileA.style.height = heightA + 'px'; + let topA = 0; + let heightA = Math.max(minHeightA, Math.min(maxHeightA, prelimHeightA)); + tileA.style.top = topA + 'px'; + tileA.style.height = heightA + 'px'; - var topSep = topA + heightA; - sep.style.top = topSep + 'px'; - sep.style.height = heightSep + 'px'; + let topSep = topA + heightA; + sep.style.top = topSep + 'px'; + sep.style.height = heightSep + 'px'; - var topB = topSep + heightSep; - var heightB = Math.max( minHeightB, heightContainer - topB ); - tileB.style.top = topB + 'px'; - tileB.style.height = heightB + 'px'; + let topB = topSep + heightSep; + let heightB = Math.max(minHeightB, heightContainer - topB); + tileB.style.top = topB + 'px'; + tileB.style.height = heightB + 'px'; - if ( !keepFracA && heightContent >= heightA && heightContent >= ( minHeightA + minHeightB ) ) { - recentFracA = heightA / heightContent; - } + if (!keepFracA && heightContent >= heightA && heightContent >= (minHeightA + minHeightB)) { + recentFracA = heightA / heightContent; } + } - var sepGrab : number = null; + let sepGrab: number = null; - sep.addEventListener( 'mousedown', function( ev : MouseEvent ) { - if ( ev.button === 0 ) { - sepGrab = ev.clientY - tileA.getBoundingClientRect( ).top - tileA.getBoundingClientRect( ).height; - ev.preventDefault( ); - } - } ); + sep.addEventListener('mousedown', function (ev: MouseEvent) { + if (ev.button === 0) { + sepGrab = ev.clientY - tileA.getBoundingClientRect().top - tileA.getBoundingClientRect().height; + ev.preventDefault(); + } + }); - // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove - window.addEventListener( 'mousemove', function( ev : MouseEvent ) { - if ( sepGrab != null ) { - layoutTiles( ev.clientY - tileA.getBoundingClientRect( ).top - sepGrab ); - tilesResized.fire( ); - } - } ); - - // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window - window.addEventListener( 'mouseup', function( ev : MouseEvent ) { - if ( sepGrab != null && ev.button === 0 ) { - layoutTiles( ev.clientY - tileA.getBoundingClientRect( ).top - sepGrab ); - tilesResized.fire( ); - sepGrab = null; - } - } ); + // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove + window.addEventListener('mousemove', function (ev: MouseEvent) { + if (sepGrab != null) { + layoutTiles(ev.clientY - tileA.getBoundingClientRect().top - sepGrab); + tilesResized.fire(); + } + }); + + // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window + window.addEventListener('mouseup', function (ev: MouseEvent) { + if (sepGrab != null && ev.button === 0) { + layoutTiles(ev.clientY - tileA.getBoundingClientRect().top - sepGrab); + tilesResized.fire(); + sepGrab = null; + } + }); - tilesResized.on( layoutTiles ); - } + tilesResized.on(layoutTiles); +} - function _initSplitEW( container : HTMLElement, tileA : HTMLElement, sep : HTMLElement, tileB : HTMLElement, tilesResized : Notification ) : void { - sep.classList.add( 'splitSepEW' ); - sep.style.top = '0px'; - sep.style.bottom = '0px'; - tileA.style.top = '0px'; - tileA.style.bottom = '0px'; - tileB.style.top = '0px'; - tileB.style.bottom = '0px'; +function _initSplitEW(container: HTMLElement, tileA: HTMLElement, sep: HTMLElement, tileB: HTMLElement, tilesResized: Notification): void { + sep.classList.add('splitSepEW'); + sep.style.top = '0px'; + sep.style.bottom = '0px'; + tileA.style.top = '0px'; + tileA.style.bottom = '0px'; + tileB.style.top = '0px'; + tileB.style.bottom = '0px'; - var minWidthA = 1; - var minWidthB = 1; - var recentFracA : number = null; + let minWidthA = 1; + let minWidthB = 1; + let recentFracA: number = null; - function layoutTiles( prelimWidthA? : number ) { - var widthSep = sep.getBoundingClientRect( ).width; - var widthContainer = container.getBoundingClientRect( ).width; - var widthContent = widthContainer - widthSep; - if ( recentFracA == null ) { - recentFracA = tileA.getBoundingClientRect( ).width / widthContent; - } + function layoutTiles(prelimWidthA?: number) { + let widthSep = sep.getBoundingClientRect().width; + let widthContainer = container.getBoundingClientRect().width; + let widthContent = widthContainer - widthSep; + if (recentFracA == null) { + recentFracA = tileA.getBoundingClientRect().width / widthContent; + } - var keepFracA = ( prelimWidthA == null ); - if ( keepFracA ) { - prelimWidthA = Math.round( recentFracA * widthContent ); - } + let keepFracA = (prelimWidthA == null); + if (keepFracA) { + prelimWidthA = Math.round(recentFracA * widthContent); + } - var maxWidthA = widthContainer - widthSep - minWidthB; + let maxWidthA = widthContainer - widthSep - minWidthB; - var leftA = 0; - var widthA = Math.max( minWidthA, Math.min( maxWidthA, prelimWidthA ) ); - tileA.style.left = leftA + 'px'; - tileA.style.width = widthA + 'px'; + let leftA = 0; + let widthA = Math.max(minWidthA, Math.min(maxWidthA, prelimWidthA)); + tileA.style.left = leftA + 'px'; + tileA.style.width = widthA + 'px'; - var leftSep = leftA + widthA; - sep.style.left = leftSep + 'px'; - sep.style.width = widthSep + 'px'; + let leftSep = leftA + widthA; + sep.style.left = leftSep + 'px'; + sep.style.width = widthSep + 'px'; - var leftB = leftSep + widthSep; - var widthB = Math.max( minWidthB, widthContainer - leftB ); - tileB.style.left = leftB + 'px'; - tileB.style.width = widthB + 'px'; + let leftB = leftSep + widthSep; + let widthB = Math.max(minWidthB, widthContainer - leftB); + tileB.style.left = leftB + 'px'; + tileB.style.width = widthB + 'px'; - if ( !keepFracA && widthContent >= widthA && widthContent >= ( minWidthA + minWidthB ) ) { - recentFracA = widthA / widthContent; - } + if (!keepFracA && widthContent >= widthA && widthContent >= (minWidthA + minWidthB)) { + recentFracA = widthA / widthContent; } + } - var sepGrab : number = null; + let sepGrab: number = null; - sep.addEventListener( 'mousedown', function( ev : MouseEvent ) { - if ( ev.button === 0 ) { - sepGrab = ev.clientX - tileA.getBoundingClientRect( ).left - tileA.getBoundingClientRect( ).width; - ev.preventDefault( ); - } - } ); + sep.addEventListener('mousedown', function (ev: MouseEvent) { + if (ev.button === 0) { + sepGrab = ev.clientX - tileA.getBoundingClientRect().left - tileA.getBoundingClientRect().width; + ev.preventDefault(); + } + }); - // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove - window.addEventListener( 'mousemove', function( ev : MouseEvent ) { - if ( sepGrab != null ) { - layoutTiles( ev.clientX - tileA.getBoundingClientRect( ).left - sepGrab ); - tilesResized.fire( ); - } - } ); - - // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window - window.addEventListener( 'mouseup', function( ev : MouseEvent ) { - if ( sepGrab != null && ev.button === 0 ) { - layoutTiles( ev.clientX - tileA.getBoundingClientRect( ).left - sepGrab ); - tilesResized.fire( ); - sepGrab = null; - } - } ); + // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove + window.addEventListener('mousemove', function (ev: MouseEvent) { + if (sepGrab != null) { + layoutTiles(ev.clientX - tileA.getBoundingClientRect().left - sepGrab); + tilesResized.fire(); + } + }); + + // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window + window.addEventListener('mouseup', function (ev: MouseEvent) { + if (sepGrab != null && ev.button === 0) { + layoutTiles(ev.clientX - tileA.getBoundingClientRect().left - sepGrab); + tilesResized.fire(); + sepGrab = null; + } + }); - tilesResized.on( layoutTiles ); - } + tilesResized.on(layoutTiles); +} diff --git a/src/webglimpse/util/util.ts b/src/webglimpse/util/util.ts index c5708ea..9ad13da 100644 --- a/src/webglimpse/util/util.ts +++ b/src/webglimpse/util/util.ts @@ -29,190 +29,192 @@ */ - // Alias for more readable access to static constants - export var GL = WebGLRenderingContext; +// Alias for more readable access to static constants +export let GL = WebGLRenderingContext; - export function hasval( value : any ) : boolean { - // Double-equals is weird: ( undefined == null ) is true - return ( value != null ); - } +export function hasval(value: any): boolean { + // Double-equals is weird: ( undefined == null ) is true + return (value != null); +} - export function isNumber( value : any ) : boolean { - return typeof( value ) === 'number'; - } +export function isNumber(value: any): boolean { + return typeof (value) === 'number'; +} - export function isString( value : any ) : boolean { - return typeof( value ) === 'string'; - } +export function isString(value: any): boolean { + return typeof (value) === 'string'; +} - export function isEmpty( array : any[] ) : boolean { - return ( array.length === 0 ); - } +export function isEmpty(array: any[]): boolean { + return (array.length === 0); +} - export function notEmpty( array : any[] ) : boolean { - return ( array.length > 0 ); - } +export function notEmpty(array: any[]): boolean { + return (array.length > 0); +} - export function alwaysTrue( ) : boolean { - return true; - } +export function alwaysTrue(): boolean { + return true; +} - export function alwaysFalse( ) : boolean { - return false; - } +export function alwaysFalse(): boolean { + return false; +} - export function constantFn( value : V ) : ()=>V { - return function( ) : V { - return value; - }; - } +export function constantFn(value: V): () => V { + return function (): V { + return value; + }; +} - export function log10( x : number ) : number { - return Math.log( x ) * ( 1.0 / Math.LN10 ); - } +export function log10(x: number): number { + return Math.log(x) * (1.0 / Math.LN10); +} - export function order( x : number ) : number { - return Math.floor( log10( x ) + 1e-12 ); - } +export function order(x: number): number { + return Math.floor(log10(x) + 1e-12); +} - export function clamp( xMin : number, xMax : number, x : number ) : number { - return Math.max( xMin, Math.min( xMax, x ) ); - } +export function clamp(xMin: number, xMax: number, x: number): number { + return Math.max(xMin, Math.min(xMax, x)); +} + + +export function copyArray(values: T[]): T[] { + return values.slice(0); +} - export function copyArray( values : T[] ) : T[] { - return values.slice( 0 ); +export function ensureCapacityFloat32(buffer: Float32Array, minNewCapacity: number): Float32Array { + // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer + if (!minNewCapacity || buffer.length >= minNewCapacity) { + return buffer; } + else { + let newCapacity = Math.max(minNewCapacity, 2 * buffer.length); + return new Float32Array(newCapacity); + } +} - export function ensureCapacityFloat32( buffer : Float32Array, minNewCapacity : number ) : Float32Array { - // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer - if ( !minNewCapacity || buffer.length >= minNewCapacity ) { - return buffer; - } - else { - var newCapacity = Math.max( minNewCapacity, 2*buffer.length ); - return new Float32Array( newCapacity ); - } +export function ensureCapacityUint32(buffer: Uint32Array, minNewCapacity: number): Uint32Array { + // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer + if (!minNewCapacity || buffer.length >= minNewCapacity) { + return buffer; + } + else { + let newCapacity = Math.max(minNewCapacity, 2 * buffer.length); + return new Uint32Array(newCapacity); } +} - export function ensureCapacityUint32( buffer : Uint32Array, minNewCapacity : number ) : Uint32Array { - // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer - if ( !minNewCapacity || buffer.length >= minNewCapacity ) { - return buffer; - } - else { - var newCapacity = Math.max( minNewCapacity, 2*buffer.length ); - return new Uint32Array( newCapacity ); - } +export function ensureCapacityUint16(buffer: Uint16Array, minNewCapacity: number): Uint16Array { + // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer + if (!minNewCapacity || buffer.length >= minNewCapacity) { + return buffer; + } + else { + let newCapacity = Math.max(minNewCapacity, 2 * buffer.length); + return new Uint16Array(newCapacity); } +} - export function ensureCapacityUint16( buffer : Uint16Array, minNewCapacity : number ) : Uint16Array { - // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer - if ( !minNewCapacity || buffer.length >= minNewCapacity ) { - return buffer; - } - else { - var newCapacity = Math.max( minNewCapacity, 2*buffer.length ); - return new Uint16Array( newCapacity ); +export interface StringMap { + [key: string]: V; +} + +export interface IdFunction { + (value: V): string; +} + + +export let getObjectId = (function () { + let keyName = 'webglimpse_ObjectId'; + let nextValue = 0; + return function (obj: any): string { + let value = obj[keyName]; + if (!hasval(value)) { + value = (nextValue++).toString(); + obj[keyName] = value; } - } + return value; + }; +})(); - export interface StringMap { - [ key : string ] : V; - } +export function concatLines(...lines: string[]) { + return lines.join('\n'); +} - export interface IdFunction { - ( value : V ) : string; - } +/** + * Parses a timestamp from the format 'YYYY-MM-DDTHH:mm:ss[.SSS]ZZ' into posix-milliseconds. + * + * Format examples: + * - '2014-01-01T00:00:00Z' + * - '2014-01-01T00:00:00.000+00:00' + * + * Use of a colon in numeric timezones is optional. However, it is strongly encouraged, for + * compatibility with Date in major browsers. + * + * Parsing is strict, and will throw an error if the input string does not match the expected + * format. A notable example is that the seconds field must not have more than three decimal + * places. + * + */ +declare var moment: any; + +export function parseTime_PMILLIS(time_ISO8601: string): number { - export var getObjectId = ( function( ) { - var keyName = 'webglimpse_ObjectId'; - var nextValue = 0; - return function( obj : any ) : string { - var value = obj[ keyName ]; - if ( !hasval( value ) ) { - value = ( nextValue++ ).toString( ); - obj[ keyName ] = value; - } - return value; - }; - } )( ); + // Moment's lenient parsing is way too lenient -- but its strict parsing is a little too + // strict, so we have to try several possible formats. + // + // We could pass in multiple formats to try all at once, but Moment's docs warn that that + // can be slow. Plus, we expect some formats to be more common than others, so we can make + // the common formats fast at the expense of the less common ones. + // + let m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ssZZ', true); + if (m.isValid()) return m.valueOf(); - export function concatLines( ...lines : string[] ) { - return lines.join( '\n' ); - } + m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSSZZ', true); + if (m.isValid()) return m.valueOf(); + m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSZZ', true); + if (m.isValid()) return m.valueOf(); - /** - * Parses a timestamp from the format 'YYYY-MM-DDTHH:mm:ss[.SSS]ZZ' into posix-milliseconds. - * - * Format examples: - * - '2014-01-01T00:00:00Z' - * - '2014-01-01T00:00:00.000+00:00' - * - * Use of a colon in numeric timezones is optional. However, it is strongly encouraged, for - * compatibility with Date in major browsers. - * - * Parsing is strict, and will throw an error if the input string does not match the expected - * format. A notable example is that the seconds field must not have more than three decimal - * places. - * - */ - export function parseTime_PMILLIS( time_ISO8601 : string ) : number { - - // Moment's lenient parsing is way too lenient -- but its strict parsing is a little too - // strict, so we have to try several possible formats. - // - // We could pass in multiple formats to try all at once, but Moment's docs warn that that - // can be slow. Plus, we expect some formats to be more common than others, so we can make - // the common formats fast at the expense of the less common ones. - // - - var m = moment( time_ISO8601, 'YYYY-MM-DDTHH:mm:ssZZ', true ); - if ( m.isValid( ) ) return m.valueOf( ); - - var m = moment( time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSSZZ', true ); - if ( m.isValid( ) ) return m.valueOf( ); - - var m = moment( time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSZZ', true ); - if ( m.isValid( ) ) return m.valueOf( ); - - var m = moment( time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SZZ', true ); - if ( m.isValid( ) ) return m.valueOf( ); - - throw new Error( 'Failed to parse time-string: \'' + time_ISO8601 + '\'' ); - } + m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SZZ', true); + if (m.isValid()) return m.valueOf(); + throw new Error('Failed to parse time-string: \'' + time_ISO8601 + '\''); +} - /** - * Formats a timestamp from posix-millis into the format 'YYYY-MM-DDThh:mm:ss.SSSZZ' (for - * example '2014-01-01T00:00:00.000Z'). - * - * The input value is effectively truncated (not rounded!) to milliseconds. So for example, - * formatTime_ISO8601(12345.999) will return '1970-01-01T00:00:12.345Z' -- exactly the same - * as for an input of 12345. - * - */ - export function formatTime_ISO8601( time_PMILLIS : number ) : string { - return moment( time_PMILLIS ).toISOString( ); - } + +/** + * Formats a timestamp from posix-millis into the format 'YYYY-MM-DDThh:mm:ss.SSSZZ' (for + * example '2014-01-01T00:00:00.000Z'). + * + * The input value is effectively truncated (not rounded!) to milliseconds. So for example, + * formatTime_ISO8601(12345.999) will return '1970-01-01T00:00:12.345Z' -- exactly the same + * as for an input of 12345. + * + */ +export function formatTime_ISO8601(time_PMILLIS: number): string { + return moment(time_PMILLIS).toISOString(); +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 449408d..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compileOnSave": true, - "compilerOptions": { - "target": "es5", - "sourceRoot": "." - }, - "exclude": [ - "node_modules", - "build" - ] -} From 21501631b64b6ccfd95d11f78a750d31bf29a334 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 28 Mar 2018 14:25:28 -0700 Subject: [PATCH 11/69] Update version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f9d13b..09603a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "1.9.2", + "version": "2.0.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From c27dbf11af84cb51affa9e1f7c478335d83cd083 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 28 Mar 2018 14:42:14 -0700 Subject: [PATCH 12/69] Update readme, move moment to peer/dev dependencies --- README.md | 11 +++++++++++ package.json | 7 +++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 08e3c77..7eb1874 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,17 @@ Webglimpse is a data visualization library for the web. +## Installation + +To install the Webglimpse library, run the following command. + +`npm install --save webglimpse` + +## Usage + +To use Webglimpse, import into your typescript project. + +`import * as Webglimpse from 'webglimpse'` ## WebGL diff --git a/package.json b/package.json index 09603a2..894a161 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,7 @@ "@angular/router": "^5.2.0", "core-js": "^2.4.1", "rxjs": "^5.5.6", - "zone.js": "^0.8.14" - }, - "dependencies": { + "zone.js": "^0.8.14", "moment": "^2.21.0" }, "devDependencies": { @@ -74,6 +72,7 @@ "ts-node": "~3.2.0", "tslint": "~5.7.0", "typescript": "~2.4.2", - "zone.js": "^0.8.14" + "zone.js": "^0.8.14", + "moment": "^2.21.0" } } From 9089ac095144d7c27660f4aacb2636613ca53523 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 28 Mar 2018 14:51:00 -0700 Subject: [PATCH 13/69] Clean up peerDependencies --- package.json | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/package.json b/package.json index 894a161..4ed948b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.0", + "version": "2.0.2", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", @@ -25,18 +25,6 @@ "serve-docs": "node_modules/.bin/compodoc -s -d docs" }, "peerDependencies": { - "@angular/core": "^5.2.0", - "@angular/animations": "^5.2.0", - "@angular/common": "^5.2.0", - "@angular/compiler": "^5.2.0", - "@angular/forms": "^5.2.0", - "@angular/http": "^5.2.0", - "@angular/platform-browser": "^5.2.0", - "@angular/platform-browser-dynamic": "^5.2.0", - "@angular/router": "^5.2.0", - "core-js": "^2.4.1", - "rxjs": "^5.5.6", - "zone.js": "^0.8.14", "moment": "^2.21.0" }, "devDependencies": { From d8075955e099978bc7a938c608be75fe98cd2f00 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 28 Mar 2018 15:24:10 -0700 Subject: [PATCH 14/69] Updated Changelog for v2.0.2 --- CHANGELOG | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index fff3a10..a61241c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,10 @@ +Webglimpse 2.0.2 (release 2018-3-28) + +* Replaced build system with ng-packagr. +* Updated typescript and other dependencies. +* Fixed tons of typescript errors. +* Removed Webglimpse namespace and ported code to use newer module based structure. + Webglimpse 1.9.2 (released 2018-3-22) * Made release package installable from npm. From 81f5e941e6a624f3d49e3c892bd6f31afb9de9b0 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 29 Mar 2018 15:40:32 -0700 Subject: [PATCH 15/69] Fixed incorrect redefinition of scoped variables. --- CHANGELOG | 4 ++++ package.json | 2 +- src/webglimpse/timeline/timeline_pane.ts | 12 ++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a61241c..e58208b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Webglimpse 2.0.3 (release 2018-3-29) + +* Fixed incorrect scoped redefinition of variables. + Webglimpse 2.0.2 (release 2018-3-28) * Replaced build system with ng-packagr. diff --git a/package.json b/package.json index 4ed948b..8ab403f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.2", + "version": "2.0.3", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index b5364dc..ee52f0f 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -255,7 +255,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: let scrollbar = newVerticalScrollbar(scrollLayout, drawable, scrollbarOptions); ui.addPane('scrollbar', scrollbar); - let contentPane = new Pane(newColumnLayout(false), false); + contentPane = new Pane(newColumnLayout(false), false); ui.addPane('scroll-outer-pane', contentPane); contentPane.addPane(scrollbar, 0, { width: scrollbarWidth, ignoreHeight: true }); @@ -265,7 +265,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: else { contentPaneArgs = { drawable: drawable, scrollLayout: null, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; - let contentPane = newTimelineContentPane(contentPaneArgs); + contentPane = newTimelineContentPane(contentPaneArgs); ui.addPane('content-pane', contentPane); } @@ -1073,16 +1073,16 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupButtonHeaderUnderlay.addPane(groupButton, 1); groupButtonHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); - let groupHeaderUnderlay = new Pane(newColumnLayout()); + groupHeaderUnderlay = new Pane(newColumnLayout()); groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); groupHeaderUnderlay.addPane(groupButtonHeaderUnderlay, 0, { width: rowLabelPaneWidth }); groupHeaderUnderlay.addPane(rowBackgroundPane, 1, { width: null }); - let groupHeaderPane = groupHeaderUnderlay; + groupHeaderPane = groupHeaderUnderlay; } else { - let groupHeaderUnderlay = new Pane(newColumnLayout()); + groupHeaderUnderlay = new Pane(newColumnLayout()); groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); groupHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); groupHeaderUnderlay.addPane(groupButton, 1); @@ -1091,7 +1091,7 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { let groupHeaderOverlay = newTimeAxisPane(args, null); let groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); - let groupHeaderPane = new Pane(newOverlayLayout()); + groupHeaderPane = new Pane(newOverlayLayout()); groupHeaderPane.addPane(groupHeaderUnderlay, true); groupHeaderPane.addPane(newInsetPane(groupHeaderOverlay, groupHeaderOverlayInsets, null, false), false); From 885d52b2a12818a4f0afdd8ab0ba98bbe64f0350 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 29 Mar 2018 17:03:13 -0700 Subject: [PATCH 16/69] Whitelist moment dependency. --- ng-package.json | 5 ++++- package.json | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ng-package.json b/ng-package.json index ec1c9de..5738b26 100644 --- a/ng-package.json +++ b/ng-package.json @@ -10,5 +10,8 @@ "moment": "moment" } } - } + }, + "whitelistedNonPeerDependencies": [ + "moment" + ] } \ No newline at end of file diff --git a/package.json b/package.json index 8ab403f..9011151 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "docs": "node_modules/.bin/compodoc -p tsconfig.json -d docs --theme readthedocs", "serve-docs": "node_modules/.bin/compodoc -s -d docs" }, - "peerDependencies": { + "dependencies": { "moment": "^2.21.0" }, "devDependencies": { @@ -60,7 +60,6 @@ "ts-node": "~3.2.0", "tslint": "~5.7.0", "typescript": "~2.4.2", - "zone.js": "^0.8.14", - "moment": "^2.21.0" + "zone.js": "^0.8.14" } } From 880d91e310cbab27c73ad9180305acb39101527a Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 11 Apr 2018 16:21:02 -0700 Subject: [PATCH 17/69] Fixed issues with compiled code getting deleted due to improperly scoped variable declarations. Added tslint.json and fixed lots of linter errors. Updated version to 2.0.4 --- CHANGELOG | 6 + ng-package.json | 13 +- package-lock.json | 13062 ++++++++++++++++ package.json | 2 +- src/webglimpse/bounds.ts | 4 +- src/webglimpse/buffer.ts | 16 +- src/webglimpse/color.ts | 28 +- src/webglimpse/core.ts | 157 +- src/webglimpse/gradient.ts | 18 +- src/webglimpse/label.ts | 8 +- src/webglimpse/layout/card_layout.ts | 14 +- src/webglimpse/layout/column_layout.ts | 50 +- src/webglimpse/layout/corner_layout.ts | 8 +- src/webglimpse/layout/inset_layout.ts | 6 +- src/webglimpse/layout/overlay_layout.ts | 12 +- src/webglimpse/layout/row_layout.ts | 58 +- src/webglimpse/matrix.ts | 6 +- src/webglimpse/misc.ts | 24 +- src/webglimpse/painter/border_painter.ts | 98 +- src/webglimpse/plot/axis.ts | 38 +- src/webglimpse/plot/edge_axis_painter.ts | 148 +- src/webglimpse/plot/heatmap_painter.ts | 44 +- src/webglimpse/plot/line_painter.ts | 24 +- src/webglimpse/plot/plot_layout.ts | 54 +- src/webglimpse/scroll.ts | 116 +- src/webglimpse/shader.ts | 102 +- src/webglimpse/text.ts | 143 +- src/webglimpse/texture.ts | 39 +- src/webglimpse/timeline/time_axis_painter.ts | 419 +- src/webglimpse/timeline/time_grid_painter.ts | 20 +- .../timeline/timeline_annotation_painter.ts | 64 +- .../timeline/timeline_annotation_style.ts | 2 +- .../timeline/timeline_cursor_painter.ts | 114 +- .../timeline/timeline_event_style.ts | 2 +- .../timeline/timeline_events_row.ts | 730 +- src/webglimpse/timeline/timeline_lanes.ts | 178 +- src/webglimpse/timeline/timeline_layout.ts | 34 +- src/webglimpse/timeline/timeline_model.ts | 186 +- src/webglimpse/timeline/timeline_pane.ts | 623 +- src/webglimpse/timeline/timeline_row.ts | 10 +- .../timeline/timeline_timeseries_row.ts | 370 +- src/webglimpse/timeline/timeline_ui.ts | 50 +- src/webglimpse/util/binary_tree.ts | 46 +- src/webglimpse/util/cache.ts | 24 +- src/webglimpse/util/multikey_cache.ts | 40 +- src/webglimpse/util/notification.ts | 80 +- src/webglimpse/util/ordered_set.ts | 70 +- src/webglimpse/util/sorted_arrays.ts | 51 +- src/webglimpse/util/sorted_multimap.ts | 38 +- src/webglimpse/util/split.ts | 68 +- src/webglimpse/util/util.ts | 28 +- tslint.json | 144 + 52 files changed, 15533 insertions(+), 2156 deletions(-) create mode 100644 package-lock.json create mode 100644 tslint.json diff --git a/CHANGELOG b/CHANGELOG index e58208b..c118990 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +Webglimpse 2.0.4 (release 2018-4-11) + +* Fixed some issues with variables being re-declared in if block scopes + that was causing the code to not generate properly. +* Added tslint.json and fixed lots of tslint errors. + Webglimpse 2.0.3 (release 2018-3-29) * Fixed incorrect scoped redefinition of variables. diff --git a/ng-package.json b/ng-package.json index 5738b26..25733ab 100644 --- a/ng-package.json +++ b/ng-package.json @@ -1,14 +1,9 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", - "ngPackage": { - "lib": { - "entryFile": "public_api.ts", - "externals": { - "moment": "moment" - }, - "umdModuleIds": { - "moment": "moment" - } + "lib": { + "entryFile": "src/public_api.ts", + "umdModuleIds": { + "moment": "moment" } }, "whitelistedNonPeerDependencies": [ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..52d44b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13062 @@ +{ + "name": "webglimpse", + "version": "2.0.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/build-optimizer": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", + "integrity": "sha1-d9TR5PzQlXXwIA4tbSHBo/mVCW8=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.7", + "typescript": "2.6.2", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", + "integrity": "sha1-tv1qouT0rDw5R4GYupGlPUwPiNU=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", + "rxjs": "5.5.8", + "source-map": "0.5.7" + }, + "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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", + "integrity": "sha1-CaImj61h9PlW9C24eRO4dIxRKng=", + "dev": true, + "requires": { + "@ngtools/json-schema": "1.2.0", + "rxjs": "5.5.8" + } + }, + "@angular/animations": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.9.tgz", + "integrity": "sha1-Ig25+1pSoZPbACPXIbI93SWnV3A=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/cli": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.3.tgz", + "integrity": "sha1-rJF7aSQLsbNAQh6fmFE1iQ4NU7Q=", + "dev": true, + "requires": { + "@angular-devkit/build-optimizer": "0.3.2", + "@angular-devkit/core": "0.3.2", + "@angular-devkit/schematics": "0.3.2", + "@ngtools/json-schema": "1.2.0", + "@ngtools/webpack": "1.10.2", + "@schematics/angular": "0.3.2", + "@schematics/package-update": "0.3.2", + "ajv": "6.4.0", + "autoprefixer": "7.2.6", + "cache-loader": "1.2.2", + "chalk": "2.2.2", + "circular-dependency-plugin": "4.4.0", + "clean-css": "4.1.11", + "common-tags": "1.7.2", + "copy-webpack-plugin": "4.4.3", + "core-object": "3.1.5", + "denodeify": "1.2.1", + "ember-cli-string-utils": "1.1.0", + "extract-text-webpack-plugin": "3.0.2", + "file-loader": "1.1.11", + "fs-extra": "4.0.3", + "glob": "7.1.2", + "html-webpack-plugin": "2.30.1", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.2.0", + "less": "2.7.3", + "less-loader": "4.1.0", + "license-webpack-plugin": "1.3.1", + "loader-utils": "1.1.0", + "lodash": "4.17.5", + "memory-fs": "0.4.1", + "minimatch": "3.0.4", + "node-modules-path": "1.0.1", + "node-sass": "4.8.3", + "nopt": "4.0.1", + "opn": "5.1.0", + "portfinder": "1.0.13", + "postcss": "6.0.21", + "postcss-import": "11.1.0", + "postcss-loader": "2.1.3", + "postcss-url": "7.3.1", + "raw-loader": "0.5.1", + "resolve": "1.6.0", + "rxjs": "5.5.8", + "sass-loader": "6.0.7", + "semver": "5.5.0", + "silent-error": "1.1.0", + "source-map-support": "0.4.18", + "style-loader": "0.19.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "uglifyjs-webpack-plugin": "1.2.4", + "url-loader": "0.6.2", + "webpack": "3.11.0", + "webpack-dev-middleware": "1.12.2", + "webpack-dev-server": "2.11.2", + "webpack-merge": "4.1.2", + "webpack-sources": "1.1.0", + "webpack-subresource-integrity": "1.0.4" + } + }, + "@angular/common": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.9.tgz", + "integrity": "sha1-vrJdRDRJirrla9jcLAGt4/bEXoE=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/compiler": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.9.tgz", + "integrity": "sha1-HQO8Hos4wlm8WBFNaRwhQNJE+PU=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.9.tgz", + "integrity": "sha1-NqBpk31QqKKU7aIztbGyxxE5dR8=", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "minimist": "1.2.0", + "reflect-metadata": "0.1.12", + "tsickle": "0.27.2" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@angular/core": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.9.tgz", + "integrity": "sha1-Pa8T75qnVLmVTtIdo+syLosg9mc=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/forms": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.9.tgz", + "integrity": "sha1-EsRbOgLDmLNU8JzHQNkUzZBMDJw=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/http": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.9.tgz", + "integrity": "sha1-L/6lNuGBvJfihnWT1XQl6nhTKFs=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/language-service": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.9.tgz", + "integrity": "sha1-SDi7YxnJno9b6wi9+zku6aEXN2Y=", + "dev": true + }, + "@angular/platform-browser": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.9.tgz", + "integrity": "sha1-nudjJ7Gzr/rWj/qDkFhmG3cEvCw=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.9.tgz", + "integrity": "sha1-hgdbe7aUhh9yLO2imq4YawRca30=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/router": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.9.tgz", + "integrity": "sha1-A2nfbmDG2jpYQsbrNeOVjU/+cn4=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "@compodoc/compodoc": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.0.9.tgz", + "integrity": "sha1-NSXS30n+T/v54LYnuSphB7YSA9w=", + "dev": true, + "requires": { + "@compodoc/ngd-transformer": "2.0.0", + "chalk": "2.3.2", + "cheerio": "1.0.0-rc.2", + "chokidar": "2.0.3", + "colors": "1.2.1", + "commander": "2.15.0", + "fancy-log": "1.3.2", + "findit2": "2.2.3", + "fs-extra": "5.0.0", + "glob": "7.1.2", + "handlebars": "4.0.11", + "html-entities": "1.2.1", + "json5": "0.5.1", + "live-server": "1.1.0", + "lodash": "4.17.5", + "lunr": "2.1.6", + "marked": "0.3.19", + "os-name": "2.0.1", + "traverse": "0.6.6", + "ts-simple-ast": "6.12.0", + "typescript": "2.4.2" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "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.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + } + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "commander": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha1-rSojocOwNuOSRpuAEs7GsztMEyI=", + "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.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.6" + } + }, + "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.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + } + } + }, + "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.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.1" + } + } + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "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.2" + }, + "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.1" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "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-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.2.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.6" + } + } + } + }, + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "@compodoc/ngd-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.0.0.tgz", + "integrity": "sha1-4xpsu9+o3mSLAnqkFpRovEllRMk=", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "fancy-log": "1.3.2", + "typescript": "2.4.2" + } + }, + "@compodoc/ngd-transformer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0.tgz", + "integrity": "sha1-iehY3TMhmM3iYvDPNki9CWnQ2mI=", + "dev": true, + "requires": { + "@compodoc/ngd-core": "2.0.0", + "dot": "1.1.2", + "fs-extra": "4.0.3", + "viz.js": "1.8.1" + } + }, + "@ngtools/json-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", + "integrity": "sha1-BuXs0p6aN9JgpEfdhz6ivs0ijE8=", + "dev": true + }, + "@ngtools/webpack": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", + "integrity": "sha1-NzcF/RmZKzbpliA0gLHUEulCyNY=", + "dev": true, + "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "magic-string": "0.22.5", + "semver": "5.5.0", + "source-map": "0.5.7", + "tree-kill": "1.2.0", + "webpack-sources": "1.1.0" + } + }, + "@schematics/angular": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", + "integrity": "sha1-viCaAyo+RXeZLZT7qhS9S/3kheI=", + "dev": true, + "requires": { + "typescript": "2.6.2" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@schematics/package-update": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", + "integrity": "sha1-xaKZzrqLnlbz4fgE+G8HZk7G4Bw=", + "dev": true, + "requires": { + "rxjs": "5.5.8", + "semver": "5.5.0", + "semver-intersect": "1.3.1" + } + }, + "@types/jasmine": { + "version": "2.5.54", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", + "integrity": "sha1-prXyrir7bgMHd06MfGCOA31JHGM=", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha1-DSiGsMva5MDuulXjB5L1hL8ECpU=", + "dev": true, + "requires": { + "@types/jasmine": "2.5.54" + } + }, + "@types/node": { + "version": "6.0.103", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.103.tgz", + "integrity": "sha1-T922wlR1bpgAQDnaTk9CMNHjl8o=", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.43", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "integrity": "sha1-LePXGIGbwgFldUxKWa+36YM/Zwc=", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha1-9HPdR+AnegjijpvsWu6wR1HwuMk=", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "adm-zip": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", + "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "ambi": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", + "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=", + "dev": true, + "requires": { + "editions": "1.3.4", + "typechecker": "4.5.0" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "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 + }, + "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 + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.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" + } + } + } + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "apache-crypt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.1.2.tgz", + "integrity": "sha1-ggeCozu2pf0nEggvDtOiTjybAhQ=", + "dev": true, + "requires": { + "unix-crypt-td-js": "1.0.0" + } + }, + "apache-md5": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.0.6.tgz", + "integrity": "sha1-RwI51AxU58Mt2dbrEbw1eOzJA8I=", + "dev": true + }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.5" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "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-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "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.11.0" + } + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "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.3" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "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=", + "dev": true, + "optional": true + }, + "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": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "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" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "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-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", + "integrity": "sha1-qysVDlHXsSK578jXNAwGtsQQdrw=", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha1-JWZy+G98c12oScTwfQCKuwVgZ9w=", + "dev": true, + "requires": { + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000821", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.21", + "postcss-value-parser": "3.3.0" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "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=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.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=", + "dev": true, + "requires": { + "core-js": "2.5.4", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.5" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "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.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha1-+xNmgjPZYUz1+0vOlam6QJbN+AE=", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "blocking-proxy": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", + "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "dev": true, + "requires": { + "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 + } + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.2.2", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "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 + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.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" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "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.11.8", + "randombytes": "2.0.6" + } + }, + "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.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha1-/jYWeu0bvN5IJ+v+cTR6LMcLmbI=", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000821", + "electron-to-chromium": "1.3.41" + } + }, + "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.2.3", + "ieee754": "1.1.11", + "isarray": "1.0.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha1-TLiDLSNhJYmwQG6eKVbBfwb99TE=", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "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-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "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 + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.2", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "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": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "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 + } + } + }, + "cache-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", + "integrity": "sha1-bVw43tlZoJzF1YGQq1r29zvTU/U=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mkdirp": "0.5.1", + "neo-async": "2.5.0", + "schema-utils": "0.4.5" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "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.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30000821", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000821.tgz", + "integrity": "sha1-DzIj8eBI7ZZFHFbKbPGXBYxCy5M=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha1-RAP1zxjzXAX1H73xUr9Yj5Vs98s=", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.5", + "parse5": "3.0.3" + }, + "dependencies": { + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha1-cQGTJkuwXHe4yQ0C9aryIhamZ7I=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "circular-dependency-plugin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", + "integrity": "sha1-+KGnRqP2yOV/Ta6bVNmRzSpYL10=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "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.6" + } + }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "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.7" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha1-ANs6Hhc2VnMNEYjD1qztbX6pdxM=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "6.0.2", + "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.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "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-block-writer": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.7.1.tgz", + "integrity": "sha1-F0u8O4xzRcfW4+R6dRWfXlAr2g0=", + "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 + }, + "codelyzer": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.2.1.tgz", + "integrity": "sha1-1W6qzvyn6BOKrApjDkhL2wmYhUQ=", + "dev": true, + "requires": { + "app-root-path": "2.0.1", + "css-selector-tokenizer": "0.7.0", + "cssauron": "1.4.0", + "semver-dsl": "1.0.1", + "source-map": "0.5.7", + "sprintf-js": "1.0.3" + } + }, + "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.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "colors": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", + "integrity": "sha1-9KPTApdqrwQjVroa3jsaLGLZ15Q=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", + "dev": true + }, + "commenting": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.0.5.tgz", + "integrity": "sha1-MQTVQsrIpPJ7PVFDj0uAQx/kUms=", + "dev": true + }, + "common-tags": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz", + "integrity": "sha1-JNl2jGPSU6Vuz/k4RbRLTfHVJ3E=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", + "integrity": "sha1-QzECVqXFVartQZPATY8VTPnG79U=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "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=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "compression": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.13", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + } + }, + "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": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "dev": true, + "requires": { + "debug": "2.2.0", + "finalhandler": "0.4.1", + "parseurl": "1.3.2", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "dev": true, + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "unpipe": "1.0.0" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "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" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "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 + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "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=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", + "integrity": "sha1-ZdVvueGTaznhKfmqKuwJfOH9RL4=", + "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.2.0", + "serialize-javascript": "1.4.0" + }, + "dependencies": { + "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-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" + } + } + } + }, + "core-js": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.4.tgz", + "integrity": "sha1-8si/GB8qgLkvNgEhQpzmOi8K6uA=", + "dev": true + }, + "core-object": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha1-+mJ7h1Aq3JgEXkRnjpqOw7nA0qk=", + "dev": true, + "requires": { + "chalk": "2.2.2" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + } + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.11.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "duplexer": "0.1.1", + "glob": "7.1.2", + "glob2base": "0.0.12", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "resolve": "1.6.0", + "safe-buffer": "5.1.1", + "shell-quote": "1.6.1", + "subarg": "1.0.0" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.11" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "csextends": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", + "integrity": "sha1-Y3SyEJhLVNRJXynJnT3QabgFQ+U=", + "dev": true + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "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.0", + "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=", + "dev": true, + "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 + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.42" + } + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "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": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "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-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "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.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "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 + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "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.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "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.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-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.1", + "void-elements": "2.0.1" + } + }, + "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.3", + "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": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "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.1.0", + "domelementtype": "1.3.0" + } + }, + "dot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.2.tgz", + "integrity": "sha1-xzdwGfxOVQeYkosrmv62ar+h8vk=", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha1-S7RsF5bqvr7sTKmi5muAjLej2LQ=", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + } + }, + "eachr": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz", + "integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=", + "dev": true, + "requires": { + "editions": "1.3.4", + "typechecker": "4.5.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.1" + } + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha1-NmLLWSNHwxaOuOSYoP9zJx1n9Qs=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.8.tgz", + "integrity": "sha1-KraVRhnyJeYZO3rF98OcSP7+Q4A=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.41.tgz", + "integrity": "sha1-fjNkPgDNhe39F+BBlPbQDnNzcjU=", + "dev": true + }, + "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.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "ember-cli-string-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", + "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha1-zOh9UY8Elok7GjDNhGGDVTVIBoE=", + "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.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha1-jAfdM68E1dzRMQtc7xO+pjqJuo0=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "estree-walker": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz", + "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42" + } + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "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.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "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.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "0.1.1" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extendr": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/extendr/-/extendr-3.3.0.tgz", + "integrity": "sha1-amGtOti5sDr6VhaWxIvvR94FPjc=", + "dev": true, + "requires": { + "editions": "1.3.4", + "typechecker": "4.5.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-opts": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-3.3.1.tgz", + "integrity": "sha1-WrvtyYwNUgLjJ4cn+Rktfghsa+E=", + "dev": true, + "requires": { + "eachr": "3.2.0", + "editions": "1.3.4", + "typechecker": "4.5.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha1-XwQ+qgL5dQqSWLeMCm4NwUCPsvc=", + "dev": true, + "requires": { + "async": "2.6.0", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0", + "webpack-sources": "1.1.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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "time-stamp": "1.1.0" + }, + "dependencies": { + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + } + } + }, + "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 + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha1-b+iGRJsPKpNuQ8q6rAzb+zaVBvg=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.4.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.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.2.0", + "pkg-dir": "2.0.0" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "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" + } + }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "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": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "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.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "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" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "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.3", + "readable-stream": "2.3.5" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha1-BsJ3IYRU7CiN93raVKA7hwKqy50=", + "dev": true, + "requires": { + "minipass": "2.2.4" + } + }, + "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.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.5" + } + }, + "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.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "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 + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": 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.0.2" + } + }, + "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.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "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.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.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.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.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 + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "1.2.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "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-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "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.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "minimatch": "3.0.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "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 + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "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=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "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=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "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.1" + }, + "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-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.2.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.6" + } + } + } + }, + "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.6" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha1-IyNbKasjDFdqqw1PE/wEawsDgiI=", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.5", + "wbuf": "1.7.3" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.12.tgz", + "integrity": "sha1-a/rU0DJ/W40rYvWFRlSsNwO5sDE=", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.11", + "commander": "2.15.1", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.16" + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "html-minifier": "3.5.12", + "loader-utils": "0.2.17", + "lodash": "4.17.5", + "pretty-error": "2.1.1", + "toposort": "1.0.6" + }, + "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.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.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.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + }, + "dependencies": { + "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.3.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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + } + } + }, + "http-auth": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-2.4.11.tgz", + "integrity": "sha1-YfAkpuDnxIk0lEiVyHoTlVCcYZs=", + "dev": true, + "requires": { + "apache-crypt": "1.1.2", + "apache-md5": "1.0.6", + "node-uuid": "1.4.8" + }, + "dependencies": { + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz", + "integrity": "sha1-W3IIScZQkDwn5SFjPZRpbulfNSk=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.5", + "micromatch": "2.3.11" + }, + "dependencies": { + "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-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.1" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "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 + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "ieee754": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha1-wWOE/+APW3g1gk5ntvK9RKUilFU=", + "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.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "dev": true + }, + "ignorefs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", + "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=", + "dev": true, + "requires": { + "editions": "1.3.4", + "ignorepatterns": "1.1.0" + } + }, + "ignorepatterns": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz", + "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=", + "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-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=", + "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 + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "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.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "injection-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.1.tgz", + "integrity": "sha1-qNaghbLwuNhlD29Eh/aruMwNZ84=", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.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": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "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 + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + }, + "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.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha1-JH5BYueGDOu9rzC3dNawrH3P56U=", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + }, + "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": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha1-ayEDoojpTvPeXPFdKd2F/Et41lw=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "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-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "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-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "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" + } + }, + "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-api": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha1-TDsF0YwAFtECLgebmNyCxA9IiVQ=", + "dev": true, + "requires": { + "async": "2.6.0", + "compare-versions": "3.1.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.11.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "istanbul-lib-instrument": "1.10.1", + "loader-utils": "1.1.0", + "schema-utils": "0.3.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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha1-99jy5CuX43/nlhFMsPnWi146Q0E=", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha1-rlVv1aQabo76CxACseQW3+r5gWw=", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha1-cktLbKzrqGktPx+dByfiecQBr3s=", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha1-6IbN9QXE672OCZ5DlqkNCijirLU=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha1-zHzK1hYp9O//ji94rbjFIsmXbsc=", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha1-LzIugeHZUgdnWX3KPCCgzOiaNVQ=", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "jasmine": { + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2", + "jasmine-core": "2.99.1" + }, + "dependencies": { + "jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", + "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", + "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "dev": true, + "requires": { + "colors": "1.1.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + } + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha1-LlRewrDylX9BNWUQIFIU6Y+tZYI=", + "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=", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha1-WXwai9VxUvJtYizkEXhRpR9euu8=", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", + "integrity": "sha1-UBg80bLSUnXeBp6ecbRnrJ6rlzo=", + "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.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "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 + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "body-parser": "1.18.2", + "chokidar": "1.7.0", + "colors": "1.2.1", + "combine-lists": "1.0.1", + "connect": "3.6.6", + "core-js": "2.5.4", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.16.2", + "isbinaryfile": "3.0.2", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.6.0", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "socket.io": "1.7.3", + "source-map": "0.5.7", + "tmp": "0.0.31", + "useragent": "2.3.0" + }, + "dependencies": { + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "1.3.2", + "utils-merge": "1.0.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", + "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "1.6.0" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.2.tgz", + "integrity": "sha1-qNDIgVx9b2zqFaOUp8SznvFRqTk=", + "dev": true, + "requires": { + "istanbul-api": "1.3.1", + "minimatch": "3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", + "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "1.1.1" + } + }, + "karma-source-map-support": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", + "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "dev": true, + "requires": { + "source-map-support": "0.4.18" + } + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "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.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "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" + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", + "dev": true, + "requires": { + "errno": "0.1.7", + "graceful-fs": "4.1.11", + "image-size": "0.5.5", + "mime": "1.6.0", + "mkdirp": "0.5.1", + "promise": "7.3.1", + "request": "2.81.0", + "source-map": "0.5.7" + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=", + "dev": true, + "requires": { + "clone": "2.1.2", + "loader-utils": "1.1.0", + "pify": "3.0.0" + } + }, + "license-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", + "integrity": "sha1-aIt2RyGI71l5GLfK4+7H3C+loOg=", + "dev": true, + "requires": { + "ejs": "2.5.8" + } + }, + "live-server": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", + "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", + "dev": true, + "requires": { + "colors": "1.2.1", + "connect": "3.4.1", + "cors": "2.8.4", + "event-stream": "3.3.4", + "faye-websocket": "0.11.1", + "http-auth": "2.4.11", + "morgan": "1.9.0", + "object-assign": "4.1.1", + "opn": "5.3.0", + "proxy-middleware": "0.15.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "watchr": "2.6.0" + }, + "dependencies": { + "colors": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", + "integrity": "sha1-9KPTApdqrwQjVroa3jsaLGLZ15Q=", + "dev": true + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha1-ZIcVZchjh18FLP31PT48ta21Oxw=", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + } + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "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=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc=", + "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 + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, + "dependencies": { + "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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "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 + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "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=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha1-RSNLLm4vKzPaElYkxGZJKaAiTD8=", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "lunr": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.1.6.tgz", + "integrity": "sha1-Zx0jIcTFvExSKRSVPRxU1hL2Cqc=", + "dev": true + }, + "macos-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", + "integrity": "sha1-gxlF4pNltHCqhySwqzbI+JWdEPs=", + "dev": true + }, + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha1-jpz1r930Q4XB2lvCpqDb0QsDZX4=", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha1-bWpJ7q1KrilsU7vzoaAIvWyJRps=", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha1-GZeO1XX56VRdL/jBPjO10Ypn1TU=", + "dev": true + }, + "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-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "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.1" + } + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha1-XUf3CcTJ/Dwha21GEnKA9As515A=", + "dev": true + }, + "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.4", + "inherits": "2.0.3" + }, + "dependencies": { + "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.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "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.2.0" + } + }, + "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.7", + "readable-stream": "2.3.5" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", + "dev": true, + "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": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "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": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minipass": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", + "integrity": "sha1-A8gk2EVR7Dio0btbw1Clowo1SkA=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "dev": true + } + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha1-EeE2WM5GvDpwomeqxYNZ0eDCnOs=", + "dev": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "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": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "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.8", + "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.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha1-KhFLUdKm7J5tg8+AP4OKh42KAjo=" + }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "dev": true, + "requires": { + "basic-auth": "2.0.0", + "debug": "2.6.9", + "depd": "1.1.2", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + } + }, + "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.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "dev": true, + "requires": { + "dns-packet": "1.3.1", + "thunky": "1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8=", + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", + "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-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", + "integrity": "sha1-drHIIxMMyias+6zMj7rwovozsY8=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "ng-packagr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-2.4.1.tgz", + "integrity": "sha1-J6ta2TNyWkicXtp+VlbOWpRcOcI=", + "dev": true, + "requires": { + "@ngtools/json-schema": "1.2.0", + "autoprefixer": "7.2.6", + "browserslist": "2.11.3", + "chalk": "2.3.2", + "commander": "2.15.1", + "cpx": "1.5.0", + "fs-extra": "5.0.0", + "glob": "7.1.2", + "injection-js": "2.2.1", + "less": "2.7.3", + "node-sass": "4.8.3", + "node-sass-tilde-importer": "1.0.2", + "postcss": "6.0.21", + "postcss-clean": "1.1.0", + "postcss-url": "7.3.1", + "read-pkg-up": "3.0.0", + "rimraf": "2.6.2", + "rollup": "0.55.5", + "rollup-plugin-cleanup": "2.0.0", + "rollup-plugin-commonjs": "8.3.0", + "rollup-plugin-license": "0.6.0", + "rollup-plugin-node-resolve": "3.3.0", + "rxjs": "5.5.8", + "sorcery": "0.10.0", + "strip-bom": "3.0.0", + "stylus": "0.54.5", + "tar": "4.4.1", + "uglify-js": "3.3.16", + "update-notifier": "2.4.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "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" + } + }, + "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.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.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 + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "tar": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", + "integrity": "sha1-sl1ahHDJdv16moo1D0LFnp+oF0k=", + "dev": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "dev": true + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "dev": true + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "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": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.5", + "stream-browserify": "2.0.1", + "stream-http": "2.8.1", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.6", + "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-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", + "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "dev": true + }, + "node-sass": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", + "integrity": "sha1-0HfMIKCKwG9mHKRPtvGc0u1B3rs=", + "dev": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.10.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.15.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha1-GhUQXBU/ZIMjtDR2k/2w8zG60c4=", + "dev": true, + "requires": { + "find-parent-dir": "0.3.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "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.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "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.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "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" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "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 + }, + "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=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "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.6" + } + }, + "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.2.2" + } + }, + "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.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "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.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=", + "dev": true, + "requires": { + "is-wsl": "1.1.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.8", + "wordwrap": "0.0.2" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "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-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "dev": true, + "requires": { + "macos-release": "1.1.0", + "win-release": "1.1.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 + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "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-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", + "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.2.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "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 + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=", + "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.3.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.3.2" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w=", + "dev": true, + "requires": { + "@types/node": "6.0.103" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.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=", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.11" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "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.4" + } + }, + "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" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "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": "6.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", + "integrity": "sha1-gmVmJpTt356aWWDbbaM8OeTNBp0=", + "dev": true, + "requires": { + "chalk": "2.3.2", + "source-map": "0.6.1", + "supports-color": "5.3.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "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 + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-clean/-/postcss-clean-1.1.0.tgz", + "integrity": "sha1-wtYdXYyvGaWFrboWiXcmwmdMQgc=", + "dev": true, + "requires": { + "clean-css": "4.1.11", + "postcss": "6.0.21" + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha1-Vck2LJGSmU7GiGXSJEGd8dspgfA=", + "dev": true, + "requires": { + "postcss": "6.0.21", + "postcss-value-parser": "3.3.0", + "read-cache": "1.0.0", + "resolve": "1.6.0" + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.3.tgz", + "integrity": "sha1-6yENpzTkdaJE92zNYfmGD1uz7gk=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "postcss": "6.0.21", + "postcss-load-config": "1.2.0", + "schema-utils": "0.4.5" + } + }, + "postcss-url": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.1.tgz", + "integrity": "sha1-tDrg8NrkzQbIMfo66sLXpbc3VO0=", + "dev": true, + "requires": { + "mime": "1.6.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "postcss": "6.0.21", + "xxhashjs": "0.2.2" + } + }, + "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=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "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.0" + } + }, + "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": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "dev": true, + "optional": true, + "requires": { + "asap": "2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protractor": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", + "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", + "dev": true, + "requires": { + "@types/node": "6.0.103", + "@types/q": "0.0.32", + "@types/selenium-webdriver": "2.53.43", + "blocking-proxy": "0.0.5", + "chalk": "1.1.3", + "glob": "7.1.2", + "jasmine": "2.99.0", + "jasminewd2": "2.2.0", + "optimist": "0.6.1", + "q": "1.4.1", + "saucelabs": "1.3.0", + "selenium-webdriver": "3.0.1", + "source-map-support": "0.4.18", + "webdriver-js-extender": "1.0.0", + "webdriver-manager": "12.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", + "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "dev": true, + "requires": { + "adm-zip": "0.4.7", + "chalk": "1.1.3", + "del": "2.2.2", + "glob": "7.1.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "q": "1.4.1", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.5.0", + "xml2js": "0.4.19" + } + } + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha1-NV8mJQWmIWRrMTCnKOtkfiIFU0E=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.6" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha1-gLfF334kFT0D8OesigWl0Gi9B/s=", + "dev": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "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.2.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.6" + } + } + } + }, + "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.6" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "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.1.0", + "pinkie-promise": "2.0.1" + } + }, + "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.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha1-tPhQA6k4y7bsvOKhJPsQEr0ag40=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "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.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.5", + "set-immediate-shim": "1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha1-MRvwxrY814LyKKgavhRqK/qcVvI=", + "dev": true + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha1-DDNtOYBVPXVcObWGrjsgqknIK38=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=", + "dev": true, + "requires": { + "rc": "1.2.6", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.6" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "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.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.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 + } + } + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "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-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", + "integrity": "sha1-D70hJ4sntABEgcOVNJ56umCp/1w=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "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" + } + }, + "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-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "rollup": { + "version": "0.55.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.5.tgz", + "integrity": "sha1-L4jDAPfPJLXsLcqKarpzsE4IfpM=", + "dev": true + }, + "rollup-plugin-cleanup": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.0.tgz", + "integrity": "sha1-hZdzGaO/VHUKnXX7kJx+UfWaLaQ=", + "dev": true, + "requires": { + "acorn": "4.0.13", + "magic-string": "0.22.5", + "rollup-pluginutils": "2.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "rollup-plugin-commonjs": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.3.0.tgz", + "integrity": "sha1-kbS6GPNAlR457XsZAfN3qAqz+cM=", + "dev": true, + "requires": { + "acorn": "5.5.3", + "estree-walker": "0.5.1", + "magic-string": "0.22.5", + "resolve": "1.6.0", + "rollup-pluginutils": "2.0.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.1.tgz", + "integrity": "sha1-ZPw3UFOrxvV9c+m9LwBGRK08WFQ=", + "dev": true + } + } + }, + "rollup-plugin-license": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-0.6.0.tgz", + "integrity": "sha1-2OXnWsD8taevfF2JpkTvQvBfSKQ=", + "dev": true, + "requires": { + "commenting": "1.0.5", + "lodash": "4.17.5", + "magic-string": "0.22.4", + "mkdirp": "0.5.1", + "moment": "2.21.0" + }, + "dependencies": { + "magic-string": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha1-MQObTkA2Y5VhjB1s+Bk8U5F0df8=", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + } + } + }, + "rollup-plugin-node-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", + "integrity": "sha1-wm0RCjaBLL76fOEXytzTQ5qhxxM=", + "dev": true, + "requires": { + "builtin-modules": "2.0.0", + "is-module": "1.0.0", + "resolve": "1.6.0" + }, + "dependencies": { + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha1-YLfvWuZUa9fe76dLCLYqQ6IyZI4=", + "dev": true + } + } + }, + "rollup-pluginutils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz", + "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=", + "dev": true, + "requires": { + "estree-walker": "0.3.1", + "micromatch": "2.3.11" + } + }, + "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.2.0" + } + }, + "rxjs": { + "version": "5.5.8", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz", + "integrity": "sha1-srCAmldhStYlTAPXRG3qDYPKN5E=", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safefs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.1.0.tgz", + "integrity": "sha1-+CrrS9165R9lPrIPZyizBYyNZEU=", + "dev": true, + "requires": { + "editions": "1.3.4", + "graceful-fs": "4.1.11" + } + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", + "dev": true, + "requires": { + "es6-promise": "3.3.1", + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha1-3S/bPn7v9KU/NbpqxAhxVIg1PQA=", + "dev": true, + "requires": { + "clone-deep": "2.0.2", + "loader-utils": "1.1.0", + "lodash.tail": "4.1.1", + "neo-async": "2.5.0", + "pify": "3.0.0" + } + }, + "saucelabs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", + "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "dev": true, + "requires": { + "https-proxy-agent": "1.0.0" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "scandirectory": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", + "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=", + "dev": true, + "requires": { + "ignorefs": "1.2.0", + "safefs": "3.2.2", + "taskgroup": "4.3.1" + }, + "dependencies": { + "safefs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", + "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "taskgroup": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", + "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=", + "dev": true, + "requires": { + "ambi": "2.5.0", + "csextends": "1.2.0" + } + } + } + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha1-IYNvBgiqwXt4+ePiTa/xSlyhOj4=", + "dev": true, + "requires": { + "ajv": "6.4.0", + "ajv-keywords": "3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "2.4.3", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", + "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", + "dev": true, + "requires": { + "adm-zip": "0.4.7", + "rimraf": "2.6.2", + "tmp": "0.0.30", + "xml2js": "0.4.19" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } + } + }, + "selfsigned": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", + "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "dev": true, + "requires": { + "node-forge": "0.7.1" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "semver-intersect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", + "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.18", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.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.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha1-RIDNBuiC72iyrYij6lSDLixItXE=", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.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": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "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 + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "dev": true, + "requires": { + "debug": "2.6.9" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.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.6" + } + }, + "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.1" + } + }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "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.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.2.1" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.2.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "minimist": "1.2.0", + "sander": "0.5.1", + "sourcemap-codec": "1.4.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", + "dev": true, + "requires": { + "atob": "2.1.0", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "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 + }, + "sourcemap-codec": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz", + "integrity": "sha1-yP2S2RiJ6QKgeu45K90sWGOVi6I=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "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": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" + } + }, + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha1-S7sVqv/tC+791WrWHb3Iuj4st6E=", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.5", + "safe-buffer": "5.1.1", + "wbuf": "1.7.3" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "requires": { + "readable-stream": "2.3.5" + } + }, + "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.3", + "readable-stream": "2.3.5" + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha1-joxGP5HaiZF3h2WHP+TZYNj2Fr0=", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", + "integrity": "sha1-0EQb4aRXpzpzOop7U1cL69nvZqQ=", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "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 + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "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-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "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.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha1-WR/8gLzv4mi3fF2evAUF13Jhn4U=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.0", + "debug": "2.6.9", + "glob": "7.0.6", + "mkdirp": "0.5.1", + "sax": "0.5.8", + "source-map": "0.1.43" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha1-J6cGQgsFo44DjnyssVNXjUUFE8Y=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "lodash.clonedeep": "4.5.0", + "when": "3.6.4" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "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 + } + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "taskgroup": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-5.0.1.tgz", + "integrity": "sha1-CHNsmyRoOxQ0d0Ix60tzqnw/ebU=", + "dev": true, + "requires": { + "ambi": "2.5.0", + "eachr": "3.2.0", + "editions": "1.3.4", + "extendr": "3.3.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "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.3.5", + "xtend": "4.0.1" + } + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha1-JB52kn2coF9NlZgZAi9bNmS2S64=", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "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-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "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.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "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.2.2" + } + } + } + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "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 + } + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha1-WEZ4Yje0I5AU8F2xVrZDIS1MbzY=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "ts-node": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", + "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.2.2", + "diff": "3.5.0", + "make-error": "1.3.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18", + "tsconfig": "6.0.0", + "v8flags": "3.0.2", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "ts-simple-ast": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-6.12.0.tgz", + "integrity": "sha1-vSMtf8fj8f8SEYJVTeHkIW+SWC4=", + "dev": true, + "requires": { + "code-block-writer": "6.7.1", + "globby": "6.1.0", + "multimatch": "2.1.0", + "object-assign": "4.1.1", + "typescript": "2.4.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.2.tgz", + "integrity": "sha1-8z1G0Eb3PdXBVaN5IuQigW6HhzY=", + "dev": true, + "requires": { + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map": "0.6.1", + "source-map-support": "0.5.4" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "source-map-support": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha1-VEVu+onKqScK981iTMLxI+Ufuug=", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + } + } + }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", + "dev": true + }, + "tslint": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", + "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "colors": "1.2.1", + "commander": "2.15.1", + "diff": "3.5.0", + "glob": "7.1.2", + "minimatch": "3.0.4", + "resolve": "1.6.0", + "semver": "5.5.0", + "tslib": "1.9.0", + "tsutils": "2.25.0" + } + }, + "tsutils": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.25.0.tgz", + "integrity": "sha1-FNYW71kiSjyft+tIPhwYK2Zlrl4=", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, + "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.1.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-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "typechecker": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.5.0.tgz", + "integrity": "sha1-w4KSAJeBI2S7r0WVsKtliCRBF6Y=", + "dev": true, + "requires": { + "editions": "1.3.4" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "dev": true + }, + "uglify-js": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.16.tgz", + "integrity": "sha1-I7oT76J6oAiFvnQXgZ6Kl4f5QCg=", + "dev": true, + "requires": { + "commander": "2.15.1", + "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": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz", + "integrity": "sha1-XuyUGy6bhTi+CiD8btolsUx8EEM=", + "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.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + } + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "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.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "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" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unix-crypt-td-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", + "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "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.1" + }, + "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.6", + "has-values": "0.1.4", + "isobject": "2.1.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 + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha1-7iMhugp4bFCXPbBDpQt7y6giNh0=", + "dev": true + }, + "update-notifier": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.4.0.tgz", + "integrity": "sha1-+bTHAPv9TsEsgRWHJYd31WPYyGY=", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.2.2", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "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": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha1-oAenEJYg6dmI0UvOZ3od7Lmpk/c=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "1.6.0", + "schema-utils": "0.3.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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha1-OhnoqqbQI93SfcxEy0/I9/7COYY=", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha1-FHFr8D/f79AwQK71jYtLhfOnxUQ=", + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + } + } + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "tmp": "0.0.31" + } + }, + "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" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", + "dev": true + }, + "v8flags": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", + "integrity": "sha1-rWp4ogprI9A6jevBEhHjzCMUlHc=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "viz.js": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.1.tgz", + "integrity": "sha1-J3qzz0NnxgipWygadHIIPD4u5s8=", + "dev": true + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha1-jz5DKM9jsVQMDWfhsneDhviXWyY=", + "dev": true + }, + "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" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha1-Ix54Ovgwoi+JZvZcTEusyBQHLu0=", + "dev": true, + "requires": { + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "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.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + } + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "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.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.6" + } + }, + "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.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + } + } + }, + "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.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.1" + } + } + } + }, + "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.2" + }, + "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.1" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "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-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.2.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.6" + } + } + } + }, + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "watchr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.6.0.tgz", + "integrity": "sha1-51xCOxC+eSZ6DD73bi6hBP4CZ6U=", + "dev": true, + "requires": { + "eachr": "3.2.0", + "extendr": "3.3.0", + "extract-opts": "3.3.1", + "ignorefs": "1.2.0", + "safefs": "4.1.0", + "scandirectory": "2.5.0", + "taskgroup": "5.0.1", + "typechecker": "4.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.0" + } + }, + "webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "dev": true, + "requires": { + "@types/selenium-webdriver": "2.53.43", + "selenium-webdriver": "2.53.3" + }, + "dependencies": { + "adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "dev": true + }, + "sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "dev": true + }, + "selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", + "dev": true, + "requires": { + "adm-zip": "0.4.4", + "rimraf": "2.6.2", + "tmp": "0.0.24", + "ws": "1.1.2", + "xml2js": "0.4.4" + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + "dev": true + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "dev": true, + "requires": { + "sax": "0.6.1", + "xmlbuilder": "9.0.7" + } + } + } + }, + "webpack": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha1-d9pFGx17SxF62vQaGpO1dC8k2JQ=", + "dev": true, + "requires": { + "acorn": "5.5.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "6.4.0", + "ajv-keywords": "3.1.0", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.5.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + }, + "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 + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.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": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha1-+PwRIM47T8VoDO7LQ9d3lmshEF4=", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + } + }, + "webpack-dev-server": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", + "integrity": "sha1-H09MeL8YlTePN2gVkQgS2veaIW8=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "2.0.3", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "import-local": "1.0.0", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.1.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.2", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "5.3.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "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.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + } + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "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.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "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.6" + } + }, + "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.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "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.2" + } + }, + "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.1" + } + } + } + }, + "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.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.1" + } + } + } + }, + "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.2" + }, + "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.1" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, + "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-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.2.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.6" + } + } + } + }, + "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha1-XTct3dPh5fiHT1v1qOkp2wn+shY=", + "dev": true, + "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": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=", + "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": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", + "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "dev": true, + "requires": { + "webpack-core": "0.6.9" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.11", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "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 + }, + "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 + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.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" + } + } + } + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, + "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.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "dev": true, + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.7" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha1-imJRVnYhocRqWuIE2gJJx/jKqdg=", + "dev": true, + "requires": { + "cuint": "0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "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-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", + "integrity": "sha1-ohjEjbCUZLGf9vyPDUu1sQRuGF0=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 9011151..b13040e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.3", + "version": "2.0.4", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", diff --git a/src/webglimpse/bounds.ts b/src/webglimpse/bounds.ts index 1b9ad02..46cb871 100644 --- a/src/webglimpse/bounds.ts +++ b/src/webglimpse/bounds.ts @@ -123,14 +123,14 @@ export class Bounds { export function newBoundsFromRect(i: number, j: number, w: number, h: number): Bounds { - let b = new Bounds(); + const b = new Bounds(); b.setRect(i, j, w, h); return b; } export function newBoundsFromEdges(iStart: number, iEnd: number, jStart: number, jEnd: number): Bounds { - let b = new Bounds(); + const b = new Bounds(); b.setEdges(iStart, iEnd, jStart, jEnd); return b; } diff --git a/src/webglimpse/buffer.ts b/src/webglimpse/buffer.ts index 069ee0e..af80d0f 100644 --- a/src/webglimpse/buffer.ts +++ b/src/webglimpse/buffer.ts @@ -51,7 +51,7 @@ export function newDynamicBuffer(data: Float32Array = new Float32Array(0)): Dyna class BufferEntry { gl: WebGLRenderingContext; buffer: WebGLBuffer; - capacity: number = 0; + capacity = 0; marker: number = null; constructor(gl: WebGLRenderingContext, buffer: WebGLBuffer) { @@ -62,7 +62,7 @@ class BufferEntry { class AbstractBuffer implements Buffer { private buffers: StringMap = {}; - private currentMarker: number = 0; + private currentMarker = 0; init(gl: WebGLRenderingContext, target: number): number { throw new Error('Method is abstract'); @@ -77,10 +77,12 @@ class AbstractBuffer implements Buffer { } bind(gl: WebGLRenderingContext, target: number) { - let glId = getObjectId(gl); + const glId = getObjectId(gl); if (this.buffers[glId] === undefined) { - let buffer = gl.createBuffer(); - if (!hasval(buffer)) throw new Error('Failed to create buffer'); + const buffer = gl.createBuffer(); + if (!hasval(buffer)) { + throw new Error('Failed to create buffer'); + } this.buffers[glId] = new BufferEntry(gl, buffer); gl.bindBuffer(target, this.buffers[glId].buffer); @@ -103,9 +105,9 @@ class AbstractBuffer implements Buffer { dispose() { // XXX: Not sure this actually works ... may have to make each gl current or something - for (let glid in this.buffers) { + for (const glid in this.buffers) { if (this.buffers.hasOwnProperty(glid)) { - let en = this.buffers[glid]; + const en = this.buffers[glid]; en.gl.deleteBuffer(en.buffer); } } diff --git a/src/webglimpse/color.ts b/src/webglimpse/color.ts index 84e16a6..e2aa3d3 100644 --- a/src/webglimpse/color.ts +++ b/src/webglimpse/color.ts @@ -77,15 +77,19 @@ export function rgb(r: number, g: number, b: number): Color { export function sameColor(c1: Color, c2: Color): boolean { - if (c1 === c2) return true; - if (!hasval(c1) || !hasval(c2)) return false; + if (c1 === c2) { + return true; + } + if (!hasval(c1) || !hasval(c2)) { + return false; + } return (c1.r === c2.r && c1.g === c2.g && c1.b === c2.b && c1.a === c2.a); } export function parseRgba(rgbaString: string): Color { - let tokens = rgbaString.split(',', 4); - return new Color(parseInt(tokens[0]) / 255, parseInt(tokens[1]) / 255, parseInt(tokens[2]) / 255, parseInt(tokens[3]) / 255); + const tokens = rgbaString.split(',', 4); + return new Color(parseInt(tokens[0], 10) / 255, parseInt(tokens[1], 10) / 255, parseInt(tokens[2], 10) / 255, parseInt(tokens[3], 10) / 255); } @@ -102,22 +106,22 @@ export function parseRgba(rgbaString: string): Color { * */ export let parseCssColor = (function () { - let canvas = document.createElement('canvas'); + const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; - let g = canvas.getContext('2d'); + const g = canvas.getContext('2d'); return function (cssColorString: string): Color { g.clearRect(0, 0, 1, 1); g.fillStyle = cssColorString; g.fillRect(0, 0, 1, 1); - let rgbaData = g.getImageData(0, 0, 1, 1).data; - let R = rgbaData[0] / 255; - let G = rgbaData[1] / 255; - let B = rgbaData[2] / 255; - let A = rgbaData[3] / 255; + const rgbaData = g.getImageData(0, 0, 1, 1).data; + const R = rgbaData[0] / 255; + const G = rgbaData[1] / 255; + const B = rgbaData[2] / 255; + const A = rgbaData[3] / 255; return rgba(R, G, B, A); - } + }; })(); diff --git a/src/webglimpse/core.ts b/src/webglimpse/core.ts index 001619a..a57b1f6 100644 --- a/src/webglimpse/core.ts +++ b/src/webglimpse/core.ts @@ -32,9 +32,7 @@ import { Notification, Listener, Notification1 } from './util/notification'; import { OrderedSet } from './util/ordered_set'; import { alwaysTrue, GL, getObjectId, hasval } from './util/util'; -export interface Painter { - (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable): void; -} +export type Painter = (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) => void; export interface PointerEvent { @@ -65,14 +63,10 @@ export interface LayoutEntry { } -export interface LayoutPhase1 { - (parentPrefSize: Size, children?: LayoutEntry[]): LayoutPhase1; -} +export type LayoutPhase1 = (parentPrefSize: Size, children?: LayoutEntry[]) => LayoutPhase1; -export interface LayoutPhase2 { - (children: LayoutEntry[], parentViewport: BoundsUnmodifiable): LayoutPhase2; -} +export type LayoutPhase2 = (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) => LayoutPhase2; export interface Layout { @@ -81,9 +75,7 @@ export interface Layout { } -export interface Mask2D { - (viewport: BoundsUnmodifiable, i: number, j: number): boolean; -} +export type Mask2D = (viewport: BoundsUnmodifiable, i: number, j: number) => boolean; class PaneChild implements LayoutEntry { @@ -122,6 +114,17 @@ export class Pane { private _dispose: Notification; + // Input Handling + // + + private _mouseUp: Notification1 = new Notification1(); + private _mouseDown: Notification1 = new Notification1(); + private _mouseMove: Notification1 = new Notification1(); + private _mouseWheel: Notification1 = new Notification1(); + private _mouseEnter: Notification1 = new Notification1(); + private _mouseExit: Notification1 = new Notification1(); + private _contextMenu: Notification1 = new Notification1(); + constructor(layout: Layout, consumesInputEvents: boolean = true, isInside: Mask2D = alwaysTrue) { this.painters = []; this.consumesInputEvents = consumesInputEvents; @@ -202,7 +205,7 @@ export class Pane { updateLayoutArgs(updateFn: (layoutArg: any, layoutOptions: any) => any) { for (let c = 0; c < this.children.length; c++) { - let child = this.children.valueAt(c); + const child = this.children.valueAt(c); child.layoutArg = updateFn(child.layoutArg, child.layoutOptions); } } @@ -222,7 +225,7 @@ export class Pane { updatePrefSizes(result: Size) { // Child panes for (let c = 0; c < this.children.length; c++) { - let child = this.children.valueAt(c); + const child = this.children.valueAt(c); child.pane.updatePrefSizes(child.prefSize); } // This pane @@ -237,14 +240,14 @@ export class Pane { updateBounds(viewport: BoundsUnmodifiable, scissor: BoundsUnmodifiable) { // This pane - let viewportChanged = (viewport.iStart !== this._viewport.iStart || viewport.iEnd !== this._viewport.iEnd || viewport.jStart !== this._viewport.jStart || viewport.jEnd !== this._viewport.jEnd); + const viewportChanged = (viewport.iStart !== this._viewport.iStart || viewport.iEnd !== this._viewport.iEnd || viewport.jStart !== this._viewport.jStart || viewport.jEnd !== this._viewport.jEnd); this._viewport.setBounds(viewport); this._scissor.setBounds(scissor); // Child panes if (hasval(this._layout) && hasval(this._layout.updateChildViewports)) { this._layout.updateChildViewports(this.children.toArray(), viewport); for (let c = 0; c < this.children.length; c++) { - let child = this.children.valueAt(c); + const child = this.children.valueAt(c); child.scissor.setBounds(child.viewport.unmod); child.scissor.cropToBounds(scissor); child.pane.updateBounds(child.viewport.unmod, child.scissor.unmod); @@ -260,8 +263,8 @@ export class Pane { } paint(gl: WebGLRenderingContext) { - let viewport = this._viewport.unmod; - let scissor = this._scissor.unmod; + const viewport = this._viewport.unmod; + const scissor = this._scissor.unmod; if (scissor.w > 0 && scissor.h > 0) { // This pane gl.viewport(viewport.i, viewport.j, viewport.w, viewport.h); @@ -290,7 +293,7 @@ export class Pane { } panesAt(i: number, j: number): Pane[] { - let result: Pane[] = []; + const result: Pane[] = []; this._panesAt(i, j, result); return result; } @@ -298,8 +301,10 @@ export class Pane { private _panesAt(i: number, j: number, result: Pane[]): boolean { if (this._scissor.contains(i, j)) { for (let c = this.children.length - 1; c >= 0; c--) { - let consumed = this.children.valueAt(c).pane._panesAt(i, j, result); - if (consumed) return true; + const consumed = this.children.valueAt(c).pane._panesAt(i, j, result); + if (consumed) { + return true; + } } if (this.isInside(this._viewport.unmod, i, j)) { result.push(this); @@ -309,18 +314,6 @@ export class Pane { return false; } - - // Input Handling - // - - private _mouseUp: Notification1 = new Notification1(); - private _mouseDown: Notification1 = new Notification1(); - private _mouseMove: Notification1 = new Notification1(); - private _mouseWheel: Notification1 = new Notification1(); - private _mouseEnter: Notification1 = new Notification1(); - private _mouseExit: Notification1 = new Notification1(); - private _contextMenu: Notification1 = new Notification1(); - get mouseUp(): Notification1 { return this._mouseUp; } get mouseDown(): Notification1 { return this._mouseDown; } get mouseMove(): Notification1 { return this._mouseMove; } @@ -378,14 +371,18 @@ export function requireGL(canvasElement: HTMLCanvasElement): WebGLRenderingConte // try { - let glA = canvasElement.getContext('webgl'); - if (glA) return glA; + const glA = canvasElement.getContext('webgl'); + if (glA) { + return glA; + } } catch (e) { } try { - let glB = canvasElement.getContext('experimental-webgl'); - if (glB) return glB; + const glB = canvasElement.getContext('experimental-webgl'); + if (glB) { + return glB; + } } catch (e) { } @@ -406,7 +403,7 @@ function jMouse(element: HTMLElement, ev: MouseEvent): number { function mouseWheelSteps(ev: MouseWheelEvent): number { // Firefox puts the scroll amount in the 'detail' field; everybody else puts it in 'wheelDelta' // Firefox uses positive values for a downward scroll; everybody else uses positive for upward - let raw = (ev.wheelDelta !== undefined ? ev.wheelDelta : -ev.detail); + const raw = (ev.wheelDelta !== undefined ? ev.wheelDelta : -ev.detail); if (raw > 0) { return -1; } if (raw < 0) { return +1; } return 0; @@ -460,7 +457,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { newPanes[n]['isHovered'] = true; } for (let n = 0; n < oldPanes.length; n++) { - let oldPane = oldPanes[n]; + const oldPane = oldPanes[n]; if (!oldPane['isHovered']) { oldPane.fireMouseExit(i, j, mouseEvent); } @@ -473,7 +470,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { oldPanes[n]['wasHovered'] = true; } for (let n = 0; n < newPanes.length; n++) { - let newPane = newPanes[n]; + const newPane = newPanes[n]; if (!newPane['wasHovered']) { newPane.fireMouseEnter(i, j, mouseEvent); } @@ -483,20 +480,22 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { // Support for reporting click count. Browsers handle reporting single/double // clicks differently, so it's generally not a good idea to use both listeners // at one. That's why it's done this way instead of using the 'dblclick' event. - let multiPressTimeout_MILLIS = 250; + const multiPressTimeout_MILLIS = 250; let prevPress_PMILLIS = 0; let clickCount = 1; let currentPanes: Pane[] = []; let currentMouseCursor: string = null; - let dragging: boolean = false; - let pendingExit: boolean = false; + let dragging = false; + let pendingExit = false; function refreshMouseCursor() { let newMouseCursor = null; for (let n = 0; n < currentPanes.length; n++) { newMouseCursor = currentPanes[n].mouseCursor; - if (hasval(newMouseCursor)) break; + if (hasval(newMouseCursor)) { + break; + } } if (!hasval(newMouseCursor)) { newMouseCursor = 'default'; @@ -511,9 +510,9 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { element.addEventListener('mousedown', function (ev: MouseEvent) { - let press_PMILLIS = (new Date()).getTime(); - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const press_PMILLIS = (new Date()).getTime(); + const i = iMouse(element, ev); + const j = jMouse(element, ev); if (press_PMILLIS - prevPress_PMILLIS < multiPressTimeout_MILLIS) { clickCount++; @@ -523,7 +522,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { } prevPress_PMILLIS = press_PMILLIS; - let newPanes = contentPane.panesAt(i, j); + const newPanes = contentPane.panesAt(i, j); detectEntersAndExits(currentPanes, newPanes, i, j, ev); currentPanes = newPanes; for (let n = 0; n < currentPanes.length; n++) { @@ -540,10 +539,10 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { // Only want NON-DRAG moves from the canvas (e.g. we don't want moves that occur in an overlay div) -- so subscribe to CANVAS's mousemove element.addEventListener('mousemove', function (ev: MouseEvent) { if (!dragging) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const i = iMouse(element, ev); + const j = jMouse(element, ev); - let newPanes = contentPane.panesAt(i, j); + const newPanes = contentPane.panesAt(i, j); detectEntersAndExits(currentPanes, newPanes, i, j, ev); currentPanes = newPanes; for (let n = 0; n < currentPanes.length; n++) { @@ -556,8 +555,8 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove window.addEventListener('mousemove', function (ev: MouseEvent) { if (dragging) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const i = iMouse(element, ev); + const j = jMouse(element, ev); for (let n = 0; n < currentPanes.length; n++) { currentPanes[n].fireMouseMove(i, j, ev); @@ -566,8 +565,8 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { }); element.addEventListener('mouseout', function (ev: MouseEvent) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const i = iMouse(element, ev); + const j = jMouse(element, ev); if (dragging) { for (let n = 0; n < currentPanes.length; n++) { @@ -583,14 +582,14 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { }); element.addEventListener('mouseover', function (ev: MouseEvent) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const i = iMouse(element, ev); + const j = jMouse(element, ev); if (dragging) { pendingExit = false; } else { - let newPanes = contentPane.panesAt(i, j); + const newPanes = contentPane.panesAt(i, j); detectEntersAndExits(currentPanes, newPanes, i, j, ev); currentPanes = newPanes; for (let n = 0; n < currentPanes.length; n++) { @@ -600,9 +599,9 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { } }); - let endDrag = function (ev: MouseEvent) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const endDrag = function (ev: MouseEvent) { + const i = iMouse(element, ev); + const j = jMouse(element, ev); for (let n = 0; n < currentPanes.length; n++) { currentPanes[n].fireMouseUp(i, j, clickCount, ev); @@ -617,7 +616,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { refreshMouseCursor(); } else { - let newPanes = contentPane.panesAt(i, j); + const newPanes = contentPane.panesAt(i, j); detectEntersAndExits(currentPanes, newPanes, i, j, ev); currentPanes = newPanes; for (let n = 0; n < currentPanes.length; n++) { @@ -641,10 +640,10 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { // If we're dragging, and we see a mousemove with no buttons down, end the drag let recentDrag: MouseEvent = null; - let handleMissedMouseUp = function (ev: MouseEvent) { + const handleMissedMouseUp = function (ev: MouseEvent) { if (dragging) { if (!isMouseDown(ev) && recentDrag) { - let mouseUp = document.createEvent('MouseEvents'); + const mouseUp = document.createEvent('MouseEvents'); mouseUp.initMouseEvent('mouseup', true, true, window, 0, recentDrag.screenX, recentDrag.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, recentDrag.ctrlKey, recentDrag.altKey, recentDrag.shiftKey, recentDrag.metaKey, 0, null); endDrag(mouseUp); } @@ -663,7 +662,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { // the least bad option is to terminate drags on exit from the highest accessible window w.addEventListener('mouseout', function (ev: MouseEvent) { if (dragging) { - let mouseUp = document.createEvent('MouseEvents'); + const mouseUp = document.createEvent('MouseEvents'); mouseUp.initMouseEvent('mouseup', true, true, window, 0, ev.screenX, ev.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, ev.ctrlKey, ev.altKey, ev.shiftKey, ev.metaKey, 0, null); endDrag(mouseUp); } @@ -674,9 +673,9 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { // Firefox uses event type 'DOMMouseScroll' for mouse-wheel events; everybody else uses 'mousewheel' - let handleMouseWheel = function (ev: MouseWheelEvent) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const handleMouseWheel = function (ev: MouseWheelEvent) { + const i = iMouse(element, ev); + const j = jMouse(element, ev); if (dragging) { for (let n = 0; n < currentPanes.length; n++) { @@ -684,7 +683,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { } } else { - let newPanes = contentPane.panesAt(i, j); + const newPanes = contentPane.panesAt(i, j); detectEntersAndExits(currentPanes, newPanes, i, j, ev); currentPanes = newPanes; for (let n = 0; n < currentPanes.length; n++) { @@ -692,7 +691,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { } } - let wheelSteps = mouseWheelSteps(ev); + const wheelSteps = mouseWheelSteps(ev); for (let n = 0; n < currentPanes.length; n++) { currentPanes[n].fireMouseWheel(i, j, wheelSteps, ev); } @@ -701,8 +700,8 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { element.addEventListener('DOMMouseScroll', handleMouseWheel, false); element.addEventListener('contextmenu', function (ev: MouseEvent) { - let i = iMouse(element, ev); - let j = jMouse(element, ev); + const i = iMouse(element, ev); + const j = jMouse(element, ev); if (dragging) { for (let n = 0; n < currentPanes.length; n++) { @@ -710,7 +709,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { } } else { - let newPanes = contentPane.panesAt(i, j); + const newPanes = contentPane.panesAt(i, j); detectEntersAndExits(currentPanes, newPanes, i, j, ev); currentPanes = newPanes; for (let n = 0; n < currentPanes.length; n++) { @@ -740,10 +739,10 @@ export interface Drawable { export function newDrawable(canvas: HTMLCanvasElement): Drawable { let contentPane: Pane = null; - let contentPrefSizeNotification = new Notification1(); - let contentPrefSize = { w: null, h: null }; - let contentViewport = newBoundsFromRect(0, 0, 0, 0); - let gl = requireGL(canvas); + const contentPrefSizeNotification = new Notification1(); + const contentPrefSize = { w: null, h: null }; + const contentViewport = newBoundsFromRect(0, 0, 0, 0); + const gl = requireGL(canvas); let pendingRequestId = null; return { setContentPane: function (pane: Pane) { @@ -756,10 +755,10 @@ export function newDrawable(canvas: HTMLCanvasElement): Drawable { redraw: function () { if (!hasval(pendingRequestId)) { pendingRequestId = window.requestAnimationFrame(function () { - let oldPrefSize = { w: null, h: null } + let oldPrefSize = { w: null, h: null }; if (hasval(contentPane)) { - let oldPrefSize = { w: contentPrefSize.w, h: contentPrefSize.h }; + oldPrefSize = { w: contentPrefSize.w, h: contentPrefSize.h }; contentPane.updatePrefSizes(contentPrefSize); contentViewport.setRect(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); diff --git a/src/webglimpse/gradient.ts b/src/webglimpse/gradient.ts index 4baa9c5..52794c2 100644 --- a/src/webglimpse/gradient.ts +++ b/src/webglimpse/gradient.ts @@ -31,26 +31,24 @@ import { Texture, FloatDataTexture2D } from './texture'; // value: a number from 0-1 // out: four component RGBA array indicating the gradient color for the input fraction -export interface Gradient { - (value: number): number[]; -} +export type Gradient = (value: number) => number[]; // fills an array with jet colorscale values // webgl does not support 1D textures, so a 2D texture must be used export function jet(value: number): number[] { - let x = 4.0 * value; + const x = 4.0 * value; - let r = clamp(1.5 - Math.abs(x - 3.0), 0, 1); - let g = clamp(1.5 - Math.abs(x - 2.0), 0, 1); - let b = clamp(1.5 - Math.abs(x - 1.0), 0, 1); + const r = clamp(1.5 - Math.abs(x - 3.0), 0, 1); + const g = clamp(1.5 - Math.abs(x - 2.0), 0, 1); + const b = clamp(1.5 - Math.abs(x - 1.0), 0, 1); return [r, g, b, 1.0]; } export function reverseBone(value: number): number[] { - let x = 1 - 0.875 * value; + const x = 1 - 0.875 * value; if (value < 0.375) { return [x, x, x - value / 3, 1]; } @@ -64,10 +62,10 @@ export function reverseBone(value: number): number[] { } export function getGradientTexture(gradient: Gradient, size: number = 1024): Texture { - let array = new Float32Array(size * 4); + const array = new Float32Array(size * 4); for (let v = 0; v < size; v++) { - let color = gradient(v / size); + const color = gradient(v / size); array[4 * v + 0] = color[0]; array[4 * v + 1] = color[1]; diff --git a/src/webglimpse/label.ts b/src/webglimpse/label.ts index 1aa9f0d..163349e 100644 --- a/src/webglimpse/label.ts +++ b/src/webglimpse/label.ts @@ -32,7 +32,7 @@ import {TextTextureFactory, TextTexture2D, createTextTextureFactory} from './tex import {Size, BoundsUnmodifiable} from './bounds'; import {TextureRenderer} from './texture'; import {GL, hasval} from './util/util'; -import {xFrac, yFrac, LayoutPhase1} from './core'; +import {LayoutPhase1} from './core'; export class Label { private _font: string; @@ -132,7 +132,7 @@ export class Label { export function fitToLabel(label: Label): LayoutPhase1 { return function (parentPrefSize: Size): void { - let texture = label.texture; + const texture = label.texture; parentPrefSize.w = (texture ? texture.w : 0); parentPrefSize.h = (texture ? texture.h : 0); }; @@ -140,7 +140,7 @@ export function fitToLabel(label: Label): LayoutPhase1 { export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnchor?: number, yAnchor?: number, rotation_CCWRAD?: number) { - let textureRenderer = new TextureRenderer(); + const textureRenderer = new TextureRenderer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { if (hasval(label.bgColor)) { @@ -148,7 +148,7 @@ export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnc gl.clear(GL.COLOR_BUFFER_BIT); } - let texture = label.texture; + const texture = label.texture; if (texture) { textureRenderer.begin(gl, viewport); textureRenderer.draw(gl, texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: texture.yAnchor(yAnchor), rotation_CCWRAD: rotation_CCWRAD }); diff --git a/src/webglimpse/layout/card_layout.ts b/src/webglimpse/layout/card_layout.ts index 50edaf1..5eefe21 100644 --- a/src/webglimpse/layout/card_layout.ts +++ b/src/webglimpse/layout/card_layout.ts @@ -48,8 +48,8 @@ export function newCardLayout(): Layout { let activeChild: LayoutEntry; for (let c = 0; c < children.length; c++) { - let child = children[c]; - let isActive = child.layoutArg; + const child = children[c]; + const isActive = child.layoutArg; if (isActive) { activeChild = child; } @@ -57,9 +57,9 @@ export function newCardLayout(): Layout { if (hasval(activeChild)) { - let childPrefSize = activeChild.prefSize; + const childPrefSize = activeChild.prefSize; - let childPrefWidth = childPrefSize.w; + const childPrefWidth = childPrefSize.w; if (hasval(childPrefWidth)) { parentPrefSize.w = childPrefWidth; } @@ -67,7 +67,7 @@ export function newCardLayout(): Layout { parentPrefSize.w = null; } - let childPrefHeight = childPrefSize.h; + const childPrefHeight = childPrefSize.h; if (hasval(childPrefHeight)) { parentPrefSize.h = childPrefHeight; } @@ -85,8 +85,8 @@ export function newCardLayout(): Layout { let activeChildIndex: number; for (let c = 0; c < children.length; c++) { - let child = children[c]; - let isActive = child.layoutArg; + const child = children[c]; + const isActive = child.layoutArg; if (isActive) { activeChildIndex = c; } diff --git a/src/webglimpse/layout/column_layout.ts b/src/webglimpse/layout/column_layout.ts index 6ff4970..0c2416c 100644 --- a/src/webglimpse/layout/column_layout.ts +++ b/src/webglimpse/layout/column_layout.ts @@ -33,7 +33,7 @@ import { hasval, isNumber } from '../util/util'; function childWidth(child: LayoutEntry): number { - let usePrefWidth = (!hasval(child.layoutOptions) || child.layoutOptions.width === undefined || child.layoutOptions.width === 'pref'); + const usePrefWidth = (!hasval(child.layoutOptions) || child.layoutOptions.width === undefined || child.layoutOptions.width === 'pref'); return (usePrefWidth ? child.prefSize.w : child.layoutOptions.width); } @@ -44,9 +44,9 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { - let childrenToPlace = []; + const childrenToPlace = []; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { childrenToPlace.push(child); } @@ -55,11 +55,11 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { let hMax = 0; let wSum = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; - let honorChildHeight = !(child.layoutOptions && child.layoutOptions.ignoreHeight); + const honorChildHeight = !(child.layoutOptions && child.layoutOptions.ignoreHeight); if (honorChildHeight) { - let h = child.prefSize.h; + const h = child.prefSize.h; if (hasval(hMax) && hasval(h)) { hMax = Math.max(hMax, h); } @@ -68,7 +68,7 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { } } - let w = childWidth(child); + const w = childWidth(child); if (hasval(wSum) && hasval(w)) { wSum += w; } @@ -82,10 +82,10 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { - let childrenToPlace = []; - let childrenToHide = []; + const childrenToPlace = []; + const childrenToHide = []; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { childrenToPlace.push(child); } @@ -95,21 +95,21 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { } // Use the original index to make the sort stable - let indexProp = 'webglimpse_columnLayout_index'; + const indexProp = 'webglimpse_columnLayout_index'; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; child[indexProp] = c; } childrenToPlace.sort(function (a: LayoutEntry, b: LayoutEntry) { - let orderDiff = a.layoutArg - b.layoutArg; + const orderDiff = a.layoutArg - b.layoutArg; return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp])); }); let numFlexible = 0; let totalFlexWidth = parentViewport.w; for (let c = 0; c < childrenToPlace.length; c++) { - let w = childWidth(childrenToPlace[c]); + const w = childWidth(childrenToPlace[c]); if (hasval(w)) { totalFlexWidth -= w; } @@ -117,23 +117,23 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { numFlexible++; } } - let flexWidth = totalFlexWidth / numFlexible; + const flexWidth = totalFlexWidth / numFlexible; if (leftToRight) { - let jStart = parentViewport.jStart; - let jEnd = parentViewport.jEnd; + const jStart = parentViewport.jStart; + const jEnd = parentViewport.jEnd; let iStart = parentViewport.iStart; let iRemainder = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; let iEnd: number; - let w = childWidth(child); + const w = childWidth(child); if (hasval(w)) { iEnd = iStart + w; } else { - let iEnd0 = iStart + flexWidth + iRemainder; + const iEnd0 = iStart + flexWidth + iRemainder; iEnd = Math.round(iEnd0); iRemainder = iEnd0 - iEnd; } @@ -143,20 +143,20 @@ export function newColumnLayout(leftToRight: boolean = true): Layout { } } else { - let jStart = parentViewport.jStart; - let jEnd = parentViewport.jEnd; + const jStart = parentViewport.jStart; + const jEnd = parentViewport.jEnd; let iEnd = parentViewport.iEnd; let iRemainder = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; let iStart: number; - let w = childWidth(child); + const w = childWidth(child); if (hasval(w)) { iStart = iEnd - w; } else { - let iStart0 = iEnd - flexWidth - iRemainder; + const iStart0 = iEnd - flexWidth - iRemainder; iStart = Math.round(iStart0); iRemainder = iStart - iStart0; } diff --git a/src/webglimpse/layout/corner_layout.ts b/src/webglimpse/layout/corner_layout.ts index 4142e93..eb743d4 100644 --- a/src/webglimpse/layout/corner_layout.ts +++ b/src/webglimpse/layout/corner_layout.ts @@ -37,7 +37,7 @@ export function newCornerLayout(hSide: Side, vSide: Side): Layout { return { updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { if (children.length === 1) { - let childPrefSize = children[0].prefSize; + const childPrefSize = children[0].prefSize; parentPrefSize.w = childPrefSize.w; parentPrefSize.h = childPrefSize.h; } @@ -47,11 +47,11 @@ export function newCornerLayout(hSide: Side, vSide: Side): Layout { }, updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { if (children.length === 1) { - let child = children[0]; + const child = children[0]; let iStart; let iEnd; - let w = child.prefSize.w; + const w = child.prefSize.w; if (hSide === Side.RIGHT) { iEnd = parentViewport.iEnd; iStart = (hasval(w) ? Math.max(iEnd - w, parentViewport.iStart) : parentViewport.iStart); @@ -63,7 +63,7 @@ export function newCornerLayout(hSide: Side, vSide: Side): Layout { let jStart; let jEnd; - let h = child.prefSize.h; + const h = child.prefSize.h; if (vSide === Side.BOTTOM) { jStart = parentViewport.jStart; jEnd = (hasval(h) ? Math.min(jStart + h, parentViewport.jEnd) : parentViewport.jEnd); diff --git a/src/webglimpse/layout/inset_layout.ts b/src/webglimpse/layout/inset_layout.ts index 74cc0fe..50a29db 100644 --- a/src/webglimpse/layout/inset_layout.ts +++ b/src/webglimpse/layout/inset_layout.ts @@ -91,7 +91,7 @@ export function newInsetLayout(insets: Insets): Layout { parentPrefSize.h = insets.top + insets.bottom; } else if (children.length === 1) { - let childPrefSize = children[0].prefSize; + const childPrefSize = children[0].prefSize; parentPrefSize.w = (hasval(childPrefSize.w) ? childPrefSize.w + insets.left + insets.right : null); parentPrefSize.h = (hasval(childPrefSize.h) ? childPrefSize.h + insets.top + insets.bottom : null); } @@ -101,7 +101,7 @@ export function newInsetLayout(insets: Insets): Layout { }, updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { if (children.length === 1) { - let childViewport = children[0].viewport; + const childViewport = children[0].viewport; childViewport.setEdges(parentViewport.iStart + insets.left, parentViewport.iEnd - insets.right, parentViewport.jStart + insets.bottom, @@ -116,7 +116,7 @@ export function newInsetLayout(insets: Insets): Layout { export function newInsetPane(pane: Pane, insets: Insets, bgColor: Color = null, consumeInputEvents: boolean = true): Pane { - let insetPane = new Pane(newInsetLayout(insets), consumeInputEvents); + const insetPane = new Pane(newInsetLayout(insets), consumeInputEvents); if (hasval(bgColor)) { insetPane.addPainter(newBackgroundPainter(bgColor)); } diff --git a/src/webglimpse/layout/overlay_layout.ts b/src/webglimpse/layout/overlay_layout.ts index ef52c34..41ba711 100644 --- a/src/webglimpse/layout/overlay_layout.ts +++ b/src/webglimpse/layout/overlay_layout.ts @@ -41,10 +41,10 @@ export function newOverlayLayout(): Layout { return { updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { - let underlays: LayoutEntry[] = []; + const underlays: LayoutEntry[] = []; for (let c = 0; c < children.length; c++) { - let child = children[c]; - let isUnderlay = child.layoutArg; + const child = children[c]; + const isUnderlay = child.layoutArg; if (isUnderlay) { underlays.push(child); } @@ -54,9 +54,9 @@ export function newOverlayLayout(): Layout { let maxChildPrefWidth = 0; let maxChildPrefHeight = 0; for (let c = 0; c < underlays.length; c++) { - let childPrefSize = underlays[c].prefSize; + const childPrefSize = underlays[c].prefSize; - let childPrefWidth = childPrefSize.w; + const childPrefWidth = childPrefSize.w; if (hasval(maxChildPrefWidth) && hasval(childPrefWidth)) { maxChildPrefWidth = Math.max(maxChildPrefWidth, childPrefWidth); } @@ -64,7 +64,7 @@ export function newOverlayLayout(): Layout { maxChildPrefWidth = null; } - let childPrefHeight = childPrefSize.h; + const childPrefHeight = childPrefSize.h; if (hasval(maxChildPrefHeight) && hasval(childPrefHeight)) { maxChildPrefHeight = Math.max(maxChildPrefHeight, childPrefHeight); } diff --git a/src/webglimpse/layout/row_layout.ts b/src/webglimpse/layout/row_layout.ts index 644d6e1..03508be 100644 --- a/src/webglimpse/layout/row_layout.ts +++ b/src/webglimpse/layout/row_layout.ts @@ -40,13 +40,13 @@ import { hasval, isNumber } from '../util/util'; // This layout is essentially a generalization of timeline_layout.ts. If you use a row_layout with the center element set to pref-max // you get the same effect as timeline_layout). function childHeight(child: LayoutEntry): number { - let usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max'); + const usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max'); return (usePrefHeight ? child.prefSize.h : child.layoutOptions.height); } // see above, like childHeight( ) but don't count 'pref-max' function childHeightOverfull(child: LayoutEntry): number { - let usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref'); + const usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref'); if (usePrefHeight) { return child.prefSize.h; @@ -67,11 +67,11 @@ interface FlexData { childHeight: (child: LayoutEntry) => number; } -function calculateFlexData(childrenToPlace: LayoutEntry[], parentViewport: BoundsUnmodifiable, childHeight: (child: LayoutEntry) => number): FlexData { +function calculateFlexData(childrenToPlace: LayoutEntry[], parentViewport: BoundsUnmodifiable, getChildHeight: (child: LayoutEntry) => number): FlexData { let numFlexible = 0; let totalHeight = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let h = childHeight(childrenToPlace[c]); + const h = getChildHeight(childrenToPlace[c]); if (hasval(h)) { totalHeight += h; } @@ -79,9 +79,9 @@ function calculateFlexData(childrenToPlace: LayoutEntry[], parentViewport: Bound numFlexible++; } } - let totalFlexHeight = parentViewport.h - totalHeight; - let flexHeight = totalFlexHeight / numFlexible; - return { numFlexible: numFlexible, totalHeight: totalHeight, flexHeight: flexHeight, totalFlexHeight: totalFlexHeight, childHeight: childHeight }; + const totalFlexHeight = parentViewport.h - totalHeight; + const flexHeight = totalFlexHeight / numFlexible; + return { numFlexible: numFlexible, totalHeight: totalHeight, flexHeight: flexHeight, totalFlexHeight: totalFlexHeight, childHeight: getChildHeight }; } export function newRowLayout(topToBottom: boolean = true): Layout { @@ -90,9 +90,9 @@ export function newRowLayout(topToBottom: boolean = true): Layout { updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { - let childrenToPlace = []; + const childrenToPlace = []; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { childrenToPlace.push(child); } @@ -101,11 +101,11 @@ export function newRowLayout(topToBottom: boolean = true): Layout { let wMax = 0; let hSum = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; - let honorChildWidth = !(child.layoutOptions && child.layoutOptions.ignoreWidth); + const honorChildWidth = !(child.layoutOptions && child.layoutOptions.ignoreWidth); if (honorChildWidth) { - let w = child.prefSize.w; + const w = child.prefSize.w; if (hasval(wMax) && hasval(w)) { wMax = Math.max(wMax, w); } @@ -114,7 +114,7 @@ export function newRowLayout(topToBottom: boolean = true): Layout { } } - let h = childHeight(child); + const h = childHeight(child); if (hasval(hSum) && hasval(h)) { hSum += h; } @@ -128,10 +128,10 @@ export function newRowLayout(topToBottom: boolean = true): Layout { updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { - let childrenToPlace = []; - let childrenToHide = []; + const childrenToPlace = []; + const childrenToHide = []; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { childrenToPlace.push(child); } @@ -141,14 +141,14 @@ export function newRowLayout(topToBottom: boolean = true): Layout { } // Use the original index to make the sort stable - let indexProp = 'webglimpse_rowLayout_index'; + const indexProp = 'webglimpse_rowLayout_index'; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; child[indexProp] = c; } childrenToPlace.sort(function (a: LayoutEntry, b: LayoutEntry) { - let orderDiff = a.layoutArg - b.layoutArg; + const orderDiff = a.layoutArg - b.layoutArg; return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp])); }); @@ -161,20 +161,20 @@ export function newRowLayout(topToBottom: boolean = true): Layout { } if (topToBottom) { - let iStart = parentViewport.iStart; - let iEnd = parentViewport.iEnd; + const iStart = parentViewport.iStart; + const iEnd = parentViewport.iEnd; let jEnd = parentViewport.jEnd; let jRemainder = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; let jStart: number; - let h = flexData.childHeight(child); + const h = flexData.childHeight(child); if (hasval(h)) { jStart = jEnd - h; } else { - let jStart0 = jEnd - flexData.flexHeight - jRemainder; + const jStart0 = jEnd - flexData.flexHeight - jRemainder; jStart = Math.round(jStart0); jRemainder = jStart - jStart0; } @@ -184,20 +184,20 @@ export function newRowLayout(topToBottom: boolean = true): Layout { } } else { - let iStart = parentViewport.iStart; - let iEnd = parentViewport.iEnd; + const iStart = parentViewport.iStart; + const iEnd = parentViewport.iEnd; let jStart = parentViewport.jStart; let jRemainder = 0; for (let c = 0; c < childrenToPlace.length; c++) { - let child = childrenToPlace[c]; + const child = childrenToPlace[c]; let jEnd: number; - let h = flexData.childHeight(child); + const h = flexData.childHeight(child); if (hasval(h)) { jEnd = jStart + h; } else { - let jEnd0 = jStart + flexData.flexHeight + jRemainder; + const jEnd0 = jStart + flexData.flexHeight + jRemainder; jEnd = Math.round(jEnd0); jRemainder = jEnd0 - jEnd; } diff --git a/src/webglimpse/matrix.ts b/src/webglimpse/matrix.ts index c729ebe..29818c2 100644 --- a/src/webglimpse/matrix.ts +++ b/src/webglimpse/matrix.ts @@ -34,9 +34,9 @@ import { Axis2D } from './plot/axis'; // see: http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho export function glOrtho(left: number, right: number, bottom: number, top: number, near: number, far: number): Float32Array { - let tx = (right + left) / (right - left); - let ty = (top + bottom) / (top - bottom); - let tz = (far + near) / (far - near); + const tx = (right + left) / (right - left); + const ty = (top + bottom) / (top - bottom); + const tz = (far + near) / (far - near); // GL ES (and therefore WebGL) requires matrices to be column-major return new Float32Array([ diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index bc9df1b..a95119a 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import { Painter, xFrac, yFrac, Pane } from './core'; +import { Painter, Pane } from './core'; import { BoundsUnmodifiable, Size } from './bounds'; import { Color, sameColor } from './color'; import { Program, UniformColor, Attribute } from './shader'; @@ -47,13 +47,13 @@ export function newGroupPainter(...painters: Painter[]): Painter { export function newBlendingBackgroundPainter(color: Color): Painter { - let program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_XyNdc = new Attribute(program, 'a_XyNdc'); + const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_XyNdc = new Attribute(program, 'a_XyNdc'); - let numVertices = 4; - let xy_NDC = new Float32Array(2 * numVertices); - let xyBuffer_NDC = newDynamicBuffer(); + const numVertices = 4; + const xy_NDC = new Float32Array(2 * numVertices); + const xyBuffer_NDC = newDynamicBuffer(); return function (gl: WebGLRenderingContext): void { if (color.a >= 1) { @@ -105,7 +105,7 @@ export class Background { } newPainter() { - let background: Background = this; + const background: Background = this; return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { if (hasval(background.color)) { gl.clearColor(background.color.r, background.color.g, background.color.b, background.color.a); @@ -125,7 +125,7 @@ export function newBackgroundPainter(color: Color): Painter { export function newTexturePainter(texture: Texture2D, xFrac: number, yFrac: number, options: TextureDrawOptions) { - let textureRenderer = new TextureRenderer(); + const textureRenderer = new TextureRenderer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { textureRenderer.begin(gl, viewport); textureRenderer.draw(gl, texture, xFrac, yFrac, options); @@ -135,7 +135,7 @@ export function newTexturePainter(texture: Texture2D, xFrac: number, yFrac: numb export function newSolidPane(color: Color): Pane { - let pane = new Pane(null); + const pane = new Pane(null); pane.addPainter(newBackgroundPainter(color)); return pane; } @@ -261,7 +261,7 @@ export function fracToNdc(frac: number): number { export function nearestPixel(viewportFrac: number, viewportSize: number, imageAnchor: number, imageSize: number): number { - let anchor = (imageAnchor * imageSize) % 1.0; + const anchor = (imageAnchor * imageSize) % 1.0; return (Math.floor(viewportFrac * viewportSize - anchor + 0.5 + 1e-4) + anchor) / viewportSize; } @@ -325,7 +325,7 @@ export function putRgbas(rgbas: Float32Array, index: number, color: Color, count export function clearSelection() { - let selection = window.getSelection(); + const selection = window.getSelection(); if (selection) { if (selection['removeAllRanges']) { selection['removeAllRanges'](); diff --git a/src/webglimpse/painter/border_painter.ts b/src/webglimpse/painter/border_painter.ts index ce0fad5..6c484dd 100644 --- a/src/webglimpse/painter/border_painter.ts +++ b/src/webglimpse/painter/border_painter.ts @@ -46,32 +46,44 @@ export interface BorderOptions { export function newBorderPainter(color: Color, options?: BorderOptions): Painter { - if (!hasval(options)) options = {}; - if (!hasval(options.drawTop)) options.drawTop = true; - if (!hasval(options.drawLeft)) options.drawLeft = true; - if (!hasval(options.drawRight)) options.drawRight = true; - if (!hasval(options.drawBottom)) options.drawBottom = true; - if (!hasval(options.thickness)) options.thickness = 1; - - let simple = (options.thickness === 1 && color.a >= 1); + if (!hasval(options)) { + options = {}; + } + if (!hasval(options.drawTop)) { + options.drawTop = true; + } + if (!hasval(options.drawLeft)) { + options.drawLeft = true; + } + if (!hasval(options.drawRight)) { + options.drawRight = true; + } + if (!hasval(options.drawBottom)) { + options.drawBottom = true; + } + if (!hasval(options.thickness)) { + options.thickness = 1; + } + + const simple = (options.thickness === 1 && color.a >= 1); return (simple ? newSimpleBorderPainter(color, options) : newFullBorderPainter(color, options)); } function newFullBorderPainter(color: Color, options: BorderOptions): Painter { - let drawTop = options.drawTop; - let drawLeft = options.drawLeft; - let drawRight = options.drawRight; - let drawBottom = options.drawBottom; - let thickness = options.thickness; + const drawTop = options.drawTop; + const drawLeft = options.drawLeft; + const drawRight = options.drawRight; + const drawBottom = options.drawBottom; + const thickness = options.thickness; - let program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_XyNdc = new Attribute(program, 'a_XyNdc'); + const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_XyNdc = new Attribute(program, 'a_XyNdc'); - let numVertices = (drawTop ? 6 : 0) + (drawLeft ? 6 : 0) + (drawRight ? 6 : 0) + (drawBottom ? 6 : 0); - let xy_NDC = new Float32Array(2 * numVertices); - let xyBuffer_NDC = newDynamicBuffer(); + const numVertices = (drawTop ? 6 : 0) + (drawLeft ? 6 : 0) + (drawRight ? 6 : 0) + (drawBottom ? 6 : 0); + const xy_NDC = new Float32Array(2 * numVertices); + const xyBuffer_NDC = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { if (color.a >= 1) { @@ -85,13 +97,21 @@ function newFullBorderPainter(color: Color, options: BorderOptions): Painter { program.use(gl); u_Color.setData(gl, color); - let w_NDC = 2 * thickness / viewport.w; - let h_NDC = 2 * thickness / viewport.h; + const w_NDC = 2 * thickness / viewport.w; + const h_NDC = 2 * thickness / viewport.h; let index = 0; - if (drawTop) index = putQuadXys(xy_NDC, index, -1, (drawRight ? +1 - w_NDC : +1), +1, +1 - h_NDC); - if (drawRight) index = putQuadXys(xy_NDC, index, +1 - w_NDC, +1, +1, (drawBottom ? -1 + h_NDC : -1)); - if (drawBottom) index = putQuadXys(xy_NDC, index, (drawLeft ? -1 + w_NDC : -1), +1, -1 + h_NDC, -1); - if (drawLeft) index = putQuadXys(xy_NDC, index, -1, -1 + w_NDC, (drawTop ? +1 - h_NDC : +1), -1); + if (drawTop) { + index = putQuadXys(xy_NDC, index, -1, (drawRight ? +1 - w_NDC : +1), +1, +1 - h_NDC); + } + if (drawRight) { + index = putQuadXys(xy_NDC, index, +1 - w_NDC, +1, +1, (drawBottom ? -1 + h_NDC : -1)); + } + if (drawBottom) { + index = putQuadXys(xy_NDC, index, (drawLeft ? -1 + w_NDC : -1), +1, -1 + h_NDC, -1); + } + if (drawLeft) { + index = putQuadXys(xy_NDC, index, -1, -1 + w_NDC, (drawTop ? +1 - h_NDC : +1), -1); + } xyBuffer_NDC.setData(xy_NDC); a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT); @@ -105,18 +125,18 @@ function newFullBorderPainter(color: Color, options: BorderOptions): Painter { function newSimpleBorderPainter(color: Color, options: BorderOptions): Painter { - let drawTop = options.drawTop; - let drawLeft = options.drawLeft; - let drawRight = options.drawRight; - let drawBottom = options.drawBottom; + const drawTop = options.drawTop; + const drawLeft = options.drawLeft; + const drawRight = options.drawRight; + const drawBottom = options.drawBottom; - let program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_XyNdc = new Attribute(program, 'a_XyNdc'); + const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_XyNdc = new Attribute(program, 'a_XyNdc'); - let numVertices = (drawTop ? 2 : 0) + (drawLeft ? 2 : 0) + (drawRight ? 2 : 0) + (drawBottom ? 2 : 0); - let xy_NDC = new Float32Array(2 * numVertices); - let xyBuffer_NDC = newDynamicBuffer(); + const numVertices = (drawTop ? 2 : 0) + (drawLeft ? 2 : 0) + (drawRight ? 2 : 0) + (drawBottom ? 2 : 0); + const xy_NDC = new Float32Array(2 * numVertices); + const xyBuffer_NDC = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { gl.disable(GL.BLEND); @@ -124,10 +144,10 @@ function newSimpleBorderPainter(color: Color, options: BorderOptions): Painter { program.use(gl); u_Color.setData(gl, color); - let left_NDC = fracToNdc(0.5 / viewport.w); - let bottom_NDC = fracToNdc(0.5 / viewport.h); - let right_NDC = fracToNdc((viewport.w - 0.5) / viewport.w); - let top_NDC = fracToNdc((viewport.h - 0.5) / viewport.h); + const left_NDC = fracToNdc(0.5 / viewport.w); + const bottom_NDC = fracToNdc(0.5 / viewport.h); + const right_NDC = fracToNdc((viewport.w - 0.5) / viewport.w); + const top_NDC = fracToNdc((viewport.h - 0.5) / viewport.h); let n = 0; if (drawTop) { diff --git a/src/webglimpse/plot/axis.ts b/src/webglimpse/plot/axis.ts index a15cddc..70d0382 100644 --- a/src/webglimpse/plot/axis.ts +++ b/src/webglimpse/plot/axis.ts @@ -97,17 +97,25 @@ export class Axis1D { export function getTickInterval(axis: Axis1D, approxNumTicks: number): number { - let vMin = Math.min(axis.vMin, axis.vMax); - let vMax = Math.max(axis.vMin, axis.vMax); - let approxTickInterval = (vMax - vMin) / approxNumTicks; - let prelimTickInterval = Math.pow(10, Math.round(log10(approxTickInterval))); - let prelimNumTicks = (vMax - vMin) / prelimTickInterval; + const vMin = Math.min(axis.vMin, axis.vMax); + const vMax = Math.max(axis.vMin, axis.vMax); + const approxTickInterval = (vMax - vMin) / approxNumTicks; + const prelimTickInterval = Math.pow(10, Math.round(log10(approxTickInterval))); + const prelimNumTicks = (vMax - vMin) / prelimTickInterval; - if (prelimNumTicks >= 5 * approxNumTicks) return (prelimTickInterval * 5); - if (prelimNumTicks >= 2 * approxNumTicks) return (prelimTickInterval * 2); + if (prelimNumTicks >= 5 * approxNumTicks) { + return (prelimTickInterval * 5); + } + if (prelimNumTicks >= 2 * approxNumTicks) { + return (prelimTickInterval * 2); + } - if (5 * prelimNumTicks <= approxNumTicks) return (prelimTickInterval / 5); - if (2 * prelimNumTicks <= approxNumTicks) return (prelimTickInterval / 2); + if (5 * prelimNumTicks <= approxNumTicks) { + return (prelimTickInterval / 5); + } + if (2 * prelimNumTicks <= approxNumTicks) { + return (prelimTickInterval / 2); + } return prelimTickInterval; } @@ -119,10 +127,10 @@ export function getTickCount(axis: Axis1D, tickInterval: number): number { export function getTickPositions(axis: Axis1D, tickInterval: number, tickCount: number, result: Float32Array) { - let vMin = Math.min(axis.vMin, axis.vMax); - let vMax = Math.max(axis.vMin, axis.vMax); + const vMin = Math.min(axis.vMin, axis.vMax); + const vMax = Math.max(axis.vMin, axis.vMax); - let minTickNumber = Math.floor(vMin / tickInterval); + const minTickNumber = Math.floor(vMin / tickInterval); for (let i = 0; i < tickCount; i++) { result[i] = (minTickNumber + i) * tickInterval; @@ -131,7 +139,7 @@ export function getTickPositions(axis: Axis1D, tickInterval: number, tickCount: if (axis.vMin > axis.vMax) { // XXX: Need floor() on tickCount/2? for (let i = 0; i < tickCount / 2; i++) { - let temp = result[i]; + const temp = result[i]; result[i] = result[tickCount - 1 - i]; result[tickCount - 1 - i] = temp; } @@ -204,7 +212,7 @@ export function attachAxisMouseListeners1D(pane: Pane, axis: Axis1D, isVertical: }); pane.mouseWheel.on(function (ev: PointerEvent) { - let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); axis.zoom(zoomFactor, axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev))); }); } @@ -233,7 +241,7 @@ export function attachAxisMouseListeners2D(pane: Pane, axis: Axis2D) { }); pane.mouseWheel.on(function (ev: PointerEvent) { - let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); axis.zoom(zoomFactor, axis.xAtFrac(xFrac(ev)), axis.yAtFrac(yFrac(ev))); }); } diff --git a/src/webglimpse/plot/edge_axis_painter.ts b/src/webglimpse/plot/edge_axis_painter.ts index c30918b..8724d37 100644 --- a/src/webglimpse/plot/edge_axis_painter.ts +++ b/src/webglimpse/plot/edge_axis_painter.ts @@ -32,7 +32,7 @@ import { concatLines, ensureCapacityFloat32, GL, order, hasval, clamp } from '.. import { Axis1D, getTickInterval, getTickCount, getTickPositions } from './axis'; import { Color, black } from '../color'; import { Gradient, getGradientTexture } from '../gradient'; -import { Painter, yFrac, xFrac } from '../core'; +import { Painter } from '../core'; import { Program, UniformMatrix4f, UniformSampler2D, Attribute, UniformColor, Uniform1f, Uniform2f } from '../shader'; import { heatmap_VERTSHADER } from './heatmap_painter'; import { newDynamicBuffer } from '../buffer'; @@ -45,8 +45,8 @@ import { glOrthoViewport } from '../matrix'; export function edgeMarks_VERTSHADER(labelSide: Side) { // The shader uses 'a' for the along-axis coord, and 'b' for the across-axis coord - let horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM); - let bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM); + const horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM); + const bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM); return concatLines( nearestPixelCenter_GLSLFUNC, ' ', @@ -94,9 +94,7 @@ export let gradient_FRAGSHADER = concatLines( // precision : number of decimal points which should be used for tick labels // orderAxis : order( Math.abs( axis.vSize ) ) then rounded to nearest multiple of three (-3, 0, 3, 6...) // orderFactor : Math.pow( 10, -orderAxis ) -export interface TickLabeler { - (value: number, axis: Axis1D, tickInterval: number): string; -} +export type TickLabeler = (value: number, axis: Axis1D, tickInterval: number) => string; export interface EdgeAxisPainterOptions { @@ -116,69 +114,71 @@ export interface EdgeAxisPainterOptions { export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: EdgeAxisPainterOptions): Painter { - let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 100); - let label = (hasval(options) && hasval(options.label) ? options.label : ''); - let units = (hasval(options) && hasval(options.units) ? options.units : ''); - let shortenLabels = (hasval(options) && hasval(options.shortenLabels) ? options.shortenLabels : true); - let font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); - let textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black); - let tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black); - let tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6); - let showLabel = (hasval(options) && hasval(options.showLabel) ? options.showLabel : true); - let showBorder = (hasval(options) && hasval(options.showBorder) ? options.showBorder : false); - let gradientFill = (hasval(options) && hasval(options.gradientFill) ? options.gradientFill : undefined); - let tickLabeler = (hasval(options) && hasval(options.tickLabeler) ? options.tickLabeler : undefined); + const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 100); + const label = (hasval(options) && hasval(options.label) ? options.label : ''); + const units = (hasval(options) && hasval(options.units) ? options.units : ''); + const shortenLabels = (hasval(options) && hasval(options.shortenLabels) ? options.shortenLabels : true); + const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); + const textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black); + const tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black); + const tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6); + const showLabel = (hasval(options) && hasval(options.showLabel) ? options.showLabel : true); + const showBorder = (hasval(options) && hasval(options.showBorder) ? options.showBorder : false); + const gradientFill = (hasval(options) && hasval(options.gradientFill) ? options.gradientFill : undefined); + const tickLabeler = (hasval(options) && hasval(options.tickLabeler) ? options.tickLabeler : undefined); let tickPositions = new Float32Array(0); - let gradientProgram = new Program(heatmap_VERTSHADER, gradient_FRAGSHADER); - let gradientProgram_u_modelViewMatrix = new UniformMatrix4f(gradientProgram, 'u_modelViewMatrix'); - let gradientProgram_u_colorTexture = new UniformSampler2D(gradientProgram, 'u_colorTex'); - let gradientProgram_a_vertCoord = new Attribute(gradientProgram, 'a_vertCoord'); - let gradientProgram_a_texCoord = new Attribute(gradientProgram, 'a_texCoord'); + const gradientProgram = new Program(heatmap_VERTSHADER, gradient_FRAGSHADER); + const gradientProgram_u_modelViewMatrix = new UniformMatrix4f(gradientProgram, 'u_modelViewMatrix'); + const gradientProgram_u_colorTexture = new UniformSampler2D(gradientProgram, 'u_colorTex'); + const gradientProgram_a_vertCoord = new Attribute(gradientProgram, 'a_vertCoord'); + const gradientProgram_a_texCoord = new Attribute(gradientProgram, 'a_texCoord'); let gradientColorTexture: Texture = null; if (gradientFill) { - let gradientColorTexture = getGradientTexture(gradientFill); + gradientColorTexture = getGradientTexture(gradientFill); } let gradientVertCoords = new Float32Array(0); - let gradientVertCoordsBuffer = newDynamicBuffer(); + const gradientVertCoordsBuffer = newDynamicBuffer(); let gradientTexCoords = new Float32Array(0); - let gradientTexCoordsBuffer = newDynamicBuffer(); + const gradientTexCoordsBuffer = newDynamicBuffer(); - let borderProgram = new Program(modelview_VERTSHADER, solid_FRAGSHADER); - let borderProgram_a_Position = new Attribute(borderProgram, 'a_Position'); - let borderProgram_u_modelViewMatrix = new UniformMatrix4f(borderProgram, 'u_modelViewMatrix'); - let borderProgram_u_Color = new UniformColor(borderProgram, 'u_Color'); + const borderProgram = new Program(modelview_VERTSHADER, solid_FRAGSHADER); + const borderProgram_a_Position = new Attribute(borderProgram, 'a_Position'); + const borderProgram_u_modelViewMatrix = new UniformMatrix4f(borderProgram, 'u_modelViewMatrix'); + const borderProgram_u_Color = new UniformColor(borderProgram, 'u_Color'); let borderCoords = new Float32Array(0); - let borderCoordsBuffer = newDynamicBuffer(); + const borderCoordsBuffer = newDynamicBuffer(); - let marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER); - let marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin'); - let marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize'); - let marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize'); - let marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize'); - let marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color'); - let marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord'); + const marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER); + const marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin'); + const marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize'); + const marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize'); + const marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize'); + const marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color'); + const marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord'); let markCoords = new Float32Array(0); - let markCoordsBuffer = newDynamicBuffer(); + const markCoordsBuffer = newDynamicBuffer(); - let textTextures = >newTextTextureCache(font, textColor); - let textureRenderer = new TextureRenderer(); - let hTickLabels = textTextures.value('-0.123456789').h; - let isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT); + const textTextures = >newTextTextureCache(font, textColor); + const textureRenderer = new TextureRenderer(); + const hTickLabels = textTextures.value('-0.123456789').h; + const isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let sizePixels = isVerticalAxis ? viewport.h : viewport.w; - if (sizePixels === 0) return; - let approxNumTicks = sizePixels / tickSpacing; - let tickInterval = getTickInterval(axis, approxNumTicks); - let tickCount = getTickCount(axis, tickInterval); + const sizePixels = isVerticalAxis ? viewport.h : viewport.w; + if (sizePixels === 0) { + return; + } + const approxNumTicks = sizePixels / tickSpacing; + const tickInterval = getTickInterval(axis, approxNumTicks); + const tickCount = getTickCount(axis, tickInterval); tickPositions = ensureCapacityFloat32(tickPositions, tickCount); getTickPositions(axis, tickInterval, tickCount, tickPositions); @@ -191,10 +191,10 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge if (showBorder || gradientFill) { borderCoords = ensureCapacityFloat32(borderCoords, 10); - let horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM); - let bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM); - let width = viewport.w - 1; - let height = viewport.h - 1; + const horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM); + const bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM); + const width = viewport.w - 1; + const height = viewport.h - 1; borderCoords[0] = horizontal ? 0 : (bFlip ? width - tickSize : 0); borderCoords[1] = !horizontal ? 0 : (bFlip ? height - tickSize : 0); @@ -280,7 +280,7 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge markCoords = ensureCapacityFloat32(markCoords, 4 * tickCount); for (let n = 0; n < tickCount; n++) { - let v = tickPositions[n]; + const v = tickPositions[n]; markCoords[(4 * n + 0)] = v; markCoords[(4 * n + 1)] = 0; markCoords[(4 * n + 2)] = v; @@ -303,7 +303,7 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); - let orderAxisRaw = order(Math.abs(axis.vSize)); + const orderAxisRaw = order(Math.abs(axis.vSize)); let orderAxis = 0; if (orderAxisRaw > 0) { orderAxis = Math.floor((orderAxisRaw - 1) / 3) * 3; @@ -311,17 +311,19 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge else if (orderAxisRaw < 0) { orderAxis = (Math.ceil(orderAxisRaw / 3) - 1) * 3; } - let orderFactor = Math.pow(10, -orderAxis); - let orderTick = order(tickInterval); - let precision = Math.max(0, orderAxis - orderTick); + const orderFactor = Math.pow(10, -orderAxis); + const orderTick = order(tickInterval); + const precision = Math.max(0, orderAxis - orderTick); textTextures.resetTouches(); textureRenderer.begin(gl, viewport); for (let n = 0; n < tickCount; n++) { - let v = tickPositions[n]; - let vFrac = axis.vFrac(v); - if (vFrac < 0 || vFrac >= 1) continue; + const v = tickPositions[n]; + const vFrac = axis.vFrac(v); + if (vFrac < 0 || vFrac >= 1) { + continue; + } let tickLabel; if (tickLabeler) { @@ -345,14 +347,14 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge // show magnitude inline for each tick tickLabel = Number(v * orderFactor).toFixed(precision) + (orderAxis === 0 ? '' : 'e' + orderAxis); } - let textTexture = textTextures.value(tickLabel); + const textTexture = textTextures.value(tickLabel); let xFrac: number; let yFrac: number; if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { - let yAnchor = textTexture.yAnchor(0.43); - let j0 = (vFrac * viewport.h) - yAnchor * textTexture.h; - let j = clamp(0, viewport.h - textTexture.h, j0); + const yAnchor = textTexture.yAnchor(0.43); + const j0 = (vFrac * viewport.h) - yAnchor * textTexture.h; + const j = clamp(0, viewport.h - textTexture.h, j0); yFrac = j / viewport.h; if (labelSide === Side.LEFT) { @@ -365,13 +367,13 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge else { let wMinus = 0; if (v < 0) { - let absTickLabel = Number(Math.abs(v) * orderFactor).toFixed(precision); + const absTickLabel = Number(Math.abs(v) * orderFactor).toFixed(precision); wMinus = textTexture.w - textTextures.value(absTickLabel).w; } - let xAnchor = 0.45; - let i0 = (vFrac * viewport.w) - xAnchor * (textTexture.w - wMinus) - wMinus; - let i = clamp(0, viewport.w - textTexture.w, i0); + const xAnchor = 0.45; + const i0 = (vFrac * viewport.w) - xAnchor * (textTexture.w - wMinus) - wMinus; + const i = clamp(0, viewport.w - textTexture.w, i0); xFrac = i / viewport.w; if (labelSide === Side.BOTTOM) { @@ -389,18 +391,18 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge // if (showLabel) { - let unitsString = units + (!shortenLabels || orderAxis === 0 ? '' : ' x 10^' + orderAxis.toFixed(0)); - let axisLabel = label + (unitsString ? ' (' + unitsString + ')' : ''); + const unitsString = units + (!shortenLabels || orderAxis === 0 ? '' : ' x 10^' + orderAxis.toFixed(0)); + const axisLabel = label + (unitsString ? ' (' + unitsString + ')' : ''); if (axisLabel !== '') { - let textTexture = textTextures.value(axisLabel); + const textTexture = textTextures.value(axisLabel); let xFrac: number; let yFrac: number; let textOpts: TextureDrawOptions; if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { // Using hTickLabels here works out about right, even though the tick-label text is horizontal - let xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w; + const xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w; xFrac = (labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0); yFrac = 0.5; textOpts = { @@ -410,7 +412,7 @@ export function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: Edge }; } else { - let yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; + const yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; yFrac = (labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0); xFrac = 0.5; textOpts = { diff --git a/src/webglimpse/plot/heatmap_painter.ts b/src/webglimpse/plot/heatmap_painter.ts index 45c5082..20b3924 100644 --- a/src/webglimpse/plot/heatmap_painter.ts +++ b/src/webglimpse/plot/heatmap_painter.ts @@ -99,16 +99,16 @@ export let heatmap_FRAGSHADER = concatLines( */ export function newHeatmapPainter(axis: Axis2D, colorAxis: Axis1D, data: HeatMapData, colorTexture: Texture, options?: HeatmapPainterOptions): Painter { - let blend = (hasval(options) && hasval(options.blend) ? options.blend : false); + const blend = (hasval(options) && hasval(options.blend) ? options.blend : false); // only GL_RGBA is supported with GL_FLOAT texture type in webgl (see texture.ts) // we we currently need an array 4 times bigger than necessary in order to use FLOATS // to store the matrix data in a texture - let array = new Float32Array(data.xSize * data.ySize * 4); + const array = new Float32Array(data.xSize * data.ySize * 4); for (let x = 0; x < data.xSize; x++) { for (let y = 0; y < data.ySize; y++) { - let index = x * data.ySize + y; - let value = data.array[index]; + const index = x * data.ySize + y; + const value = data.array[index]; array[4 * index] = value; array[4 * index + 1] = value; @@ -118,29 +118,29 @@ export function newHeatmapPainter(axis: Axis2D, colorAxis: Axis1D, data: HeatMap } data.array = array; - let program = new Program(heatmap_VERTSHADER, heatmap_FRAGSHADER); - let u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); - let u_dataTexture = new UniformSampler2D(program, 'u_dataTex'); - let u_colorTexture = new UniformSampler2D(program, 'u_colorTex'); - let u_dataMin = new Uniform1f(program, 'u_dataMin'); - let u_dataMax = new Uniform1f(program, 'u_dataMax'); - let a_vertCoord = new Attribute(program, 'a_vertCoord'); - let a_texCoord = new Attribute(program, 'a_texCoord'); + const program = new Program(heatmap_VERTSHADER, heatmap_FRAGSHADER); + const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); + const u_dataTexture = new UniformSampler2D(program, 'u_dataTex'); + const u_colorTexture = new UniformSampler2D(program, 'u_colorTex'); + const u_dataMin = new Uniform1f(program, 'u_dataMin'); + const u_dataMax = new Uniform1f(program, 'u_dataMax'); + const a_vertCoord = new Attribute(program, 'a_vertCoord'); + const a_texCoord = new Attribute(program, 'a_texCoord'); - let texture = new FloatDataTexture2D(data.xSize, data.ySize, data.array); + const texture = new FloatDataTexture2D(data.xSize, data.ySize, data.array); // points in triangle strip - let vertCoordArray = [data.xMin, data.yMax, data.xMax, data.yMax, data.xMin, data.yMin, data.xMax, data.yMin]; - let vertCoordFloatArray = new Float32Array(vertCoordArray); - let vertCoordBuffer = newStaticBuffer(vertCoordFloatArray); + const vertCoordArray = [data.xMin, data.yMax, data.xMax, data.yMax, data.xMin, data.yMin, data.xMax, data.yMin]; + const vertCoordFloatArray = new Float32Array(vertCoordArray); + const vertCoordBuffer = newStaticBuffer(vertCoordFloatArray); // texture coordinates - let texCoordArray = [0, 1, 1, 1, 0, 0, 1, 0]; - let texCoordFloatArray = new Float32Array(texCoordArray); - let texCoordBuffer = newStaticBuffer(texCoordFloatArray); + const texCoordArray = [0, 1, 1, 1, 0, 0, 1, 0]; + const texCoordFloatArray = new Float32Array(texCoordArray); + const texCoordBuffer = newStaticBuffer(texCoordFloatArray); - let dim = 2; - let vertexCount = 4; + const dim = 2; + const vertexCount = 4; return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -168,4 +168,4 @@ export function newHeatmapPainter(axis: Axis2D, colorAxis: Axis1D, data: HeatMap u_colorTexture.unbind(gl); program.endUse(gl); }; -} \ No newline at end of file +} diff --git a/src/webglimpse/plot/line_painter.ts b/src/webglimpse/plot/line_painter.ts index 14bbd1f..95b2ec7 100644 --- a/src/webglimpse/plot/line_painter.ts +++ b/src/webglimpse/plot/line_painter.ts @@ -48,23 +48,23 @@ export interface XyLinePainterOptions { * Simple xy line painter which displays static data */ export function newXyLinePainter(axis: Axis2D, xCoords: number[], yCoords: number[], options?: XyLinePainterOptions): Painter { - let thickness = (hasval(options) && hasval(options.thickness) ? options.thickness : 4); - let color = (hasval(options) && hasval(options.color) ? options.color : black); - let blend = (hasval(options) && hasval(options.blend) ? options.blend : false); + const thickness = (hasval(options) && hasval(options.thickness) ? options.thickness : 4); + const color = (hasval(options) && hasval(options.color) ? options.color : black); + const blend = (hasval(options) && hasval(options.blend) ? options.blend : false); - let program = new Program(modelview_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); + const program = new Program(modelview_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); - let coordArray = []; + const coordArray = []; for (let i = 0; i < xCoords.length; i++) { coordArray[2 * i] = xCoords[i]; coordArray[2 * i + 1] = yCoords[i]; } - let coordFloatArray = new Float32Array(coordArray); - let coordBuffer = newStaticBuffer(coordFloatArray); - let dim = 2; - let count = coordFloatArray.length / dim; + const coordFloatArray = new Float32Array(coordArray); + const coordBuffer = newStaticBuffer(coordFloatArray); + const dim = 2; + const count = coordFloatArray.length / dim; return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -100,7 +100,7 @@ export function newXyLinePainter(axis: Axis2D, xCoords: number[], yCoords: numbe coordBuffer.unbind(gl, GL.ARRAY_BUFFER); program.endUse(gl); - } + }; } diff --git a/src/webglimpse/plot/plot_layout.ts b/src/webglimpse/plot/plot_layout.ts index c81c95b..b06749e 100644 --- a/src/webglimpse/plot/plot_layout.ts +++ b/src/webglimpse/plot/plot_layout.ts @@ -33,20 +33,20 @@ import { Side } from '../misc'; import { hasval } from '../util/util'; export function newPlotLayout(options?: { horizAxisHeight?: number; vertAxisWidth?: number }): Layout { - let horizAxisHeight = (hasval(options) && hasval(options.horizAxisHeight) ? options.horizAxisHeight : 60); - let vertAxisWidth = (hasval(options) && hasval(options.vertAxisWidth) ? options.vertAxisWidth : 70); + const horizAxisHeight = (hasval(options) && hasval(options.horizAxisHeight) ? options.horizAxisHeight : 60); + const vertAxisWidth = (hasval(options) && hasval(options.vertAxisWidth) ? options.vertAxisWidth : 70); return { updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { - let topAxes = []; - let leftAxes = []; - let rightAxes = []; - let bottomAxes = []; - let centers = []; - let others = []; + const topAxes = []; + const leftAxes = []; + const rightAxes = []; + const bottomAxes = []; + const centers = []; + const others = []; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; switch (child.layoutArg) { case Side.TOP: topAxes.push(child); break; case Side.LEFT: leftAxes.push(child); break; @@ -57,39 +57,39 @@ export function newPlotLayout(options?: { horizAxisHeight?: number; vertAxisWidt } } - let numVertAxes = leftAxes.length + rightAxes.length; - let numHorizAxes = topAxes.length + bottomAxes.length; - let centerWidth = Math.max(vertAxisWidth, parentViewport.w - numVertAxes * vertAxisWidth); - let centerHeight = Math.max(horizAxisHeight, parentViewport.h - numHorizAxes * horizAxisHeight); - let vertAxisWidth2 = (numVertAxes === 0 ? 0 : (parentViewport.w - centerWidth) / numVertAxes); - let horizAxisHeight2 = (numHorizAxes === 0 ? 0 : (parentViewport.h - centerHeight) / numHorizAxes); + const numVertAxes = leftAxes.length + rightAxes.length; + const numHorizAxes = topAxes.length + bottomAxes.length; + const centerWidth = Math.max(vertAxisWidth, parentViewport.w - numVertAxes * vertAxisWidth); + const centerHeight = Math.max(horizAxisHeight, parentViewport.h - numHorizAxes * horizAxisHeight); + const vertAxisWidth2 = (numVertAxes === 0 ? 0 : (parentViewport.w - centerWidth) / numVertAxes); + const horizAxisHeight2 = (numHorizAxes === 0 ? 0 : (parentViewport.h - centerHeight) / numHorizAxes); - let iCenterStart = parentViewport.iStart + leftAxes.length * vertAxisWidth2; - let iCenterEnd = parentViewport.iEnd - rightAxes.length * vertAxisWidth2; - let jCenterStart = parentViewport.jStart + bottomAxes.length * horizAxisHeight2; - let jCenterEnd = parentViewport.jEnd - topAxes.length * horizAxisHeight2; + const iCenterStart = parentViewport.iStart + leftAxes.length * vertAxisWidth2; + const iCenterEnd = parentViewport.iEnd - rightAxes.length * vertAxisWidth2; + const jCenterStart = parentViewport.jStart + bottomAxes.length * horizAxisHeight2; + const jCenterEnd = parentViewport.jEnd - topAxes.length * horizAxisHeight2; for (let c = 0; c < topAxes.length; c++) { - let jStart = Math.round(jCenterEnd + c * horizAxisHeight2); - let jEnd = (c === topAxes.length - 1 ? parentViewport.jEnd : Math.round(jCenterEnd + (c + 1) * horizAxisHeight2)); + const jStart = Math.round(jCenterEnd + c * horizAxisHeight2); + const jEnd = (c === topAxes.length - 1 ? parentViewport.jEnd : Math.round(jCenterEnd + (c + 1) * horizAxisHeight2)); topAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd); } for (let c = 0; c < bottomAxes.length; c++) { - let jStart = (c === bottomAxes.length - 1 ? parentViewport.jStart : Math.round(jCenterStart - (c + 1) * horizAxisHeight2)); - let jEnd = Math.round(jCenterStart - c * horizAxisHeight2); + const jStart = (c === bottomAxes.length - 1 ? parentViewport.jStart : Math.round(jCenterStart - (c + 1) * horizAxisHeight2)); + const jEnd = Math.round(jCenterStart - c * horizAxisHeight2); bottomAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd); } for (let c = 0; c < leftAxes.length; c++) { - let iStart = (c === leftAxes.length - 1 ? parentViewport.iStart : Math.round(iCenterStart - (c + 1) * vertAxisWidth2)); - let iEnd = Math.round(iCenterStart - c * vertAxisWidth2); + const iStart = (c === leftAxes.length - 1 ? parentViewport.iStart : Math.round(iCenterStart - (c + 1) * vertAxisWidth2)); + const iEnd = Math.round(iCenterStart - c * vertAxisWidth2); leftAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd); } for (let c = 0; c < rightAxes.length; c++) { - let iStart = Math.round(iCenterEnd + c * vertAxisWidth2); - let iEnd = (c === rightAxes.length - 1 ? parentViewport.iEnd : Math.round(iCenterEnd + (c + 1) * vertAxisWidth2)); + const iStart = Math.round(iCenterEnd + c * vertAxisWidth2); + const iEnd = (c === rightAxes.length - 1 ? parentViewport.iEnd : Math.round(iCenterEnd + (c + 1) * vertAxisWidth2)); rightAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd); } diff --git a/src/webglimpse/scroll.ts b/src/webglimpse/scroll.ts index 634fbd5..338ffef 100644 --- a/src/webglimpse/scroll.ts +++ b/src/webglimpse/scroll.ts @@ -43,11 +43,11 @@ export interface VerticalScrollLayout extends Layout { export function newVerticalScrollLayout(): VerticalScrollLayout { - let layout = { + const layout = { updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) { if (children.length === 1) { - let childPrefSize = children[0].prefSize; + const childPrefSize = children[0].prefSize; // XXX: Need some way to override the child's pref-height if (!hasval(childPrefSize.h)) { @@ -68,10 +68,10 @@ export function newVerticalScrollLayout(): VerticalScrollLayout { updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) { if (children.length === 1) { - let child = children[0]; + const child = children[0]; let j; - let h = child.prefSize.h; + const h = child.prefSize.h; if (h <= parentViewport.h) { j = parentViewport.jEnd - h; } @@ -108,9 +108,9 @@ export interface ScrollbarOptions { export function newVerticalScrollbar(scrollLayout: VerticalScrollLayout, drawable: Drawable, options?: ScrollbarOptions): Pane { - let bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : gray(0.9)); + const bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : gray(0.9)); - let scrollbar = new Pane(null); + const scrollbar = new Pane(null); scrollbar.addPainter(newBackgroundPainter(bgColor)); scrollbar.addPainter(newVerticalScrollbarPainter(scrollLayout, options)); @@ -121,34 +121,34 @@ export function newVerticalScrollbar(scrollLayout: VerticalScrollLayout, drawabl export function newVerticalScrollbarPainter(scrollLayout: VerticalScrollLayout, options?: ScrollbarOptions): Painter { - let fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : gray(0.56)); - let borderColor = (hasval(options) && hasval(options.borderColor) ? options.borderColor : gray(0.42)); - let borderThickness = (hasval(options) && hasval(options.borderThickness) ? options.borderThickness : 1); - let borderTop = (hasval(options) && hasval(options.borderTop) ? options.borderTop : true); - let borderLeft = (hasval(options) && hasval(options.borderLeft) ? options.borderLeft : false); - let borderRight = (hasval(options) && hasval(options.borderRight) ? options.borderRight : false); - let borderBottom = (hasval(options) && hasval(options.borderBottom) ? options.borderBottom : true); - - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - - let numFillVertices = 6; - let numBorderVertices = (borderTop ? 6 : 0) + (borderLeft ? 6 : 0) + (borderRight ? 6 : 0) + (borderBottom ? 6 : 0); - let xyFrac = new Float32Array(2 * Math.max(numFillVertices, numBorderVertices)); - let xyFracBuffer = newDynamicBuffer(); + const fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : gray(0.56)); + const borderColor = (hasval(options) && hasval(options.borderColor) ? options.borderColor : gray(0.42)); + const borderThickness = (hasval(options) && hasval(options.borderThickness) ? options.borderThickness : 1); + const borderTop = (hasval(options) && hasval(options.borderTop) ? options.borderTop : true); + const borderLeft = (hasval(options) && hasval(options.borderLeft) ? options.borderLeft : false); + const borderRight = (hasval(options) && hasval(options.borderRight) ? options.borderRight : false); + const borderBottom = (hasval(options) && hasval(options.borderBottom) ? options.borderBottom : true); + + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + + const numFillVertices = 6; + const numBorderVertices = (borderTop ? 6 : 0) + (borderLeft ? 6 : 0) + (borderRight ? 6 : 0) + (borderBottom ? 6 : 0); + const xyFrac = new Float32Array(2 * Math.max(numFillVertices, numBorderVertices)); + const xyFracBuffer = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let hFrac = scrollLayout.hVisible / scrollLayout.hContent; + const hFrac = scrollLayout.hVisible / scrollLayout.hContent; if (hFrac < 1) { - let yTop = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset)) / scrollLayout.hContent) * viewport.h + 1e-4); - let yBottom = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset + scrollLayout.hVisible)) / scrollLayout.hContent) * viewport.h + 1e-4); + const yTop = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset)) / scrollLayout.hContent) * viewport.h + 1e-4); + const yBottom = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset + scrollLayout.hVisible)) / scrollLayout.hContent) * viewport.h + 1e-4); - let yFracTop = yTop / viewport.h; - let yFracBottom = yBottom / viewport.h; + const yFracTop = yTop / viewport.h; + const yFracBottom = yBottom / viewport.h; - let wBorderFrac = borderThickness / viewport.w; - let hBorderFrac = borderThickness / viewport.h; + const wBorderFrac = borderThickness / viewport.w; + const hBorderFrac = borderThickness / viewport.h; gl.disable(GL.BLEND); @@ -169,10 +169,18 @@ export function newVerticalScrollbarPainter(scrollLayout: VerticalScrollLayout, // let index = 0; - if (borderTop) index = putQuadXys(xyFrac, index, 0, 1 - (borderRight ? wBorderFrac : 0), yFracTop, yFracTop - hBorderFrac); - if (borderBottom) index = putQuadXys(xyFrac, index, 0 + (borderLeft ? wBorderFrac : 0), 1, yFracBottom + hBorderFrac, yFracBottom); - if (borderRight) index = putQuadXys(xyFrac, index, 1 - wBorderFrac, 1, yFracTop, yFracBottom + (borderBottom ? hBorderFrac : 0)); - if (borderLeft) index = putQuadXys(xyFrac, index, 0, 0 + wBorderFrac, yFracTop - (borderTop ? hBorderFrac : 0), yFracBottom); + if (borderTop) { + index = putQuadXys(xyFrac, index, 0, 1 - (borderRight ? wBorderFrac : 0), yFracTop, yFracTop - hBorderFrac); + } + if (borderBottom) { + index = putQuadXys(xyFrac, index, 0 + (borderLeft ? wBorderFrac : 0), 1, yFracBottom + hBorderFrac, yFracBottom); + } + if (borderRight) { + index = putQuadXys(xyFrac, index, 1 - wBorderFrac, 1, yFracTop, yFracBottom + (borderBottom ? hBorderFrac : 0)); + } + if (borderLeft) { + index = putQuadXys(xyFrac, index, 0, 0 + wBorderFrac, yFracTop - (borderTop ? hBorderFrac : 0), yFracBottom); + } xyFracBuffer.setData(xyFrac.subarray(0, 2 * numBorderVertices)); a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT); @@ -224,9 +232,9 @@ export function attachVerticalScrollMouseListeners(scrollbar: Pane, scrollLayout scrollbar.mouseDown.on(function (ev: PointerEvent) { if (isLeftMouseDown(ev.mouseEvent) && !hasval(grab)) { - let topFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent; - let fracExtent = scrollLayout.hVisible / scrollLayout.hContent; - let pointerFrac = yFrac(ev); + const topFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent; + const fracExtent = scrollLayout.hVisible / scrollLayout.hContent; + const pointerFrac = yFrac(ev); if (topFrac - fracExtent <= pointerFrac && pointerFrac <= topFrac) { grab = (topFrac - pointerFrac) / fracExtent; } @@ -243,21 +251,29 @@ export function attachVerticalScrollMouseListeners(scrollbar: Pane, scrollLayout // let direction = 0; - if (pointerFrac < topFrac - fracExtent) direction = +1; - else if (pointerFrac > topFrac) direction = -1; + if (pointerFrac < topFrac - fracExtent) { + direction = +1; + } + else if (pointerFrac > topFrac) { + direction = -1; + } scrollLayout.jOffset += direction * Math.max(1, 0.875 * scrollLayout.hVisible); drawable.redraw(); recentPointerFrac = pointerFrac; - let pageScroll = function () { - let topFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent; - let fracExtent = scrollLayout.hVisible / scrollLayout.hContent; - let pointerFrac = recentPointerFrac; - - let direction = 0; - if (pointerFrac < topFrac - fracExtent) direction = +1; - else if (pointerFrac > topFrac) direction = -1; - scrollLayout.jOffset += direction * Math.max(1, 0.875 * scrollLayout.hVisible); + const pageScroll = function () { + const pageTopFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent; + const pageFracExtent = scrollLayout.hVisible / scrollLayout.hContent; + const pagePointerFrac = recentPointerFrac; + + let pageDirection = 0; + if (pagePointerFrac < pageTopFrac - pageFracExtent) { + pageDirection = +1; + } + else if (pagePointerFrac > pageTopFrac) { + pageDirection = -1; + } + scrollLayout.jOffset += pageDirection * Math.max(1, 0.875 * scrollLayout.hVisible); drawable.redraw(); pageScrollTimer = setTimeout(pageScroll, 50); @@ -268,10 +284,10 @@ export function attachVerticalScrollMouseListeners(scrollbar: Pane, scrollLayout }); scrollbar.mouseMove.on(function (ev: PointerEvent) { - let pointerFrac = yFrac(ev); + const pointerFrac = yFrac(ev); if (hasval(grab)) { - let fracExtent = scrollLayout.hVisible / scrollLayout.hContent; - let topFrac = pointerFrac + grab * fracExtent; + const fracExtent = scrollLayout.hVisible / scrollLayout.hContent; + const topFrac = pointerFrac + grab * fracExtent; scrollLayout.jOffset = scrollLayout.hContent - topFrac * scrollLayout.hContent; drawable.redraw(); } diff --git a/src/webglimpse/shader.ts b/src/webglimpse/shader.ts index f7416fa..50ec8df 100644 --- a/src/webglimpse/shader.ts +++ b/src/webglimpse/shader.ts @@ -33,23 +33,27 @@ import { Texture } from './texture'; import { Buffer } from './buffer'; function compileShader(gl: WebGLRenderingContext, shaderType: number, glsl: string): WebGLShader { - let shader = gl.createShader(shaderType); + const shader = gl.createShader(shaderType); gl.shaderSource(shader, glsl); gl.compileShader(shader); - if (!gl.getShaderParameter(shader, GL.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader)); + if (!gl.getShaderParameter(shader, GL.COMPILE_STATUS)) { + throw new Error(gl.getShaderInfoLog(shader)); + } return shader; } function linkProgram(gl: WebGLRenderingContext, shaders: WebGLShader[]): WebGLProgram { - let program = gl.createProgram(); + const program = gl.createProgram(); for (let i = 0; i < shaders.length; i++) { gl.attachShader(program, shaders[i]); } try { gl.linkProgram(program); - if (!gl.getProgramParameter(program, GL.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program)); + if (!gl.getProgramParameter(program, GL.LINK_STATUS)) { + throw new Error(gl.getProgramInfoLog(program)); + } return program; } finally { @@ -64,7 +68,7 @@ function linkProgram(gl: WebGLRenderingContext, shaders: WebGLShader[]): WebGLPr } function createProgram(gl: WebGLRenderingContext, vertShaderSource: string, fragShaderSource: string): WebGLProgram { - let shaders = []; + const shaders = []; try { shaders.push(compileShader(gl, GL.VERTEX_SHADER, vertShaderSource)); shaders.push(compileShader(gl, GL.FRAGMENT_SHADER, fragShaderSource)); @@ -104,9 +108,9 @@ export class Program { // XXX: Would be nice if this weren't public _program(gl: WebGLRenderingContext): WebGLProgram { - let glId = getObjectId(gl); + const glId = getObjectId(gl); if (this.programs[glId] === undefined) { - let program = createProgram(gl, this.vertShaderSource, this.fragShaderSource); + const program = createProgram(gl, this.vertShaderSource, this.fragShaderSource); this.programs[glId] = new ProgramEntry(gl, program); } return this.programs[glId].program; @@ -122,9 +126,9 @@ export class Program { dispose() { // XXX: Not sure this actually works ... may have to make each gl current or something - for (let glid in this.programs) { + for (const glid in this.programs) { if (this.programs.hasOwnProperty(glid)) { - let en = this.programs[glid]; + const en = this.programs[glid]; en.gl.deleteProgram(en.program); } } @@ -147,10 +151,12 @@ export class Uniform { // XXX: Would be nice if this weren't public _location(gl: WebGLRenderingContext): WebGLUniformLocation { - let glId = getObjectId(gl); + const glId = getObjectId(gl); if (this.locations[glId] === undefined) { - let location = gl.getUniformLocation(this.program._program(gl), this.name); - if (!this.optional && !hasval(location)) throw new Error('Uniform \'' + this.name + '\' not found'); + const location = gl.getUniformLocation(this.program._program(gl), this.name); + if (!this.optional && !hasval(location)) { + throw new Error('Uniform \'' + this.name + '\' not found'); + } this.locations[glId] = location; } return this.locations[glId]; @@ -164,8 +170,10 @@ export class Uniform1f extends Uniform { } setData(gl: WebGLRenderingContext, x: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform1f(location, x); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform1f(location, x); + } } } @@ -175,8 +183,10 @@ export class Uniform2f extends Uniform { } setData(gl: WebGLRenderingContext, x: number, y: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform2f(location, x, y); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform2f(location, x, y); + } } } @@ -186,8 +196,10 @@ export class Uniform3f extends Uniform { } setData(gl: WebGLRenderingContext, x: number, y: number, z: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform3f(location, x, y, z); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform3f(location, x, y, z); + } } } @@ -197,8 +209,10 @@ export class Uniform4f extends Uniform { } setData(gl: WebGLRenderingContext, x: number, y: number, z: number, w: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform4f(location, x, y, z, w); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform4f(location, x, y, z, w); + } } } @@ -208,8 +222,10 @@ export class UniformMatrix4f extends Uniform { } setData(gl: WebGLRenderingContext, value: Float32Array, transpose: boolean = false) { - let location = this._location(gl); - if (hasval(location)) gl.uniformMatrix4fv(location, transpose, value); + const location = this._location(gl); + if (hasval(location)) { + gl.uniformMatrix4fv(location, transpose, value); + } } } @@ -219,8 +235,10 @@ export class Uniform1i extends Uniform { } setData(gl: WebGLRenderingContext, x: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform1i(location, x); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform1i(location, x); + } } } @@ -230,8 +248,10 @@ export class Uniform2i extends Uniform { } setData(gl: WebGLRenderingContext, x: number, y: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform2i(location, x, y); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform2i(location, x, y); + } } } @@ -241,8 +261,10 @@ export class Uniform3i extends Uniform { } setData(gl: WebGLRenderingContext, x: number, y: number, z: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform3i(location, x, y, z); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform3i(location, x, y, z); + } } } @@ -252,8 +274,10 @@ export class Uniform4i extends Uniform { } setData(gl: WebGLRenderingContext, x: number, y: number, z: number, w: number) { - let location = this._location(gl); - if (hasval(location)) gl.uniform4i(location, x, y, z, w); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform4i(location, x, y, z, w); + } } } @@ -263,8 +287,10 @@ export class UniformColor extends Uniform { } setData(gl: WebGLRenderingContext, color: Color) { - let location = this._location(gl); - if (hasval(location)) gl.uniform4f(location, color.r, color.g, color.b, color.a); + const location = this._location(gl); + if (hasval(location)) { + gl.uniform4f(location, color.r, color.g, color.b, color.a); + } } } @@ -277,7 +303,7 @@ export class UniformSampler2D extends Uniform { } setDataAndBind(gl: WebGLRenderingContext, textureUnit: number, texture: Texture) { - let location = this._location(gl); + const location = this._location(gl); if (hasval(location)) { texture.bind(gl, textureUnit); gl.uniform1i(location, textureUnit); @@ -306,17 +332,19 @@ export class Attribute { // XXX: Would be nice if this weren't public _location(gl: WebGLRenderingContext): number { - let glId = getObjectId(gl); + const glId = getObjectId(gl); if (this.locations[glId] === undefined) { - let location = gl.getAttribLocation(this.program._program(gl), this.name); - if (location === -1) throw new Error('Attribute "' + this.name + '" not found'); + const location = gl.getAttribLocation(this.program._program(gl), this.name); + if (location === -1) { + throw new Error('Attribute "' + this.name + '" not found'); + } this.locations[glId] = location; } return this.locations[glId]; } setDataAndEnable(gl: WebGLRenderingContext, buffer: Buffer, size: number, type: number, normalized: boolean = false, stride: number = 0, offset: number = 0) { - let location = this._location(gl); + const location = this._location(gl); gl.enableVertexAttribArray(location); buffer.bind(gl, GL.ARRAY_BUFFER); gl.vertexAttribPointer(location, size, type, normalized, stride, offset); diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index 321ea7f..b703b39 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -36,7 +36,6 @@ import { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './sh import { Buffer, newStaticBuffer } from './buffer'; import { BoundsUnmodifiable } from './bounds'; import { nearestPixel } from './misc'; -import { xFrac, yFrac } from './core'; interface Dim2D { w: number; @@ -44,9 +43,9 @@ interface Dim2D { } -let textDim = (function () { +const textDim = (function () { // Use div to figure out how big our texture needs to be - let div = document.createElement('div'); + const div = document.createElement('div'); div.style.setProperty('position', 'absolute'); div.style.setProperty('padding', '0'); div.style.setProperty('margin', '0'); @@ -59,8 +58,8 @@ let textDim = (function () { div.textContent = s; document.body.appendChild(div); - let width = div.clientWidth; - let height = div.clientHeight; + const width = div.clientWidth; + const height = div.clientHeight; document.body.removeChild(div); return { w: width, h: height }; @@ -80,13 +79,13 @@ function newFontMetricsCache(): Cache { return new Cache({ create: function (font: string): FontMetrics { - let dim = textDim('fMgyj', font); - let w = dim.w; - let h = dim.h; - let canvas = document.createElement('canvas'); + const dim = textDim('fMgyj', font); + const w = dim.w; + const h = dim.h; + const canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - let g = canvas.getContext('2d'); + const g = canvas.getContext('2d'); g.font = font; g.textAlign = 'left'; @@ -100,16 +99,20 @@ function newFontMetricsCache(): Cache { let jTop = -1; for (let j = 0; j < h && jTop < 0; j++) { for (let i = 0; i < w && jTop < 0; i++) { - let alpha = rgbaData[(j * w + i) * 4 + 3]; - if (alpha !== 0) jTop = j; + const alpha = rgbaData[(j * w + i) * 4 + 3]; + if (alpha !== 0) { + jTop = j; + } } } let jBaseline = -1; for (let j = h - 1; j >= 0 && jBaseline < 0; j--) { for (let i = 0; i < w && jBaseline < 0; i++) { - let alpha = rgbaData[(j * w + i) * 4 + 3]; - if (alpha !== 0) jBaseline = j; + const alpha = rgbaData[(j * w + i) * 4 + 3]; + if (alpha !== 0) { + jBaseline = j; + } } } @@ -120,8 +123,10 @@ function newFontMetricsCache(): Cache { let jBottom = -1; for (let j = h - 1; j >= 0 && jBottom < 0; j--) { for (let i = 0; i < w && jBottom < 0; i++) { - let alpha = rgbaData[(j * w + i) * 4 + 3]; - if (alpha !== 0) jBottom = j; + const alpha = rgbaData[(j * w + i) * 4 + 3]; + if (alpha !== 0) { + jBottom = j; + } } } @@ -132,19 +137,19 @@ function newFontMetricsCache(): Cache { } -let getRawFontMetrics = (function () { - let cache = newFontMetricsCache(); +const getRawFontMetrics = (function () { + const cache = newFontMetricsCache(); return function (font: string): FontMetrics { return cache.value(font); }; })(); -let getTextWidth = (function () { - let canvas = document.createElement('canvas'); +const getTextWidth = (function () { + const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; - let g = canvas.getContext('2d'); + const g = canvas.getContext('2d'); g.textAlign = 'left'; g.textBaseline = 'top'; return function (font: string, text: string): number { @@ -169,15 +174,15 @@ export class TextTexture2D extends Texture2D { // a fraction of the way from the bottom of the baseline pixel up to the // top of the top pixel // - let bottom = this.jBaseline + 1; - let h = this.h; + const bottom = this.jBaseline + 1; + const h = this.h; return 1 - ((1 - textFrac) * bottom / h); } } export function newTextTextureCache(font: string, color: Color): Cache { - let createTextTexture = createTextTextureFactory(font); + const createTextTexture = createTextTextureFactory(font); return new Cache({ create: function (text: string): TextTexture2D { return createTextTexture(color, text); @@ -190,10 +195,10 @@ export function newTextTextureCache(font: string, color: Color): Cache { - let createTextTexture = createTextTextureFactory(font); + const createTextTexture = createTextTextureFactory(font); return new TwoKeyCache({ create: function (rgbaString: string, text: string): TextTexture2D { - let color = parseRgba(rgbaString); + const color = parseRgba(rgbaString); return createTextTexture(color, text); }, dispose: function (texture: Texture2D) { @@ -206,8 +211,8 @@ export function newTextTextureCache2(font: string): TwoKeyCache { export function newTextTextureCache3(): ThreeKeyCache { return new ThreeKeyCache({ create: function (font: string, rgbaString: string, text: string): TextTexture2D { - let createTextTexture = createTextTextureFactory(font); - let color = parseRgba(rgbaString); + const createTextTexture = createTextTextureFactory(font); + const color = parseRgba(rgbaString); return createTextTexture(color, text); }, dispose: function (texture: Texture2D) { @@ -217,18 +222,16 @@ export function newTextTextureCache3(): ThreeKeyCache { } -export interface TextTextureFactory { - (color: Color, text: string): TextTexture2D; -} +export type TextTextureFactory = (color: Color, text: string) => TextTexture2D; export function createTextTextureFactory(font: string): TextTextureFactory { - let rawFontMetrics = getRawFontMetrics(font); - let jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; - let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; + const rawFontMetrics = getRawFontMetrics(font); + const jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; + const h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; return function (color: Color, text: string): TextTexture2D { - let w = getTextWidth(font, text); + const w = getTextWidth(font, text); return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent @@ -252,16 +255,16 @@ export function createTextTextureFactory(font: string): TextTextureFactory { g.fillText(text, 0, 0); g.restore(); - let r255 = 255 * color.r; - let g255 = 255 * color.g; - let b255 = 255 * color.b; - let aFactor = color.a / 3; + const r255 = 255 * color.r; + const g255 = 255 * color.g; + const b255 = 255 * color.b; + const aFactor = color.a / 3; - let pixels = g.getImageData(0, 0, w, h); + const pixels = g.getImageData(0, 0, w, h); for (let j = 0; j < pixels.height; j++) { for (let i = 0; i < pixels.width; i++) { - let pixelOffset = (j * pixels.width + i) * 4; - let a255 = aFactor * (pixels.data[pixelOffset + 0] + pixels.data[pixelOffset + 1] + pixels.data[pixelOffset + 2]); + const pixelOffset = (j * pixels.width + i) * 4; + const a255 = aFactor * (pixels.data[pixelOffset + 0] + pixels.data[pixelOffset + 1] + pixels.data[pixelOffset + 2]); pixels.data[pixelOffset + 0] = r255; pixels.data[pixelOffset + 1] = g255; @@ -272,7 +275,7 @@ export function createTextTextureFactory(font: string): TextTextureFactory { g.putImageData(pixels, 0, 0); }); - } + }; } @@ -283,22 +286,22 @@ export function createTextTextureFactory(font: string): TextTextureFactory { export function newTextHintsCache(font: string): Cache { - let rawFontMetrics = getRawFontMetrics(font); - let jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; - let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; + const rawFontMetrics = getRawFontMetrics(font); + const jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; + const h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; return new Cache({ create: function (text: string): Texture2D { - let w = getTextWidth(font, text); + const w = getTextWidth(font, text); // XXX: For now, assuming subpixels are horizontal-RGB // Draw text triple-sized, to get an alpha for each r,g,b subpixel - let canvas3 = document.createElement('canvas'); + const canvas3 = document.createElement('canvas'); canvas3.width = 3 * w; canvas3.height = h; - let g3 = canvas3.getContext('2d'); + const g3 = canvas3.getContext('2d'); g3.fillStyle = 'black'; g3.fillRect(0, 0, canvas3.width, canvas3.height); @@ -311,16 +314,16 @@ export function newTextHintsCache(font: string): Cache { g3.fillStyle = 'white'; g3.fillText(text, 0, 0); g3.restore(); - let srcRgba = g3.getImageData(0, 0, canvas3.width, canvas3.height).data; + const srcRgba = g3.getImageData(0, 0, canvas3.width, canvas3.height).data; return new Texture2D(w, h, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { - let destImage = g.createImageData(w, h); - let destRgba = destImage.data; + const destImage = g.createImageData(w, h); + const destRgba = destImage.data; - let weightLeft = 1; - let weightCenter = 2; - let weightRight = 1; - let weightNorm = 1 / (weightLeft + weightCenter + weightRight); + const weightLeft = 1; + const weightCenter = 2; + const weightRight = 1; + const weightNorm = 1 / (weightLeft + weightCenter + weightRight); for (let j = 0; j < h; j++) { for (let i = 0; i < w; i++) { @@ -335,20 +338,20 @@ export function newTextHintsCache(font: string): Cache { // de-hinting it so that we can re-hint it ourselves later (during blending, when the // background color is known). // - let srcPixelIndex = (j * 3 * w + 3 * i) * 4; - let srcAlphaL = (i > 0 ? (srcRgba[srcPixelIndex - 4] + srcRgba[srcPixelIndex - 3] + srcRgba[srcPixelIndex - 2]) / (3 * 255) : 0); - let srcAlpha0 = (srcRgba[srcPixelIndex + 0] + srcRgba[srcPixelIndex + 1] + srcRgba[srcPixelIndex + 2]) / (3 * 255); - let srcAlpha1 = (srcRgba[srcPixelIndex + 4] + srcRgba[srcPixelIndex + 5] + srcRgba[srcPixelIndex + 6]) / (3 * 255); - let srcAlpha2 = (srcRgba[srcPixelIndex + 8] + srcRgba[srcPixelIndex + 9] + srcRgba[srcPixelIndex + 10]) / (3 * 255); - let srcAlphaR = (i < w - 1 ? (srcRgba[srcPixelIndex + 12] + srcRgba[srcPixelIndex + 13] + srcRgba[srcPixelIndex + 14]) / (3 * 255) : 0); + const srcPixelIndex = (j * 3 * w + 3 * i) * 4; + const srcAlphaL = (i > 0 ? (srcRgba[srcPixelIndex - 4] + srcRgba[srcPixelIndex - 3] + srcRgba[srcPixelIndex - 2]) / (3 * 255) : 0); + const srcAlpha0 = (srcRgba[srcPixelIndex + 0] + srcRgba[srcPixelIndex + 1] + srcRgba[srcPixelIndex + 2]) / (3 * 255); + const srcAlpha1 = (srcRgba[srcPixelIndex + 4] + srcRgba[srcPixelIndex + 5] + srcRgba[srcPixelIndex + 6]) / (3 * 255); + const srcAlpha2 = (srcRgba[srcPixelIndex + 8] + srcRgba[srcPixelIndex + 9] + srcRgba[srcPixelIndex + 10]) / (3 * 255); + const srcAlphaR = (i < w - 1 ? (srcRgba[srcPixelIndex + 12] + srcRgba[srcPixelIndex + 13] + srcRgba[srcPixelIndex + 14]) / (3 * 255) : 0); // Weighted averages to find subpixel alphas - let alphaLeft = weightNorm * (weightLeft * srcAlphaL + weightCenter * srcAlpha0 + weightRight * srcAlpha1); - let alphaCenter = weightNorm * (weightLeft * srcAlpha0 + weightCenter * srcAlpha1 + weightRight * srcAlpha2); - let alphaRight = weightNorm * (weightLeft * srcAlpha1 + weightCenter * srcAlpha2 + weightRight * srcAlphaR); + const alphaLeft = weightNorm * (weightLeft * srcAlphaL + weightCenter * srcAlpha0 + weightRight * srcAlpha1); + const alphaCenter = weightNorm * (weightLeft * srcAlpha0 + weightCenter * srcAlpha1 + weightRight * srcAlpha2); + const alphaRight = weightNorm * (weightLeft * srcAlpha1 + weightCenter * srcAlpha2 + weightRight * srcAlphaR); // Store subpixel alphas in dest-pixel - let destPixelIndex = (j * w + i) * 4; + const destPixelIndex = (j * w + i) * 4; destRgba[destPixelIndex + 0] = Math.round(255 * alphaLeft); destRgba[destPixelIndex + 1] = Math.round(255 * alphaCenter); destRgba[destPixelIndex + 2] = Math.round(255 * alphaRight); @@ -359,7 +362,7 @@ export function newTextHintsCache(font: string): Cache { // If alpha is 1, Firefox will interpret it as 100%. Causes some pixels that should be // very dim to come out very bright. As a workaround, nudge them down to zero. // - let alphaAvg = Math.round(255 * (alphaLeft + alphaCenter + alphaRight) / 3); + const alphaAvg = Math.round(255 * (alphaLeft + alphaCenter + alphaRight) / 3); destRgba[destPixelIndex + 3] = (alphaAvg === 1 ? 0 : alphaAvg); } } @@ -459,9 +462,9 @@ export class HintedTextRenderer { yAnchor?: number; color?: Color }) { - let xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5); - let yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5); - let color = (hasval(options) && hasval(options.color) ? options.color : black); + const xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5); + const yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5); + const color = (hasval(options) && hasval(options.color) ? options.color : black); // The hints texture stores subpixel alphas in its R,G,B components. For example, a red hint-pixel indicates // that, at that pixel, the final R component should be color.r (R_hint=1, so red is opaque), but the diff --git a/src/webglimpse/texture.ts b/src/webglimpse/texture.ts index ad670cc..1573d57 100644 --- a/src/webglimpse/texture.ts +++ b/src/webglimpse/texture.ts @@ -32,7 +32,6 @@ import { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './sh import { Buffer, newStaticBuffer } from './buffer'; import { BoundsUnmodifiable } from './bounds'; import { nearestPixel } from './misc'; -import { xFrac, yFrac } from './core'; class TextureEntry { gl: WebGLRenderingContext; @@ -65,20 +64,22 @@ export class Texture { } bind(gl: WebGLRenderingContext, textureUnit: number) { - let glId = getObjectId(gl); + const glId = getObjectId(gl); if (hasval(this.textures[glId])) { - let en = this.textures[glId]; + const en = this.textures[glId]; gl.activeTexture(GL.TEXTURE0 + textureUnit); gl.bindTexture(en.target, en.texture); en.textureUnit = textureUnit; } else { - let target = this.helper.target(gl); - let texture = gl.createTexture(); - if (!hasval(texture)) throw new Error('Failed to create texture'); + const target = this.helper.target(gl); + const texture = gl.createTexture(); + if (!hasval(texture)) { + throw new Error('Failed to create texture'); + } this.textures[glId] = new TextureEntry(gl, target, texture); - let en = this.textures[glId]; + const en = this.textures[glId]; gl.activeTexture(GL.TEXTURE0 + textureUnit); gl.bindTexture(en.target, en.texture); en.textureUnit = textureUnit; @@ -88,9 +89,9 @@ export class Texture { } unbind(gl: WebGLRenderingContext) { - let glId = getObjectId(gl); + const glId = getObjectId(gl); if (hasval(this.textures[glId])) { - let en = this.textures[glId]; + const en = this.textures[glId]; gl.activeTexture(GL.TEXTURE0 + en.textureUnit); gl.bindTexture(en.target, null); en.textureUnit = -1; @@ -99,9 +100,9 @@ export class Texture { dispose() { // XXX: Not sure this actually works ... may have to make each gl current or something - for (let glid in this.textures) { + for (const glid in this.textures) { if (this.textures.hasOwnProperty(glid)) { - let en = this.textures[glid]; + const en = this.textures[glid]; en.gl.deleteTexture(en.texture); } } @@ -110,9 +111,7 @@ export class Texture { } -export interface ImageDrawer { - (context: CanvasRenderingContext2D): void; -} +export type ImageDrawer = (context: CanvasRenderingContext2D) => void; export class FloatDataTexture2D extends Texture { private _w: number; @@ -155,7 +154,7 @@ export class Texture2D extends Texture { get h(): number { return this._h; } constructor(w: number, h: number, minFilter: number, magFilter: number, draw: ImageDrawer) { - let canvas = document.createElement('canvas'); + const canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; draw(canvas.getContext('2d')); @@ -278,11 +277,11 @@ export class TextureRenderer { } draw(gl: WebGLRenderingContext, texture: Texture2D, xFrac: number, yFrac: number, options?: TextureDrawOptions) { - let xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5); - let yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5); - let rotation_CCWRAD = (hasval(options) && hasval(options.rotation_CCWRAD) ? options.rotation_CCWRAD : 0); - let width = (hasval(options) && hasval(options.width) ? options.width : texture.w); - let height = (hasval(options) && hasval(options.height) ? options.height : texture.h); + const xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5); + const yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5); + const rotation_CCWRAD = (hasval(options) && hasval(options.rotation_CCWRAD) ? options.rotation_CCWRAD : 0); + const width = (hasval(options) && hasval(options.width) ? options.width : texture.w); + const height = (hasval(options) && hasval(options.height) ? options.height : texture.h); this.u_XyFrac.setData(gl, nearestPixel(xFrac, this.wViewport, xAnchor, texture.w), nearestPixel(yFrac, this.hViewport, yAnchor, texture.h)); this.u_Anchor.setData(gl, xAnchor, yAnchor); diff --git a/src/webglimpse/timeline/time_axis_painter.ts b/src/webglimpse/timeline/time_axis_painter.ts index fc5776a..915ecdf 100644 --- a/src/webglimpse/timeline/time_axis_painter.ts +++ b/src/webglimpse/timeline/time_axis_painter.ts @@ -30,7 +30,7 @@ import { Color, black } from '../color'; import { TimeAxis1D } from './time_axis'; import { Side, solid_FRAGSHADER } from '../misc'; -import { Painter, yFrac, xFrac } from '../core'; +import { Painter } from '../core'; import { Program, Uniform1f, Uniform2f, UniformColor, Attribute } from '../shader'; import { edgeMarks_VERTSHADER } from '../plot/edge_axis_painter'; import { newDynamicBuffer } from '../buffer'; @@ -38,7 +38,7 @@ import { Cache } from '../util/cache'; import { TextTexture2D, newTextTextureCache } from '../text'; import { TextureRenderer, TextureDrawOptions } from '../texture'; import { BoundsUnmodifiable } from '../bounds'; -import { ensureCapacityFloat32, GL, log10, order, hasval, parseTime_PMILLIS, clamp } from '../util/util'; +import { ensureCapacityFloat32, GL, hasval, parseTime_PMILLIS, clamp } from '../util/util'; import { minutesToMillis, millisToDays, hoursToMillis, daysToMillis, millisToHours, secondsToMillis } from '../time'; import { Axis1D, getTickInterval, getTickCount, getTickPositions } from '../plot/axis'; import * as momentNs from 'moment'; @@ -78,40 +78,42 @@ export interface TimeAxisPainterOptions { export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displayTimeZone: string, tickTimeZone: string, options?: TimeAxisPainterOptions): Painter { - let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); - let font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); - let textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black); - let tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black); - let tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6); - let labelAlign = (hasval(options) && hasval(options.labelAlign) ? options.labelAlign : 0.5); - let referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined); - let isFuturePositive = (hasval(options) && hasval(options.isFuturePositive) ? options.isFuturePositive : true); - let timeAxisFormat = (hasval(options) && hasval(options.timeAxisFormat) ? options.timeAxisFormat : undefined); - - let marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER); - let marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin'); - let marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize'); - let marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize'); - let marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize'); - let marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color'); - let marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord'); + const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); + const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); + const textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black); + const tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black); + const tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6); + const labelAlign = (hasval(options) && hasval(options.labelAlign) ? options.labelAlign : 0.5); + const referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined); + const isFuturePositive = (hasval(options) && hasval(options.isFuturePositive) ? options.isFuturePositive : true); + const timeAxisFormat = (hasval(options) && hasval(options.timeAxisFormat) ? options.timeAxisFormat : undefined); + + const marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER); + const marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin'); + const marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize'); + const marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize'); + const marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize'); + const marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color'); + const marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord'); let markCoords = new Float32Array(0); - let markCoordsBuffer = newDynamicBuffer(); + const markCoordsBuffer = newDynamicBuffer(); - let textTextures = >newTextTextureCache(font, textColor); - let textureRenderer = new TextureRenderer(); - let hTickLabels = textTextures.value('-0123456789:.').h; - let isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT); + const textTextures = >newTextTextureCache(font, textColor); + const textureRenderer = new TextureRenderer(); + const hTickLabels = textTextures.value('-0123456789:.').h; + const isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let sizePixels = isVerticalAxis ? viewport.h : viewport.w; - if (sizePixels === 0) return; + const sizePixels = isVerticalAxis ? viewport.h : viewport.w; + if (sizePixels === 0) { + return; + } - let tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, sizePixels, tickSpacing, tickTimeZone, referenceDate_PMILLIS); - let tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS); - let tickCount = tickTimes_PMILLIS.length; + const tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, sizePixels, tickSpacing, tickTimeZone, referenceDate_PMILLIS); + const tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS); + const tickCount = tickTimes_PMILLIS.length; // Tick marks @@ -126,7 +128,7 @@ export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displa markCoords = ensureCapacityFloat32(markCoords, 4 * tickCount); for (let n = 0; n < tickCount; n++) { - let v = timeAxis.vAtTime(tickTimes_PMILLIS[n]); + const v = timeAxis.vAtTime(tickTimes_PMILLIS[n]); markCoords[(4 * n + 0)] = v; markCoords[(4 * n + 1)] = 0; markCoords[(4 * n + 2)] = v; @@ -149,25 +151,27 @@ export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displa // Tick labels // - let ticks: TickDisplayData = getTickDisplayData(tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive, timeAxisFormat); + const ticks: TickDisplayData = getTickDisplayData(tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive, timeAxisFormat); textTextures.resetTouches(); textureRenderer.begin(gl, viewport); for (let n = 0; n < tickCount; n++) { - let tickTime_PMILLIS = tickTimes_PMILLIS[n]; - let tFrac = timeAxis.tFrac(tickTime_PMILLIS); - if (tFrac < 0 || tFrac >= 1) continue; + const tickTime_PMILLIS = tickTimes_PMILLIS[n]; + const tFrac = timeAxis.tFrac(tickTime_PMILLIS); + if (tFrac < 0 || tFrac >= 1) { + continue; + } - let tickLabel: string = ticks.tickFormat(tickTime_PMILLIS); - let textTexture = textTextures.value(tickLabel); + const tickLabel: string = ticks.tickFormat(tickTime_PMILLIS); + const textTexture = textTextures.value(tickLabel); let xFrac: number; let yFrac: number; if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { - let yAnchor = textTexture.yAnchor(0.43); - let j0 = (tFrac * viewport.h) - yAnchor * textTexture.h; - let j = clamp(0, viewport.h - textTexture.h, j0); + const yAnchor = textTexture.yAnchor(0.43); + const j0 = (tFrac * viewport.h) - yAnchor * textTexture.h; + const j = clamp(0, viewport.h - textTexture.h, j0); yFrac = j / viewport.h; if (labelSide === Side.LEFT) { @@ -178,9 +182,9 @@ export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displa } } else { - let xAnchor = 0.45; - let i0 = (tFrac * viewport.w) - xAnchor * (textTexture.w); - let i = clamp(0, viewport.w - textTexture.w, i0); + const xAnchor = 0.45; + const i0 = (tFrac * viewport.w) - xAnchor * (textTexture.w); + const i = clamp(0, viewport.w - textTexture.w, i0); xFrac = i / viewport.w; if (labelSide === Side.BOTTOM) { @@ -198,24 +202,26 @@ export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displa // if (ticks.timeStructFactory) { - let timeStructs = createTimeStructs(timeAxis, ticks.timeStructFactory, tickTimeZone, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign); + const timeStructs = createTimeStructs(timeAxis, ticks.timeStructFactory, tickTimeZone, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign); for (let n = 0; n < timeStructs.length; n++) { - let timeStruct = timeStructs[n]; - let text = ticks.prefixFormat(timeStruct); - let textTexture = textTextures.value(text); - - let halfTextFrac = 0.5 * textTexture.w / viewport.w; - let minFrac = timeAxis.tFrac(timeStruct.start_PMILLIS) - halfTextFrac; - let maxFrac = timeAxis.tFrac(timeStruct.end_PMILLIS) + halfTextFrac; - let tFrac = clamp(minFrac, maxFrac, timeAxis.tFrac(timeStruct.textCenter_PMILLIS)); - if (tFrac - halfTextFrac < 0 || tFrac + halfTextFrac > 1) continue; + const timeStruct = timeStructs[n]; + const text = ticks.prefixFormat(timeStruct); + const textTexture = textTextures.value(text); + + const halfTextFrac = 0.5 * textTexture.w / viewport.w; + const minFrac = timeAxis.tFrac(timeStruct.start_PMILLIS) - halfTextFrac; + const maxFrac = timeAxis.tFrac(timeStruct.end_PMILLIS) + halfTextFrac; + const tFrac = clamp(minFrac, maxFrac, timeAxis.tFrac(timeStruct.textCenter_PMILLIS)); + if (tFrac - halfTextFrac < 0 || tFrac + halfTextFrac > 1) { + continue; + } let xFrac: number; let yFrac: number; let textOpts: TextureDrawOptions; if (labelSide === Side.LEFT || labelSide === Side.RIGHT) { // Using hTickLabels here works out about right, even though the tick-label text is horizontal - let xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w; + const xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w; xFrac = (labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0); yFrac = tFrac; textOpts = { @@ -225,7 +231,7 @@ export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displa }; } else { - let yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; + const yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h; yFrac = (labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0); xFrac = tFrac; textOpts = { @@ -244,7 +250,7 @@ export function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displa textureRenderer.end(gl); textTextures.retainTouched(); - } + }; } function getTickDisplayData(tickInterval_MILLIS: number, referenceDate_PMILLIS: number, displayTimeZone: string, isFuturePositive: boolean, timeAxisFormat: TimeAxisFormatOptions): TickDisplayData { @@ -260,17 +266,16 @@ function getTickDisplayDataRelative(tickInterval_MILLIS: number, referenceDate_P let tickFormat: TickFormat = null; let prefixFormat: PrefixFormat = null; let timeStructFactory: TimeStructFactory = null; - if (tickInterval_MILLIS <= minutesToMillis(1)) { - let tickFormat: TickFormat = function (tickTime_PMILLIS: number): string { - let elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS); - let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); - let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); - let elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; - let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); - let elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60; + tickFormat = function (tickTime_PMILLIS: number): string { + const elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS); + const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + const elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; + const elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); + const elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60; let elapsedTime_MIN_WHOLE = Math.floor(elapsedTime_MIN); - let elapsedTime_SEC = (elapsedTime_MIN - elapsedTime_MIN_WHOLE) * 60; + const elapsedTime_SEC = (elapsedTime_MIN - elapsedTime_MIN_WHOLE) * 60; // use round() here instead of floor() because we always expect ticks to be on even second // boundaries but rounding error will cause us to be somewhat unpredictably above or below // the nearest even second boundary @@ -284,37 +289,37 @@ function getTickDisplayDataRelative(tickInterval_MILLIS: number, referenceDate_P elapsedTime_MIN_WHOLE = 0; } - let min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; - let sec: string = elapsedTime_SEC_WHOLE < 10 ? '0' + elapsedTime_SEC_WHOLE : '' + elapsedTime_SEC_WHOLE; + const min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; + const sec: string = elapsedTime_SEC_WHOLE < 10 ? '0' + elapsedTime_SEC_WHOLE : '' + elapsedTime_SEC_WHOLE; return min + ':' + sec; }; - let prefixFormat: PrefixFormat = function (timeStruct: TimeStruct): string { - let center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS; + prefixFormat = function (timeStruct: TimeStruct): string { + const center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS; let elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS; - let negative = (elapsedTime_MILLIS < 0); - let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + const negative = (elapsedTime_MILLIS < 0); + const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : ''; elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); - let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); - let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); - let elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; - let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); + const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + const elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; + const elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); return 'Day ' + signString + elapsedTime_DAYS_WHOLE + ' Hour ' + signString + elapsedTime_HOURS_WHOLE; }; - let timeStructFactory = function (): TimeStruct { return new TimeStruct() }; + timeStructFactory = function (): TimeStruct { return new TimeStruct(); }; } else if (tickInterval_MILLIS <= hoursToMillis(12)) { - let tickFormat: TickFormat = function (tickTime_PMILLIS: number): string { - let elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS); - let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); - let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); - let elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; + tickFormat = function (tickTime_PMILLIS: number): string { + const elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS); + const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + const elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24; let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); - let elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60; + const elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60; // use round() here instead of floor() because we always expect ticks to be on even minute // boundaries but rounding error will cause us to be somewhat unpredictably above or below // the nearest even minute boundary @@ -328,31 +333,31 @@ function getTickDisplayDataRelative(tickInterval_MILLIS: number, referenceDate_P elapsedTime_HOURS_WHOLE = 0; } - let hour: string = elapsedTime_HOURS_WHOLE < 10 ? '0' + elapsedTime_HOURS_WHOLE : '' + elapsedTime_HOURS_WHOLE; - let min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; + const hour: string = elapsedTime_HOURS_WHOLE < 10 ? '0' + elapsedTime_HOURS_WHOLE : '' + elapsedTime_HOURS_WHOLE; + const min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE; return hour + ':' + min; }; - let prefixFormat: PrefixFormat = function (timeStruct: TimeStruct): string { - let center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS; + prefixFormat = function (timeStruct: TimeStruct): string { + const center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS; let elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS; - let negative = (elapsedTime_MILLIS < 0); - let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + const negative = (elapsedTime_MILLIS < 0); + const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : ''; elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); - let elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS)); + const elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS)); return 'Day ' + signString + elapsedTime_DAYS; }; - let timeStructFactory = function (): TimeStruct { return new TimeStruct() }; + timeStructFactory = function (): TimeStruct { return new TimeStruct(); }; } else { - let tickFormat: TickFormat = function (tickTime_PMILLIS: number): string { + tickFormat = function (tickTime_PMILLIS: number): string { let elapsedTime_MILLIS = tickTime_PMILLIS - referenceDate_PMILLIS; - let negative = (elapsedTime_MILLIS < 0); - let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + const negative = (elapsedTime_MILLIS < 0); + const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : ''; elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); - let elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS)); + const elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS)); return elapsedTime_DAYS === 0 ? '' + elapsedTime_DAYS : signString + elapsedTime_DAYS; }; } @@ -365,39 +370,39 @@ function getTickDisplayDataAbsolute(tickInterval_MILLIS: number, displayTimeZone let tickFormat: TickFormat = null; let prefixFormat: PrefixFormat = null; let timeStructFactory: TimeStructFactory = null; - let defaultTickFormat = function (format: string): TickFormat { return function (tickTime_PMILLIS: number): string { return moment(tickTime_PMILLIS).zone(displayTimeZone).format(format) } }; - let defaultPrefixFormat = function (format: string): PrefixFormat { return function (timeStruct: TimeStruct): string { return moment(timeStruct.textCenter_PMILLIS).zone(displayTimeZone).format(format) } }; + const defaultTickFormat = function (format: string): TickFormat { return function (tickTime_PMILLIS: number): string { return moment(tickTime_PMILLIS).zone(displayTimeZone).format(format); }; }; + const defaultPrefixFormat = function (format: string): PrefixFormat { return function (timeStruct: TimeStruct): string { return moment(timeStruct.textCenter_PMILLIS).zone(displayTimeZone).format(format); }; }; if (tickInterval_MILLIS <= minutesToMillis(1)) { - let formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00'); - let hour = (hasval(timeAxisFormat) && hasval(timeAxisFormat.hour) ? timeAxisFormat.hour : formatOptions); - let tickFormat = defaultTickFormat((hasval(hour.tickFormat) && hour.tickFormat !== '' ? hour.tickFormat : formatOptions.tickFormat)); - let prefixFormat = defaultPrefixFormat((hasval(hour.prefixFormat) && hour.prefixFormat !== '' ? hour.prefixFormat : formatOptions.prefixFormat)); - let timeStructFactory = function (): TimeStruct { return new HourStruct() }; + const formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00'); + const hour = (hasval(timeAxisFormat) && hasval(timeAxisFormat.hour) ? timeAxisFormat.hour : formatOptions); + tickFormat = defaultTickFormat((hasval(hour.tickFormat) && hour.tickFormat !== '' ? hour.tickFormat : formatOptions.tickFormat)); + prefixFormat = defaultPrefixFormat((hasval(hour.prefixFormat) && hour.prefixFormat !== '' ? hour.prefixFormat : formatOptions.prefixFormat)); + timeStructFactory = function (): TimeStruct { return new HourStruct(); }; } else if (tickInterval_MILLIS <= hoursToMillis(12)) { - let formatOptions = new FormatOptions('HH:mm', 'D MMM YYYY'); - let day = (hasval(timeAxisFormat) && hasval(timeAxisFormat.day) ? timeAxisFormat.day : formatOptions); - let tickFormat = defaultTickFormat((hasval(day.tickFormat) && day.tickFormat !== '' ? day.tickFormat : formatOptions.tickFormat)); - let prefixFormat = defaultPrefixFormat((hasval(day.prefixFormat) && day.prefixFormat !== '' ? day.prefixFormat : formatOptions.prefixFormat)); - let timeStructFactory = function (): TimeStruct { return new DayStruct() }; + const formatOptions = new FormatOptions('HH:mm', 'D MMM YYYY'); + const day = (hasval(timeAxisFormat) && hasval(timeAxisFormat.day) ? timeAxisFormat.day : formatOptions); + tickFormat = defaultTickFormat((hasval(day.tickFormat) && day.tickFormat !== '' ? day.tickFormat : formatOptions.tickFormat)); + prefixFormat = defaultPrefixFormat((hasval(day.prefixFormat) && day.prefixFormat !== '' ? day.prefixFormat : formatOptions.prefixFormat)); + timeStructFactory = function (): TimeStruct { return new DayStruct(); }; } else if (tickInterval_MILLIS <= daysToMillis(10)) { - let formatOptions = new FormatOptions('D', 'MMM YYYY'); - let month = (hasval(timeAxisFormat) && hasval(timeAxisFormat.month) ? timeAxisFormat.month : formatOptions); - let tickFormat = defaultTickFormat((hasval(month.tickFormat) && month.tickFormat !== '' ? month.tickFormat : formatOptions.tickFormat)); - let prefixFormat = defaultPrefixFormat((hasval(month.prefixFormat) && month.prefixFormat !== '' ? month.prefixFormat : formatOptions.prefixFormat)); - let timeStructFactory = function (): TimeStruct { return new MonthStruct() }; + const formatOptions = new FormatOptions('D', 'MMM YYYY'); + const month = (hasval(timeAxisFormat) && hasval(timeAxisFormat.month) ? timeAxisFormat.month : formatOptions); + tickFormat = defaultTickFormat((hasval(month.tickFormat) && month.tickFormat !== '' ? month.tickFormat : formatOptions.tickFormat)); + prefixFormat = defaultPrefixFormat((hasval(month.prefixFormat) && month.prefixFormat !== '' ? month.prefixFormat : formatOptions.prefixFormat)); + timeStructFactory = function (): TimeStruct { return new MonthStruct(); }; } else if (tickInterval_MILLIS <= daysToMillis(60)) { - let formatOptions = new FormatOptions('MMM', 'YYYY'); - let year = (hasval(timeAxisFormat) && hasval(timeAxisFormat.year) ? timeAxisFormat.year : formatOptions); - let tickFormat = defaultTickFormat((hasval(year.tickFormat) && year.tickFormat !== '' ? year.tickFormat : formatOptions.tickFormat)); - let prefixFormat = defaultPrefixFormat((hasval(year.prefixFormat) && year.prefixFormat !== '' ? year.prefixFormat : formatOptions.prefixFormat)); - let timeStructFactory = function (): TimeStruct { return new YearStruct() }; + const formatOptions = new FormatOptions('MMM', 'YYYY'); + const year = (hasval(timeAxisFormat) && hasval(timeAxisFormat.year) ? timeAxisFormat.year : formatOptions); + tickFormat = defaultTickFormat((hasval(year.tickFormat) && year.tickFormat !== '' ? year.tickFormat : formatOptions.tickFormat)); + prefixFormat = defaultPrefixFormat((hasval(year.prefixFormat) && year.prefixFormat !== '' ? year.prefixFormat : formatOptions.prefixFormat)); + timeStructFactory = function (): TimeStruct { return new YearStruct(); }; } else { - let tickFormat = defaultTickFormat('YYYY'); + tickFormat = defaultTickFormat('YYYY'); } return { prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory: timeStructFactory }; @@ -409,17 +414,11 @@ interface TickDisplayData { timeStructFactory: TimeStructFactory; } -interface PrefixFormat { - (timeStruct: TimeStruct): string; -} +type PrefixFormat = (timeStruct: TimeStruct) => string; -interface TickFormat { - (tickTime_PMILLIS: number): string; -} +type TickFormat = (tickTime_PMILLIS: number) => string; -interface TimeStructFactory { - (): TimeStruct; -} +type TimeStructFactory = () => TimeStruct; class TimeStruct { public start_PMILLIS: number; @@ -438,7 +437,7 @@ class TimeStruct { class YearStruct extends TimeStruct { setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { - let m = moment(time_PMILLIS).zone(timeZone); + const m = moment(time_PMILLIS).zone(timeZone); m.month(0); m.date(0); m.hours(0); @@ -455,7 +454,7 @@ class YearStruct extends TimeStruct { class MonthStruct extends TimeStruct { setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { - let m = moment(time_PMILLIS).zone(timeZone); + const m = moment(time_PMILLIS).zone(timeZone); m.date(0); m.hours(0); m.minutes(0); @@ -471,7 +470,7 @@ class MonthStruct extends TimeStruct { class DayStruct extends TimeStruct { setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { - let m = moment(time_PMILLIS).zone(timeZone); + const m = moment(time_PMILLIS).zone(timeZone); m.hours(0); m.minutes(0); m.seconds(0); @@ -486,7 +485,7 @@ class DayStruct extends TimeStruct { class HourStruct extends TimeStruct { setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { - let m = moment(time_PMILLIS).zone(timeZone); + const m = moment(time_PMILLIS).zone(timeZone); m.minutes(0); m.seconds(0); return m; @@ -499,7 +498,7 @@ class HourStruct extends TimeStruct { function createTimeStructs(timeAxis: TimeAxis1D, factory: TimeStructFactory, timeZone: string, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { if (hasval(referenceDate_PMILLIS)) { - let tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS); + const tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS); if (tickInterval_MILLIS <= minutesToMillis(1)) { return createTimeStructsRelativeHours(timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign); @@ -516,10 +515,10 @@ function createTimeStructs(timeAxis: TimeAxis1D, factory: TimeStructFactory, tim function createTimeStructsRelativeHours(timeAxis: TimeAxis1D, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { - let dMin_PMILLIS = timeAxis.tMin_PMILLIS; - let dMax_PMILLIS = timeAxis.tMax_PMILLIS; + const dMin_PMILLIS = timeAxis.tMin_PMILLIS; + const dMax_PMILLIS = timeAxis.tMax_PMILLIS; - let timeStructs: TimeStruct[] = []; + const timeStructs: TimeStruct[] = []; let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; let previous_HOURS = null; @@ -528,17 +527,19 @@ function createTimeStructsRelativeHours(timeAxis: TimeAxis1D, referenceDate_PMIL for (let n = 0; n < tickTimes_PMILLIS.length; n++) { let elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS; - let negative = (elapsedTime_MILLIS < 0); - let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + const negative = (elapsedTime_MILLIS < 0); + const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : ''; elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); - let elapsedTime_HOURS = millisToHours(elapsedTime_MILLIS); - let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); + const elapsedTime_HOURS = millisToHours(elapsedTime_MILLIS); + const elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS); - if (hasval(previous_HOURS) && elapsedTime_HOURS_WHOLE === previous_HOURS && negative === previous_SIGN) continue; + if (hasval(previous_HOURS) && elapsedTime_HOURS_WHOLE === previous_HOURS && negative === previous_SIGN) { + continue; + } previous_HOURS = elapsedTime_HOURS_WHOLE; previous_SIGN = negative; - let timeStruct = new TimeStruct(); + const timeStruct = new TimeStruct(); if (negative) { timeStruct.end_PMILLIS = hoursToMillis(-elapsedTime_HOURS_WHOLE) + referenceDate_PMILLIS; @@ -564,10 +565,10 @@ function createTimeStructsRelativeHours(timeAxis: TimeAxis1D, referenceDate_PMIL function createTimeStructsRelativeDays(timeAxis: TimeAxis1D, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { - let dMin_PMILLIS = timeAxis.tMin_PMILLIS; - let dMax_PMILLIS = timeAxis.tMax_PMILLIS; + const dMin_PMILLIS = timeAxis.tMin_PMILLIS; + const dMax_PMILLIS = timeAxis.tMax_PMILLIS; - let timeStructs: TimeStruct[] = []; + const timeStructs: TimeStruct[] = []; let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; let previous_DAYS = null; @@ -576,17 +577,19 @@ function createTimeStructsRelativeDays(timeAxis: TimeAxis1D, referenceDate_PMILL for (let n = 0; n < tickTimes_PMILLIS.length; n++) { let elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS; - let negative = (elapsedTime_MILLIS < 0); - let signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? "-" : ""; + const negative = (elapsedTime_MILLIS < 0); + const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : ''; elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS); - let elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); - let elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); + const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS); + const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS); - if (hasval(previous_DAYS) && elapsedTime_DAYS_WHOLE === previous_DAYS && negative === previous_SIGN) continue; + if (hasval(previous_DAYS) && elapsedTime_DAYS_WHOLE === previous_DAYS && negative === previous_SIGN) { + continue; + } previous_DAYS = elapsedTime_DAYS_WHOLE; previous_SIGN = negative; - let timeStruct = new TimeStruct(); + const timeStruct = new TimeStruct(); if (negative) { timeStruct.end_PMILLIS = daysToMillis(-elapsedTime_DAYS_WHOLE) + referenceDate_PMILLIS; @@ -611,22 +614,24 @@ function createTimeStructsRelativeDays(timeAxis: TimeAxis1D, referenceDate_PMILL } function createTimeStructsAbsolute(timeAxis: TimeAxis1D, factory: TimeStructFactory, timeZone: string, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] { - let dMin_PMILLIS = timeAxis.tMin_PMILLIS; - let dMax_PMILLIS = timeAxis.tMax_PMILLIS; + const dMin_PMILLIS = timeAxis.tMin_PMILLIS; + const dMax_PMILLIS = timeAxis.tMax_PMILLIS; - let timeStructs: TimeStruct[] = []; + const timeStructs: TimeStruct[] = []; let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY; let previous_PMILLIS: number = null; for (let n = 0; n < tickTimes_PMILLIS.length; n++) { - let tickTime_PMILLIS = tickTimes_PMILLIS[n]; - let timeStruct = factory(); - let m = timeStruct.setTime(tickTime_PMILLIS, timeZone); - let start_PMILLIS = m.valueOf(); + const tickTime_PMILLIS = tickTimes_PMILLIS[n]; + const timeStruct = factory(); + const m = timeStruct.setTime(tickTime_PMILLIS, timeZone); + const start_PMILLIS = m.valueOf(); // XXX: Floating-point comparison can be unintuitive - if (hasval(previous_PMILLIS) && start_PMILLIS === previous_PMILLIS) continue; + if (hasval(previous_PMILLIS) && start_PMILLIS === previous_PMILLIS) { + continue; + } previous_PMILLIS = start_PMILLIS; timeStruct.start_PMILLIS = start_PMILLIS; @@ -647,11 +652,11 @@ function createTimeStructsAbsolute(timeAxis: TimeAxis1D, factory: TimeStructFact function setTimeStructTextCenter(timeStructs: TimeStruct[], labelAlign: number, maxViewDuration_MILLIS: number) { for (let n = 0; n < timeStructs.length; n++) { - let timeStruct = timeStructs[n]; - let duration_MILLIS = timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS; - let midpoint_PMILLIS = timeStruct.viewStart_PMILLIS + labelAlign * duration_MILLIS; - let edge_PMILLIS = (timeStruct.viewStart_PMILLIS === timeStruct.start_PMILLIS ? timeStruct.viewEnd_PMILLIS : timeStruct.viewStart_PMILLIS); - let edginess = 1 - clamp(0, 1, duration_MILLIS / maxViewDuration_MILLIS); + const timeStruct = timeStructs[n]; + const duration_MILLIS = timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS; + const midpoint_PMILLIS = timeStruct.viewStart_PMILLIS + labelAlign * duration_MILLIS; + const edge_PMILLIS = (timeStruct.viewStart_PMILLIS === timeStruct.start_PMILLIS ? timeStruct.viewEnd_PMILLIS : timeStruct.viewStart_PMILLIS); + const edginess = 1 - clamp(0, 1, duration_MILLIS / maxViewDuration_MILLIS); timeStruct.textCenter_PMILLIS = midpoint_PMILLIS + edginess * (edge_PMILLIS - midpoint_PMILLIS); } } @@ -667,9 +672,9 @@ export function getTickTimes_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, t function getTickTimesRelative_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, referenceDate_PMILLIS: number): number[] { - let dMin_PMILLIS = timeAxis.tMin_PMILLIS; - let dMax_PMILLIS = timeAxis.tMax_PMILLIS; - let approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels; + const dMin_PMILLIS = timeAxis.tMin_PMILLIS; + const dMax_PMILLIS = timeAxis.tMax_PMILLIS; + const approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels; if (approxTickInterval_MILLIS < daysToMillis(1)) { return getHourTickTimesRelative_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, referenceDate_PMILLIS); @@ -680,7 +685,7 @@ function getTickTimesRelative_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, } function getHourTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, referenceDate_PMILLIS: number): number[] { - let tickTimes = getHourTickTimes_PMILLIS(dMin_PMILLIS - referenceDate_PMILLIS, dMax_PMILLIS - referenceDate_PMILLIS, approxTickInterval_MILLIS, 0); + const tickTimes = getHourTickTimes_PMILLIS(dMin_PMILLIS - referenceDate_PMILLIS, dMax_PMILLIS - referenceDate_PMILLIS, approxTickInterval_MILLIS, 0); for (let n = 0; n < tickTimes.length; n++) { tickTimes[n] = tickTimes[n] + referenceDate_PMILLIS; @@ -690,13 +695,13 @@ function getHourTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: nu } function getDayTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, sizePixels: number, tickSpacing: number, referenceDate_PMILLIS: number): number[] { - let axis = new Axis1D(millisToDays(dMin_PMILLIS - referenceDate_PMILLIS), millisToDays(dMax_PMILLIS - referenceDate_PMILLIS)); - let approxNumTicks = sizePixels / tickSpacing; - let tickInterval = getTickInterval(axis, approxNumTicks); - let tickCount = getTickCount(axis, tickInterval); - let tickPositions = new Float32Array(tickCount); + const axis = new Axis1D(millisToDays(dMin_PMILLIS - referenceDate_PMILLIS), millisToDays(dMax_PMILLIS - referenceDate_PMILLIS)); + const approxNumTicks = sizePixels / tickSpacing; + const tickInterval = getTickInterval(axis, approxNumTicks); + const tickCount = getTickCount(axis, tickInterval); + const tickPositions = new Float32Array(tickCount); getTickPositions(axis, tickInterval, tickCount, tickPositions); - let tickTimes_PMILLIS = []; + const tickTimes_PMILLIS = []; for (let n = 0; n < tickCount; n++) { tickTimes_PMILLIS.push(daysToMillis(tickPositions[n]) + referenceDate_PMILLIS); } @@ -704,14 +709,14 @@ function getDayTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: num } function getTickTimesAbsolute_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, timeZone: string): number[] { - let dMin_PMILLIS = timeAxis.tMin_PMILLIS; - let dMax_PMILLIS = timeAxis.tMax_PMILLIS; + const dMin_PMILLIS = timeAxis.tMin_PMILLIS; + const dMax_PMILLIS = timeAxis.tMax_PMILLIS; // NOTE: moment.js reports time zone offset reversed from Java Calendar, thus the negative sign - let mMin = moment(dMin_PMILLIS).zone(timeZone); - let zoneOffset_MILLIS = -minutesToMillis(mMin.zone()); + const mMin = moment(dMin_PMILLIS).zone(timeZone); + const zoneOffset_MILLIS = -minutesToMillis(mMin.zone()); - let approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels; + const approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels; if (approxTickInterval_MILLIS > daysToMillis(60)) { return getYearTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone); @@ -729,19 +734,19 @@ function getTickTimesAbsolute_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, function getYearTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] { - let m = moment(dMin_PMILLIS).zone(timeZone); + const m = moment(dMin_PMILLIS).zone(timeZone); - let currentYear = m.year(); - let daysPerYear = 365.25; // assume 365.25 days in every year as a heuristic - let approxTickInterval_YEARS = millisToDays(approxTickInterval_MILLIS) / daysPerYear; + const currentYear = m.year(); + const daysPerYear = 365.25; // assume 365.25 days in every year as a heuristic + const approxTickInterval_YEARS = millisToDays(approxTickInterval_MILLIS) / daysPerYear; - let yearOrderFactor = 6.0; - let stepYears = getYearStep(approxTickInterval_YEARS * yearOrderFactor); - let startYear = getRoundedYear(currentYear, stepYears); + const yearOrderFactor = 6.0; + const stepYears = getYearStep(approxTickInterval_YEARS * yearOrderFactor); + const startYear = getRoundedYear(currentYear, stepYears); m.year(startYear).month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); - let tickTimes_PMILLIS = []; + const tickTimes_PMILLIS = []; while (m.valueOf() <= dMax_PMILLIS) { tickTimes_PMILLIS.push(m.valueOf()); m.add('years', stepYears); @@ -751,23 +756,25 @@ function getYearTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, ap function getYearStep(spanYears: number): number { - let log10 = Math.log(spanYears) / Math.LN10; - let order = Math.floor(log10); - if ((log10 - order) > (1.0 - 1e-12)) order++; + const log10Span = Math.log(spanYears) / Math.LN10; + let orderSpan = Math.floor(log10Span); + if ((log10Span - orderSpan) > (1.0 - 1e-12)) { + orderSpan++; + } - return Math.max(1, Math.pow(10, order)); + return Math.max(1, Math.pow(10, orderSpan)); } function getRoundedYear(currentYear: number, yearStep: number): number { - let numSteps = Math.floor(currentYear / yearStep); + const numSteps = Math.floor(currentYear / yearStep); return numSteps * yearStep; } function getMonthTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] { - let m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); - let tickTimes_PMILLIS = []; + const m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); + const tickTimes_PMILLIS = []; while (m.valueOf() <= dMax_PMILLIS) { tickTimes_PMILLIS.push(m.valueOf()); m.add('months', 1); @@ -777,27 +784,27 @@ function getMonthTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, a function getDayTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] { - let tickInterval_DAYS = calculateTickInterval_DAYS(approxTickInterval_MILLIS); + const tickInterval_DAYS = calculateTickInterval_DAYS(approxTickInterval_MILLIS); // initialize calendar off start time and reset fields less than month - let m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); + const m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0); - let endTime_PMILLIS = dMax_PMILLIS + daysToMillis(tickInterval_DAYS); + const endTime_PMILLIS = dMax_PMILLIS + daysToMillis(tickInterval_DAYS); let currentMonth = m.month(); - let tickTimes_PMILLIS = []; + const tickTimes_PMILLIS = []; while (m.valueOf() <= endTime_PMILLIS) { // ensure ticks always fall on the first day of the month - let newMonth = m.month(); + const newMonth = m.month(); if (newMonth !== currentMonth) { m.date(1); currentMonth = newMonth; } // prevent display of ticks too close to the end of the month - let maxDom = m.clone().endOf('month').date(); - let dom = m.date(); + const maxDom = m.clone().endOf('month').date(); + const dom = m.date(); if (maxDom - dom + 1 >= tickInterval_DAYS / 2) { tickTimes_PMILLIS.push(m.valueOf()); } @@ -810,13 +817,13 @@ function getDayTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, app function getHourTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, zoneOffset_MILLIS: number): number[] { - let tickInterval_MILLIS = calculateTickInterval_MILLIS(approxTickInterval_MILLIS); + const tickInterval_MILLIS = calculateTickInterval_MILLIS(approxTickInterval_MILLIS); - let ticksSince1970 = Math.floor((dMin_PMILLIS + zoneOffset_MILLIS) / tickInterval_MILLIS); - let firstTick_PMILLIS = (ticksSince1970 * tickInterval_MILLIS) - zoneOffset_MILLIS; - let numTicks = Math.ceil(1 + (dMax_PMILLIS - firstTick_PMILLIS) / tickInterval_MILLIS); + const ticksSince1970 = Math.floor((dMin_PMILLIS + zoneOffset_MILLIS) / tickInterval_MILLIS); + const firstTick_PMILLIS = (ticksSince1970 * tickInterval_MILLIS) - zoneOffset_MILLIS; + const numTicks = Math.ceil(1 + (dMax_PMILLIS - firstTick_PMILLIS) / tickInterval_MILLIS); - let tickTimes_PMILLIS = []; + const tickTimes_PMILLIS = []; for (let n = 0; n < numTicks; n++) { tickTimes_PMILLIS.push(firstTick_PMILLIS + n * tickInterval_MILLIS); } @@ -824,11 +831,11 @@ function getHourTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, ap } -let tickIntervalRungs_DAYS = [2, 3, 4, 5, 8, 10]; +const tickIntervalRungs_DAYS = [2, 3, 4, 5, 8, 10]; function calculateTickInterval_DAYS(approxTickInterval_MILLIS: number) { - let approxTickInterval_DAYS = millisToDays(approxTickInterval_MILLIS); + const approxTickInterval_DAYS = millisToDays(approxTickInterval_MILLIS); for (let n = 0; n < tickIntervalRungs_DAYS.length; n++) { if (approxTickInterval_DAYS <= tickIntervalRungs_DAYS[n]) { return tickIntervalRungs_DAYS[n]; @@ -838,7 +845,7 @@ function calculateTickInterval_DAYS(approxTickInterval_MILLIS: number) { } -let tickIntervalRungs_MILLIS = [secondsToMillis(1), +const tickIntervalRungs_MILLIS = [secondsToMillis(1), secondsToMillis(2), secondsToMillis(5), secondsToMillis(10), diff --git a/src/webglimpse/timeline/time_grid_painter.ts b/src/webglimpse/timeline/time_grid_painter.ts index 0a54213..b7795cf 100644 --- a/src/webglimpse/timeline/time_grid_painter.ts +++ b/src/webglimpse/timeline/time_grid_painter.ts @@ -46,20 +46,20 @@ export interface TimeGridPainterOptions { export function newTimeGridPainter(timeAxis: TimeAxis1D, isVerticalAxis: boolean, timeZone: string, options?: TimeGridPainterOptions): Painter { - let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); - let gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : black); - let referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined); + const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); + const gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : black); + const referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined); - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); let xyFrac = new Float32Array(0); - let xyFracBuffer = newDynamicBuffer(); + const xyFracBuffer = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, (isVerticalAxis ? viewport.h : viewport.w), tickSpacing, timeZone, referenceDate_PMILLIS); - let tickCount = tickTimes_PMILLIS.length; + const tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, (isVerticalAxis ? viewport.h : viewport.w), tickSpacing, timeZone, referenceDate_PMILLIS); + const tickCount = tickTimes_PMILLIS.length; program.use(gl); u_Color.setData(gl, gridColor); @@ -92,7 +92,7 @@ export function newTimeGridPainter(timeAxis: TimeAxis1D, isVerticalAxis: boolean a_XyFrac.disable(gl); program.endUse(gl); - } + }; } diff --git a/src/webglimpse/timeline/timeline_annotation_painter.ts b/src/webglimpse/timeline/timeline_annotation_painter.ts index cdf0069..3bca07a 100644 --- a/src/webglimpse/timeline/timeline_annotation_painter.ts +++ b/src/webglimpse/timeline/timeline_annotation_painter.ts @@ -28,7 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import { TimelineTimeseriesPainterFactory } from './timeline_timeseries_row'; -import { Drawable, Painter, xFrac, yFrac } from '../core'; +import { Drawable, Painter } from '../core'; import { TimeAxis1D } from './time_axis'; import { Axis1D } from '../plot/axis'; import { TimelineModel, TimelineRowModel, TimelineAnnotationModel } from './timeline_model'; @@ -47,16 +47,16 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter { - let textTextures = newTextTextureCache3(); - let textureRenderer = new TextureRenderer(); + const textTextures = newTextTextureCache3(); + const textureRenderer = new TextureRenderer(); - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_Position = new Attribute(program, 'a_XyFrac'); + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_Position = new Attribute(program, 'a_XyFrac'); let xys = new Float32Array(0); xys = ensureCapacityFloat32(xys, 4); - let xysBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -65,26 +65,26 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint textTextures.resetTouches(); - let xFrac: number = 0; - let yFrac: number = 0; + let xFrac = 0; + let yFrac = 0; for (let i = 0; i < rowModel.annotationGuids.length; i++) { - let annotationGuid: string = rowModel.annotationGuids.valueAt(i); - let annotation: TimelineAnnotationModel = model.annotation(annotationGuid); - let annotationStyle: TimelineAnnotationStyleUi = ui.annotationStyle(annotation.styleGuid); + const annotationGuid: string = rowModel.annotationGuids.valueAt(i); + const annotation: TimelineAnnotationModel = model.annotation(annotationGuid); + const annotationStyle: TimelineAnnotationStyleUi = ui.annotationStyle(annotation.styleGuid); - let font = hasval(annotationStyle.font) ? annotationStyle.font : '11px verdana,sans-serif'; - let color = hasval(annotationStyle.color) ? annotationStyle.color : white; + const font = hasval(annotationStyle.font) ? annotationStyle.font : '11px verdana,sans-serif'; + const color = hasval(annotationStyle.color) ? annotationStyle.color : white; - let hTextOffset = hasval(annotationStyle.hTextOffset) ? annotationStyle.hTextOffset : 0; - let vTextOffset = hasval(annotationStyle.vTextOffset) ? annotationStyle.vTextOffset : 0; + const hTextOffset = hasval(annotationStyle.hTextOffset) ? annotationStyle.hTextOffset : 0; + const vTextOffset = hasval(annotationStyle.vTextOffset) ? annotationStyle.vTextOffset : 0; // draw line if (annotationStyle.uiHint === 'horizontal-line' || annotationStyle.uiHint === 'vertical-line') { if (annotationStyle.uiHint === 'horizontal-line') { - let xFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; - let yFrac = dataAxis.vFrac(annotation.y); + xFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; + yFrac = dataAxis.vFrac(annotation.y); xys[0] = 0; xys[1] = yFrac; @@ -92,8 +92,8 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint xys[3] = yFrac; } else if (annotationStyle.uiHint === 'vertical-line') { - let xFrac = timeAxis.tFrac(annotation.time_PMILLIS); - let yFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; + xFrac = timeAxis.tFrac(annotation.time_PMILLIS); + yFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1; xys[0] = xFrac; xys[1] = 0; @@ -113,22 +113,22 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint program.endUse(gl); } else { - let xFrac = timeAxis.tFrac(annotation.time_PMILLIS); - let yFrac = dataAxis.vFrac(annotation.y); + xFrac = timeAxis.tFrac(annotation.time_PMILLIS); + yFrac = dataAxis.vFrac(annotation.y); } textureRenderer.begin(gl, viewport); // draw icons for (let n = 0; n < annotationStyle.numIcons; n++) { - let icon: TimelineAnnotationIcon = annotationStyle.icon(n); + const icon: TimelineAnnotationIcon = annotationStyle.icon(n); - let xFracOffset = xFrac + (hasval(icon.hOffset) ? icon.hOffset : 0) / viewport.w; - let yFracOffset = yFrac + (hasval(icon.vOffset) ? icon.vOffset : 0) / viewport.h; + const xFracOffset = xFrac + (hasval(icon.hOffset) ? icon.hOffset : 0) / viewport.w; + const yFracOffset = yFrac + (hasval(icon.vOffset) ? icon.vOffset : 0) / viewport.h; - let iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); + const iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); if (iconTexture) { - let options = { + const options = { xAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5), yAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5), width: icon.displayWidth, @@ -143,13 +143,13 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint // draw text label if (hasval(annotation.label)) { - let textTexture = textTextures.value(font, color.rgbaString, annotation.label); + const textTexture = textTextures.value(font, color.rgbaString, annotation.label); - let xFracOffset = xFrac + hTextOffset / viewport.w; - let yFracOffset = yFrac + vTextOffset / viewport.h; + const xFracOffset = xFrac + hTextOffset / viewport.w; + const yFracOffset = yFrac + vTextOffset / viewport.h; - let xAnchor = hasval(annotationStyle.hTextAlign) ? annotationStyle.hTextAlign : 0; - let yAnchor = textTexture.yAnchor(hasval(annotationStyle.vTextAlign) ? annotationStyle.vTextAlign : 0.5); + const xAnchor = hasval(annotationStyle.hTextAlign) ? annotationStyle.hTextAlign : 0; + const yAnchor = textTexture.yAnchor(hasval(annotationStyle.vTextAlign) ? annotationStyle.vTextAlign : 0.5); textureRenderer.draw(gl, textTexture, xFracOffset, yFracOffset, { xAnchor: xAnchor, yAnchor: yAnchor }); } diff --git a/src/webglimpse/timeline/timeline_annotation_style.ts b/src/webglimpse/timeline/timeline_annotation_style.ts index 293df15..fbce806 100644 --- a/src/webglimpse/timeline/timeline_annotation_style.ts +++ b/src/webglimpse/timeline/timeline_annotation_style.ts @@ -130,7 +130,7 @@ export class TimelineAnnotationStyleUi { this._vTextAlign = style.vTextAlign; this._align = style.align; this._uiHint = style.uiHint; - this._icons = hasval(style.color) ? style.icons.map((icon) => { return new TimelineAnnotationIconUi(icon); }) : []; + this._icons = hasval(style.color) ? style.icons.map((icon) => new TimelineAnnotationIconUi(icon)) : []; } get numIcons(): number { diff --git a/src/webglimpse/timeline/timeline_cursor_painter.ts b/src/webglimpse/timeline/timeline_cursor_painter.ts index 7234a25..593d150 100644 --- a/src/webglimpse/timeline/timeline_cursor_painter.ts +++ b/src/webglimpse/timeline/timeline_cursor_painter.ts @@ -70,30 +70,32 @@ export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCurs let textColor = (hasval(cursorOptions) && hasval(cursorOptions.textColor) ? cursorOptions.textColor : white); let lineColor = (hasval(cursorOptions) && hasval(cursorOptions.lineColor) ? cursorOptions.lineColor : white); - let font = (hasval(cursorOptions) && hasval(cursorOptions.font) ? cursorOptions.font : options.timelineFont); - let buffer_px = (hasval(cursorOptions) && hasval(cursorOptions.buffer_px) ? cursorOptions.buffer_px : 4); - let textDecimals = (hasval(cursorOptions) && hasval(cursorOptions.textDecimals) ? cursorOptions.textDecimals : 2); - let boxSize_px = (hasval(cursorOptions) && hasval(cursorOptions.boxSize_px) ? cursorOptions.boxSize_px : 8); - let crosshairThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.crosshairThickness_px) ? cursorOptions.boxSize_px : 2); - let boxThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.boxThickness_px) ? cursorOptions.boxSize_px : 2); + const font = (hasval(cursorOptions) && hasval(cursorOptions.font) ? cursorOptions.font : options.timelineFont); + const buffer_px = (hasval(cursorOptions) && hasval(cursorOptions.buffer_px) ? cursorOptions.buffer_px : 4); + const textDecimals = (hasval(cursorOptions) && hasval(cursorOptions.textDecimals) ? cursorOptions.textDecimals : 2); + const boxSize_px = (hasval(cursorOptions) && hasval(cursorOptions.boxSize_px) ? cursorOptions.boxSize_px : 8); + const crosshairThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.crosshairThickness_px) ? cursorOptions.boxSize_px : 2); + const boxThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.boxThickness_px) ? cursorOptions.boxSize_px : 2); - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let a_Position = new Attribute(program, 'a_XyFrac'); + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const u_Color = new UniformColor(program, 'u_Color'); + const a_Position = new Attribute(program, 'a_XyFrac'); let xys = new Float32Array(0); xys = ensureCapacityFloat32(xys, 4); - let xysBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); - let textTextures = newTextTextureCache2(font); - let textureRenderer = new TextureRenderer(); + const textTextures = newTextTextureCache2(font); + const textureRenderer = new TextureRenderer(); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { // only draw a cursor if we are the current hovered row - let hoveredRow: TimelineRowModel = ui.selection.hoveredRow.value; - if (!hasval(hoveredRow) || hoveredRow.rowGuid !== rowModel.rowGuid) return; + const hoveredRow: TimelineRowModel = ui.selection.hoveredRow.value; + if (!hasval(hoveredRow) || hoveredRow.rowGuid !== rowModel.rowGuid) { + return; + } gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); @@ -101,23 +103,25 @@ export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCurs let indexXys = 0; textTextures.resetTouches(); - let time = ui.selection.hoveredTime_PMILLIS.value; - let y = ui.selection.hoveredY.value; + const time = ui.selection.hoveredTime_PMILLIS.value; + const y = ui.selection.hoveredY.value; - if (!hasval(time) || !hasval(y)) return; + if (!hasval(time) || !hasval(y)) { + return; + } - let wLine = crosshairThickness_px / viewport.w; - let hLine = crosshairThickness_px / viewport.h; + const wLine = crosshairThickness_px / viewport.w; + const hLine = crosshairThickness_px / viewport.h; - let wBoxLine = boxThickness_px / viewport.w; - let hBoxLine = boxThickness_px / viewport.h; + const wBoxLine = boxThickness_px / viewport.w; + const hBoxLine = boxThickness_px / viewport.h; - let wBox = boxSize_px / viewport.w; - let hBox = boxSize_px / viewport.h; + const wBox = boxSize_px / viewport.w; + const hBox = boxSize_px / viewport.h; if (hasval(time)) { - let cursorModel = model.cursor(rowModel.cursorGuid); + const cursorModel = model.cursor(rowModel.cursorGuid); if (hasval(cursorModel)) { if (hasval(cursorModel.lineColor)) { @@ -130,22 +134,24 @@ export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCurs textureRenderer.begin(gl, viewport); - let timeseriesCount = cursorModel.labeledTimeseriesGuids.length; + const timeseriesCount = cursorModel.labeledTimeseriesGuids.length; // 36 vertices for crosshairs, 48 vertices per timeseries intersection marker xys = ensureCapacityFloat32(xys, 2 * (36 + timeseriesCount * 48)); for (let i = 0; i < cursorModel.labeledTimeseriesGuids.length; i++) { - let timeseriesGuid = cursorModel.labeledTimeseriesGuids.valueAt(i); - let timeseries = model.timeseries(timeseriesGuid); + const timeseriesGuid = cursorModel.labeledTimeseriesGuids.valueAt(i); + const timeseries = model.timeseries(timeseriesGuid); // if the row doesn't contain the timeseries, don't show cursor intersections - if (!rowModel.timeseriesGuids.hasValue(timeseriesGuid)) continue; + if (!rowModel.timeseriesGuids.hasValue(timeseriesGuid)) { + continue; + } for (let j = 0; j < timeseries.fragmentGuids.length; j++) { - let fragmentGuid: string = timeseries.fragmentGuids.valueAt(j); - let fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid); + const fragmentGuid: string = timeseries.fragmentGuids.valueAt(j); + const fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid); // fragments should not overlap if (fragment.start_PMILLIS < time && fragment.end_PMILLIS > time) { @@ -154,35 +160,35 @@ export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCurs // bars are drawn starting at the point and continuing to the next point, so we don't interpolate them if (timeseries.uiHint === 'bars') { - let index: number = indexAtOrBefore(fragment.times_PMILLIS, time); + const index: number = indexAtOrBefore(fragment.times_PMILLIS, time); value = fragment.data[index]; } else { - let index0: number = indexAtOrBefore(fragment.times_PMILLIS, time); - let index1: number = indexAtOrAfter(fragment.times_PMILLIS, time); + const index0: number = indexAtOrBefore(fragment.times_PMILLIS, time); + const index1: number = indexAtOrAfter(fragment.times_PMILLIS, time); - let value0 = fragment.data[index0]; - let time0 = fragment.times_PMILLIS[index0]; + const value0 = fragment.data[index0]; + const time0 = fragment.times_PMILLIS[index0]; - let value1 = fragment.data[index1]; - let time1 = fragment.times_PMILLIS[index1]; + const value1 = fragment.data[index1]; + const time1 = fragment.times_PMILLIS[index1]; - let diff = time1 - time0; - let diff0 = (time - time0) / diff; - let diff1 = 1 - diff0; + const diff = time1 - time0; + const diff0 = (time - time0) / diff; + const diff1 = 1 - diff0; value = value0 * diff1 + value1 * diff0; } - let textTexture = textTextures.value(textColor.rgbaString, value.toFixed(textDecimals)); + const textTexture = textTextures.value(textColor.rgbaString, value.toFixed(textDecimals)); - let valueFracY = dataAxis.vFrac(value); - let valueFracX = timeAxis.tFrac(time); + const valueFracY = dataAxis.vFrac(value); + const valueFracX = timeAxis.tFrac(time); - let boxLeft = valueFracX - wBox / 2; - let boxRight = valueFracX + wBox / 2; - let boxTop = valueFracY + hBox / 2; - let boxBottom = valueFracY - hBox / 2; + const boxLeft = valueFracX - wBox / 2; + const boxRight = valueFracX + wBox / 2; + const boxTop = valueFracY + hBox / 2; + const boxBottom = valueFracY - hBox / 2; // draw box at value location @@ -204,17 +210,17 @@ export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCurs } if (hasval(cursorModel.showCursorText) ? cursorModel.showCursorText : true) { - let textTexture = textTextures.value(textColor.rgbaString, y.toFixed(textDecimals)); + const textTexture = textTextures.value(textColor.rgbaString, y.toFixed(textDecimals)); textureRenderer.draw(gl, textTexture, 1, dataAxis.vFrac(y) + buffer_px / viewport.h, { xAnchor: 1, yAnchor: 0 }); } textureRenderer.end(gl); textTextures.retainTouched(); - let xLeft = 0; - let xRight = 1; - let yMid = dataAxis.vFrac(y); - let xMid = timeAxis.tFrac(time); + const xLeft = 0; + const xRight = 1; + const yMid = dataAxis.vFrac(y); + const xMid = timeAxis.tFrac(time); // draw horizontal line if (hasval(cursorModel.showHorizontalLine) ? cursorModel.showHorizontalLine : true) { @@ -239,6 +245,6 @@ export function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCurs program.endUse(gl); } } - } - } + }; + }; } diff --git a/src/webglimpse/timeline/timeline_event_style.ts b/src/webglimpse/timeline/timeline_event_style.ts index ff62f8c..e57bc45 100644 --- a/src/webglimpse/timeline/timeline_event_style.ts +++ b/src/webglimpse/timeline/timeline_event_style.ts @@ -97,7 +97,7 @@ export class TimelineEventStyleUi { } private _setAttrs(style: TimelineEventStyle) { - this._icons = style.icons.map((icon) => { return new TimelineEventIconUi(icon); }); + this._icons = style.icons.map((icon) => new TimelineEventIconUi(icon)); } get numIcons(): number { diff --git a/src/webglimpse/timeline/timeline_events_row.ts b/src/webglimpse/timeline/timeline_events_row.ts index 041a331..5d65cda 100644 --- a/src/webglimpse/timeline/timeline_events_row.ts +++ b/src/webglimpse/timeline/timeline_events_row.ts @@ -28,7 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import { Color, darker } from '../color'; -import { Drawable, Painter, Pane, PointerEvent, Mask2D, yFrac, xFrac, isLeftMouseDown, Layout } from '../core'; +import { Drawable, Painter, Pane, PointerEvent, Mask2D, isLeftMouseDown, Layout } from '../core'; import { TimeAxis1D } from './time_axis'; import { TimelineLaneArray, TimelineLane, effectiveEdges_PMILLIS } from './timeline_lanes'; import { TimelineUi } from './timeline_ui'; @@ -57,9 +57,7 @@ export interface TimelineEventsPainterOptions { -export interface TimelineEventsPainterFactory { - (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter; -} +export type TimelineEventsPainterFactory = (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) => Painter; @@ -77,42 +75,42 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // Pane Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane { - let rowTopPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowTopPadding) ? eventsRowOpts.rowTopPadding : 6); - let rowBottomPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowBottomPadding) ? eventsRowOpts.rowBottomPadding : 6); - let laneHeight = (hasval(eventsRowOpts) && hasval(eventsRowOpts.laneHeight) ? eventsRowOpts.laneHeight : 33); - let painterFactories = (hasval(eventsRowOpts) && hasval(eventsRowOpts.painterFactories) ? eventsRowOpts.painterFactories : []); - let allowMultipleLanes = (hasval(eventsRowOpts) && hasval(eventsRowOpts.allowMultipleLanes) ? eventsRowOpts.allowMultipleLanes : true); + const rowTopPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowTopPadding) ? eventsRowOpts.rowTopPadding : 6); + const rowBottomPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowBottomPadding) ? eventsRowOpts.rowBottomPadding : 6); + const laneHeight = (hasval(eventsRowOpts) && hasval(eventsRowOpts.laneHeight) ? eventsRowOpts.laneHeight : 33); + const painterFactories = (hasval(eventsRowOpts) && hasval(eventsRowOpts.painterFactories) ? eventsRowOpts.painterFactories : []); + const allowMultipleLanes = (hasval(eventsRowOpts) && hasval(eventsRowOpts.allowMultipleLanes) ? eventsRowOpts.allowMultipleLanes : true); - let timelineFont = options.timelineFont; - let timelineFgColor = options.timelineFgColor; - let draggableEdgeWidth = options.draggableEdgeWidth; - let snapToDistance = options.snapToDistance; + const timelineFont = options.timelineFont; + const timelineFgColor = options.timelineFgColor; + const draggableEdgeWidth = options.draggableEdgeWidth; + const snapToDistance = options.snapToDistance; - let rowUi = ui.rowUi(row.rowGuid); - let input = ui.input; - let selection = ui.selection; + const rowUi = ui.rowUi(row.rowGuid); + const input = ui.input; + const selection = ui.selection; - let lanes = new TimelineLaneArray(model, row, ui, allowMultipleLanes); + const lanes = new TimelineLaneArray(model, row, ui, allowMultipleLanes); - let timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number { + const timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number { return timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); }; - let timeAtPointer_PMILLIS = function (ev: PointerEvent): number { + const timeAtPointer_PMILLIS = function (ev: PointerEvent): number { return timeAtCoords_PMILLIS(ev.paneViewport, ev.i); }; - let eventAtCoords = function (viewport: BoundsUnmodifiable, i: number, j: number): TimelineEventModel { - let laneNum = Math.floor((viewport.jEnd - j - rowTopPadding) / laneHeight); - let time_PMILLIS = timeAtCoords_PMILLIS(viewport, i); + const eventAtCoords = function (viewport: BoundsUnmodifiable, i: number, j: number): TimelineEventModel { + const laneNum = Math.floor((viewport.jEnd - j - rowTopPadding) / laneHeight); + const time_PMILLIS = timeAtCoords_PMILLIS(viewport, i); return lanes.eventAt(laneNum, time_PMILLIS); }; - let eventAtPointer = function (ev: PointerEvent): TimelineEventModel { + const eventAtPointer = function (ev: PointerEvent): TimelineEventModel { return eventAtCoords(ev.paneViewport, ev.i, ev.j); }; - let isInsideAnEvent: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { + const isInsideAnEvent: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { return hasval(eventAtCoords(viewport, i, j)); }; @@ -120,24 +118,24 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // Create pane // - let layout = { + const layout = { updatePrefSize: function (parentPrefSize: Size): void { parentPrefSize.h = rowTopPadding + rowBottomPadding + Math.max(1, lanes.length) * laneHeight; parentPrefSize.w = null; } }; - let rowContentPane = new Pane(layout, true, isInsideAnEvent); + const rowContentPane = new Pane(layout, true, isInsideAnEvent); rowUi.addPane('content', rowContentPane); - let painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding, laneHeight: laneHeight }; + const painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding, laneHeight: laneHeight }; for (let n = 0; n < painterFactories.length; n++) { - let createPainter = painterFactories[n]; + const createPainter = painterFactories[n]; rowContentPane.addPainter(createPainter(drawable, timeAxis, lanes, ui, painterOptions)); } - let redraw = function () { + const redraw = function () { drawable.redraw(); }; @@ -145,15 +143,15 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt row.eventGuids.valueMoved.on(redraw); row.eventGuids.valueRemoved.on(redraw); - let watchEventAttrs = function (eventGuid: string) { + const watchEventAttrs = function (eventGuid: string) { model.event(eventGuid).attrsChanged.on(redraw); }; row.eventGuids.forEach(watchEventAttrs); row.eventGuids.valueAdded.on(watchEventAttrs); - let removeRedraw = function (eventGuid: string) { + const removeRedraw = function (eventGuid: string) { model.event(eventGuid).attrsChanged.off(redraw); - } + }; row.eventGuids.valueRemoved.on(removeRedraw); @@ -188,9 +186,9 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt recentMouseMove = null; }); - let uiMillisPerPxChanged = function () { + const uiMillisPerPxChanged = function () { if (!eventDragMode && recentMouseMove != null) { - let ev = recentMouseMove; + const ev = recentMouseMove; input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev); input.eventHover.fire(eventAtPointer(ev), ev); } @@ -222,7 +220,7 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // Event-edges are draggable for events at least this wide - let minEventWidthForEdgeDraggability = 3 * draggableEdgeWidth; + const minEventWidthForEdgeDraggability = 3 * draggableEdgeWidth; // When dragging an event-edge, the event cannot be made narrower than this // @@ -230,7 +228,7 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // cover floating-point precision loss -- so a user can't accidentally make // an event so narrow that it can't easily be widened again. // - let minEventWidthWhenDraggingEdge = minEventWidthForEdgeDraggability + 1; + const minEventWidthWhenDraggingEdge = minEventWidthForEdgeDraggability + 1; function allUserEditable(events: TimelineEventModel[]): boolean { @@ -242,29 +240,29 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt return true; } - function chooseEventDragMode(ui: TimelineUi, mouseTime_PMILLIS: number, eventDragEvents: TimelineEventModel[]): string { - if (eventDragEvents.length === 0) { + function chooseEventDragMode(timelineUi: TimelineUi, mouseTime_PMILLIS: number, timelineEventDragEvents: TimelineEventModel[]): string { + if (timelineEventDragEvents.length === 0) { // If no events are selected, then we don't have any to drag return null; } - else if (!allUserEditable(eventDragEvents)) { + else if (!allUserEditable(timelineEventDragEvents)) { // If any selected event is not user-editable, don't allow editing return 'undraggable'; } - else if (eventDragEvents.length > 1) { + else if (timelineEventDragEvents.length > 1) { // If more than one event is selected, don't allow edge dragging return 'center'; } - else if (eventDragEvents.length === 1) { - let event = eventDragEvents[0]; - let pxPerMilli = 1 / ui.millisPerPx.value; - let eventWidth = (event.end_PMILLIS - event.start_PMILLIS) * pxPerMilli; + else if (timelineEventDragEvents.length === 1) { + const event = timelineEventDragEvents[0]; + const pxPerMilli = 1 / timelineUi.millisPerPx.value; + const eventWidth = (event.end_PMILLIS - event.start_PMILLIS) * pxPerMilli; if (eventWidth < minEventWidthForEdgeDraggability) { // If event isn't very wide, don't try to allow edge dragging return 'center'; } else { - let mouseOffset = (mouseTime_PMILLIS - event.start_PMILLIS) * pxPerMilli; + const mouseOffset = (mouseTime_PMILLIS - event.start_PMILLIS) * pxPerMilli; if (mouseOffset < draggableEdgeWidth) { // If mouse is near the left edge, drag the event's start-time return 'start'; @@ -285,19 +283,19 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt } } - let updateCursor = function () { + const updateCursor = function () { if (!eventDragMode) { - let mouseCursors = { 'center': 'default', 'start': 'w-resize', 'end': 'e-resize', 'undraggable': 'default' }; - let hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; + const mouseCursors = { 'center': 'default', 'start': 'w-resize', 'end': 'e-resize', 'undraggable': 'default' }; + const hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value; // if a multi-selection has been made, update the cursor based on all the events in the multi-selection if (selection.selectedEvents.length > 1) { rowContentPane.mouseCursor = mouseCursors[chooseEventDragMode(ui, hoveredTime_PMILLIS, selection.selectedEvents.toArray())]; } else { - let hoveredEvent = selection.hoveredEvent.value; - let hoveredEvents = (hasval(hoveredEvent) ? [hoveredEvent] : []); + const hoveredEvent = selection.hoveredEvent.value; + const hoveredEvents = (hasval(hoveredEvent) ? [hoveredEvent] : []); rowContentPane.mouseCursor = mouseCursors[chooseEventDragMode(ui, hoveredTime_PMILLIS, hoveredEvents)]; } } @@ -308,17 +306,17 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt rowContentPane.mouseDown.on(function (ev: PointerEvent) { if (isLeftMouseDown(ev.mouseEvent)) { - let eventDragEventsSet = selection.selectedEvents; + const eventDragEventsSet = selection.selectedEvents; eventDragEvents = eventDragEventsSet.toArray(); eventDragMode = chooseEventDragMode(ui, timeAtPointer_PMILLIS(ev), eventDragEvents); eventDragSnapTimes_PMILLIS = new Array(); - let numSnapTimes = 0; - let allEventGuids = row.eventGuids; + const numSnapTimes = 0; + const allEventGuids = row.eventGuids; for (let n = 0; n < allEventGuids.length; n++) { - let eventGuid = allEventGuids.valueAt(n); + const eventGuid = allEventGuids.valueAt(n); if (!eventDragEventsSet.hasId(eventGuid)) { - let event = model.event(eventGuid); + const event = model.event(eventGuid); eventDragSnapTimes_PMILLIS.push(event.start_PMILLIS); eventDragSnapTimes_PMILLIS.push(event.end_PMILLIS); } @@ -328,9 +326,9 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt }); function findSnapShift_MILLIS(t_PMILLIS: number, maxShift_MILLIS: number): number { - let i = indexNearest(eventDragSnapTimes_PMILLIS, t_PMILLIS); + const i = indexNearest(eventDragSnapTimes_PMILLIS, t_PMILLIS); if (i >= 0) { - let shift_MILLIS = eventDragSnapTimes_PMILLIS[i] - t_PMILLIS; + const shift_MILLIS = eventDragSnapTimes_PMILLIS[i] - t_PMILLIS; if (Math.abs(shift_MILLIS) <= maxShift_MILLIS) { return shift_MILLIS; } @@ -344,7 +342,7 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt let eventDragPointer_PMILLIS: number = null; - let updateEventDragPointer = function (ev: PointerEvent) { + const updateEventDragPointer = function (ev: PointerEvent) { if (isLeftMouseDown(ev.mouseEvent) && eventDragMode) { eventDragPointer_PMILLIS = timeAtPointer_PMILLIS(ev); } @@ -356,10 +354,10 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // Dragging event-center // - let grabEventCenter = function () { + const grabEventCenter = function () { if (eventDragMode === 'center') { for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; + const event = eventDragEvents[n]; eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.start_PMILLIS; } @@ -367,13 +365,13 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // but once we can tell that it's actually a drag, change to a drag cursor // - let beginDrag = function () { + const beginDrag = function () { rowContentPane.mouseCursor = 'move'; }; rowContentPane.mouseMove.on(beginDrag); - let pendingBeginDrag = setTimeout(beginDrag, 300); + const pendingBeginDrag = setTimeout(beginDrag, 300); - let endDrag = function () { + const endDrag = function () { clearTimeout(pendingBeginDrag); rowContentPane.mouseMove.off(beginDrag); rowContentPane.mouseUp.off(endDrag); @@ -383,24 +381,24 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt }; rowContentPane.mouseDown.on(grabEventCenter); - let dragEventCenter = function () { + const dragEventCenter = function () { if (eventDragMode === 'center') { - let maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); + const maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); let snapShift_MILLIS: number = null; for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; - let newStart_PMILLIS = (eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]); - let newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS); + const event = eventDragEvents[n]; + const newStart_PMILLIS = (eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]); + const newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS); - let eventStartSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS); + const eventStartSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS); if (hasval(eventStartSnapShift_MILLIS)) { if (!hasval(snapShift_MILLIS) || Math.abs(eventStartSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { snapShift_MILLIS = eventStartSnapShift_MILLIS; } } - let eventEndSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS); + const eventEndSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS); if (hasval(eventEndSnapShift_MILLIS)) { if (!hasval(snapShift_MILLIS) || Math.abs(eventEndSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { snapShift_MILLIS = eventEndSnapShift_MILLIS; @@ -412,9 +410,9 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt } for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; - let newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; - let newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS); + const event = eventDragEvents[n]; + const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; + const newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS); event.setInterval(newStart_PMILLIS, newEnd_PMILLIS); } } @@ -425,27 +423,27 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // Dragging event-start // - let grabEventStart = function () { + const grabEventStart = function () { if (eventDragMode === 'start') { for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; + const event = eventDragEvents[n]; eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.start_PMILLIS; } } }; rowContentPane.mouseDown.on(grabEventStart); - let dragEventStart = function () { + const dragEventStart = function () { if (eventDragMode === 'start') { - let wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; - let maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); + const wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; + const maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); let snapShift_MILLIS: number = null; for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; - let newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]; + const event = eventDragEvents[n]; + const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]; - let eventSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS); + const eventSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS); if (hasval(eventSnapShift_MILLIS)) { if (!hasval(snapShift_MILLIS) || Math.abs(eventSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { snapShift_MILLIS = eventSnapShift_MILLIS; @@ -457,8 +455,8 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt } for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; - let newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; + const event = eventDragEvents[n]; + const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; event.start_PMILLIS = Math.min(event.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS); } } @@ -470,27 +468,27 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt // Dragging event-end // - let grabEventEnd = function () { + const grabEventEnd = function () { if (eventDragMode === 'end') { for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; + const event = eventDragEvents[n]; eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.end_PMILLIS; } } }; rowContentPane.mouseDown.on(grabEventEnd); - let dragEventEnd = function () { + const dragEventEnd = function () { if (eventDragMode === 'end') { - let wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; - let maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); + const wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w; + const maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w); let snapShift_MILLIS: number = null; for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; - let newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]; + const event = eventDragEvents[n]; + const newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]; - let eventSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS); + const eventSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS); if (hasval(eventSnapShift_MILLIS)) { if (!hasval(snapShift_MILLIS) || Math.abs(eventSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) { snapShift_MILLIS = eventSnapShift_MILLIS; @@ -502,8 +500,8 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt } for (let n = 0; n < eventDragEvents.length; n++) { - let event = eventDragEvents[n]; - let newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; + const event = eventDragEvents[n]; + const newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; event.end_PMILLIS = Math.max(event.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS); } } @@ -559,14 +557,14 @@ export interface TimelineEventLimitsPainterOptions { function eventLimitsPainterHelper(limitsOpts: TimelineEventLimitsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - let rowTopPadding = options.rowTopPadding; - let rowBottomPadding = options.rowBottomPadding; - let laneHeight = options.laneHeight; + const rowTopPadding = options.rowTopPadding; + const rowBottomPadding = options.rowBottomPadding; + const laneHeight = options.laneHeight; - let lineColor = (hasval(limitsOpts) && hasval(limitsOpts.lineColor) ? limitsOpts.lineColor : new Color(1, 0, 0, 1)); - let lineThickness = (hasval(limitsOpts) && hasval(limitsOpts.lineThickness) ? limitsOpts.lineThickness : 2.5); + const lineColor = (hasval(limitsOpts) && hasval(limitsOpts.lineColor) ? limitsOpts.lineColor : new Color(1, 0, 0, 1)); + const lineThickness = (hasval(limitsOpts) && hasval(limitsOpts.lineThickness) ? limitsOpts.lineThickness : 2.5); - let xyFrac_vColor_VERTSHADER = concatLines( + const xyFrac_vColor_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', ' attribute vec4 a_Color; ', @@ -580,15 +578,15 @@ function eventLimitsPainterHelper(limitsOpts: TimelineEventLimitsPainterOptions, ' ' ); - let program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let a_Color = new Attribute(program, 'a_Color'); + const program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const a_Color = new Attribute(program, 'a_Color'); let xys = new Float32Array(0); - let xysBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); let rgbas = new Float32Array(0); - let rgbasBuffer = newDynamicBuffer(); + const rgbasBuffer = newDynamicBuffer(); return { paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -610,26 +608,26 @@ function eventLimitsPainterHelper(limitsOpts: TimelineEventLimitsPainterOptions, } }, ensureCapacity: function (eventCount: number) { - let numVertices = (6 * 3 /* triangles */ * eventCount); + const numVertices = (6 * 3 /* triangles */ * eventCount); xys = ensureCapacityFloat32(xys, 2 * numVertices); rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); }, fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable): { indexXys: number; indexRgbas: number } { - let lane: TimelineLane = lanes.lane(laneIndex); - let event: TimelineEventModel = lane.event(eventIndex); + const lane: TimelineLane = lanes.lane(laneIndex); + const event: TimelineEventModel = lane.event(eventIndex); - let wLine = lineThickness / viewport.w; - let hLine = lineThickness / viewport.h; + const wLine = lineThickness / viewport.w; + const hLine = lineThickness / viewport.h; - let jTop = rowTopPadding + (laneIndex) * laneHeight; - let yTop = (viewport.h - jTop) / viewport.h; - let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight; - let yBottom = (viewport.h - jBottom) / viewport.h; - let yMid = (yTop + yBottom) / 2; + const jTop = rowTopPadding + (laneIndex) * laneHeight; + const yTop = (viewport.h - jTop) / viewport.h; + const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight; + const yBottom = (viewport.h - jBottom) / viewport.h; + const yMid = (yTop + yBottom) / 2; - let xLeft = hasval(event.startLimit_PMILLIS) ? timeAxis.tFrac(event.startLimit_PMILLIS) : 0; - let xRight = hasval(event.endLimit_PMILLIS) ? timeAxis.tFrac(event.endLimit_PMILLIS) : 1; + const xLeft = hasval(event.startLimit_PMILLIS) ? timeAxis.tFrac(event.startLimit_PMILLIS) : 0; + const xRight = hasval(event.endLimit_PMILLIS) ? timeAxis.tFrac(event.endLimit_PMILLIS) : 1; indexXys = putQuadXys(xys, indexXys, xLeft, xRight, yMid - hLine / 2, yMid + hLine / 2); indexXys = putQuadXys(xys, indexXys, xLeft, xLeft - wLine, yTop, yBottom); @@ -646,12 +644,12 @@ export function newEventLimitsPainterFactory(limitOpts?: TimelineEventLimitsPain // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let helper = eventLimitsPainterHelper(limitOpts, drawable, timeAxis, lanes, ui, options); + const helper = eventLimitsPainterHelper(limitOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let selectedEvents: OrderedSet = ui.selection.selectedEvents; + const selectedEvents: OrderedSet = ui.selection.selectedEvents; // XXX Instead of estimating the number of events we will need to draw ahead of time // XXX (difficult because selected events may be present in multiple lanes, so @@ -663,13 +661,13 @@ export function newEventLimitsPainterFactory(limitOpts?: TimelineEventLimitsPain let indexRgbas = 0; for (let l = 0; l < lanes.length; l++) { - let lane = lanes.lane(l); + const lane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { - let event = lane.event(e); + const event = lane.event(e); // check whether the event is selected and has limits defined if (selectedEvents.hasId(event.eventGuid) && (hasval(event.startLimit_PMILLIS) || hasval(event.endLimit_PMILLIS))) { - let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport); + const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport); indexXys = indexes.indexXys; indexRgbas = indexes.indexRgbas; } @@ -719,26 +717,26 @@ export enum FillPattern { } function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - let rowTopPadding = options.rowTopPadding; - let rowBottomPadding = options.rowBottomPadding; - let laneHeight = options.laneHeight; - - let topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); - let bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); - let borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); - let cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); - let defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); - let defaultColorSecondary = new Color(1, 1, 1, 1); - let minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); - - let stripeWidth = (hasval(barOpts) && hasval(barOpts.stripeWidth) ? barOpts.stripeWidth : 5); - let stripeSecondaryWidth = (hasval(barOpts) && hasval(barOpts.stripeSecondaryWidth) ? barOpts.stripeSecondaryWidth : 5); - let stripeSlant = (hasval(barOpts) && hasval(barOpts.stripeSlant) ? barOpts.stripeSlant : 1); - let featherWidth = (hasval(barOpts) && hasval(barOpts.featherWidth) ? barOpts.featherWidth : 2); - - let selection = ui.selection; - - let xyFrac_vColor_VERTSHADER = concatLines( + const rowTopPadding = options.rowTopPadding; + const rowBottomPadding = options.rowBottomPadding; + const laneHeight = options.laneHeight; + + const topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); + const bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); + const borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); + const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); + const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); + const defaultColorSecondary = new Color(1, 1, 1, 1); + const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); + + const stripeWidth = (hasval(barOpts) && hasval(barOpts.stripeWidth) ? barOpts.stripeWidth : 5); + const stripeSecondaryWidth = (hasval(barOpts) && hasval(barOpts.stripeSecondaryWidth) ? barOpts.stripeSecondaryWidth : 5); + const stripeSlant = (hasval(barOpts) && hasval(barOpts.stripeSlant) ? barOpts.stripeSlant : 1); + const featherWidth = (hasval(barOpts) && hasval(barOpts.featherWidth) ? barOpts.featherWidth : 2); + + const selection = ui.selection; + + const xyFrac_vColor_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', ' attribute vec4 a_Color; ', @@ -761,7 +759,7 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, ' ' ); - let fillPattern_FRAGSHADER = concatLines( + const fillPattern_FRAGSHADER = concatLines( ' #define PI 3.1415926535897932384626433832795 ', ' ', ' precision lowp float; ', @@ -848,36 +846,38 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, ' ' ); - let program = new Program(xyFrac_vColor_VERTSHADER, fillPattern_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let a_Color = new Attribute(program, 'a_Color'); - let a_ColorSecondary = new Attribute(program, 'a_ColorSecondary'); - let a_relativeXy = new Attribute(program, 'a_relativeXy'); - let a_fillPattern = new Attribute(program, 'a_fillPattern'); + const program = new Program(xyFrac_vColor_VERTSHADER, fillPattern_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const a_Color = new Attribute(program, 'a_Color'); + const a_ColorSecondary = new Attribute(program, 'a_ColorSecondary'); + const a_relativeXy = new Attribute(program, 'a_relativeXy'); + const a_fillPattern = new Attribute(program, 'a_fillPattern'); - let u_stripeWidth = new Uniform1f(program, 'u_stripeWidth'); - let u_stripeSecondaryWidth = new Uniform1f(program, 'u_stripeSecondaryWidth'); - let u_slant = new Uniform1f(program, 'u_slant'); - let u_featherWidth = new Uniform1f(program, 'u_featherWidth'); + const u_stripeWidth = new Uniform1f(program, 'u_stripeWidth'); + const u_stripeSecondaryWidth = new Uniform1f(program, 'u_stripeSecondaryWidth'); + const u_slant = new Uniform1f(program, 'u_slant'); + const u_featherWidth = new Uniform1f(program, 'u_featherWidth'); let xys = new Float32Array(0); - let xysBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); let rgbas = new Float32Array(0); - let rgbasBuffer = newDynamicBuffer(); + const rgbasBuffer = newDynamicBuffer(); let rgbasSecondary = new Float32Array(0); - let rgbasSecondaryBuffer = newDynamicBuffer(); + const rgbasSecondaryBuffer = newDynamicBuffer(); let relativeXys = new Float32Array(0); - let relativeXysBuffer = newDynamicBuffer(); + const relativeXysBuffer = newDynamicBuffer(); let fillPattern = new Float32Array(0); - let fillPatternBuffer = newDynamicBuffer(); + const fillPatternBuffer = newDynamicBuffer(); return { paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number) { - if (indexXys === 0 || indexRgbas === 0) return; + if (indexXys === 0 || indexRgbas === 0) { + return; + } gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); @@ -915,7 +915,7 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, program.endUse(gl); }, ensureCapacity: function (eventCount: number) { - let numVertices = (6 * (1 /*quads*/)) * eventCount; + const numVertices = (6 * (1 /*quads*/)) * eventCount; xys = ensureCapacityFloat32(xys, 2 * numVertices); rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); rgbasSecondary = ensureCapacityFloat32(rgbasSecondary, 4 * numVertices); @@ -923,25 +923,25 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, fillPattern = ensureCapacityFloat32(fillPattern, numVertices); }, fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number): { indexXys: number; indexRgbas: number; indexRelativeXys: number; indexFillPattern: number; } { - let lane: TimelineLane = lanes.lane(laneIndex); - let event: TimelineEventModel = lane.event(eventIndex); + const lane: TimelineLane = lanes.lane(laneIndex); + const event: TimelineEventModel = lane.event(eventIndex); - let wBorder = borderThickness / viewport.w; - let hBorder = borderThickness / viewport.h; + const wBorder = borderThickness / viewport.w; + const hBorder = borderThickness / viewport.h; - let _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; - let _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; + const _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; + const _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; - let jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; - let yTop = (viewport.h - jTop) / viewport.h; - let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; - let yBottom = (viewport.h - jBottom) / viewport.h; + const jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; + const yTop = (viewport.h - jTop) / viewport.h; + const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; + const yBottom = (viewport.h - jBottom) / viewport.h; - let xLeft = timeAxis.tFrac(event.start_PMILLIS); - let xRight = timeAxis.tFrac(event.end_PMILLIS); + const xLeft = timeAxis.tFrac(event.start_PMILLIS); + const xRight = timeAxis.tFrac(event.end_PMILLIS); - let xWidthPixels = viewport.w * (xRight - xLeft); - let yHeightPixels = jTop - jBottom; + const xWidthPixels = viewport.w * (xRight - xLeft); + const yHeightPixels = jTop - jBottom; if (!(xRight < 0 || xLeft > 1) && xWidthPixels > minimumVisibleWidth) { @@ -954,7 +954,7 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, } indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop - hBorder, yBottom + hBorder); - let startIndex = indexRgbas; + const startIndex = indexRgbas; putQuadRgbas(rgbas, startIndex, fillColor); indexRgbas = putQuadRgbas(rgbasSecondary, startIndex, fillColorSecondary); @@ -962,7 +962,7 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, indexRelativeXys = putQuadXys(relativeXys, indexRelativeXys, 0.0, xWidthPixels, 0.0, yHeightPixels); // Set the fillPatternValue per vertex of the quad - let fillPatternValue: number = event.fillPattern; + const fillPatternValue: number = event.fillPattern; fillPattern[indexFillPattern++] = fillPatternValue; fillPattern[indexFillPattern++] = fillPatternValue; @@ -978,24 +978,24 @@ function eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, } function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - let rowTopPadding = options.rowTopPadding; - let rowBottomPadding = options.rowBottomPadding; - let laneHeight = options.laneHeight; - - let topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); - let bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); - let borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); - let cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); - let defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); - let defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); - let selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); - let minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); - let dashLength = (hasval(barOpts) && hasval(barOpts.dashLength) ? barOpts.dashLength : 5); - let defaultSecondaryColor = new Color(0, 0, 0, 0); - - let selection = ui.selection; - - let dashedBorder_VERTSHADER = concatLines( + const rowTopPadding = options.rowTopPadding; + const rowBottomPadding = options.rowBottomPadding; + const laneHeight = options.laneHeight; + + const topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); + const bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); + const borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); + const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); + const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); + const defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); + const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); + const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); + const dashLength = (hasval(barOpts) && hasval(barOpts.dashLength) ? barOpts.dashLength : 5); + const defaultSecondaryColor = new Color(0, 0, 0, 0); + + const selection = ui.selection; + + const dashedBorder_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', ' attribute vec4 a_Color; ', @@ -1015,7 +1015,7 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions ' ' ); - let varyingBorder_FRAGSHADER = concatLines( + const varyingBorder_FRAGSHADER = concatLines( ' ', ' precision lowp float; ', ' varying vec4 v_Color; ', @@ -1044,28 +1044,30 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions ' ' ); - let program = new Program(dashedBorder_VERTSHADER, varyingBorder_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let a_Color = new Attribute(program, 'a_Color'); - let a_SecondaryColor = new Attribute(program, 'a_SecondaryColor'); - let a_LengthSoFar = new Attribute(program, 'a_LengthSoFar'); - let u_DashLength_PX = new Uniform1f(program, 'u_DashLength_PX'); + const program = new Program(dashedBorder_VERTSHADER, varyingBorder_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const a_Color = new Attribute(program, 'a_Color'); + const a_SecondaryColor = new Attribute(program, 'a_SecondaryColor'); + const a_LengthSoFar = new Attribute(program, 'a_LengthSoFar'); + const u_DashLength_PX = new Uniform1f(program, 'u_DashLength_PX'); let xys = new Float32Array(0); - let xysBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); let rgbas = new Float32Array(0); - let rgbasBuffer = newDynamicBuffer(); + const rgbasBuffer = newDynamicBuffer(); let rgbasSecondary = new Float32Array(0); - let rgbasSecondaryBuffer = newDynamicBuffer(); + const rgbasSecondaryBuffer = newDynamicBuffer(); let lengths = new Float32Array(0); - let lengthsBuffer = newDynamicBuffer(); + const lengthsBuffer = newDynamicBuffer(); return { paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable, indexLengthSoFar: number) { - if (indexXys === 0 || indexRgbas === 0) return; + if (indexXys === 0 || indexRgbas === 0) { + return; + } gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); @@ -1107,27 +1109,27 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions lengths = ensureCapacityFloat32(lengths, numVertices); }, fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable, indexLengthSoFar: number): { indexXys: number; indexRgbas: number; indexLengthSoFar: number } { - let lane: TimelineLane = lanes.lane(laneIndex); - let event: TimelineEventModel = lane.event(eventIndex); + const lane: TimelineLane = lanes.lane(laneIndex); + const event: TimelineEventModel = lane.event(eventIndex); - let wBorder = borderThickness / viewport.w; - let hBorder = borderThickness / viewport.h; + const wBorder = borderThickness / viewport.w; + const hBorder = borderThickness / viewport.h; - let _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; - let _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; + const _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; + const _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; - let jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; - let yTop = (viewport.h - jTop) / viewport.h; - let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; - let yBottom = (viewport.h - jBottom) / viewport.h; + const jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; + const yTop = (viewport.h - jTop) / viewport.h; + const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; + const yBottom = (viewport.h - jBottom) / viewport.h; - let xLeft = timeAxis.tFrac(event.start_PMILLIS); - let xRight = timeAxis.tFrac(event.end_PMILLIS); + const xLeft = timeAxis.tFrac(event.start_PMILLIS); + const xRight = timeAxis.tFrac(event.end_PMILLIS); - let widthPixels = viewport.w * (xRight - xLeft); - let heightPixels = jBottom - jTop; // confirmed jBottom > jTop + const widthPixels = viewport.w * (xRight - xLeft); + const heightPixels = jBottom - jTop; // confirmed jBottom > jTop - let setLengthsVertical = function (bottomEdge: number, topEdge: number) { + const setLengthsVertical = function (bottomEdge: number, topEdge: number) { lengths[indexLengthSoFar++] = topEdge; lengths[indexLengthSoFar++] = topEdge; lengths[indexLengthSoFar++] = bottomEdge; @@ -1139,7 +1141,7 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions return Math.abs(bottomEdge - topEdge); }; - let setLengthsHorizontal = function (leftEdge: number, rightEdge: number) { + const setLengthsHorizontal = function (leftEdge: number, rightEdge: number) { lengths[indexLengthSoFar++] = leftEdge; lengths[indexLengthSoFar++] = rightEdge; lengths[indexLengthSoFar++] = leftEdge; @@ -1151,17 +1153,17 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions return Math.abs(leftEdge - rightEdge); }; - let setLengthsTriangle = function (length: number) { + const setLengthsTriangle = function (length: number) { lengths[indexLengthSoFar++] = length; lengths[indexLengthSoFar++] = length; lengths[indexLengthSoFar++] = length; - } + }; if (!(xRight < 0 || xLeft > 1) && widthPixels > minimumVisibleWidth) { // Border let borderColor = (event.borderColor || event.bgColor || defaultBorderColor); - let borderSecondaryColor = (event.borderSecondaryColor || defaultSecondaryColor); + const borderSecondaryColor = (event.borderSecondaryColor || defaultSecondaryColor); if (selection.selectedEvents.hasValue(event)) { borderColor = selectedBorderColor; } @@ -1272,7 +1274,7 @@ export function newEventStripedBarsPainterFactory(barOpts?: TimelineEventBarsPai // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let helper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + const helper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -1284,10 +1286,10 @@ export function newEventStripedBarsPainterFactory(barOpts?: TimelineEventBarsPai let indexFillPattern = 0; for (let l = 0; l < lanes.length; l++) { - let lane = lanes.lane(l); + const lane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { - let event = lane.event(e); - let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexRelativeXys, indexFillPattern); + const event = lane.event(e); + const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexRelativeXys, indexFillPattern); indexXys = indexes.indexXys; indexRgbas = indexes.indexRgbas; indexRelativeXys = indexes.indexRelativeXys; @@ -1305,7 +1307,7 @@ export function newEventDashedBordersPainterFactory(barOpts?: TimelineEventBarsP // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let helper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + const helper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -1316,10 +1318,10 @@ export function newEventDashedBordersPainterFactory(barOpts?: TimelineEventBarsP let indexLengthSoFar = 0; for (let l = 0; l < lanes.length; l++) { - let lane = lanes.lane(l); + const lane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { - let event = lane.event(e); - let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexLengthSoFar); + const event = lane.event(e); + const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexLengthSoFar); indexXys = indexes.indexXys; indexRgbas = indexes.indexRgbas; indexLengthSoFar = indexes.indexLengthSoFar; @@ -1341,33 +1343,33 @@ export interface TimelineEventIconsPainterOptions { function eventIconsPainterHelper(iconOpts: TimelineEventIconsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - let rowTopPadding = options.rowTopPadding; - let rowBottomPadding = options.rowBottomPadding; - let laneHeight = options.laneHeight; + const rowTopPadding = options.rowTopPadding; + const rowBottomPadding = options.rowBottomPadding; + const laneHeight = options.laneHeight; - let topMargin = (hasval(iconOpts) && hasval(iconOpts.topMargin) ? iconOpts.topMargin : 1.2); - let bottomMargin = (hasval(iconOpts) && hasval(iconOpts.bottomMargin) ? iconOpts.bottomMargin : 1.2); - let vAlign = (hasval(iconOpts) && hasval(iconOpts.vAlign) ? iconOpts.vAlign : 0.5); + const topMargin = (hasval(iconOpts) && hasval(iconOpts.topMargin) ? iconOpts.topMargin : 1.2); + const bottomMargin = (hasval(iconOpts) && hasval(iconOpts.bottomMargin) ? iconOpts.bottomMargin : 1.2); + const vAlign = (hasval(iconOpts) && hasval(iconOpts.vAlign) ? iconOpts.vAlign : 0.5); - let textureRenderer = new TextureRenderer(); + const textureRenderer = new TextureRenderer(); return { textureRenderer: textureRenderer, paintEvent: function (laneIndex: number, eventIndex: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let lane: TimelineLane = lanes.lane(laneIndex); - let event: TimelineEventModel = lane.event(eventIndex); - let eventStyle = ui.eventStyle(event.styleGuid); + const lane: TimelineLane = lanes.lane(laneIndex); + const event: TimelineEventModel = lane.event(eventIndex); + const eventStyle = ui.eventStyle(event.styleGuid); - let jTop = rowTopPadding + (laneIndex) * laneHeight + topMargin; - let yFrac = (viewport.h - jTop - (1.0 - vAlign) * (laneHeight - topMargin - bottomMargin)) / viewport.h; + const jTop = rowTopPadding + (laneIndex) * laneHeight + topMargin; + const yFrac = (viewport.h - jTop - (1.0 - vAlign) * (laneHeight - topMargin - bottomMargin)) / viewport.h; for (let n = 0; n < eventStyle.numIcons; n++) { - let icon = eventStyle.icon(n); - let iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS); - let xFrac = timeAxis.tFrac(iconTime_PMILLIS); - let w = icon.displayWidth / viewport.w; + const icon = eventStyle.icon(n); + const iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS); + const xFrac = timeAxis.tFrac(iconTime_PMILLIS); + const w = icon.displayWidth / viewport.w; if (-w <= xFrac && xFrac <= 1 + w) { - let iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); + const iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); }); if (iconTexture) { textureRenderer.draw(gl, iconTexture, xFrac, yFrac, { xAnchor: icon.hAlign, yAnchor: vAlign, width: icon.displayWidth, height: icon.displayHeight }); } @@ -1382,7 +1384,7 @@ export function newEventIconsPainterFactory(iconOpts?: TimelineEventIconsPainter // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let helper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options); + const helper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -1391,7 +1393,7 @@ export function newEventIconsPainterFactory(iconOpts?: TimelineEventIconsPainter helper.textureRenderer.begin(gl, viewport); for (let l = 0; l < lanes.length; l++) { - let lane = lanes.lane(l); + const lane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { helper.paintEvent(l, e, gl, viewport); } @@ -1435,7 +1437,7 @@ function calculateTextWidth(textEnabled: boolean, labelText: string, fgColor: Co let wText = 0; let textTexture; if (textEnabled && labelText) { - let textColor = hasval(fgColor) ? fgColor : textDefaultColor; + const textColor = hasval(fgColor) ? fgColor : textDefaultColor; textTexture = textTextures.value(textColor.rgbaString, labelText); wText = textTexture.w / viewport.w; } @@ -1446,65 +1448,65 @@ function calculateTextWidth(textEnabled: boolean, labelText: string, fgColor: Co } function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - let rowTopPadding = options.rowTopPadding; - let rowBottomPadding = options.rowBottomPadding; - let laneHeight = options.laneHeight; - - let topMargin = (hasval(labelOpts) && hasval(labelOpts.topMargin) ? labelOpts.topMargin : 1.2); - let bottomMargin = (hasval(labelOpts) && hasval(labelOpts.bottomMargin) ? labelOpts.bottomMargin : 1.2); - let leftMargin = (hasval(labelOpts) && hasval(labelOpts.leftMargin) ? labelOpts.leftMargin : 4); - let rightMargin = (hasval(labelOpts) && hasval(labelOpts.rightMargin) ? labelOpts.rightMargin : 4); - let vAlign = (hasval(labelOpts) && hasval(labelOpts.vAlign) ? labelOpts.vAlign : 0.5); - let spacing = (hasval(labelOpts) && hasval(labelOpts.spacing) ? labelOpts.spacing : 3); - let extendBeyondBar = (hasval(labelOpts) && hasval(labelOpts.extendBeyondBar) ? labelOpts.extendBeyondBar : false); - let textMode = (hasval(labelOpts) && hasval(labelOpts.textMode) ? labelOpts.textMode : 'force'); + const rowTopPadding = options.rowTopPadding; + const rowBottomPadding = options.rowBottomPadding; + const laneHeight = options.laneHeight; + + const topMargin = (hasval(labelOpts) && hasval(labelOpts.topMargin) ? labelOpts.topMargin : 1.2); + const bottomMargin = (hasval(labelOpts) && hasval(labelOpts.bottomMargin) ? labelOpts.bottomMargin : 1.2); + const leftMargin = (hasval(labelOpts) && hasval(labelOpts.leftMargin) ? labelOpts.leftMargin : 4); + const rightMargin = (hasval(labelOpts) && hasval(labelOpts.rightMargin) ? labelOpts.rightMargin : 4); + const vAlign = (hasval(labelOpts) && hasval(labelOpts.vAlign) ? labelOpts.vAlign : 0.5); + const spacing = (hasval(labelOpts) && hasval(labelOpts.spacing) ? labelOpts.spacing : 3); + const extendBeyondBar = (hasval(labelOpts) && hasval(labelOpts.extendBeyondBar) ? labelOpts.extendBeyondBar : false); + const textMode = (hasval(labelOpts) && hasval(labelOpts.textMode) ? labelOpts.textMode : 'force'); // Icon options - let iconsEnabled = (hasval(labelOpts) && hasval(labelOpts.iconsEnabled) ? labelOpts.iconsEnabled : true); - let iconsForceWidth = (hasval(labelOpts) && hasval(labelOpts.iconsForceWidth) ? labelOpts.iconsForceWidth : 'auto'); - let iconsForceHeight = (hasval(labelOpts) && hasval(labelOpts.iconsForceHeight) ? labelOpts.iconsForceHeight : 'auto'); - let iconsSizeFactor = (hasval(labelOpts) && hasval(labelOpts.iconsSizeFactor) ? labelOpts.iconsSizeFactor : 1); + const iconsEnabled = (hasval(labelOpts) && hasval(labelOpts.iconsEnabled) ? labelOpts.iconsEnabled : true); + const iconsForceWidth = (hasval(labelOpts) && hasval(labelOpts.iconsForceWidth) ? labelOpts.iconsForceWidth : 'auto'); + const iconsForceHeight = (hasval(labelOpts) && hasval(labelOpts.iconsForceHeight) ? labelOpts.iconsForceHeight : 'auto'); + const iconsSizeFactor = (hasval(labelOpts) && hasval(labelOpts.iconsSizeFactor) ? labelOpts.iconsSizeFactor : 1); // Text options - let textEnabled = (hasval(labelOpts) && hasval(labelOpts.textEnabled) ? labelOpts.textEnabled : true); - let textDefaultColor = (hasval(labelOpts) && hasval(labelOpts.textDefaultColor) ? labelOpts.textDefaultColor : options.timelineFgColor); - let textFont = (hasval(labelOpts) && hasval(labelOpts.textFont) ? labelOpts.textFont : options.timelineFont); + const textEnabled = (hasval(labelOpts) && hasval(labelOpts.textEnabled) ? labelOpts.textEnabled : true); + const textDefaultColor = (hasval(labelOpts) && hasval(labelOpts.textDefaultColor) ? labelOpts.textDefaultColor : options.timelineFgColor); + const textFont = (hasval(labelOpts) && hasval(labelOpts.textFont) ? labelOpts.textFont : options.timelineFont); // XXX: Old icon textures never get cleaned out - let iconTextures: StringMap = {}; - let textTextures = newTextTextureCache2(textFont); - let textureRenderer = new TextureRenderer(); + const iconTextures: StringMap = {}; + const textTextures = newTextTextureCache2(textFont); + const textureRenderer = new TextureRenderer(); return { textTextures: textTextures, textureRenderer: textureRenderer, paintEvent: function (laneIndex: number, eventIndex: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - let lane: TimelineLane = lanes.lane(laneIndex); - let event: TimelineEventModel = lane.event(eventIndex); + const lane: TimelineLane = lanes.lane(laneIndex); + const event: TimelineEventModel = lane.event(eventIndex); - let labelTopMargin = hasval(event.labelTopMargin) ? event.labelTopMargin : topMargin; - let labelBottomMargin = hasval(event.labelBottomMargin) ? event.labelBottomMargin : bottomMargin; + const labelTopMargin = hasval(event.labelTopMargin) ? event.labelTopMargin : topMargin; + const labelBottomMargin = hasval(event.labelBottomMargin) ? event.labelBottomMargin : bottomMargin; - let labelVAlign = hasval(event.labelVAlign) ? event.labelVAlign : vAlign; - let labelVPos = hasval(event.labelVPos) ? event.labelVPos : labelVAlign; + const labelVAlign = hasval(event.labelVAlign) ? event.labelVAlign : vAlign; + const labelVPos = hasval(event.labelVPos) ? event.labelVPos : labelVAlign; - let labelHAlign = hasval(event.labelHAlign) ? event.labelHAlign : 0; - let labelHPos = hasval(event.labelHPos) ? event.labelHPos : labelHAlign; + const labelHAlign = hasval(event.labelHAlign) ? event.labelHAlign : 0; + const labelHPos = hasval(event.labelHPos) ? event.labelHPos : labelHAlign; - let jTop = rowTopPadding + (laneIndex) * laneHeight + labelTopMargin; - let yFrac = (viewport.h - jTop - (1.0 - labelVAlign) * (laneHeight - labelTopMargin - labelBottomMargin)) / viewport.h; + const jTop = rowTopPadding + (laneIndex) * laneHeight + labelTopMargin; + const yFrac = (viewport.h - jTop - (1.0 - labelVAlign) * (laneHeight - labelTopMargin - labelBottomMargin)) / viewport.h; - let xLeftMin = 2 / viewport.w; - let xRightMax = (viewport.w - 2) / viewport.w; - let wLeftIndent = leftMargin / viewport.w; - let wRightIndent = rightMargin / viewport.w; + const xLeftMin = 2 / viewport.w; + const xRightMax = (viewport.w - 2) / viewport.w; + const wLeftIndent = leftMargin / viewport.w; + const wRightIndent = rightMargin / viewport.w; - let xStart = timeAxis.tFrac(event.start_PMILLIS); - let xEnd = timeAxis.tFrac(event.end_PMILLIS); + const xStart = timeAxis.tFrac(event.start_PMILLIS); + const xEnd = timeAxis.tFrac(event.end_PMILLIS); - let wTotal = (xEnd - wRightIndent) - (xStart + wLeftIndent) - let wSpacing = (spacing / viewport.w); + const wTotal = (xEnd - wRightIndent) - (xStart + wLeftIndent); + const wSpacing = (spacing / viewport.w); if (!(xEnd <= 0 || xStart > 1)) { @@ -1512,8 +1514,8 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable let xRight; if (extendBeyondBar) { if (eventIndex + 1 < lane.length) { - let nextEvent = lane.event(eventIndex + 1); - let nextStart_PMILLIS = effectiveEdges_PMILLIS(ui, nextEvent)[0]; + const nextEvent = lane.event(eventIndex + 1); + const nextStart_PMILLIS = effectiveEdges_PMILLIS(ui, nextEvent)[0]; xRight = timeAxis.tFrac(nextStart_PMILLIS); } else { @@ -1521,8 +1523,8 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable } if (eventIndex - 1 >= 0) { - let previousEvent = lane.event(eventIndex - 1); - let previousEnd_PMILLIS = effectiveEdges_PMILLIS(ui, previousEvent)[1]; + const previousEvent = lane.event(eventIndex - 1); + const previousEnd_PMILLIS = effectiveEdges_PMILLIS(ui, previousEvent)[1]; xLeft = timeAxis.tFrac(previousEnd_PMILLIS); } else { @@ -1551,8 +1553,8 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable iconWidth = (isNumber(iconsForceWidth) ? iconsForceWidth : (iconsForceWidth === 'imageSize' ? iconTexture.w : null)); iconHeight = (isNumber(iconsForceHeight) ? iconsForceHeight : (iconsForceHeight === 'imageSize' ? iconTexture.h : null)); - let wIconKnown = hasval(iconWidth); - let hIconKnown = hasval(iconHeight); + const wIconKnown = hasval(iconWidth); + const hIconKnown = hasval(iconHeight); if (!wIconKnown && !hIconKnown) { iconHeight = Math.round(iconsSizeFactor * (laneHeight - labelTopMargin - labelBottomMargin)); iconWidth = iconTexture.w * iconHeight / iconTexture.h; @@ -1579,11 +1581,11 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable else if (iconTexture !== null) { iconTextures[event.labelIcon] = null; - let image = new Image(); + const image = new Image(); image.onload = (function (url, img) { return function () { - let wImage = img.naturalWidth; - let hImage = img.naturalHeight; + const wImage = img.naturalWidth; + const hImage = img.naturalHeight; iconTextures[url] = new Texture2D(wImage, hImage, GL.LINEAR, GL.LINEAR, function (g) { g.drawImage(img, 0, 0); }); @@ -1618,11 +1620,11 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable if (textMode === 'truncate') { let labelText = event.label; - while (!!labelText && labelText !== "...") { + while (!!labelText && labelText !== '...') { if (xEndLabel > xRight || xStartLabel < xLeft) { // there is not enough room for the text, begin truncating the text - labelText = labelText.substring(0, labelText.length - 4).concat("..."); - let calculatedTextWidth = calculateTextWidth(textEnabled, labelText, event.fgColor, textDefaultColor, textTextures, viewport); + labelText = labelText.substring(0, labelText.length - 4).concat('...'); + calculatedTextWidth = calculateTextWidth(textEnabled, labelText, event.fgColor, textDefaultColor, textTextures, viewport); wText = calculatedTextWidth.wText; textTexture = calculatedTextWidth.textTexture; @@ -1641,7 +1643,7 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable break; } } - if (!labelText || labelText === "...") { + if (!labelText || labelText === '...') { wText = 0; textTexture = null; } @@ -1652,9 +1654,9 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable textTexture = null; // coordinates of the start edge of the icon + label - let xStartLabel = xStart + wLeftIndent - (wIcon) * labelHPos + (wTotal) * labelHAlign; + xStartLabel = xStart + wLeftIndent - (wIcon) * labelHPos + (wTotal) * labelHAlign; // coordinates of the end edge of the icon + label - let xEndLabel = xStartLabel + (wIcon); + xEndLabel = xStartLabel + (wIcon); // adjust xStartLabel and xEndLabel if they fall off the screen if (xStartLabel < xLeftMin) { @@ -1677,10 +1679,10 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable // Icons if (hasval(iconTexture)) { // coordinates of the start edge of the icon + label - let xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; + xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; // coordinates of the end edge of the icon + label - let xEndLabel = xStartLabel + (wSpacing + wIcon + wText); + xEndLabel = xStartLabel + (wSpacing + wIcon + wText); if (xStartLabel < xLeftMin) { textureRenderer.draw(gl, iconTexture, xLeftMin, yFrac, { xAnchor: 0, yAnchor: labelVPos, width: iconWidth, height: iconHeight }); @@ -1689,7 +1691,7 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable textureRenderer.draw(gl, iconTexture, xRightMax - wSpacing - wText, yFrac, { xAnchor: 1, yAnchor: labelVPos, width: iconWidth, height: iconHeight }); } else { - let xFrac = xStart + wLeftIndent - (wSpacing + wText) * labelHPos + (wTotal) * labelHAlign; + const xFrac = xStart + wLeftIndent - (wSpacing + wText) * labelHPos + (wTotal) * labelHAlign; textureRenderer.draw(gl, iconTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: labelVPos, width: iconWidth, height: iconHeight }); } } @@ -1697,10 +1699,10 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable // Text if (hasval(textTexture)) { // coordinates of the start edge of the icon + label - let xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; + xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign; // coordinates of the end edge of the icon + label - let xEndLabel = xStartLabel + (wSpacing + wIcon + wText); + xEndLabel = xStartLabel + (wSpacing + wIcon + wText); if (xStartLabel < xLeftMin) { textureRenderer.draw(gl, textTexture, xLeftMin + wSpacing + wIcon, yFrac, { xAnchor: 0, yAnchor: textTexture.yAnchor(labelVPos) }); @@ -1709,7 +1711,7 @@ function eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable textureRenderer.draw(gl, textTexture, xRightMax, yFrac, { xAnchor: 1, yAnchor: textTexture.yAnchor(labelVPos) }); } else { - let xFrac = xStart + wLeftIndent + (wIconPlusSpacing) * (1 - labelHPos) + (wTotal) * labelHAlign; + const xFrac = xStart + wLeftIndent + (wIconPlusSpacing) * (1 - labelHPos) + (wTotal) * labelHAlign; textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: textTexture.yAnchor(labelVPos) }); } } @@ -1723,7 +1725,7 @@ export function newEventLabelsPainterFactory(labelOpts?: TimelineEventLabelOptio // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let helper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options); + const helper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -1733,7 +1735,7 @@ export function newEventLabelsPainterFactory(labelOpts?: TimelineEventLabelOptio helper.textTextures.resetTouches(); helper.textureRenderer.begin(gl, viewport); for (let l = 0; l < lanes.length; l++) { - let lane: TimelineLane = lanes.lane(l); + const lane: TimelineLane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { helper.paintEvent(l, e, gl, viewport); } @@ -1746,22 +1748,22 @@ export function newEventLabelsPainterFactory(labelOpts?: TimelineEventLabelOptio function eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) { - let rowTopPadding = options.rowTopPadding; - let rowBottomPadding = options.rowBottomPadding; - let laneHeight = options.laneHeight; - - let topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); - let bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); - let borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); - let cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); - let defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); - let defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); - let selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); - let minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); - - let selection = ui.selection; - - let xyFrac_vColor_VERTSHADER = concatLines( + const rowTopPadding = options.rowTopPadding; + const rowBottomPadding = options.rowBottomPadding; + const laneHeight = options.laneHeight; + + const topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2); + const bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2); + const borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2); + const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); + const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); + const defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); + const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); + const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); + + const selection = ui.selection; + + const xyFrac_vColor_VERTSHADER = concatLines( ' ', ' attribute vec2 a_XyFrac; ', ' attribute vec4 a_Color; ', @@ -1775,19 +1777,21 @@ function eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawabl ' ' ); - let program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let a_Color = new Attribute(program, 'a_Color'); + const program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const a_Color = new Attribute(program, 'a_Color'); let xys = new Float32Array(0); - let xysBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); let rgbas = new Float32Array(0); - let rgbasBuffer = newDynamicBuffer(); + const rgbasBuffer = newDynamicBuffer(); return { paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { - if (indexXys === 0 || indexRgbas === 0) return; + if (indexXys === 0 || indexRgbas === 0) { + return; + } gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); @@ -1820,24 +1824,24 @@ function eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawabl rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices); }, fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable): { indexXys: number; indexRgbas: number } { - let lane: TimelineLane = lanes.lane(laneIndex); - let event: TimelineEventModel = lane.event(eventIndex); + const lane: TimelineLane = lanes.lane(laneIndex); + const event: TimelineEventModel = lane.event(eventIndex); - let wBorder = borderThickness / viewport.w; - let hBorder = borderThickness / viewport.h; + const wBorder = borderThickness / viewport.w; + const hBorder = borderThickness / viewport.h; - let _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; - let _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; + const _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin; + const _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin; - let jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; - let yTop = (viewport.h - jTop) / viewport.h; - let jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; - let yBottom = (viewport.h - jBottom) / viewport.h; + const jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin; + const yTop = (viewport.h - jTop) / viewport.h; + const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin; + const yBottom = (viewport.h - jBottom) / viewport.h; - let xLeft = timeAxis.tFrac(event.start_PMILLIS); - let xRight = timeAxis.tFrac(event.end_PMILLIS); + const xLeft = timeAxis.tFrac(event.start_PMILLIS); + const xRight = timeAxis.tFrac(event.end_PMILLIS); - let xWidthPixels = viewport.w * (xRight - xLeft); + const xWidthPixels = viewport.w * (xRight - xLeft); if (!(xRight < 0 || xLeft > 1) && xWidthPixels > minimumVisibleWidth) { @@ -1893,7 +1897,7 @@ export function newEventBarsPainterFactory(barOpts?: TimelineEventBarsPainterOpt // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let helper = eventBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + const helper = eventBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -1903,10 +1907,10 @@ export function newEventBarsPainterFactory(barOpts?: TimelineEventBarsPainterOpt let indexRgbas = 0; for (let l = 0; l < lanes.length; l++) { - let lane = lanes.lane(l); + const lane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { - let event = lane.event(e); - let indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport); + const event = lane.event(e); + const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport); indexXys = indexes.indexXys; indexRgbas = indexes.indexRgbas; } @@ -1923,10 +1927,10 @@ export function newCombinedEventPainterFactory(barOpts?: TimelineEventBarsPainte // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter { - let labelHelper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options); - let iconHelper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options); - let barHelper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); - let dashedHelper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + const labelHelper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options); + const iconHelper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options); + const barHelper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); + const dashedHelper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -1934,13 +1938,13 @@ export function newCombinedEventPainterFactory(barOpts?: TimelineEventBarsPainte gl.enable(GL.BLEND); for (let l = 0; l < lanes.length; l++) { - let lane: TimelineLane = lanes.lane(l); + const lane: TimelineLane = lanes.lane(l); for (let e = 0; e < lane.length; e++) { // draw bar barHelper.ensureCapacity(1); - let indexes = barHelper.fillEvent(l, e, 0, 0, viewport, 0, 0); - let dashedIndexes = dashedHelper.fillEvent(l, e, 0, 0, viewport, 0); + const indexes = barHelper.fillEvent(l, e, 0, 0, viewport, 0, 0); + const dashedIndexes = dashedHelper.fillEvent(l, e, 0, 0, viewport, 0); barHelper.paint(indexes.indexXys, indexes.indexRgbas, gl, viewport, indexes.indexRelativeXys, indexes.indexFillPattern); dashedHelper.paint(dashedIndexes.indexXys, dashedIndexes.indexRgbas, gl, viewport, dashedIndexes.indexLengthSoFar); @@ -1958,7 +1962,7 @@ export function newCombinedEventPainterFactory(barOpts?: TimelineEventBarsPainte } } - } - } + }; + }; } diff --git a/src/webglimpse/timeline/timeline_lanes.ts b/src/webglimpse/timeline/timeline_lanes.ts index df70d60..f73bdf7 100644 --- a/src/webglimpse/timeline/timeline_lanes.ts +++ b/src/webglimpse/timeline/timeline_lanes.ts @@ -59,7 +59,7 @@ export class TimelineLaneArray { this._laneNums = {}; this._eventAttrsListeners = {}; - let self = this; + const self = this; function findAvailableLaneNum(event: TimelineEventModel, startLaneNum: number, endLaneNum: number): number { for (let n = startLaneNum; n < endLaneNum; n++) { @@ -71,7 +71,7 @@ export class TimelineLaneArray { } function firstAvailableLaneNum(event: TimelineEventModel): number { - let laneNum = findAvailableLaneNum(event, 0, self._lanes.length); + const laneNum = findAvailableLaneNum(event, 0, self._lanes.length); return (hasval(laneNum) ? laneNum : self._lanes.length); } @@ -84,12 +84,12 @@ export class TimelineLaneArray { } function fillVacancy(vacancyLaneNum: number, vacancyEdges_PMILLIS: number[]) { - let vacancyLane = self._lanes[vacancyLaneNum]; + const vacancyLane = self._lanes[vacancyLaneNum]; for (let n = vacancyLaneNum + 1; n < self._lanes.length; n++) { - let lane = self._lanes[n]; - let possibleTenants = lane.collisionsWithInterval(vacancyEdges_PMILLIS[0], vacancyEdges_PMILLIS[1]); + const lane = self._lanes[n]; + const possibleTenants = lane.collisionsWithInterval(vacancyEdges_PMILLIS[0], vacancyEdges_PMILLIS[1]); for (let p = 0; p < possibleTenants.length; p++) { - let event = possibleTenants[p]; + const event = possibleTenants[p]; if (vacancyLane.couldFitEvent(event)) { lane.remove(event); addEventToLane(event, vacancyLaneNum); @@ -115,8 +115,8 @@ export class TimelineLaneArray { if (hasval(self._laneNums[eventGuid])) { throw new Error('Lanes-array already contains this event: row-guid = ' + row.rowGuid + ', lane = ' + self._laneNums[eventGuid] + ', event-guid = ' + eventGuid); } - let event = model.event(eventGuid); - let laneNum = firstAvailableLaneNum(event); + const event = model.event(eventGuid); + const laneNum = firstAvailableLaneNum(event); addEventToLane(event, laneNum); }; @@ -126,15 +126,15 @@ export class TimelineLaneArray { // attaches listeners to event, should be called only once // when an event is first added to the row model this._newEvent = function (eventGuid: string) { - let event = model.event(eventGuid); + const event = model.event(eventGuid); let oldEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event); - let updateLaneAssignment = function () { - let newEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event); + const updateLaneAssignment = function () { + const newEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event); if (newEdges_PMILLIS[0] !== oldEdges_PMILLIS[0] || newEdges_PMILLIS[1] !== oldEdges_PMILLIS[1]) { - let oldLaneNum = self._laneNums[event.eventGuid]; - let oldLane = self._lanes[oldLaneNum]; + const oldLaneNum = self._laneNums[event.eventGuid]; + const oldLane = self._lanes[oldLaneNum]; - let betterLaneNum = findAvailableLaneNum(event, 0, oldLaneNum); + const betterLaneNum = findAvailableLaneNum(event, 0, oldLaneNum); if (hasval(betterLaneNum)) { // Move to a better lane oldLane.remove(event); @@ -147,7 +147,9 @@ export class TimelineLaneArray { else { // Take whatever lane we can get let newLaneNum = findAvailableLaneNum(event, oldLaneNum + 1, self._lanes.length); - if (!hasval(newLaneNum)) newLaneNum = self._lanes.length; + if (!hasval(newLaneNum)){ + newLaneNum = self._lanes.length; + } oldLane.remove(event); addEventToLane(event, newLaneNum); } @@ -166,9 +168,9 @@ export class TimelineLaneArray { row.eventGuids.valueAdded.on(this._newEvent); this._removeEvent = function (eventGuid: string) { - let event = model.event(eventGuid); + const event = model.event(eventGuid); - let oldLaneNum = self._laneNums[eventGuid]; + const oldLaneNum = self._laneNums[eventGuid]; delete self._laneNums[eventGuid]; self._lanes[oldLaneNum].remove(event); @@ -177,41 +179,43 @@ export class TimelineLaneArray { event.attrsChanged.off(self._eventAttrsListeners[eventGuid]); delete self._eventAttrsListeners[eventGuid]; - } + }; row.eventGuids.valueRemoved.on(this._removeEvent); self._rebuildLanes = function () { - let oldLanes = self._lanes; + const oldLanes = self._lanes; self._lanes = []; self._laneNums = {}; for (let l = 0; l < oldLanes.length; l++) { - let lane = oldLanes[l]; + const lane = oldLanes[l]; for (let e = 0; e < lane.length; e++) { - let event = lane.event(e); + const event = lane.event(e); self._addEvent(event.eventGuid); } } }; - let hasIcons = function () { - let oldLanes = self._lanes; + const hasIcons = function () { + const oldLanes = self._lanes; for (let l = 0; l < oldLanes.length; l++) { - let lane = oldLanes[l]; + const lane = oldLanes[l]; for (let e = 0; e < lane.length; e++) { - let event = lane.event(e); - let style = ui.eventStyle(event.styleGuid); - if (event.labelIcon || style.numIcons > 0) return true; + const event = lane.event(e); + const style = ui.eventStyle(event.styleGuid); + if (event.labelIcon || style.numIcons > 0) { + return true; + } } } return false; - } + }; self._rebuildLanesMouseWheel = function () { if (hasIcons()) { self._rebuildLanes(); } - } + }; ui.millisPerPx.changed.on(self._rebuildLanesMouseWheel); ui.eventStyles.valueAdded.on(self._rebuildLanes); @@ -231,7 +235,7 @@ export class TimelineLaneArray { } eventAt(laneNum: number, time_PMILLIS: number): TimelineEventModel { - let lane = this._lanes[laneNum]; + const lane = this._lanes[laneNum]; return (lane && lane.eventAtTime(time_PMILLIS)); } @@ -244,11 +248,13 @@ export class TimelineLaneArray { this._ui.eventStyles.valueAdded.off(this._rebuildLanes); this._ui.eventStyles.valueRemoved.off(this._rebuildLanes); - for (let eventGuid in this._eventAttrsListeners) { + for (const eventGuid in this._eventAttrsListeners) { if (this._eventAttrsListeners.hasOwnProperty(eventGuid)) { - let listener = this._eventAttrsListeners[eventGuid]; - let event = this._model.event(eventGuid); - if (listener && event) event.attrsChanged.off(listener); + const listener = this._eventAttrsListeners[eventGuid]; + const event = this._model.event(eventGuid); + if (listener && event) { + event.attrsChanged.off(listener); + } } } } @@ -260,13 +266,13 @@ export function effectiveEdges_PMILLIS(ui: TimelineUi, event: TimelineEventModel let start_PMILLIS = event.start_PMILLIS; let end_PMILLIS = event.end_PMILLIS; - let millisPerPx = ui.millisPerPx.value; - let eventStyle = ui.eventStyle(event.styleGuid); + const millisPerPx = ui.millisPerPx.value; + const eventStyle = ui.eventStyle(event.styleGuid); for (let n = 0; n < eventStyle.numIcons; n++) { - let icon = eventStyle.icon(n); - let iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS); - let iconStart_PMILLIS = iconTime_PMILLIS - (millisPerPx * icon.hAlign * icon.displayWidth); - let iconEnd_PMILLIS = iconTime_PMILLIS + (millisPerPx * (1 - icon.hAlign) * icon.displayWidth); + const icon = eventStyle.icon(n); + const iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS); + const iconStart_PMILLIS = iconTime_PMILLIS - (millisPerPx * icon.hAlign * icon.displayWidth); + const iconEnd_PMILLIS = iconTime_PMILLIS + (millisPerPx * (1 - icon.hAlign) * icon.displayWidth); start_PMILLIS = Math.min(start_PMILLIS, iconStart_PMILLIS); end_PMILLIS = Math.max(end_PMILLIS, iconEnd_PMILLIS); @@ -320,19 +326,19 @@ export class TimelineLaneStack implements TimelineLane { eventAtTime(time_PMILLIS: number): TimelineEventModel { if (hasval(time_PMILLIS)) { // Check the first event ending after time - let iFirst = indexAfter(this._ends_PMILLIS, time_PMILLIS); + const iFirst = indexAfter(this._ends_PMILLIS, time_PMILLIS); if (iFirst < this._events.length) { - let eventFirst = this._events[iFirst]; - let startFirst_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventFirst)[0]; + const eventFirst = this._events[iFirst]; + const startFirst_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventFirst)[0]; if (time_PMILLIS >= startFirst_PMILLIS) { return eventFirst; } } // Check the previous event, in case we're in its icon-slop - let iPrev = iFirst - 1; + const iPrev = iFirst - 1; if (iPrev >= 0) { - let eventPrev = this._events[iPrev]; - let endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventPrev)[1]; + const eventPrev = this._events[iPrev]; + const endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventPrev)[1]; if (time_PMILLIS < endPrev_PMILLIS) { return eventPrev; } @@ -342,11 +348,15 @@ export class TimelineLaneStack implements TimelineLane { } add(event: TimelineEventModel) { - let eventGuid = event.eventGuid; - if (hasval(this._indices[eventGuid])) throw new Error('Lane already contains this event: event = ' + formatEvent(event)); + const eventGuid = event.eventGuid; + if (hasval(this._indices[eventGuid])) { + throw new Error('Lane already contains this event: event = ' + formatEvent(event)); + } - let i = indexAfter(this._starts_PMILLIS, event.start_PMILLIS); - if (!this._eventFitsBetween(event, i - 1, i)) throw new Error('New event does not fit between existing events: new = ' + formatEvent(event) + ', before = ' + formatEvent(this._events[i - 1]) + ', after = ' + formatEvent(this._events[i])); + const i = indexAfter(this._starts_PMILLIS, event.start_PMILLIS); + if (!this._eventFitsBetween(event, i - 1, i)) { + throw new Error('New event does not fit between existing events: new = ' + formatEvent(event) + ', before = ' + formatEvent(this._events[i - 1]) + ', after = ' + formatEvent(this._events[i])); + } this._events.splice(i, 0, event); this._starts_PMILLIS.splice(i, 0, event.start_PMILLIS); @@ -359,9 +369,11 @@ export class TimelineLaneStack implements TimelineLane { } remove(event: TimelineEventModel) { - let eventGuid = event.eventGuid; - let i = this._indices[eventGuid]; - if (!hasval(i)) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + const eventGuid = event.eventGuid; + const i = this._indices[eventGuid]; + if (!hasval(i)) { + throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + } this._events.splice(i, 1); this._starts_PMILLIS.splice(i, 1); @@ -374,15 +386,19 @@ export class TimelineLaneStack implements TimelineLane { } eventStillFits(event: TimelineEventModel): boolean { - let i = this._indices[event.eventGuid]; - if (!hasval(i)) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + const i = this._indices[event.eventGuid]; + if (!hasval(i)) { + throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + } return this._eventFitsBetween(event, i - 1, i + 1); } update(event: TimelineEventModel) { - let i = this._indices[event.eventGuid]; - if (!hasval(i)) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + const i = this._indices[event.eventGuid]; + if (!hasval(i)) { + throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + } this._starts_PMILLIS[i] = event.start_PMILLIS; this._ends_PMILLIS[i] = event.end_PMILLIS; @@ -391,18 +407,18 @@ export class TimelineLaneStack implements TimelineLane { collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[] { // Find the first event ending after start let iFirst = indexAfter(this._ends_PMILLIS, start_PMILLIS); - let iPrev = iFirst - 1; + const iPrev = iFirst - 1; if (iPrev >= 0) { - let endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPrev])[1]; + const endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPrev])[1]; if (start_PMILLIS < endPrev_PMILLIS) { iFirst = iPrev; } } // Find the last event starting before end let iLast = indexBefore(this._starts_PMILLIS, end_PMILLIS); - let iPost = iLast + 1; + const iPost = iLast + 1; if (iPost < this._events.length) { - let startPost_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPost])[0]; + const startPost_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPost])[0]; if (end_PMILLIS > startPost_PMILLIS) { iLast = iPost; } @@ -412,17 +428,17 @@ export class TimelineLaneStack implements TimelineLane { } couldFitEvent(event: TimelineEventModel): boolean { - let iAfter = indexAfter(this._starts_PMILLIS, event.start_PMILLIS); - let iBefore = iAfter - 1; + const iAfter = indexAfter(this._starts_PMILLIS, event.start_PMILLIS); + const iBefore = iAfter - 1; return this._eventFitsBetween(event, iBefore, iAfter); } _eventFitsBetween(event: TimelineEventModel, iBefore: number, iAfter: number): boolean { - let edges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event); + const edges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event); if (iBefore >= 0) { // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision - let edgesBefore_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iBefore]); + const edgesBefore_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iBefore]); if (edges_PMILLIS[0] < edgesBefore_PMILLIS[1]) { return false; } @@ -430,7 +446,7 @@ export class TimelineLaneStack implements TimelineLane { if (iAfter < this._events.length) { // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision - let edgesAfter_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iAfter]); + const edgesAfter_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iAfter]); if (edges_PMILLIS[1] > edgesAfter_PMILLIS[0]) { return false; } @@ -481,9 +497,9 @@ export class TimelineLaneSimple implements TimelineLane { // favors events drawn on top (in cases where events are unordered // those that happen to be at end end of the list are drawn last for (let n = this._events.length - 1; n >= 0; n--) { - let event: TimelineEventModel = this._events[n]; + const event: TimelineEventModel = this._events[n]; - let eventEdges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event); + const eventEdges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event); if (time_PMILLIS > eventEdges_PMILLIS[0] && time_PMILLIS < eventEdges_PMILLIS[1] && @@ -496,25 +512,29 @@ export class TimelineLaneSimple implements TimelineLane { } add(event: TimelineEventModel) { - let eventGuid = event.eventGuid; - if (hasval(this._ids[eventGuid])) throw new Error('Lane already contains this event: event = ' + formatEvent(event)); + const eventGuid = event.eventGuid; + if (hasval(this._ids[eventGuid])) { + throw new Error('Lane already contains this event: event = ' + formatEvent(event)); + } // for events with undefined order, replace with largest possible negative order so sort is correct - let order = hasval(event.order) ? event.order : Number.NEGATIVE_INFINITY; + const orderVal = hasval(event.order) ? event.order : Number.NEGATIVE_INFINITY; - let i: number = indexAtOrAfter(this._orders, order); + const i: number = indexAtOrAfter(this._orders, orderVal); this._ids[eventGuid] = eventGuid; - this._orders.splice(i, 0, order); + this._orders.splice(i, 0, orderVal); this._events.splice(i, 0, event); } remove(event: TimelineEventModel) { - let eventGuid = event.eventGuid; - if (!hasval(this._ids[eventGuid])) throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + const eventGuid = event.eventGuid; + if (!hasval(this._ids[eventGuid])) { + throw new Error('Event not found in this lane: event = ' + formatEvent(event)); + } delete this._ids[eventGuid]; - let i: number = this._getIndex(event); + const i: number = this._getIndex(event); this._orders.splice(i, 1); this._events.splice(i, 1); } @@ -526,10 +546,10 @@ export class TimelineLaneSimple implements TimelineLane { collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[] { - let results = []; + const results = []; for (let n = 0; n < this._events.length; n++) { - let event: TimelineEventModel = this._events[n]; + const event: TimelineEventModel = this._events[n]; if (!(start_PMILLIS > event.end_PMILLIS || end_PMILLIS < event.start_PMILLIS)) { results.push(event); @@ -551,7 +571,7 @@ export class TimelineLaneSimple implements TimelineLane { _getIndex(queryEvent: TimelineEventModel): number { for (let n = 0; n < this._events.length; n++) { - let event: TimelineEventModel = this._events[n]; + const event: TimelineEventModel = this._events[n]; if (queryEvent.eventGuid === event.eventGuid) { return n; } diff --git a/src/webglimpse/timeline/timeline_layout.ts b/src/webglimpse/timeline/timeline_layout.ts index c8579c8..1ba3cc9 100644 --- a/src/webglimpse/timeline/timeline_layout.ts +++ b/src/webglimpse/timeline/timeline_layout.ts @@ -41,20 +41,26 @@ export function newTimelineLayout(axisHeight: number): Layout { let bottomAxis: LayoutEntry = null; let center: LayoutEntry = null; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; switch (child.layoutArg) { case Side.TOP: - if (hasval(topAxis)) throw new Error('Timeline-layout can have at most one top-axis pane'); + if (hasval(topAxis)) { + throw new Error('Timeline-layout can have at most one top-axis pane'); + } topAxis = child; break; case Side.BOTTOM: - if (hasval(bottomAxis)) throw new Error('Timeline-layout can have at most one bottom-axis pane'); + if (hasval(bottomAxis)) { + throw new Error('Timeline-layout can have at most one bottom-axis pane'); + } bottomAxis = child; break; default: - if (hasval(center)) throw new Error('Timeline-layout can have at most one center pane'); + if (hasval(center)) { + throw new Error('Timeline-layout can have at most one center pane'); + } center = child; break; } @@ -88,20 +94,26 @@ export function newTimelineLayout(axisHeight: number): Layout { let bottomAxis: LayoutEntry = null; let center: LayoutEntry = null; for (let c = 0; c < children.length; c++) { - let child = children[c]; + const child = children[c]; switch (child.layoutArg) { case Side.TOP: - if (hasval(topAxis)) throw new Error('Timeline-layout can have at most one top-axis pane'); + if (hasval(topAxis)) { + throw new Error('Timeline-layout can have at most one top-axis pane'); + } topAxis = child; break; case Side.BOTTOM: - if (hasval(bottomAxis)) throw new Error('Timeline-layout can have at most one bottom-axis pane'); + if (hasval(bottomAxis)) { + throw new Error('Timeline-layout can have at most one bottom-axis pane'); + } bottomAxis = child; break; default: - if (hasval(center)) throw new Error('Timeline-layout can have at most one center pane'); + if (hasval(center)) { + throw new Error('Timeline-layout can have at most one center pane'); + } center = child; break; } @@ -112,13 +124,13 @@ export function newTimelineLayout(axisHeight: number): Layout { } if (hasval(bottomAxis)) { - let jBottomMax = (hasval(topAxis) ? topAxis.viewport.j : parentViewport.jEnd) - axisHeight; + const jBottomMax = (hasval(topAxis) ? topAxis.viewport.j : parentViewport.jEnd) - axisHeight; bottomAxis.viewport.setRect(parentViewport.i, Math.min(jBottomMax, parentViewport.j), parentViewport.w, axisHeight); } if (hasval(center)) { - let jCenterEnd = (hasval(topAxis) ? topAxis.viewport.jStart : parentViewport.jEnd); - let jCenterStart = (hasval(bottomAxis) ? bottomAxis.viewport.jEnd : parentViewport.jStart); + const jCenterEnd = (hasval(topAxis) ? topAxis.viewport.jStart : parentViewport.jEnd); + const jCenterStart = (hasval(bottomAxis) ? bottomAxis.viewport.jEnd : parentViewport.jStart); center.viewport.setEdges(parentViewport.iStart, parentViewport.iEnd, jCenterStart, jCenterEnd); } } diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 42d25c0..077bdb8 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -593,7 +593,9 @@ export class TimelineTimeseriesFragmentModel { // find the index to reinsert new data at index = indexOf(this._times_PMILLIS, time); - if (index < 0) index = -index - 1; + if (index < 0) { + index = -index - 1; + } this._times_PMILLIS.splice(index, 0, time); this._data.splice(index, 0, value); @@ -713,13 +715,13 @@ export class TimelineEventModel { setInterval(start_PMILLIS: number, end_PMILLIS: number) { if (start_PMILLIS !== this._start_PMILLIS || end_PMILLIS !== this._end_PMILLIS) { - let initial_start_PMILLIS = this._start_PMILLIS; - let initial_end_PMILLIS = this._end_PMILLIS; + const initial_start_PMILLIS = this._start_PMILLIS; + const initial_end_PMILLIS = this._end_PMILLIS; - let underStartLimit = hasval(this._startLimit_PMILLIS) && start_PMILLIS < this._startLimit_PMILLIS; - let overEndLimit = hasval(this._endLimit_PMILLIS) && end_PMILLIS > this._endLimit_PMILLIS; - let duration_PMILLIS = end_PMILLIS - start_PMILLIS; - let durationLimit_PMILLIS = this._endLimit_PMILLIS - this._startLimit_PMILLIS; + const underStartLimit = hasval(this._startLimit_PMILLIS) && start_PMILLIS < this._startLimit_PMILLIS; + const overEndLimit = hasval(this._endLimit_PMILLIS) && end_PMILLIS > this._endLimit_PMILLIS; + const duration_PMILLIS = end_PMILLIS - start_PMILLIS; + const durationLimit_PMILLIS = this._endLimit_PMILLIS - this._startLimit_PMILLIS; // If both limits are present and the event is larger than the total distance between them // then shrink the event to fit between the limits. @@ -852,9 +854,9 @@ export class TimelineEventModel { return this._order; } - set order(order: number) { - if (order !== this._order) { - this._order = order; + set order(orderVal: number) { + if (orderVal !== this._order) { + this._order = orderVal; this._attrsChanged.fire(); } } @@ -1077,8 +1079,8 @@ export class TimelineRowModel { this._rowGuid = row.rowGuid; this._attrsChanged = new Notification(); - let min: number = hasval(row.yMin) ? row.yMin : 0; - let max: number = hasval(row.yMax) ? row.yMax : 1; + const min: number = hasval(row.yMin) ? row.yMin : 0; + const max: number = hasval(row.yMax) ? row.yMax : 1; this._dataAxis = new Axis1D(min, max); this.setAttrs(row); @@ -1424,49 +1426,49 @@ export class TimelineModel { constructor(timeline?: Timeline) { - let cursors = (hasval(timeline) && hasval(timeline.cursors) ? timeline.cursors : []); + const cursors = (hasval(timeline) && hasval(timeline.cursors) ? timeline.cursors : []); this._cursors = new OrderedSet([], (g) => g.cursorGuid); for (let n = 0; n < cursors.length; n++) { this._cursors.add(new TimelineCursorModel(cursors[n])); } - let annotations = (hasval(timeline) && hasval(timeline.annotations) ? timeline.annotations : []); + const annotations = (hasval(timeline) && hasval(timeline.annotations) ? timeline.annotations : []); this._annotations = new OrderedSet([], (g) => g.annotationGuid); for (let n = 0; n < annotations.length; n++) { this._annotations.add(new TimelineAnnotationModel(annotations[n])); } - let timeseriesFragments = (hasval(timeline) && hasval(timeline.timeseriesFragments) ? timeline.timeseriesFragments : []); + const timeseriesFragments = (hasval(timeline) && hasval(timeline.timeseriesFragments) ? timeline.timeseriesFragments : []); this._timeseriesFragments = new OrderedSet([], (e) => e.fragmentGuid); for (let n = 0; n < timeseriesFragments.length; n++) { this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(timeseriesFragments[n])); } - let timeseries = (hasval(timeline) && hasval(timeline.timeseries) ? timeline.timeseries : []); + const timeseries = (hasval(timeline) && hasval(timeline.timeseries) ? timeline.timeseries : []); this._timeseries = new OrderedSet([], (e) => e.timeseriesGuid); for (let n = 0; n < timeseries.length; n++) { this._timeseries.add(new TimelineTimeseriesModel(timeseries[n])); } - let events = (hasval(timeline) && hasval(timeline.events) ? timeline.events : []); + const events = (hasval(timeline) && hasval(timeline.events) ? timeline.events : []); this._events = new OrderedSet([], (e) => e.eventGuid); for (let n = 0; n < events.length; n++) { this._events.add(new TimelineEventModel(events[n])); } - let rows = (hasval(timeline) && hasval(timeline.rows) ? timeline.rows : []); + const rows = (hasval(timeline) && hasval(timeline.rows) ? timeline.rows : []); this._rows = new OrderedSet([], (r) => r.rowGuid); for (let n = 0; n < rows.length; n++) { this._rows.add(new TimelineRowModel(rows[n])); } - let groups = (hasval(timeline) && hasval(timeline.groups) ? timeline.groups : []); + const groups = (hasval(timeline) && hasval(timeline.groups) ? timeline.groups : []); this._groups = new OrderedSet([], (g) => g.groupGuid); for (let n = 0; n < groups.length; n++) { this._groups.add(new TimelineGroupModel(groups[n])); } - let root = (hasval(timeline) && hasval(timeline.root) ? timeline.root : newEmptyTimelineRoot()); + const root = (hasval(timeline) && hasval(timeline.root) ? timeline.root : newEmptyTimelineRoot()); this._root = new TimelineRootModel(root); } @@ -1493,18 +1495,18 @@ export class TimelineModel { // Purge removed items // - let freshRoot = newTimeline.root; + const freshRoot = newTimeline.root; this._root.groupGuids.retainValues(freshRoot.groupGuids); this._root.topPinnedRowGuids.retainValues(freshRoot.topPinnedRowGuids); this._root.bottomPinnedRowGuids.retainValues(freshRoot.bottomPinnedRowGuids); this._root.maximizedRowGuids.retainValues(freshRoot.maximizedRowGuids); - let freshGroups = newTimeline.groups; - let retainedGroupGuids: string[] = []; + const freshGroups = newTimeline.groups; + const retainedGroupGuids: string[] = []; for (let n = 0; n < freshGroups.length; n++) { - let freshGroup = freshGroups[n]; - let groupGuid = freshGroup.groupGuid; - let oldGroup = this._groups.valueFor(groupGuid); + const freshGroup = freshGroups[n]; + const groupGuid = freshGroup.groupGuid; + const oldGroup = this._groups.valueFor(groupGuid); if (hasval(oldGroup)) { oldGroup.rowGuids.retainValues(freshGroup.rowGuids); retainedGroupGuids.push(groupGuid); @@ -1512,12 +1514,12 @@ export class TimelineModel { } this._groups.retainIds(retainedGroupGuids); - let freshRows = newTimeline.rows; - let retainedRowGuids: string[] = []; + const freshRows = newTimeline.rows; + const retainedRowGuids: string[] = []; for (let n = 0; n < freshRows.length; n++) { - let freshRow = freshRows[n]; - let rowGuid = freshRow.rowGuid; - let oldRow = this._rows.valueFor(rowGuid); + const freshRow = freshRows[n]; + const rowGuid = freshRow.rowGuid; + const oldRow = this._rows.valueFor(rowGuid); if (hasval(oldRow)) { oldRow.eventGuids.retainValues(freshRow.eventGuids || []); retainedRowGuids.push(rowGuid); @@ -1525,60 +1527,60 @@ export class TimelineModel { } this._rows.retainIds(retainedRowGuids); - let freshEvents = newTimeline.events; - let retainedEventGuids: string[] = []; + const freshEvents = newTimeline.events; + const retainedEventGuids: string[] = []; for (let n = 0; n < freshEvents.length; n++) { - let freshEvent = freshEvents[n]; - let eventGuid = freshEvent.eventGuid; - let oldEvent = this._events.valueFor(eventGuid); + const freshEvent = freshEvents[n]; + const eventGuid = freshEvent.eventGuid; + const oldEvent = this._events.valueFor(eventGuid); if (hasval(oldEvent)) { retainedEventGuids.push(eventGuid); } } this._events.retainIds(retainedEventGuids); - let freshTimeseriesSet = newTimeline.timeseries; - let retainedTimeseriesGuids: string[] = []; + const freshTimeseriesSet = newTimeline.timeseries; + const retainedTimeseriesGuids: string[] = []; for (let n = 0; n < freshTimeseriesSet.length; n++) { - let freshTimeseries = freshTimeseriesSet[n]; - let timeseriesGuid = freshTimeseries.timeseriesGuid; - let oldTimeseries = this._timeseries.valueFor(timeseriesGuid); + const freshTimeseries = freshTimeseriesSet[n]; + const timeseriesGuid = freshTimeseries.timeseriesGuid; + const oldTimeseries = this._timeseries.valueFor(timeseriesGuid); if (hasval(oldTimeseries)) { retainedTimeseriesGuids.push(timeseriesGuid); } } this._timeseries.retainIds(retainedTimeseriesGuids); - let freshTimeseriesFragments = newTimeline.timeseriesFragments; - let retainedTimeseriesFragmentGuids: string[] = []; + const freshTimeseriesFragments = newTimeline.timeseriesFragments; + const retainedTimeseriesFragmentGuids: string[] = []; for (let n = 0; n < freshTimeseriesFragments.length; n++) { - let freshTimeseriesFragment = freshTimeseriesFragments[n]; - let fragmentGuid = freshTimeseriesFragment.fragmentGuid; - let oldTimeseriesFragment = this._timeseriesFragments.valueFor(fragmentGuid); + const freshTimeseriesFragment = freshTimeseriesFragments[n]; + const fragmentGuid = freshTimeseriesFragment.fragmentGuid; + const oldTimeseriesFragment = this._timeseriesFragments.valueFor(fragmentGuid); if (hasval(oldTimeseriesFragment)) { retainedTimeseriesFragmentGuids.push(fragmentGuid); } } this._timeseriesFragments.retainIds(retainedTimeseriesFragmentGuids); - let freshAnnotations = newTimeline.annotations; - let retainedAnnotationGuids: string[] = []; + const freshAnnotations = newTimeline.annotations; + const retainedAnnotationGuids: string[] = []; for (let n = 0; n < freshAnnotations.length; n++) { - let freshAnnotation = freshAnnotations[n]; - let annotationGuid = freshAnnotation.annotationGuid; - let oldAnnotation = this._annotations.valueFor(annotationGuid); + const freshAnnotation = freshAnnotations[n]; + const annotationGuid = freshAnnotation.annotationGuid; + const oldAnnotation = this._annotations.valueFor(annotationGuid); if (hasval(oldAnnotation)) { retainedAnnotationGuids.push(annotationGuid); } } this._annotations.retainIds(retainedAnnotationGuids); - let freshCursors = newTimeline.cursors; - let retainedCursorGuids: string[] = []; + const freshCursors = newTimeline.cursors; + const retainedCursorGuids: string[] = []; for (let n = 0; n < freshCursors.length; n++) { - let freshCursor = freshCursors[n]; - let cursorGuid = freshCursor.cursorGuid; - let oldCursor = this._cursors.valueFor(cursorGuid); + const freshCursor = freshCursors[n]; + const cursorGuid = freshCursor.cursorGuid; + const oldCursor = this._cursors.valueFor(cursorGuid); if (hasval(oldCursor)) { retainedCursorGuids.push(cursorGuid); } @@ -1589,8 +1591,8 @@ export class TimelineModel { // for (let n = 0; n < freshCursors.length; n++) { - let freshCursor = freshCursors[n]; - let oldCursor = this._cursors.valueFor(freshCursor.cursorGuid); + const freshCursor = freshCursors[n]; + const oldCursor = this._cursors.valueFor(freshCursor.cursorGuid); if (hasval(oldCursor)) { oldCursor.setAttrs(freshCursor); } @@ -1600,8 +1602,8 @@ export class TimelineModel { } for (let n = 0; n < freshAnnotations.length; n++) { - let freshAnnotation = freshAnnotations[n]; - let oldAnnotation = this._annotations.valueFor(freshAnnotation.annotationGuid); + const freshAnnotation = freshAnnotations[n]; + const oldAnnotation = this._annotations.valueFor(freshAnnotation.annotationGuid); if (hasval(oldAnnotation)) { oldAnnotation.setAttrs(freshAnnotation); } @@ -1611,8 +1613,8 @@ export class TimelineModel { } for (let n = 0; n < freshTimeseriesFragments.length; n++) { - let freshTimeseriesFragment = freshTimeseriesFragments[n]; - let oldTimeseriesFragment = this._timeseriesFragments.valueFor(freshTimeseriesFragment.fragmentGuid); + const freshTimeseriesFragment = freshTimeseriesFragments[n]; + const oldTimeseriesFragment = this._timeseriesFragments.valueFor(freshTimeseriesFragment.fragmentGuid); if (hasval(oldTimeseriesFragment)) { oldTimeseriesFragment.setAttrs(freshTimeseriesFragment); } @@ -1622,8 +1624,8 @@ export class TimelineModel { } for (let n = 0; n < freshTimeseriesSet.length; n++) { - let freshTimeseries = freshTimeseriesSet[n]; - let oldTimeseries = this._timeseries.valueFor(freshTimeseries.timeseriesGuid); + const freshTimeseries = freshTimeseriesSet[n]; + const oldTimeseries = this._timeseries.valueFor(freshTimeseries.timeseriesGuid); if (hasval(oldTimeseries)) { oldTimeseries.setAttrs(freshTimeseries); } @@ -1633,8 +1635,8 @@ export class TimelineModel { } for (let n = 0; n < freshEvents.length; n++) { - let freshEvent = freshEvents[n]; - let oldEvent = this._events.valueFor(freshEvent.eventGuid); + const freshEvent = freshEvents[n]; + const oldEvent = this._events.valueFor(freshEvent.eventGuid); if (hasval(oldEvent)) { oldEvent.setAttrs(freshEvent); } @@ -1644,8 +1646,8 @@ export class TimelineModel { } for (let n = 0; n < freshRows.length; n++) { - let freshRow = freshRows[n]; - let oldRow = this._rows.valueFor(freshRow.rowGuid); + const freshRow = freshRows[n]; + const oldRow = this._rows.valueFor(freshRow.rowGuid); if (hasval(oldRow)) { oldRow.setAttrs(freshRow); oldRow.eventGuids.addAll((freshRow.eventGuids || []), 0, true); @@ -1656,8 +1658,8 @@ export class TimelineModel { } for (let n = 0; n < freshGroups.length; n++) { - let freshGroup = freshGroups[n]; - let oldGroup = this._groups.valueFor(freshGroup.groupGuid); + const freshGroup = freshGroups[n]; + const oldGroup = this._groups.valueFor(freshGroup.groupGuid); if (hasval(oldGroup)) { oldGroup.setAttrs(freshGroup); oldGroup.rowGuids.addAll(freshGroup.rowGuids, 0, true); @@ -1676,10 +1678,10 @@ export class TimelineModel { merge(newData: Timeline, strategy: TimelineMergeStrategy) { - let newCursors = hasval(newData.cursors) ? newData.cursors : []; + const newCursors = hasval(newData.cursors) ? newData.cursors : []; for (let n = 0; n < newCursors.length; n++) { - let newCursor = newCursors[n]; - let cursorModel = this._cursors.valueFor(newCursor.cursorGuid); + const newCursor = newCursors[n]; + const cursorModel = this._cursors.valueFor(newCursor.cursorGuid); if (hasval(cursorModel)) { strategy.updateCursorModel(cursorModel, newCursor); } @@ -1688,10 +1690,10 @@ export class TimelineModel { } } - let newAnnotations = hasval(newData.annotations) ? newData.annotations : []; + const newAnnotations = hasval(newData.annotations) ? newData.annotations : []; for (let n = 0; n < newAnnotations.length; n++) { - let newAnnotation = newAnnotations[n]; - let annotationModel = this._annotations.valueFor(newAnnotation.annotationGuid); + const newAnnotation = newAnnotations[n]; + const annotationModel = this._annotations.valueFor(newAnnotation.annotationGuid); if (hasval(annotationModel)) { strategy.updateAnnotationModel(annotationModel, newAnnotation); } @@ -1700,10 +1702,10 @@ export class TimelineModel { } } - let newTimeseriesFragments = hasval(newData.timeseriesFragments) ? newData.timeseriesFragments : []; + const newTimeseriesFragments = hasval(newData.timeseriesFragments) ? newData.timeseriesFragments : []; for (let n = 0; n < newTimeseriesFragments.length; n++) { - let newTimeseriesFragment = newTimeseriesFragments[n]; - let timeseriesFragmentModel = this._timeseriesFragments.valueFor(newTimeseriesFragment.fragmentGuid); + const newTimeseriesFragment = newTimeseriesFragments[n]; + const timeseriesFragmentModel = this._timeseriesFragments.valueFor(newTimeseriesFragment.fragmentGuid); if (hasval(timeseriesFragmentModel)) { strategy.updateTimeseriesFragmentModel(timeseriesFragmentModel, newTimeseriesFragment); } @@ -1712,10 +1714,10 @@ export class TimelineModel { } } - let newTimeseriesSet = hasval(newData.timeseries) ? newData.timeseries : []; + const newTimeseriesSet = hasval(newData.timeseries) ? newData.timeseries : []; for (let n = 0; n < newTimeseriesSet.length; n++) { - let newTimeseries = newTimeseriesSet[n]; - let timeseriesModel = this._timeseries.valueFor(newTimeseries.timeseriesGuid); + const newTimeseries = newTimeseriesSet[n]; + const timeseriesModel = this._timeseries.valueFor(newTimeseries.timeseriesGuid); if (hasval(timeseriesModel)) { strategy.updateTimeseriesModel(timeseriesModel, newTimeseries); } @@ -1724,10 +1726,10 @@ export class TimelineModel { } } - let newEvents = hasval(newData.events) ? newData.events : []; + const newEvents = hasval(newData.events) ? newData.events : []; for (let n = 0; n < newEvents.length; n++) { - let newEvent = newEvents[n]; - let eventModel = this._events.valueFor(newEvent.eventGuid); + const newEvent = newEvents[n]; + const eventModel = this._events.valueFor(newEvent.eventGuid); if (hasval(eventModel)) { strategy.updateEventModel(eventModel, newEvent); } @@ -1736,10 +1738,10 @@ export class TimelineModel { } } - let newRows = hasval(newData.rows) ? newData.rows : []; + const newRows = hasval(newData.rows) ? newData.rows : []; for (let n = 0; n < newRows.length; n++) { - let newRow = newRows[n]; - let rowModel = this._rows.valueFor(newRow.rowGuid); + const newRow = newRows[n]; + const rowModel = this._rows.valueFor(newRow.rowGuid); if (hasval(rowModel)) { strategy.updateRowModel(rowModel, newRow); } @@ -1748,10 +1750,10 @@ export class TimelineModel { } } - let newGroups = hasval(newData.groups) ? newData.groups : []; + const newGroups = hasval(newData.groups) ? newData.groups : []; for (let n = 0; n < newGroups.length; n++) { - let newGroup = newGroups[n]; - let groupModel = this._groups.valueFor(newGroup.groupGuid); + const newGroup = newGroups[n]; + const groupModel = this._groups.valueFor(newGroup.groupGuid); if (hasval(groupModel)) { strategy.updateGroupModel(groupModel, newGroup); } @@ -1760,7 +1762,7 @@ export class TimelineModel { } } - let newRoot = newData.root; + const newRoot = newData.root; strategy.updateRootModel(this._root, newRoot); } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index ee52f0f..c6494a7 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -141,70 +141,70 @@ export interface TimelinePaneOptions { export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: TimelineModel, options?: TimelinePaneOptions, ui?: TimelineUi): TimelinePane { // Misc - let font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); - let rowPaneFactoryChooser = (hasval(options) && hasval(options.rowPaneFactoryChooser) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT); + const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); + const rowPaneFactoryChooser = (hasval(options) && hasval(options.rowPaneFactoryChooser) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT); // Scroll - let showScrollbar = (hasval(options) && hasval(options.showScrollbar) ? options.showScrollbar : true); - let scrollbarOptions = (hasval(options) ? options.scrollbarOptions : null); + const showScrollbar = (hasval(options) && hasval(options.showScrollbar) ? options.showScrollbar : true); + const scrollbarOptions = (hasval(options) ? options.scrollbarOptions : null); // Colors - let fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : white); - let bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : rgb(0.098, 0.165, 0.243)); - let rowLabelColor = (hasval(options) && hasval(options.rowLabelColor) ? options.rowLabelColor : fgColor); - let rowLabelBgColor = (hasval(options) && hasval(options.rowLabelBgColor) ? options.rowLabelBgColor : bgColor); - let groupLabelColor = (hasval(options) && hasval(options.groupLabelColor) ? options.groupLabelColor : fgColor); - let groupHighlightColor = (hasval(options) && hasval(options.groupHighlightColor) ? options.groupHighlightColor : rgb(0, 1, 1)); - let axisLabelColor = (hasval(options) && hasval(options.axisLabelColor) ? options.axisLabelColor : fgColor); - let rowBgColor = (hasval(options) && hasval(options.rowBgColor) ? options.rowBgColor : rgb(0.020, 0.086, 0.165)); - let rowAltBgColor = (hasval(options) && hasval(options.rowAltBgColor) ? options.rowAltBgColor : rgb(0.020, 0.086, 0.165)); - let gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : gray(0.5)); - let selectedIntervalFillColor = (hasval(options) && hasval(options.selectedIntervalFillColor) ? options.selectedIntervalFillColor : rgba(0, 0.6, 0.8, 0.157)); - let selectedIntervalBorderColor = (hasval(options) && hasval(options.selectedIntervalBorderColor) ? options.selectedIntervalBorderColor : rgb(0, 0.2, 1.0)); + const fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : white); + const bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : rgb(0.098, 0.165, 0.243)); + const rowLabelColor = (hasval(options) && hasval(options.rowLabelColor) ? options.rowLabelColor : fgColor); + const rowLabelBgColor = (hasval(options) && hasval(options.rowLabelBgColor) ? options.rowLabelBgColor : bgColor); + const groupLabelColor = (hasval(options) && hasval(options.groupLabelColor) ? options.groupLabelColor : fgColor); + const groupHighlightColor = (hasval(options) && hasval(options.groupHighlightColor) ? options.groupHighlightColor : rgb(0, 1, 1)); + const axisLabelColor = (hasval(options) && hasval(options.axisLabelColor) ? options.axisLabelColor : fgColor); + const rowBgColor = (hasval(options) && hasval(options.rowBgColor) ? options.rowBgColor : rgb(0.020, 0.086, 0.165)); + const rowAltBgColor = (hasval(options) && hasval(options.rowAltBgColor) ? options.rowAltBgColor : rgb(0.020, 0.086, 0.165)); + const gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : gray(0.5)); + const selectedIntervalFillColor = (hasval(options) && hasval(options.selectedIntervalFillColor) ? options.selectedIntervalFillColor : rgba(0, 0.6, 0.8, 0.157)); + const selectedIntervalBorderColor = (hasval(options) && hasval(options.selectedIntervalBorderColor) ? options.selectedIntervalBorderColor : rgb(0, 0.2, 1.0)); // Axes - let showTopAxis = (hasval(options) && hasval(options.showTopAxis) ? options.showTopAxis : true); - let showBottomAxis = (hasval(options) && hasval(options.showBottomAxis) ? options.showBottomAxis : true); - let topTimeZone = (hasval(options) && hasval(options.topTimeZone) ? options.topTimeZone : '+0000'); - let bottomTimeZone = (hasval(options) && hasval(options.bottomTimeZone) ? options.bottomTimeZone : '+0000'); - let tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); - let axisLabelAlign = (hasval(options) && hasval(options.axisLabelAlign) ? options.axisLabelAlign : 0.5); + const showTopAxis = (hasval(options) && hasval(options.showTopAxis) ? options.showTopAxis : true); + const showBottomAxis = (hasval(options) && hasval(options.showBottomAxis) ? options.showBottomAxis : true); + const topTimeZone = (hasval(options) && hasval(options.topTimeZone) ? options.topTimeZone : '+0000'); + const bottomTimeZone = (hasval(options) && hasval(options.bottomTimeZone) ? options.bottomTimeZone : '+0000'); + const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60); + const axisLabelAlign = (hasval(options) && hasval(options.axisLabelAlign) ? options.axisLabelAlign : 0.5); // Sizing - let groupLabelInsets = (hasval(options) && hasval(options.groupLabelInsets) ? options.groupLabelInsets : newInsets(6, 10)); - let rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35)); - let rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140); - let rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2); + const groupLabelInsets = (hasval(options) && hasval(options.groupLabelInsets) ? options.groupLabelInsets : newInsets(6, 10)); + const rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35)); + const rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140); + const rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2); let scrollbarWidth = (hasval(options) && hasval(options.scrollbarWidth) ? options.scrollbarWidth : 16); scrollbarWidth = showScrollbar ? scrollbarWidth : 0; // if the scrollbar is not showing, set its width to 0 - let axisPaneHeight = (hasval(options) && hasval(options.axisPaneHeight) ? options.axisPaneHeight : 40); - let draggableEdgeWidth = (hasval(options) && hasval(options.draggableEdgeWidth) ? options.draggableEdgeWidth : 6); - let snapToDistance = (hasval(options) && hasval(options.snapToDistance) ? options.snapToDistance : 10); + const axisPaneHeight = (hasval(options) && hasval(options.axisPaneHeight) ? options.axisPaneHeight : 40); + const draggableEdgeWidth = (hasval(options) && hasval(options.draggableEdgeWidth) ? options.draggableEdgeWidth : 6); + const snapToDistance = (hasval(options) && hasval(options.snapToDistance) ? options.snapToDistance : 10); // Event / Selection - let allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true); - let selectedIntervalMode = (hasval(options) && hasval(options.selectedIntervalMode) ? options.selectedIntervalMode : 'range'); - let centerSelectedIntervalOnDoubleClick = (hasval(options) && hasval(options.centerSelectedIntervalOnDoubleClick) ? options.centerSelectedIntervalOnDoubleClick : true); - let defaultMouseWheelListener = function (ev: PointerEvent) { - let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + const allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true); + const selectedIntervalMode = (hasval(options) && hasval(options.selectedIntervalMode) ? options.selectedIntervalMode : 'range'); + const centerSelectedIntervalOnDoubleClick = (hasval(options) && hasval(options.centerSelectedIntervalOnDoubleClick) ? options.centerSelectedIntervalOnDoubleClick : true); + const defaultMouseWheelListener = function (ev: PointerEvent) { + const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); timeAxis.zoom(zoomFactor, timeAxis.vAtFrac(xFrac(ev))); - } - let mouseWheelListener = (hasval(options) && hasval(options.mouseWheelListener) ? options.mouseWheelListener : defaultMouseWheelListener); + }; + const mouseWheelListener = (hasval(options) && hasval(options.mouseWheelListener) ? options.mouseWheelListener : defaultMouseWheelListener); let outsideManagedUi = false; if (!ui) { - let outsideManagedUi = false; + outsideManagedUi = false; ui = new TimelineUi(model, { allowEventMultiSelection: allowEventMultiSelection }); } else { // remove old panes (if the ui is being reused) - let outsideManagedUi = true; + outsideManagedUi = true; ui.panes.removeAll(); } - let selection = ui.selection; + const selection = ui.selection; - let redraw = function () { + const redraw = function () { drawable.redraw(); }; selection.selectedInterval.changed.on(redraw); @@ -217,11 +217,11 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // cursor doesn't show a vertical or horizontal line) // this check just avoids redrawing unncessarily in the easy-to-verify common case where // no cursors are defined - let redrawCursor = function () { + const redrawCursor = function () { if (!model.cursors.isEmpty) { drawable.redraw(); } - } + }; selection.hoveredY.changed.on(redrawCursor); selection.hoveredTime_PMILLIS.changed.on(redrawCursor); @@ -234,25 +234,25 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Scroll Pane - let tickTimeZone = (showTopAxis ? topTimeZone : bottomTimeZone); - let contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; + const tickTimeZone = (showTopAxis ? topTimeZone : bottomTimeZone); + const contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; let contentPaneArgs; let contentPane: Pane = null; if (showScrollbar) { - let scrollLayout = newVerticalScrollLayout(); - let scrollable = new Pane(scrollLayout, false); + const scrollLayout = newVerticalScrollLayout(); + const scrollable = new Pane(scrollLayout, false); ui.addPane('scroll-content-pane', scrollable); contentPaneArgs = { drawable: drawable, scrollLayout: scrollLayout, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts }; - let scrollContentPane = newTimelineContentPane(contentPaneArgs); + const scrollContentPane = newTimelineContentPane(contentPaneArgs); ui.addPane('content-pane', scrollContentPane); scrollable.addPane(scrollContentPane, 0); - let scrollbar = newVerticalScrollbar(scrollLayout, drawable, scrollbarOptions); + const scrollbar = newVerticalScrollbar(scrollLayout, drawable, scrollbarOptions); ui.addPane('scrollbar', scrollbar); contentPane = new Pane(newColumnLayout(false), false); @@ -272,27 +272,27 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Card Pane Switching Logic - let timelineCardPane = new Pane(newCardLayout()); + const timelineCardPane = new Pane(newCardLayout()); ui.addPane('switch-content-pane', timelineCardPane); - let maximizedContentPane = new Pane(newRowLayout()); + const maximizedContentPane = new Pane(newRowLayout()); ui.addPane('maximize-content-pane', maximizedContentPane); - let insetMaximizedContentPane = newInsetPane(maximizedContentPane, newInsets(0, scrollbarWidth, 0, 0)); + const insetMaximizedContentPane = newInsetPane(maximizedContentPane, newInsets(0, scrollbarWidth, 0, 0)); ui.addPane('inset-maximize-content-pane', insetMaximizedContentPane); - let contentActive = model.root.maximizedRowGuids.isEmpty; + const contentActive = model.root.maximizedRowGuids.isEmpty; timelineCardPane.addPane(insetMaximizedContentPane, !contentActive); timelineCardPane.addPane(contentPane, contentActive); setupRowContainerPane(contentPaneArgs, maximizedContentPane, model.root.maximizedRowGuids, true, 'maximized'); - let updateMaximizedRows = function (rowGuid: string, rowIndex: number) { - let contentActive = model.root.maximizedRowGuids.isEmpty; - timelineCardPane.setLayoutArg(insetMaximizedContentPane, !contentActive); - timelineCardPane.setLayoutArg(contentPane, contentActive); + const updateMaximizedRows = function (rowGuid: string, rowIndex: number) { + const contentActiveInner = model.root.maximizedRowGuids.isEmpty; + timelineCardPane.setLayoutArg(insetMaximizedContentPane, !contentActiveInner); + timelineCardPane.setLayoutArg(contentPane, contentActiveInner); drawable.redraw(); - } + }; model.root.maximizedRowGuids.valueAdded.on(updateMaximizedRows); model.root.maximizedRowGuids.valueRemoved.on(updateMaximizedRows); @@ -300,25 +300,25 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Overlay and Underlay Panes // - let underlayPane = new Pane(newRowLayout()); + const underlayPane = new Pane(newRowLayout()); ui.addPane('underlay-pane', underlayPane); - let axisInsets = newInsets(0, scrollbarWidth, 0, rowLabelPaneWidth); + const axisInsets = newInsets(0, scrollbarWidth, 0, rowLabelPaneWidth); // top time axis pane - let axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive: options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; + const axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive: options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; if (showTopAxis) { - let topAxisPane = newTimeAxisPane(contentPaneArgs, null); + const topAxisPane = newTimeAxisPane(contentPaneArgs, null); ui.addPane('top-axis-pane', topAxisPane); topAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.TOP, topTimeZone, tickTimeZone, axisOpts)); underlayPane.addPane(newInsetPane(topAxisPane, axisInsets), 0, { height: axisPaneHeight, width: null }); } // pane containing pinned rows specified in TimelineRoot.topPinnedRowGuids - let topPinnedPane = new Pane(newRowLayout()); + const topPinnedPane = new Pane(newRowLayout()); ui.addPane('top-pinned-pane', topPinnedPane); - let insetTopPinnedPane = newInsetPane(topPinnedPane, newInsets(0, scrollbarWidth, 0, 0)); + const insetTopPinnedPane = newInsetPane(topPinnedPane, newInsets(0, scrollbarWidth, 0, 0)); ui.addPane('inset-top-pinned-pane', insetTopPinnedPane); setupRowContainerPane(contentPaneArgs, topPinnedPane, model.root.topPinnedRowGuids, false, 'toppinned'); @@ -328,10 +328,10 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: underlayPane.addPane(timelineCardPane, 2, { height: 'pref-max', width: null }); // pane containing pinned rows specified in TimelineRoot.bottomPinnedRowGuids - let bottomPinnedPane = new Pane(newRowLayout()); + const bottomPinnedPane = new Pane(newRowLayout()); ui.addPane('bottom-pinned-pane', bottomPinnedPane); - let insetBottomPinnedPane = newInsetPane(bottomPinnedPane, newInsets(0, scrollbarWidth, 0, 0)); + const insetBottomPinnedPane = newInsetPane(bottomPinnedPane, newInsets(0, scrollbarWidth, 0, 0)); ui.addPane('inset-bottom-pinned-pane', insetBottomPinnedPane); setupRowContainerPane(contentPaneArgs, bottomPinnedPane, model.root.bottomPinnedRowGuids, false, 'bottompinned'); @@ -339,32 +339,32 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // bottom time axis pane if (showBottomAxis) { - let bottomAxisPane = newTimeAxisPane(contentPaneArgs, null); + const bottomAxisPane = newTimeAxisPane(contentPaneArgs, null); ui.addPane('bottom-axis-pane', bottomAxisPane); bottomAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.BOTTOM, bottomTimeZone, tickTimeZone, axisOpts)); underlayPane.addPane(newInsetPane(bottomAxisPane, axisInsets), 4, { height: axisPaneHeight, width: null }); } - let updateMillisPerPx = function () { - let w = underlayPane.viewport.w - axisInsets.left - axisInsets.right; + const updateMillisPerPx = function () { + const w = underlayPane.viewport.w - axisInsets.left - axisInsets.right; ui.millisPerPx.value = timeAxis.tSize_MILLIS / w; }; underlayPane.viewportChanged.on(updateMillisPerPx); timeAxis.limitsChanged.on(updateMillisPerPx); - let timelinePane = new TimelinePane(newOverlayLayout(), model, ui); + const timelinePane = new TimelinePane(newOverlayLayout(), model, ui); ui.addPane('timeline-pane', timelinePane); timelinePane.addPainter(newBackgroundPainter(bgColor)); timelinePane.addPane(underlayPane, true); if (selectedIntervalMode === 'single' || selectedIntervalMode === 'single-unmodifiable') { - let overlayPane = new Pane(null, false, alwaysTrue); + const overlayPane = new Pane(null, false, alwaysTrue); ui.addPane('overlay-pane', overlayPane); overlayPane.addPainter(newTimelineSingleSelectionPainter(timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor)); timelinePane.addPane(newInsetPane(overlayPane, axisInsets, null, false)); } else if (selectedIntervalMode === 'range' || selectedIntervalMode === 'range-unmodifiable') { - let overlayPane = new Pane(null, false, alwaysTrue); + const overlayPane = new Pane(null, false, alwaysTrue); ui.addPane('overlay-pane', overlayPane); overlayPane.addPainter(newTimelineRangeSelectionPainter(timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor)); timelinePane.addPane(newInsetPane(overlayPane, axisInsets, null, false)); @@ -373,17 +373,17 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Enable double click to center selection on mouse if (centerSelectedIntervalOnDoubleClick) { - let doubleClick = function (ev: PointerEvent) { + const doubleClick = function (ev: PointerEvent) { if (selectedIntervalMode === 'single') { if (ev.clickCount > 1) { - let time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + const time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); selection.selectedInterval.setInterval(time_PMILLIS, time_PMILLIS); } } else if (selectedIntervalMode === 'range') { if (ev.clickCount > 1) { - let time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); - let offset_PMILLIS = selection.selectedInterval.start_PMILLIS + 0.5 * selection.selectedInterval.duration_MILLIS; + const time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + const offset_PMILLIS = selection.selectedInterval.start_PMILLIS + 0.5 * selection.selectedInterval.duration_MILLIS; selection.selectedInterval.pan(time_PMILLIS - offset_PMILLIS); } } @@ -393,7 +393,9 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: timelinePane.dispose.on(function () { // only dispose the ui if we created it (and this manage its lifecycle) - if (!outsideManagedUi) ui.dispose.fire(); + if (!outsideManagedUi) { + ui.dispose.fire(); + } selection.selectedInterval.changed.off(redraw); selection.hoveredEvent.changed.off(redraw); selection.hoveredY.changed.off(redrawCursor); @@ -415,20 +417,20 @@ function newTimeIntervalMask(timeAxis: TimeAxis1D, interval: TimeIntervalModel, if (selectedIntervalMode === 'range') { return function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { - let time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); + const time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); // allow a 10 pixel selection buffer to make it easier to grab ends of the selection - let buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; + const buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; return interval.overlaps(time_PMILLIS - buffer_MILLIS, time_PMILLIS + buffer_MILLIS); }; } else if (selectedIntervalMode === 'single') { return function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { - let time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); + const time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); // allow a 10 pixel selection buffer to make it easier to grab the selection - let buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; + const buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10; return time_PMILLIS < interval.cursor_PMILLIS + buffer_MILLIS && time_PMILLIS > interval.cursor_PMILLIS - buffer_MILLIS; }; @@ -458,52 +460,58 @@ function attachTimeAxisMouseListeners(pane: Pane, axis: Axis1D, args: TimelineCo } function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel): Pane { - let timeAxis = args.timeAxis; - let ui = args.ui; - let draggableEdgeWidth = args.options.draggableEdgeWidth; - let scrollLayout = args.scrollLayout; - let drawable = args.drawable; - let selectedIntervalMode = args.options.selectedIntervalMode; - - let input = ui.input; - - let axisPane = new Pane(newOverlayLayout()); - if (scrollLayout) attachTimelineVerticalScrollMouseListeners(axisPane, scrollLayout, drawable); + const timeAxis = args.timeAxis; + const ui = args.ui; + const draggableEdgeWidth = args.options.draggableEdgeWidth; + const scrollLayout = args.scrollLayout; + const drawable = args.drawable; + const selectedIntervalMode = args.options.selectedIntervalMode; + + const input = ui.input; + + const axisPane = new Pane(newOverlayLayout()); + if (scrollLayout) { + attachTimelineVerticalScrollMouseListeners(axisPane, scrollLayout, drawable); + } attachTimeAxisMouseListeners(axisPane, timeAxis, args); - let onMouseMove = function (ev: PointerEvent) { - let time_PMILLIS = timeAxis.tAtFrac_PMILLIS(xFrac(ev)); + const onMouseMove = function (ev: PointerEvent) { + const time_PMILLIS = timeAxis.tAtFrac_PMILLIS(xFrac(ev)); input.mouseMove.fire(ev); input.timeHover.fire(time_PMILLIS, ev); - if (row) input.rowHover.fire(row, ev); + if (row) { + input.rowHover.fire(row, ev); + } }; axisPane.mouseMove.on(onMouseMove); - let onMouseExit = function (ev: PointerEvent) { + const onMouseExit = function (ev: PointerEvent) { input.mouseExit.fire(ev); input.timeHover.fire(null, ev); - if (row) input.rowHover.fire(null, ev); + if (row) { + input.rowHover.fire(null, ev); + } }; axisPane.mouseExit.on(onMouseExit); - let onMouseDown = function (ev: PointerEvent) { + const onMouseDown = function (ev: PointerEvent) { input.mouseDown.fire(ev); }; axisPane.mouseDown.on(onMouseDown); - let onMouseUp = function (ev: PointerEvent) { + const onMouseUp = function (ev: PointerEvent) { input.mouseUp.fire(ev); }; axisPane.mouseUp.on(onMouseUp); - let onContextMenu = function (ev: PointerEvent) { + const onContextMenu = function (ev: PointerEvent) { input.contextMenu.fire(ev); }; axisPane.contextMenu.on(onContextMenu); if (selectedIntervalMode === 'single' || selectedIntervalMode === 'range') { - let selection = ui.selection; - let selectedIntervalPane = new Pane(null, true, newTimeIntervalMask(timeAxis, selection.selectedInterval, selectedIntervalMode)); + const selection = ui.selection; + const selectedIntervalPane = new Pane(null, true, newTimeIntervalMask(timeAxis, selection.selectedInterval, selectedIntervalMode)); attachTimeSelectionMouseListeners(selectedIntervalPane, timeAxis, selection.selectedInterval, input, draggableEdgeWidth, selectedIntervalMode); axisPane.addPane(selectedIntervalPane, false); @@ -536,9 +544,9 @@ function attachTimeSelectionMouseListeners(pane: Pane, if (selectedIntervalMode === 'single') { - let chooseDragMode = function chooseDragMode(ev: PointerEvent): string { + const chooseDragMode = function (ev: PointerEvent): string { return 'center'; - } + }; attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode); @@ -546,7 +554,7 @@ function attachTimeSelectionMouseListeners(pane: Pane, else if (selectedIntervalMode === 'range') { // Edges are draggable when interval is at least this wide - let minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; + const minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; // When dragging an edge, the interval cannot be made narrower than this // @@ -554,17 +562,17 @@ function attachTimeSelectionMouseListeners(pane: Pane, // cover floating-point precision loss -- so a user can't accidentally make // the interval so narrow that it can't easily be widened again. // - let minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; + const minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; - let chooseDragMode = function chooseDragMode(ev: PointerEvent): string { - let intervalWidth = (interval.duration_MILLIS) * ev.paneViewport.w / timeAxis.vSize; + const chooseDragMode = function (ev: PointerEvent): string { + const intervalWidth = (interval.duration_MILLIS) * ev.paneViewport.w / timeAxis.vSize; if (intervalWidth < minIntervalWidthForEdgeDraggability) { // If interval isn't very wide, don't try to allow edge dragging return 'center'; } else { - let time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); - let mouseOffset = (time_PMILLIS - interval.start_PMILLIS) * ev.paneViewport.w / timeAxis.vSize; + const time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); + const mouseOffset = (time_PMILLIS - interval.start_PMILLIS) * ev.paneViewport.w / timeAxis.vSize; if (mouseOffset < draggableEdgeWidth) { // If mouse is near the left edge, drag the interval's start-time return 'start'; @@ -593,14 +601,14 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, chooseDragMode: (ev: PointerEvent) => string) { // see comments in attachTimeSelectionMouseListeners( ... ) - let minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; - let minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; + const minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; + const minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1; // Hook up input notifications // pane.mouseWheel.on(function (ev: PointerEvent) { - let zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); + const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); timeAxis.zoom(zoomFactor, timeAxis.vAtFrac(xFrac(ev))); }); @@ -617,7 +625,7 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, pane.mouseMove.on(function (ev: PointerEvent) { if (!dragMode) { - let mouseCursors = { 'center': 'move', 'start': 'w-resize', 'end': 'e-resize' }; + const mouseCursors = { 'center': 'move', 'start': 'w-resize', 'end': 'e-resize' }; pane.mouseCursor = mouseCursors[chooseDragMode(ev)]; } }); @@ -635,7 +643,7 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, let dragPointer_PMILLIS: number = null; - let updateDragPointer = function (ev: PointerEvent) { + const updateDragPointer = function (ev: PointerEvent) { if (hasval(dragMode)) { dragPointer_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev); } @@ -647,17 +655,17 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, // Dragging interval-center // - let grabCenter = function () { + const grabCenter = function () { if (dragMode === 'center') { dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS; } }; pane.mouseDown.on(grabCenter); - let dragCenter = function () { + const dragCenter = function () { if (dragMode === 'center') { - let newStart_PMILLIS = (dragPointer_PMILLIS - dragOffset_MILLIS); - let newEnd_PMILLIS = interval.end_PMILLIS + (newStart_PMILLIS - interval.start_PMILLIS); + const newStart_PMILLIS = (dragPointer_PMILLIS - dragOffset_MILLIS); + const newEnd_PMILLIS = interval.end_PMILLIS + (newStart_PMILLIS - interval.start_PMILLIS); interval.setInterval(newStart_PMILLIS, newEnd_PMILLIS); } }; @@ -667,17 +675,17 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, // Dragging interval-start // - let grabStart = function () { + const grabStart = function () { if (dragMode === 'start') { dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS; } }; pane.mouseDown.on(grabStart); - let dragStart = function () { + const dragStart = function () { if (dragMode === 'start') { - let wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; - let newStart_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; + const wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; + const newStart_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; interval.start_PMILLIS = Math.min(interval.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS); } }; @@ -687,17 +695,17 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, // Dragging interval-end // - let grabEnd = function () { + const grabEnd = function () { if (dragMode === 'end') { dragOffset_MILLIS = dragPointer_PMILLIS - interval.end_PMILLIS; } }; pane.mouseDown.on(grabEnd); - let dragEnd = function () { + const dragEnd = function () { if (dragMode === 'end') { - let wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; - let newEnd_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; + const wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w; + const newEnd_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS; interval.end_PMILLIS = Math.max(interval.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS); interval.cursor_PMILLIS = interval.end_PMILLIS; } @@ -717,22 +725,22 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, export function newTimelineSingleSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIntervalModel, borderColor: Color, fillColor: Color): Painter { - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let u_Color = new UniformColor(program, 'u_Color'); + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const u_Color = new UniformColor(program, 'u_Color'); // holds vertices for fill and border - let coords = new Float32Array(12 + 8); - let coordsBuffer = newDynamicBuffer(); + const coords = new Float32Array(12 + 8); + const coordsBuffer = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { if (hasval(interval.cursor_PMILLIS)) { - let fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS); - let fracWidth = 1 / viewport.w; - let fracHeight = 1 / viewport.h; - let thickWidth = 3 / viewport.w; - let highlightWidth = 7 / viewport.w; + const fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS); + const fracWidth = 1 / viewport.w; + const fracHeight = 1 / viewport.h; + const thickWidth = 3 / viewport.w; + const highlightWidth = 7 / viewport.w; let index = 0; // fill vertices @@ -771,23 +779,23 @@ export function newTimelineSingleSelectionPainter(timeAxis: TimeAxis1D, interval function newTimelineRangeSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIntervalModel, borderColor: Color, fillColor: Color): Painter { - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let u_Color = new UniformColor(program, 'u_Color'); + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const u_Color = new UniformColor(program, 'u_Color'); // holds vertices for fill and border - let coords = new Float32Array(12 + 8 + 48); - let coordsBuffer = newDynamicBuffer(); + const coords = new Float32Array(12 + 8 + 48); + const coordsBuffer = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { if (hasval(interval.start_PMILLIS) && hasval(interval.end_PMILLIS)) { - let fracStart = timeAxis.tFrac(interval.start_PMILLIS); - let fracEnd = timeAxis.tFrac(interval.end_PMILLIS); - let fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS); - let fracWidth = 1 / viewport.w; - let fracHeight = 1 / viewport.h; - let thickWidth = 3 / viewport.w; + const fracStart = timeAxis.tFrac(interval.start_PMILLIS); + const fracEnd = timeAxis.tFrac(interval.end_PMILLIS); + const fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS); + const fracWidth = 1 / viewport.w; + const fracHeight = 1 / viewport.h; + const thickWidth = 3 / viewport.w; let index = 0; // fill vertices @@ -832,38 +840,38 @@ function newTimelineRangeSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIn function newGroupCollapseExpandArrowPainter(group: TimelineGroupModel) { - let program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); - let a_XyFrac = new Attribute(program, 'a_XyFrac'); - let u_Color = new UniformColor(program, 'u_Color'); + const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); + const a_XyFrac = new Attribute(program, 'a_XyFrac'); + const u_Color = new UniformColor(program, 'u_Color'); // holds vertices for triangle - let coords = new Float32Array(6); - let coordsBuffer = newDynamicBuffer(); + const coords = new Float32Array(6); + const coordsBuffer = newDynamicBuffer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { let sizeFracX = 0.5; - let sizeX = sizeFracX * viewport.w; - let sizeY = sizeX * Math.sqrt(3) / 2; + const sizeX = sizeFracX * viewport.w; + const sizeY = sizeX * Math.sqrt(3) / 2; let sizeFracY = sizeY / viewport.h; - let bufferFracX = 0.05; - let bufferSize = bufferFracX * viewport.w; - let bufferFracY = bufferSize / viewport.h; + const bufferFracX = 0.05; + const bufferSize = bufferFracX * viewport.w; + const bufferFracY = bufferSize / viewport.h; - let centerFracX = 0.5; - let centerFracY = bufferFracY + sizeFracY / 2; + const centerFracX = 0.5; + const centerFracY = bufferFracY + sizeFracY / 2; if (group.collapsed) { sizeFracX = sizeY / viewport.w; sizeFracY = sizeX / viewport.h; - let fracStartX = centerFracX - sizeFracX / 2; - let fracEndX = centerFracX + sizeFracX / 2; + const fracStartX = centerFracX - sizeFracX / 2; + const fracEndX = centerFracX + sizeFracX / 2; - let fracStartY = 1 - (centerFracY - sizeFracY / 2); - let fracEndY = 1 - (centerFracY + sizeFracY / 2); + const fracStartY = 1 - (centerFracY - sizeFracY / 2); + const fracEndY = 1 - (centerFracY + sizeFracY / 2); let index = 0; coords[index++] = fracStartX; @@ -873,11 +881,11 @@ function newGroupCollapseExpandArrowPainter(group: TimelineGroupModel) { coords[index++] = fracStartX; coords[index++] = fracEndY; } else { - let fracStartX = centerFracX - sizeFracX / 2; - let fracEndX = centerFracX + sizeFracX / 2; + const fracStartX = centerFracX - sizeFracX / 2; + const fracEndX = centerFracX + sizeFracX / 2; - let fracStartY = 1 - (centerFracY - sizeFracY / 2); - let fracEndY = 1 - (centerFracY + sizeFracY / 2); + const fracStartY = 1 - (centerFracY - sizeFracY / 2); + const fracEndY = 1 - (centerFracY + sizeFracY / 2); let index = 0; coords[index++] = fracStartX; @@ -897,7 +905,7 @@ function newGroupCollapseExpandArrowPainter(group: TimelineGroupModel) { a_XyFrac.disable(gl); program.endUse(gl); - } + }; } interface TimelineContentPaneOptions { @@ -941,60 +949,60 @@ interface TimelineContentPaneArguments { } function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { - let drawable = args.drawable; - let scrollLayout = args.scrollLayout; - let timeAxis = args.timeAxis; - let model = args.model; - let ui = args.ui; - let options = args.options; - - let root = model.root; - - let selectedIntervalMode = options.selectedIntervalMode; - let rowPaneFactoryChooser = options.rowPaneFactoryChooser; - - let font = options.font; - let fgColor = options.fgColor; - let rowLabelColor = options.rowLabelColor; - let groupLabelColor = options.groupLabelColor; - let groupHighlightColor = options.groupHighlightColor; - let axisLabelColor = options.axisLabelColor; - let bgColor = options.bgColor; - let rowBgColor = options.rowBgColor; - let rowAltBgColor = options.rowAltBgColor; - let gridColor = options.gridColor; - - let gridTimeZone = options.gridTimeZone; - let gridTickSpacing = options.gridTickSpacing; - - let groupLabelInsets = options.groupLabelInsets; - let rowLabelInsets = options.rowLabelInsets; - let rowLabelPaneWidth = options.rowLabelPaneWidth; - let rowSeparatorHeight = options.rowSeparatorHeight; - - let draggableEdgeWidth = options.draggableEdgeWidth; - let snapToDistance = options.snapToDistance; - - let textureRenderer = new TextureRenderer(); - let createGroupLabelTexture = createTextTextureFactory(font); - let createRowLabelTexture = createTextTextureFactory(font); + const drawable = args.drawable; + const scrollLayout = args.scrollLayout; + const timeAxis = args.timeAxis; + const model = args.model; + const ui = args.ui; + const options = args.options; + + const root = model.root; + + const selectedIntervalMode = options.selectedIntervalMode; + const rowPaneFactoryChooser = options.rowPaneFactoryChooser; + + const font = options.font; + const fgColor = options.fgColor; + const rowLabelColor = options.rowLabelColor; + const groupLabelColor = options.groupLabelColor; + const groupHighlightColor = options.groupHighlightColor; + const axisLabelColor = options.axisLabelColor; + const bgColor = options.bgColor; + const rowBgColor = options.rowBgColor; + const rowAltBgColor = options.rowAltBgColor; + const gridColor = options.gridColor; + + const gridTimeZone = options.gridTimeZone; + const gridTickSpacing = options.gridTickSpacing; + + const groupLabelInsets = options.groupLabelInsets; + const rowLabelInsets = options.rowLabelInsets; + const rowLabelPaneWidth = options.rowLabelPaneWidth; + const rowSeparatorHeight = options.rowSeparatorHeight; + + const draggableEdgeWidth = options.draggableEdgeWidth; + const snapToDistance = options.snapToDistance; + + const textureRenderer = new TextureRenderer(); + const createGroupLabelTexture = createTextTextureFactory(font); + const createRowLabelTexture = createTextTextureFactory(font); // Group panes // - let timelineContentPane = new Pane(newRowLayout()); + const timelineContentPane = new Pane(newRowLayout()); - let groupHeaderPanes: StringMap = {}; - let groupContentPanes: StringMap = {}; + const groupHeaderPanes: StringMap = {}; + const groupContentPanes: StringMap = {}; - let addGroup = function (groupGuid: string, groupIndex: number) { - let group = model.group(groupGuid); + const addGroup = function (groupGuid: string, groupIndex: number) { + const group = model.group(groupGuid); - let groupLabel = new Label(group.label, font, groupLabelColor); - let groupLabelPane = new Pane({ updatePrefSize: fitToLabel(groupLabel) }, false); + const groupLabel = new Label(group.label, font, groupLabelColor); + const groupLabelPane = new Pane({ updatePrefSize: fitToLabel(groupLabel) }, false); groupLabelPane.addPainter(newLabelPainter(groupLabel, 0, 1, 0, 1)); - let groupArrowPane = new Pane({ + const groupArrowPane = new Pane({ updatePrefSize: function (parentPrefSize: Size) { parentPrefSize.w = 16; parentPrefSize.h = 0; @@ -1002,50 +1010,50 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { }, false); groupArrowPane.addPainter(newGroupCollapseExpandArrowPainter(group)); - let groupPane = new Pane(newColumnLayout(), false); + const groupPane = new Pane(newColumnLayout(), false); groupPane.addPane(groupArrowPane, 0); groupPane.addPane(groupLabelPane, 1); - let groupButton = newInsetPane(groupPane, groupLabelInsets, bgColor); + const groupButton = newInsetPane(groupPane, groupLabelInsets, bgColor); - let redrawLabel = function () { + const redrawLabel = function () { groupLabel.text = group.label; drawable.redraw(); - } + }; group.attrsChanged.on(redrawLabel); /// handle rollup group row /// - let groupHeaderHighlight = new Pane(newColumnLayout()); + const groupHeaderHighlight = new Pane(newColumnLayout()); groupHeaderHighlight.addPane(newSolidPane(groupHighlightColor), 1, { width: 6, height: null }); - let groupHeaderStripe = new Pane(newRowLayout()); + const groupHeaderStripe = new Pane(newRowLayout()); groupHeaderStripe.addPane(new Pane(null), 0, { height: null }); groupHeaderStripe.addPane(newSolidPane(groupLabelColor), 1, { height: 1 }); groupHeaderStripe.addPane(new Pane(null), 2, { height: null }); - let rollupRow = model.row(group.rollupGuid); + const rollupRow = model.row(group.rollupGuid); let groupHeaderPane: Pane = null; let groupHeaderUnderlay: Pane = null; if (rollupRow) { - let rowBackgroundPanes = newRowBackgroundPanes(args, group.rowGuids, rollupRow); - let rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; - let rowInsetPane = rowBackgroundPanes.rowInsetPane; + const rowBackgroundPanes = newRowBackgroundPanes(args, group.rowGuids, rollupRow); + const rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; + const rowInsetPane = rowBackgroundPanes.rowInsetPane; - let rollupUi = ui.rowUi(rollupRow.rowGuid); + const rollupUi = ui.rowUi(rollupRow.rowGuid); // expose panes in api via TimelineRowUi rollupUi.addPane('background', rowBackgroundPane); rollupUi.addPane('inset', rowInsetPane); - let rollupDataAxis = rollupRow.dataAxis; + const rollupDataAxis = rollupRow.dataAxis; let rollupContentPane: Pane = null; let rollupPaneFactory: TimelineRowPaneFactory = null; - let rollupContentOptions = { timelineFont: font, timelineFgColor: fgColor, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, isMaximized: false, mouseWheelListener: args.options.mouseWheelListener }; - let refreshRollupContentPane = function () { - let newRollupPaneFactory = (rollupUi.paneFactory || rowPaneFactoryChooser(rollupRow)); + const rollupContentOptions = { timelineFont: font, timelineFgColor: fgColor, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, isMaximized: false, mouseWheelListener: args.options.mouseWheelListener }; + const refreshRollupContentPane = function () { + const newRollupPaneFactory = (rollupUi.paneFactory || rowPaneFactoryChooser(rollupRow)); if (newRollupPaneFactory !== rollupPaneFactory) { if (rollupContentPane) { rollupContentPane.dispose.fire(); @@ -1068,7 +1076,7 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { rollupRow.timeseriesGuids.valueRemoved.on(refreshRollupContentPane); refreshRollupContentPane(); - let groupButtonHeaderUnderlay = new Pane(newColumnLayout()); + const groupButtonHeaderUnderlay = new Pane(newColumnLayout()); groupButtonHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); groupButtonHeaderUnderlay.addPane(groupButton, 1); groupButtonHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); @@ -1087,9 +1095,8 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); groupHeaderUnderlay.addPane(groupButton, 1); groupHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); - groupHeaderUnderlay - let groupHeaderOverlay = newTimeAxisPane(args, null); - let groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); + const groupHeaderOverlay = newTimeAxisPane(args, null); + const groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); groupHeaderPane = new Pane(newOverlayLayout()); groupHeaderPane.addPane(groupHeaderUnderlay, true); @@ -1097,10 +1104,10 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { } - let groupContentPane = new Pane(newRowLayout()); + const groupContentPane = new Pane(newRowLayout()); timelineContentPane.updateLayoutArgs(function (layoutArg: any): any { - let shift = (isNumber(layoutArg) && layoutArg >= 2 * groupIndex); + const shift = (isNumber(layoutArg) && layoutArg >= 2 * groupIndex); return (shift ? layoutArg + 2 : layoutArg); }); timelineContentPane.addPane(groupHeaderPane, 2 * groupIndex); @@ -1108,16 +1115,16 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupHeaderPanes[groupGuid] = groupHeaderPane; groupContentPanes[groupGuid] = groupContentPane; - let groupAttrsChanged = function (group: TimelineGroup) { - let groupContentLayoutOpts = timelineContentPane.layoutOptions(groupContentPane); - let groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); + const groupAttrsChanged = function (timelineGroup: TimelineGroup) { + const groupContentLayoutOpts = timelineContentPane.layoutOptions(groupContentPane); + const groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); let redraw = false; - if (group.highlighted !== (!groupHighlightLayoutOpts.hide)) { - groupHighlightLayoutOpts.hide = !group.highlighted; + if (timelineGroup.highlighted !== (!groupHighlightLayoutOpts.hide)) { + groupHighlightLayoutOpts.hide = !timelineGroup.highlighted; redraw = true; } - if (group.collapsed !== groupContentLayoutOpts.hide) { - groupContentLayoutOpts.hide = group.collapsed; + if (timelineGroup.collapsed !== groupContentLayoutOpts.hide) { + groupContentLayoutOpts.hide = timelineGroup.collapsed; redraw = true; } if (redraw) { @@ -1150,28 +1157,28 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { root.groupGuids.forEach(addGroup); root.groupGuids.valueAdded.on(addGroup); - let moveGroup = function (groupGuid: string, groupOldIndex: number, groupNewIndex: number) { - let nMin = Math.min(groupOldIndex, groupNewIndex); - let nMax = Math.max(groupOldIndex, groupNewIndex); + const moveGroup = function (groupGuid: string, groupOldIndex: number, groupNewIndex: number) { + const nMin = Math.min(groupOldIndex, groupNewIndex); + const nMax = Math.max(groupOldIndex, groupNewIndex); for (let n = nMin; n <= nMax; n++) { - let groupGuid = root.groupGuids.valueAt(n); - timelineContentPane.setLayoutArg(groupHeaderPanes[groupGuid], 2 * n); - timelineContentPane.setLayoutArg(groupContentPanes[groupGuid], 2 * n + 1); + const groupGuidTemp = root.groupGuids.valueAt(n); + timelineContentPane.setLayoutArg(groupHeaderPanes[groupGuidTemp], 2 * n); + timelineContentPane.setLayoutArg(groupContentPanes[groupGuidTemp], 2 * n + 1); } drawable.redraw(); }; root.groupGuids.valueMoved.on(moveGroup); - let removeGroup = function (groupGuid: string, groupIndex: number) { - let contentPane: Pane = groupContentPanes[groupGuid]; - let headerPane: Pane = groupHeaderPanes[groupGuid]; + const removeGroup = function (groupGuid: string, groupIndex: number) { + const contentPane: Pane = groupContentPanes[groupGuid]; + const headerPane: Pane = groupHeaderPanes[groupGuid]; contentPane.dispose.fire(); headerPane.dispose.fire(); timelineContentPane.removePane(contentPane); timelineContentPane.removePane(headerPane); timelineContentPane.updateLayoutArgs(function (layoutArg: any): any { - let shift = (isNumber(layoutArg) && layoutArg > 2 * groupIndex + 1); + const shift = (isNumber(layoutArg) && layoutArg > 2 * groupIndex + 1); return (shift ? layoutArg - 2 : layoutArg); }); delete groupHeaderPanes[groupGuid]; @@ -1184,11 +1191,11 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { // Handle listing for hidden property // - let groupAttrsChangedListeners = {}; + const groupAttrsChangedListeners = {}; - let attachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) { - let group = model.group(groupGuid); - let groupAttrsChangedListener = function () { + const attachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) { + const group = model.group(groupGuid); + const groupAttrsChangedListener = function () { if (hasval(group.hidden) && hasval(groupContentPanes[groupGuid])) { timelineContentPane.layoutOptions(groupContentPanes[groupGuid]).hide = group.hidden; @@ -1200,10 +1207,10 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { group.attrsChanged.on(groupAttrsChangedListener); }; - let unattachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) { - let group = model.group(groupGuid); + const unattachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) { + const group = model.group(groupGuid); group.attrsChanged.off(groupAttrsChangedListeners[groupGuid]); - } + }; root.groupGuids.forEach(attachGroupAttrsChangedListener); root.groupGuids.valueAdded.on(attachGroupAttrsChangedListener); @@ -1226,27 +1233,27 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { function newRowBackgroundPainter(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) { return function (gl: WebGLRenderingContext) { - let color = hasval(row.bgColor) ? row.bgColor : (guidList.indexOf(row.rowGuid) % 2 ? args.options.rowBgColor : args.options.rowAltBgColor); + const color = hasval(row.bgColor) ? row.bgColor : (guidList.indexOf(row.rowGuid) % 2 ? args.options.rowBgColor : args.options.rowAltBgColor); gl.clearColor(color.r, color.g, color.b, color.a); gl.clear(GL.COLOR_BUFFER_BIT); }; } function newRowBackgroundPanes(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) { - let rowBackgroundPane = newTimeAxisPane(args, row); + const rowBackgroundPane = newTimeAxisPane(args, row); rowBackgroundPane.addPainter(newRowBackgroundPainter(args, guidList, row)); - let timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; + const timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; rowBackgroundPane.addPainter(newTimeGridPainter(args.timeAxis, false, args.options.gridTimeZone, timeGridOpts)); - let rowInsetTop = args.options.rowSeparatorHeight / 2; - let rowInsetBottom = args.options.rowSeparatorHeight - rowInsetTop; - let rowInsetPane = new Pane(newInsetLayout(newInsets(rowInsetTop, 0, rowInsetBottom, 0)), false); + const rowInsetTop = args.options.rowSeparatorHeight / 2; + const rowInsetBottom = args.options.rowSeparatorHeight - rowInsetTop; + const rowInsetPane = new Pane(newInsetLayout(newInsets(rowInsetTop, 0, rowInsetBottom, 0)), false); rowInsetPane.addPainter(newBorderPainter(args.options.bgColor, { thickness: rowInsetTop, drawRight: false, drawLeft: false, drawBottom: false })); rowInsetPane.addPainter(newBorderPainter(args.options.bgColor, { thickness: rowInsetBottom, drawRight: false, drawLeft: false, drawTop: false })); rowBackgroundPane.addPane(rowInsetPane, true); - let rowOverlayPane = new Pane(null, false); + const rowOverlayPane = new Pane(null, false); rowOverlayPane.addPainter(newBorderPainter(args.options.rowLabelColor, { drawRight: false, drawTop: false, drawBottom: false })); rowBackgroundPane.addPane(rowOverlayPane, false); @@ -1255,46 +1262,46 @@ function newRowBackgroundPanes(args: TimelineContentPaneArguments, guidList: Ord function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: Pane, guidList: OrderedStringSet, isMaximized: boolean, keyPrefix: string) { - let drawable = args.drawable; - let scrollLayout = args.scrollLayout; - let timeAxis = args.timeAxis; - let model = args.model; - let ui = args.ui; - let options = args.options; + const drawable = args.drawable; + const scrollLayout = args.scrollLayout; + const timeAxis = args.timeAxis; + const model = args.model; + const ui = args.ui; + const options = args.options; - let rowPanes: StringMap = {}; + const rowPanes: StringMap = {}; - let addRow = function (rowGuid: string, rowIndex: number) { - let row = model.row(rowGuid); - let rowUi = ui.rowUi(rowGuid); + const addRow = function (rowGuid: string, rowIndex: number) { + const row = model.row(rowGuid); + const rowUi = ui.rowUi(rowGuid); - let rowLabelColorBg: Color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.rowLabelBgColor; - let rowLabelColorFg: Color = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor; - let rowLabelFont: string = hasval(row.labelFont) ? row.labelFont : options.font; + const rowLabelColorBg: Color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.rowLabelBgColor; + const rowLabelColorFg: Color = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor; + const rowLabelFont: string = hasval(row.labelFont) ? row.labelFont : options.font; - let rowLabel = new Label(row.label, rowLabelFont, rowLabelColorFg); - let rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false); + const rowLabel = new Label(row.label, rowLabelFont, rowLabelColorFg); + const rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false); rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5)); - let rowLabelBackground = new Background(rowLabelColorBg); - let rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true); + const rowLabelBackground = new Background(rowLabelColorBg); + const rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true); rowHeaderPane.addPainter(rowLabelBackground.newPainter()); rowHeaderPane.addPane(rowLabelPane); - let rowAttrsChanged = function () { + const rowAttrsChanged = function () { rowLabel.text = row.label; rowLabel.fgColor = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor; rowLabel.font = hasval(row.labelFont) ? row.labelFont : options.font; rowLabelBackground.color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.bgColor; drawable.redraw(); - } + }; row.attrsChanged.on(rowAttrsChanged); - let rowBackgroundPanes = newRowBackgroundPanes(args, guidList, row); - let rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; - let rowInsetPane = rowBackgroundPanes.rowInsetPane; + const rowBackgroundPanes = newRowBackgroundPanes(args, guidList, row); + const rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; + const rowInsetPane = rowBackgroundPanes.rowInsetPane; - let rowPane = new Pane(newColumnLayout()); + const rowPane = new Pane(newColumnLayout()); rowPane.addPane(rowHeaderPane, 0, { width: options.rowLabelPaneWidth }); rowPane.addPane(rowBackgroundPane, 1, { width: null }); @@ -1304,13 +1311,13 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P rowUi.addPane(keyPrefix + '-label', rowLabelPane); rowUi.addPane(keyPrefix + '-header', rowHeaderPane); - let rowDataAxis = row.dataAxis; + const rowDataAxis = row.dataAxis; let rowContentPane: Pane = null; let rowPaneFactory: TimelineRowPaneFactory = null; - let rowContentOptions = { timelineFont: options.font, timelineFgColor: options.fgColor, draggableEdgeWidth: options.draggableEdgeWidth, snapToDistance: options.snapToDistance, isMaximized: isMaximized, mouseWheelListener: options.mouseWheelListener }; - let refreshRowContentPane = function () { - let newRowPaneFactory = (rowUi.paneFactory || options.rowPaneFactoryChooser(row)); + const rowContentOptions = { timelineFont: options.font, timelineFgColor: options.fgColor, draggableEdgeWidth: options.draggableEdgeWidth, snapToDistance: options.snapToDistance, isMaximized: isMaximized, mouseWheelListener: options.mouseWheelListener }; + const refreshRowContentPane = function () { + const newRowPaneFactory = (rowUi.paneFactory || options.rowPaneFactoryChooser(row)); if (newRowPaneFactory !== rowPaneFactory) { if (rowContentPane) { rowContentPane.dispose.fire(); @@ -1334,7 +1341,7 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P refreshRowContentPane(); parentPane.updateLayoutArgs(function (layoutArg: any): any { - let shift = (isNumber(layoutArg) && layoutArg >= rowIndex); + const shift = (isNumber(layoutArg) && layoutArg >= rowIndex); return (shift ? layoutArg + 1 : layoutArg); }); parentPane.addPane(rowPane, rowIndex); @@ -1365,24 +1372,24 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P guidList.forEach(addRow); guidList.valueAdded.on(addRow); - let valueMoved = function (rowGuid: string, rowOldIndex: number, rowNewIndex: number) { - let nMin = Math.min(rowOldIndex, rowNewIndex); - let nMax = Math.max(rowOldIndex, rowNewIndex); + const valueMoved = function (rowGuid: string, rowOldIndex: number, rowNewIndex: number) { + const nMin = Math.min(rowOldIndex, rowNewIndex); + const nMax = Math.max(rowOldIndex, rowNewIndex); for (let n = nMin; n <= nMax; n++) { - let rowGuid = guidList.valueAt(n); - parentPane.setLayoutArg(rowPanes[rowGuid], n); + const rowGuidTemp = guidList.valueAt(n); + parentPane.setLayoutArg(rowPanes[rowGuidTemp], n); } drawable.redraw(); }; guidList.valueMoved.on(valueMoved); - let removeRow = function (rowGuid: string, rowIndex: number) { - let pane: Pane = rowPanes[rowGuid]; + const removeRow = function (rowGuid: string, rowIndex: number) { + const pane: Pane = rowPanes[rowGuid]; pane.dispose.fire(); parentPane.removePane(pane); parentPane.updateLayoutArgs(function (layoutArg: any): any { - let shift = (isNumber(layoutArg) && layoutArg > rowIndex); + const shift = (isNumber(layoutArg) && layoutArg > rowIndex); return (shift ? layoutArg - 1 : layoutArg); }); delete rowPanes[rowGuid]; @@ -1394,11 +1401,11 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P // Handle listing for hidden property // - let attrsChangedListeners = {}; + const attrsChangedListeners = {}; - let attachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { - let row = model.row(rowGuid); - let attrsChangedListener = function () { + const attachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { + const row = model.row(rowGuid); + const attrsChangedListener = function () { if (hasval(row.hidden && hasval(rowPanes[rowGuid]))) { parentPane.layoutOptions(rowPanes[rowGuid]).hide = row.hidden; drawable.redraw(); @@ -1408,10 +1415,10 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P row.attrsChanged.on(attrsChangedListener); }; - let unattachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { - let row = model.row(rowGuid); + const unattachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { + const row = model.row(rowGuid); row.attrsChanged.off(attrsChangedListeners[rowGuid]); - } + }; guidList.forEach(attachAttrsChangedListener); guidList.valueAdded.on(attachAttrsChangedListener); diff --git a/src/webglimpse/timeline/timeline_row.ts b/src/webglimpse/timeline/timeline_row.ts index fca187e..9cba153 100644 --- a/src/webglimpse/timeline/timeline_row.ts +++ b/src/webglimpse/timeline/timeline_row.ts @@ -43,16 +43,12 @@ export interface TimelineRowPaneOptions { mouseWheelListener?: (PointerEvent: PointerEvent) => void; } -export interface TimelineRowPaneFactory { - (drawable: Drawable, +export type TimelineRowPaneFactory = (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, - options: TimelineRowPaneOptions): Pane; -} + options: TimelineRowPaneOptions) => Pane; -export interface TimelineRowPaneFactoryChooser { - (row: TimelineRowModel): TimelineRowPaneFactory; -} +export type TimelineRowPaneFactoryChooser = (row: TimelineRowModel) => TimelineRowPaneFactory; diff --git a/src/webglimpse/timeline/timeline_timeseries_row.ts b/src/webglimpse/timeline/timeline_timeseries_row.ts index e5f5d8b..ea270fc 100644 --- a/src/webglimpse/timeline/timeline_timeseries_row.ts +++ b/src/webglimpse/timeline/timeline_timeseries_row.ts @@ -54,31 +54,29 @@ export interface TimelineTimeseriesPainterOptions { rowBottomPadding: number; } -export interface TimelineTimeseriesPainterFactory { - (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi, options: TimelineTimeseriesPainterOptions): Painter; -} +export type TimelineTimeseriesPainterFactory = (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi, options: TimelineTimeseriesPainterOptions) => Painter; export interface TimelineTimeseriesRowPaneOptions { rowHeight?: number; rowTopPadding?: number; rowBottomPadding?: number; axisOptions?: EdgeAxisPainterOptions; - axisWidth?: number + axisWidth?: number; painterFactories?: TimelineTimeseriesPainterFactory[]; } export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPaneOptions): TimelineRowPaneFactory { return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane { - let rowTopPadding = (hasval(rowOptions) && hasval(rowOptions.rowTopPadding) ? rowOptions.rowTopPadding : 6); - let rowBottomPadding = (hasval(rowOptions) && hasval(rowOptions.rowBottomPadding) ? rowOptions.rowBottomPadding : 6); - let axisWidth = (hasval(rowOptions) && hasval(rowOptions.axisWidth) ? rowOptions.axisWidth : 60); - let painterFactories = (hasval(rowOptions) && hasval(rowOptions.painterFactories) ? rowOptions.painterFactories : []); - let axisOptions = (hasval(rowOptions) && hasval(rowOptions.axisOptions) ? rowOptions.axisOptions : {}); + const rowTopPadding = (hasval(rowOptions) && hasval(rowOptions.rowTopPadding) ? rowOptions.rowTopPadding : 6); + const rowBottomPadding = (hasval(rowOptions) && hasval(rowOptions.rowBottomPadding) ? rowOptions.rowBottomPadding : 6); + const axisWidth = (hasval(rowOptions) && hasval(rowOptions.axisWidth) ? rowOptions.axisWidth : 60); + const painterFactories = (hasval(rowOptions) && hasval(rowOptions.painterFactories) ? rowOptions.painterFactories : []); + const axisOptions = (hasval(rowOptions) && hasval(rowOptions.axisOptions) ? rowOptions.axisOptions : {}); - let keyPrefix = options.isMaximized ? 'maximized-' : ''; + const keyPrefix = options.isMaximized ? 'maximized-' : ''; - let getRowHeight = function () { + const getRowHeight = function () { // maximized rows do not specifiy a height (they should fill available space) if (options.isMaximized) { return null; @@ -95,52 +93,62 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa else { return 135; } - } + }; - let rowHeight: number = getRowHeight(); + const rowHeight: number = getRowHeight(); - let timelineFont = options.timelineFont; - let timelineFgColor = options.timelineFgColor; - let draggableEdgeWidth = options.draggableEdgeWidth; - let snapToDistance = options.snapToDistance; + const timelineFont = options.timelineFont; + const timelineFgColor = options.timelineFgColor; + const draggableEdgeWidth = options.draggableEdgeWidth; + const snapToDistance = options.snapToDistance; - let rowUi = ui.rowUi(row.rowGuid); - let input = ui.input; - let selection = ui.selection; + const rowUi = ui.rowUi(row.rowGuid); + const input = ui.input; + const selection = ui.selection; - if (!hasval(axisOptions.font)) axisOptions.font = timelineFont; - if (!hasval(axisOptions.tickColor)) axisOptions.tickColor = timelineFgColor; - if (!hasval(axisOptions.textColor)) axisOptions.textColor = timelineFgColor; - if (!hasval(axisOptions.showLabel)) axisOptions.showLabel = true; - if (!hasval(axisOptions.shortenLabels)) axisOptions.shortenLabels = false; + if (!hasval(axisOptions.font)) { + axisOptions.font = timelineFont; + } + if (!hasval(axisOptions.tickColor)) { + axisOptions.tickColor = timelineFgColor; + } + if (!hasval(axisOptions.textColor)) { + axisOptions.textColor = timelineFgColor; + } + if (!hasval(axisOptions.showLabel)) { + axisOptions.showLabel = true; + } + if (!hasval(axisOptions.shortenLabels)) { + axisOptions.shortenLabels = false; + } - let redraw = function () { + const redraw = function () { drawable.redraw(); }; // setup pane for data (y) axis painter and mouse listener - let yAxisPane = new Pane({ updatePrefSize: fixedSize(axisWidth, rowHeight) }); + const yAxisPane = new Pane({ updatePrefSize: fixedSize(axisWidth, rowHeight) }); dataAxis.limitsChanged.on(redraw); attachAxisMouseListeners1D(yAxisPane, dataAxis, true); // add listener to update the height of the row if the rowHeight attribute changes - let updateRowHeight = function () { + const updateRowHeight = function () { yAxisPane.layout = { updatePrefSize: fixedSize(axisWidth, getRowHeight()) }; }; row.attrsChanged.on(updateRowHeight); - let isDragMode: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { - let fragment = getNearestFragment(viewport, i, j).fragment; + const isDragMode: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean { + const fragment = getNearestFragment(viewport, i, j).fragment; return hasval(fragment); }; - let rowContentPane = new Pane(newColumnLayout(), true, isDragMode); - let underlayPane = new Pane(newOverlayLayout(), false); - let overlayPane = new Pane(null, false); + const rowContentPane = new Pane(newColumnLayout(), true, isDragMode); + const underlayPane = new Pane(newOverlayLayout(), false); + const overlayPane = new Pane(null, false); - let painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, timelineThickness: 1, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding }; + const painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, timelineThickness: 1, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding }; for (let n = 0; n < painterFactories.length; n++) { - let createPainter = painterFactories[n]; + const createPainter = painterFactories[n]; rowContentPane.addPainter(createPainter(drawable, timeAxis, dataAxis, model, row, ui, painterOptions)); } @@ -158,18 +166,18 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa row.timeseriesGuids.valueMoved.on(redraw); row.timeseriesGuids.valueRemoved.on(redraw); - let addFragmentRedraw = function (fragmentGuid: string) { - let fragment = model.timeseriesFragment(fragmentGuid); + const addFragmentRedraw = function (fragmentGuid: string) { + const fragment = model.timeseriesFragment(fragmentGuid); fragment.dataChanged.on(redraw); - } + }; - let removeFragmentRedraw = function (fragmentGuid: string) { - let fragment = model.timeseriesFragment(fragmentGuid); + const removeFragmentRedraw = function (fragmentGuid: string) { + const fragment = model.timeseriesFragment(fragmentGuid); fragment.dataChanged.off(redraw); - } + }; - let addRedraw = function (timeseriesGuid: string) { - let timeseries = model.timeseries(timeseriesGuid); + const addRedraw = function (timeseriesGuid: string) { + const timeseries = model.timeseries(timeseriesGuid); timeseries.attrsChanged.on(redraw); timeseries.fragmentGuids.valueAdded.on(redraw); timeseries.fragmentGuids.valueRemoved.on(redraw); @@ -181,8 +189,8 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa row.timeseriesGuids.forEach(addRedraw); row.timeseriesGuids.valueAdded.on(addRedraw); - let removeRedraw = function (timeseriesGuid: string) { - let timeseries = model.timeseries(timeseriesGuid); + const removeRedraw = function (timeseriesGuid: string) { + const timeseries = model.timeseries(timeseriesGuid); timeseries.attrsChanged.off(redraw); timeseries.fragmentGuids.valueAdded.off(redraw); timeseries.fragmentGuids.valueRemoved.off(redraw); @@ -190,11 +198,11 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa }; row.timeseriesGuids.valueRemoved.on(removeRedraw); - let timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number { + const timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number { return timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i)); }; - let timeAtPointer_PMILLIS = function (ev: PointerEvent): number { + const timeAtPointer_PMILLIS = function (ev: PointerEvent): number { return timeAtCoords_PMILLIS(ev.paneViewport, ev.i); }; @@ -225,9 +233,9 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa recentMouseMove = null; }); - let uiMillisPerPxChanged = function () { + const uiMillisPerPxChanged = function () { if (!hasval(timeseriesDragMode) && recentMouseMove != null) { - let ev = recentMouseMove; + const ev = recentMouseMove; input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev); } }; @@ -251,39 +259,39 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa // Begin annotation selection // - let getNearestAnnotation = function (viewport: BoundsUnmodifiable, i: number, j: number) { + const getNearestAnnotation = function (viewport: BoundsUnmodifiable, i: number, j: number) { // maximum number of pixels away from a point the mouse can be to select it - let pickBuffer_PIXEL: number = 10; + const pickBuffer_PIXEL = 10; // value per pixel in x and y directions - let vppx: number = ui.millisPerPx.value; - let vppy: number = dataAxis.vSize / rowContentPane.viewport.h; - let pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx; + const vppx: number = ui.millisPerPx.value; + const vppy: number = dataAxis.vSize / rowContentPane.viewport.h; + const pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx; - let ev_time: number = timeAtCoords_PMILLIS(viewport, i); - let ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j)); + const ev_time: number = timeAtCoords_PMILLIS(viewport, i); + const ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j)); let bestAnnotation: TimelineAnnotationModel = null; let best_PIXEL: number = null; if (ev_time) { - for (let i = 0; i < row.annotationGuids.length; i++) { - let annotationGuid: string = row.annotationGuids.valueAt(i); - let annotation: TimelineAnnotationModel = model.annotation(annotationGuid); - let styleGuid: string = annotation.styleGuid; - let style: TimelineAnnotationStyleUi = ui.annotationStyle(styleGuid); + for (let annotationIdx = 0; annotationIdx < row.annotationGuids.length; annotationIdx++) { + const annotationGuid: string = row.annotationGuids.valueAt(annotationIdx); + const annotation: TimelineAnnotationModel = model.annotation(annotationGuid); + const styleGuid: string = annotation.styleGuid; + const style: TimelineAnnotationStyleUi = ui.annotationStyle(styleGuid); - let dy_PIXEL = Math.abs(annotation.y - ev_value) / vppy; - let dx_PIXEL = Math.abs(annotation.time_PMILLIS - ev_time) / vppx; + const dy_PIXEL = Math.abs(annotation.y - ev_value) / vppy; + const dx_PIXEL = Math.abs(annotation.time_PMILLIS - ev_time) / vppx; - let d_PIXEL: number = 0; + let d_PIXEL = 0; if (style.uiHint === 'point') { - let d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL); + d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL); } else if (style.uiHint === 'horizontal-line') { - let d_PIXEL = dy_PIXEL; + d_PIXEL = dy_PIXEL; } else if (style.uiHint === 'vertical-line') { - let d_PIXEL = dx_PIXEL; + d_PIXEL = dx_PIXEL; } if (d_PIXEL < pickBuffer_PIXEL) { @@ -296,19 +304,19 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa } return bestAnnotation; - } + }; - let getNearestAnnotationEvent = function (ev: PointerEvent) { + const getNearestAnnotationEvent = function (ev: PointerEvent) { return getNearestAnnotation(ev.paneViewport, ev.i, ev.j); - } + }; overlayPane.mouseMove.on(function (ev: PointerEvent) { // update selection.hoveredYValue - let y: number = dataAxis.vAtFrac(yFrac(ev)); + const y: number = dataAxis.vAtFrac(yFrac(ev)); selection.hoveredY.value = y; // update selection.hoveredAnnotation - let result = getNearestAnnotationEvent(ev); + const result = getNearestAnnotationEvent(ev); selection.hoveredAnnotation.value = result; }); selection.hoveredAnnotation.changed.on(redraw); @@ -321,7 +329,7 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa // Begin timeseries-drag // - function chooseTimeseriesDragMode(ui: TimelineUi, hoveredTimeseriesFragment: TimelineTimeseriesFragmentModel): string { + function chooseTimeseriesDragMode(timelineUi: TimelineUi, hoveredTimeseriesFragment: TimelineTimeseriesFragmentModel): string { if (!hasval(hoveredTimeseriesFragment)) { return null; } @@ -331,51 +339,51 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa } } - let updateCursor = function () { + const updateCursor = function () { if (!timeseriesDragMode) { - let mouseCursors = { 'xy': 'move', 'y': 'ns-resize' }; + const mouseCursors = { 'xy': 'move', 'y': 'ns-resize' }; rowContentPane.mouseCursor = mouseCursors[chooseTimeseriesDragMode(ui, selection.hoveredTimeseries.fragment)]; } }; ui.millisPerPx.changed.on(updateCursor); selection.hoveredTimeseries.changed.on(updateCursor); - let getNearestFragment = function (viewport: BoundsUnmodifiable, i: number, j: number) { + const getNearestFragment = function (viewport: BoundsUnmodifiable, i: number, j: number) { // maximum number of pixels away from a point the mouse can be to select it - let pickBuffer_PIXEL: number = 10; + const pickBuffer_PIXEL = 10; // value per pixel in x and y directions - let vppx: number = ui.millisPerPx.value; - let vppy: number = dataAxis.vSize / rowContentPane.viewport.h; - let pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx; + const vppx: number = ui.millisPerPx.value; + const vppy: number = dataAxis.vSize / rowContentPane.viewport.h; + const pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx; let bestFragment: TimelineTimeseriesFragmentModel; let bestIndex: number; let best_PIXEL: number; - let ev_time: number = timeAtCoords_PMILLIS(viewport, i); - let ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j)); + const ev_time: number = timeAtCoords_PMILLIS(viewport, i); + const ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j)); if (ev_time) { - for (let i = 0; i < row.timeseriesGuids.length; i++) { - let timeseriesGuid: string = row.timeseriesGuids.valueAt(i); - let timeseries: TimelineTimeseriesModel = model.timeseries(timeseriesGuid); + for (let timeseriesIdx = 0; timeseriesIdx < row.timeseriesGuids.length; timeseriesIdx++) { + const timeseriesGuid: string = row.timeseriesGuids.valueAt(timeseriesIdx); + const timeseries: TimelineTimeseriesModel = model.timeseries(timeseriesGuid); - for (let j = 0; j < timeseries.fragmentGuids.length; j++) { - let fragmentGuid: string = timeseries.fragmentGuids.valueAt(j); - let fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid); + for (let fragmentIdx = 0; fragmentIdx < timeseries.fragmentGuids.length; fragmentIdx++) { + const fragmentGuid: string = timeseries.fragmentGuids.valueAt(fragmentIdx); + const fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid); // fragments should not overlap if (fragment.start_PMILLIS - pickBuffer_PMILLIS < ev_time && fragment.end_PMILLIS + pickBuffer_PMILLIS > ev_time) { // bars are drawn starting at the point and continuing to the next point, so we need to choose the closest index differently - let index: number = timeseries.uiHint === 'bars' ? indexAtOrBefore(fragment.times_PMILLIS, ev_time) : indexNearest(fragment.times_PMILLIS, ev_time); - let value = fragment.data[index]; - let time = fragment.times_PMILLIS[index]; + const index: number = timeseries.uiHint === 'bars' ? indexAtOrBefore(fragment.times_PMILLIS, ev_time) : indexNearest(fragment.times_PMILLIS, ev_time); + const value = fragment.data[index]; + const time = fragment.times_PMILLIS[index]; - let dy_PIXEL = (value - ev_value) / vppy; - let dx_PIXEL = (time - ev_time) / vppx; - let d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL); + const dy_PIXEL = (value - ev_value) / vppy; + const dx_PIXEL = (time - ev_time) / vppx; + const d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL); - let filter = function (): boolean { + const filter = function (): boolean { if (timeseries.uiHint === 'bars') { return (timeseries.baseline < ev_value && ev_value < value) || (timeseries.baseline > ev_value && ev_value > value); @@ -383,7 +391,7 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa else { return d_PIXEL < pickBuffer_PIXEL; } - } + }; if ((!best_PIXEL || d_PIXEL < best_PIXEL) && filter()) { best_PIXEL = d_PIXEL; @@ -398,14 +406,14 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa return { fragment: bestFragment, index: bestIndex }; }; - let getNearestFragmentEvent = function (ev: PointerEvent) { + const getNearestFragmentEvent = function (ev: PointerEvent) { return getNearestFragment(ev.paneViewport, ev.i, ev.j); - } + }; // choose the closest data point to the mouse cursor position and fire an event when it changes rowContentPane.mouseMove.on(function (ev: PointerEvent) { if (!hasval(timeseriesDragMode)) { - let result = getNearestFragmentEvent(ev); + const result = getNearestFragmentEvent(ev); selection.hoveredTimeseries.setValue(result.fragment, result.index); } }); @@ -424,17 +432,17 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa rowContentPane.mouseMove.on(function (ev: PointerEvent) { if (hasval(timeseriesDragMode)) { - let x: number = timeAtPointer_PMILLIS(ev); - let y: number = dataAxis.vAtFrac(yFrac(ev)); + const x: number = timeAtPointer_PMILLIS(ev); + const y: number = dataAxis.vAtFrac(yFrac(ev)); - let fragment = selection.hoveredTimeseries.fragment; - let fragment_time = fragment.times_PMILLIS; + const fragment = selection.hoveredTimeseries.fragment; + const fragment_time = fragment.times_PMILLIS; if (timeseriesDragMode === 'y') { fragment.setData(selection.hoveredTimeseries.index, y); } else if (timeseriesDragMode === 'xy') { - let index = fragment.setData(selection.hoveredTimeseries.index, y, x); + const index = fragment.setData(selection.hoveredTimeseries.index, y, x); if (index !== selection.hoveredTimeseries.index) { selection.hoveredTimeseries.setValue(fragment, index); } @@ -470,7 +478,7 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa row.attrsChanged.off(updateRowHeight); row.timeseriesGuids.forEach(function (timeseriesGuid: string) { - let timeseries = model.timeseries(timeseriesGuid); + const timeseries = model.timeseries(timeseriesGuid); timeseries.attrsChanged.off(redraw); timeseries.fragmentGuids.valueAdded.off(redraw); timeseries.fragmentGuids.valueRemoved.off(redraw); @@ -478,18 +486,18 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa }); return underlayPane; - } + }; } export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterOptions): TimelineTimeseriesPainterFactory { // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter { - let selection: TimelineSelectionModel = ui.selection; - let defaultColor = hasval(options) && hasval(options.timelineFgColor) ? options.timelineFgColor : white; - let defaultThickness = hasval(options) && hasval(options.timelineThickness) ? options.timelineThickness : 1; + const selection: TimelineSelectionModel = ui.selection; + const defaultColor = hasval(options) && hasval(options.timelineFgColor) ? options.timelineFgColor : white; + const defaultThickness = hasval(options) && hasval(options.timelineThickness) ? options.timelineThickness : 1; - let modelview_line_VERTSHADER = concatLines( + const modelview_line_VERTSHADER = concatLines( ' uniform mat4 u_modelViewMatrix; ', ' attribute vec4 a_Position; ', ' attribute float a_Distance; ', @@ -504,7 +512,7 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO ' ' ); - let modelview_pointsize_VERTSHADER = concatLines( + const modelview_pointsize_VERTSHADER = concatLines( ' uniform mat4 u_modelViewMatrix; ', ' attribute vec4 a_Position; ', ' uniform float u_PointSize; ', @@ -516,27 +524,27 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO ' ' ); - let program = new Program(modelview_pointsize_VERTSHADER, solid_FRAGSHADER); + const program = new Program(modelview_pointsize_VERTSHADER, solid_FRAGSHADER); - let u_Color = new UniformColor(program, 'u_Color'); - let u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); - let a_Position = new Attribute(program, 'a_Position'); - let u_PointSize = new Uniform1f(program, 'u_PointSize'); + const u_Color = new UniformColor(program, 'u_Color'); + const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix'); + const a_Position = new Attribute(program, 'a_Position'); + const u_PointSize = new Uniform1f(program, 'u_PointSize'); - let lineProgram = new Program(modelview_line_VERTSHADER, dash_FRAGSHADER); - let u_lpColor = new UniformColor(lineProgram, 'u_Color'); - let u_lpmodelViewMatrix = new UniformMatrix4f(lineProgram, 'u_modelViewMatrix'); - let a_lpPosition = new Attribute(lineProgram, 'a_Position'); - let u_lpPointSize = new Uniform1f(lineProgram, 'u_PointSize'); - let a_lpDistance = new Attribute(lineProgram, 'a_Distance'); - let u_lpDash = new Uniform1f(lineProgram, 'u_Dash'); + const lineProgram = new Program(modelview_line_VERTSHADER, dash_FRAGSHADER); + const u_lpColor = new UniformColor(lineProgram, 'u_Color'); + const u_lpmodelViewMatrix = new UniformMatrix4f(lineProgram, 'u_modelViewMatrix'); + const a_lpPosition = new Attribute(lineProgram, 'a_Position'); + const u_lpPointSize = new Uniform1f(lineProgram, 'u_PointSize'); + const a_lpDistance = new Attribute(lineProgram, 'a_Distance'); + const u_lpDash = new Uniform1f(lineProgram, 'u_Dash'); - let axis = new Axis2D(timeAxis, dataAxis); + const axis = new Axis2D(timeAxis, dataAxis); let xys = new Float32Array(0); let dists = new Float32Array(0); - let xysBuffer = newDynamicBuffer(); - let distBuffer = newDynamicBuffer(); + const xysBuffer = newDynamicBuffer(); + const distBuffer = newDynamicBuffer(); // Painter return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -544,22 +552,22 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); - let baseline: number = 0; + let baseline = 0; for (let i = 0; i < rowModel.timeseriesGuids.length; i++) { // collect fragments and sort them by time let totalSize = 0; - let sortedFragments = new Array(); - let timeseriesGuid = rowModel.timeseriesGuids.valueAt(i); - let timeseries = model.timeseries(timeseriesGuid); + const sortedFragments = new Array(); + const timeseriesGuid = rowModel.timeseriesGuids.valueAt(i); + const timeseries = model.timeseries(timeseriesGuid); for (let j = 0; j < timeseries.fragmentGuids.length; j++) { - let timeseriesFragmentGuid = timeseries.fragmentGuids.valueAt(j); - let fragment = model.timeseriesFragment(timeseriesFragmentGuid); + const timeseriesFragmentGuid = timeseries.fragmentGuids.valueAt(j); + const fragment = model.timeseriesFragment(timeseriesFragmentGuid); sortedFragments.push(fragment); totalSize += fragment.times_PMILLIS.length; } - sortedFragments.sort((a, b) => { return a.start_PMILLIS - b.start_PMILLIS; }); + sortedFragments.sort((a, b) => a.start_PMILLIS - b.start_PMILLIS); if (timeseries.uiHint === 'lines' || timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) { @@ -567,23 +575,23 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO lineProgram.use(gl); u_lpmodelViewMatrix.setData(gl, glOrthoAxis(axis)); - let size = totalSize * 2; + const size = totalSize * 2; xys = ensureCapacityFloat32(xys, size); dists = ensureCapacityFloat32(dists, totalSize); let index = 0; for (let j = 0; j < sortedFragments.length; j++) { - let fragment = sortedFragments[j]; - let data: number[] = fragment.data; - let times_PMILLIS: number[] = fragment.times_PMILLIS; + const fragment = sortedFragments[j]; + const data: number[] = fragment.data; + const times_PMILLIS: number[] = fragment.times_PMILLIS; for (let k = 0; k < data.length; k++ , index += 2) { xys[index] = timeAxis.vAtTime(times_PMILLIS[k]); xys[index + 1] = data[k]; if (k !== 0) { - let x = (timeAxis.vAtTime(times_PMILLIS[k]) - timeAxis.vAtTime(times_PMILLIS[k - 1])); - let y = data[k] - data[k - 1]; + const x = (timeAxis.vAtTime(times_PMILLIS[k]) - timeAxis.vAtTime(times_PMILLIS[k - 1])); + const y = data[k] - data[k - 1]; dists[k] = dists[k - 1] + Math.sqrt(x * x + y * y); } else { @@ -592,13 +600,13 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO } } - let lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + const lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; u_lpColor.setData(gl, lineColor); - let dash = hasval(timeseries.dash) ? timeseries.dash : 0; + const dash = hasval(timeseries.dash) ? timeseries.dash : 0; u_lpDash.setData(gl, dash); - let lineThickness = hasval(timeseries.lineThickness) ? timeseries.lineThickness : defaultThickness; + const lineThickness = hasval(timeseries.lineThickness) ? timeseries.lineThickness : defaultThickness; gl.lineWidth(lineThickness); xysBuffer.setData(xys.subarray(0, index)); @@ -616,7 +624,7 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO // VERTEX_PROGRAM_POINT_SIZE and POINT_SMOOTH aren't defined if (timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points') { - let pointColor = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor; + const pointColor = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor; u_Color.setData(gl, pointColor); u_PointSize.setData(gl, timeseries.pointSize); @@ -633,29 +641,29 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO // but it does not have its own bar drawn, so we need at // least 2 data points to draw any bars if (totalSize >= 2) { - let baseline: number = timeseries.baseline; + baseline = timeseries.baseline; - let size = (totalSize - 1) * 12; + const size = (totalSize - 1) * 12; xys = ensureCapacityFloat32(xys, size); let index = 0; for (let j = 0; j < sortedFragments.length; j++) { - let fragment = sortedFragments[j]; - let data: number[] = fragment.data; - let times_PMILLIS: number[] = fragment.times_PMILLIS; + const fragment = sortedFragments[j]; + const data: number[] = fragment.data; + const times_PMILLIS: number[] = fragment.times_PMILLIS; for (let k = 0; k < data.length - 1; k++) { - let x1 = timeAxis.vAtTime(times_PMILLIS[k]); - let y1 = data[k]; + const x1 = timeAxis.vAtTime(times_PMILLIS[k]); + const y1 = data[k]; - let x2 = timeAxis.vAtTime(times_PMILLIS[k + 1]); - let y2 = data[k + 1]; + const x2 = timeAxis.vAtTime(times_PMILLIS[k + 1]); + const y2 = data[k + 1]; index = putQuadXys(xys, index, x1, x2, y1, baseline); } } - let lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + const lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; u_Color.setData(gl, lineColor); xysBuffer.setData(xys.subarray(0, index)); @@ -670,9 +678,9 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO program.use(gl); u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); - let baseline: number = timeseries.baseline; + baseline = timeseries.baseline; - let size = totalSize * 4; + const size = totalSize * 4; // the last data point defines the right edge of the bar // but it does not have its own bar drawn @@ -680,13 +688,13 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO let index = 0; for (let j = 0; j < sortedFragments.length; j++) { - let fragment = sortedFragments[j]; - let data: number[] = fragment.data; - let times_PMILLIS: number[] = fragment.times_PMILLIS; + const fragment = sortedFragments[j]; + const data: number[] = fragment.data; + const times_PMILLIS: number[] = fragment.times_PMILLIS; for (let k = 0; k < data.length; k++ , index += 4) { - let x1 = timeAxis.vAtTime(times_PMILLIS[k]); - let y1 = data[k]; + const x1 = timeAxis.vAtTime(times_PMILLIS[k]); + const y1 = data[k]; xys[index] = x1; xys[index + 1] = baseline; @@ -696,7 +704,7 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO } } - let lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + const lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; u_Color.setData(gl, lineColor); xysBuffer.setData(xys.subarray(0, index)); @@ -714,27 +722,27 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO u_modelViewMatrix.setData(gl, glOrthoAxis(axis)); if (timeseries.uiHint === 'area' || timeseries.uiHint === 'lines' || timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) { - let size = 8; + const size = 8; xys = ensureCapacityFloat32(xys, size); - let vppx: number = timeAxis.vSize / viewport.w; - let vppy: number = dataAxis.vSize / viewport.h; + const vppx: number = timeAxis.vSize / viewport.w; + const vppy: number = dataAxis.vSize / viewport.h; - let highlightSize = hasval(timeseries.pointSize) ? timeseries.pointSize : 5; + const highlightSize = hasval(timeseries.pointSize) ? timeseries.pointSize : 5; - let bufferx = (highlightSize / 2) * vppx; - let buffery = (highlightSize / 2) * vppy; + const bufferx = (highlightSize / 2) * vppx; + const buffery = (highlightSize / 2) * vppy; - let fragment = selection.hoveredTimeseries.fragment; - let y = selection.hoveredTimeseries.data; - let x = timeAxis.vAtTime(selection.hoveredTimeseries.times_PMILLIS); + const fragment = selection.hoveredTimeseries.fragment; + const y = selection.hoveredTimeseries.data; + const x = timeAxis.vAtTime(selection.hoveredTimeseries.times_PMILLIS); xys[0] = x - bufferx; xys[1] = y - buffery; xys[2] = x + bufferx; xys[3] = y - buffery; xys[4] = x + bufferx; xys[5] = y + buffery; xys[6] = x - bufferx; xys[7] = y + buffery; - let color = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor; + const color = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor; u_Color.setData(gl, darker(color, 0.8)); xysBuffer.setData(xys.subarray(0, size)); @@ -743,25 +751,25 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO gl.drawArrays(GL.LINE_LOOP, 0, size / 2); } else if (timeseries.uiHint === 'bars') { - let size = 8; + const size = 8; xys = ensureCapacityFloat32(xys, size); - let fragment = selection.hoveredTimeseries.fragment; - let index = selection.hoveredTimeseries.index; + const fragment = selection.hoveredTimeseries.fragment; + const index = selection.hoveredTimeseries.index; if (index < fragment.data.length) { - let x1 = timeAxis.vAtTime(fragment.times_PMILLIS[index]); - let y1 = fragment.data[index]; + const x1 = timeAxis.vAtTime(fragment.times_PMILLIS[index]); + const y1 = fragment.data[index]; - let x2 = timeAxis.vAtTime(fragment.times_PMILLIS[index + 1]); - let y2 = fragment.data[index + 1]; + const x2 = timeAxis.vAtTime(fragment.times_PMILLIS[index + 1]); + const y2 = fragment.data[index + 1]; xys[0] = x1; xys[1] = y1; xys[2] = x2; xys[3] = y1; xys[4] = x2; xys[5] = baseline; xys[6] = x1; xys[7] = baseline; - let color = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; + const color = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor; u_Color.setData(gl, darker(color, 0.8)); xysBuffer.setData(xys.subarray(0, size)); @@ -777,7 +785,7 @@ export function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterO // disable shader and attribute buffers a_Position.disable(gl); a_lpDistance.disable(gl); - } - } + }; + }; } diff --git a/src/webglimpse/timeline/timeline_ui.ts b/src/webglimpse/timeline/timeline_ui.ts index 1979d49..a0d1a88 100644 --- a/src/webglimpse/timeline/timeline_ui.ts +++ b/src/webglimpse/timeline/timeline_ui.ts @@ -64,10 +64,10 @@ export class TimelineUi { this._dispose = new Notification(); this._input = new TimelineInput(); - let getPaneId = function (pane: Pane): string { - let paneId = pane['webglimpse_PaneId'] + const getPaneId = function (pane: Pane): string { + const paneId = pane['webglimpse_PaneId']; return hasval(paneId) ? paneId : getObjectId(pane); - } + }; this._panes = new OrderedSet([], getPaneId); @@ -75,17 +75,17 @@ export class TimelineUi { attachTimelineInputToSelection(this._input, this._selection, options); this._groupUis = new OrderedSet([], (g) => g.groupGuid); - let groupUis = this._groupUis; - let addGroupUi = function (group: TimelineGroupModel) { groupUis.add(new TimelineGroupUi(group.groupGuid)); }; - let removeGroupUi = function (group: TimelineGroupModel) { groupUis.removeId(group.groupGuid); }; + const groupUis = this._groupUis; + const addGroupUi = function (group: TimelineGroupModel) { groupUis.add(new TimelineGroupUi(group.groupGuid)); }; + const removeGroupUi = function (group: TimelineGroupModel) { groupUis.removeId(group.groupGuid); }; model.groups.forEach(addGroupUi); model.groups.valueAdded.on(addGroupUi); model.groups.valueRemoved.on(removeGroupUi); this._rowUis = new OrderedSet([], (r) => r.rowGuid); - let rowUis = this._rowUis; - let addRowUi = function (row: TimelineRowModel) { rowUis.add(new TimelineRowUi(row.rowGuid)); } - let removeRowUi = function (row: TimelineRowModel) { rowUis.removeId(row.rowGuid); } + const rowUis = this._rowUis; + const addRowUi = function (row: TimelineRowModel) { rowUis.add(new TimelineRowUi(row.rowGuid)); }; + const removeRowUi = function (row: TimelineRowModel) { rowUis.removeId(row.rowGuid); }; model.rows.forEach(addRowUi); model.rows.valueAdded.on(addRowUi); model.rows.valueRemoved.on(removeRowUi); @@ -154,13 +154,15 @@ export class TimelineUi { if (!hasval(this._imageStatus[url])) { this._imageStatus[url] = true; - let imageCache = this._imageCache; - let image = new Image(); + const imageCache = this._imageCache; + const image = new Image(); image.onload = function () { - let w = image.naturalWidth; - let h = image.naturalHeight; + const w = image.naturalWidth; + const h = image.naturalHeight; imageCache[url] = new Texture2D(w, h, GL.LINEAR, GL.LINEAR, function (g) { g.drawImage(image, 0, 0); }); - if (onLoaded) onLoaded(); + if (onLoaded) { + onLoaded(); + } }; image.src = url; } @@ -215,10 +217,10 @@ export class TimelineRowUi { this._paneFactoryChanged = new Notification(); this._paneFactory = null; - let getPaneId = function (pane: Pane): string { - let paneId = pane['webglimpse_PaneId'] + const getPaneId = function (pane: Pane): string { + const paneId = pane['webglimpse_PaneId']; return hasval(paneId) ? paneId : getObjectId(pane); - } + }; this._panes = new OrderedSet([], getPaneId); } @@ -262,14 +264,14 @@ export class TimelineRowUi { } -let timelineAnnotationStyle_DEFAULT = new TimelineAnnotationStyleUi({ +const timelineAnnotationStyle_DEFAULT = new TimelineAnnotationStyleUi({ styleGuid: 'DEFAULT', color: 'white', icons: [] }); -let timelineEventStyle_DEFAULT = new TimelineEventStyleUi({ +const timelineEventStyle_DEFAULT = new TimelineEventStyleUi({ styleGuid: 'DEFAULT', icons: [] }); @@ -459,7 +461,7 @@ export class TimeIntervalModel { function attachTimelineInputToSelection(input: TimelineInput, selection: TimelineSelectionModel, options: TimelineUiOptions) { - let allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true); + const allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true); // Mouse-pos & Time // @@ -485,10 +487,10 @@ function attachTimelineInputToSelection(input: TimelineInput, selection: Timelin if (options.allowEventMultiSelection) { input.mouseDown.on(function (ev: PointerEvent) { if (isLeftMouseDown(ev.mouseEvent)) { - let event = selection.hoveredEvent.value; + const event = selection.hoveredEvent.value; if (hasval(event)) { - let multiSelectMode = (ev.mouseEvent && (ev.mouseEvent.ctrlKey || ev.mouseEvent.shiftKey)); - let unselectedEventClicked = !selection.selectedEvents.hasValue(event); + const multiSelectMode = (ev.mouseEvent && (ev.mouseEvent.ctrlKey || ev.mouseEvent.shiftKey)); + const unselectedEventClicked = !selection.selectedEvents.hasValue(event); if (multiSelectMode) { if (selection.selectedEvents.hasValue(event)) { selection.selectedEvents.removeValue(event); @@ -513,7 +515,7 @@ function attachTimelineInputToSelection(input: TimelineInput, selection: Timelin else { input.mouseDown.on(function (ev: PointerEvent) { if (isLeftMouseDown(ev.mouseEvent)) { - let event = selection.hoveredEvent.value; + const event = selection.hoveredEvent.value; if (hasval(event)) { selection.selectedEvents.retainValues([event]); selection.selectedEvents.add(event); diff --git a/src/webglimpse/util/binary_tree.ts b/src/webglimpse/util/binary_tree.ts index 6de4b53..41943d6 100644 --- a/src/webglimpse/util/binary_tree.ts +++ b/src/webglimpse/util/binary_tree.ts @@ -120,28 +120,28 @@ export class BinaryTree { // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high) headSet(value: V, inclusive: boolean = true): V[] { - let results: V[] = new Array(); + const results: V[] = new Array(); this.head0(value, inclusive, this._root, results); return results; } // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high) tailSet(value: V, inclusive: boolean = false): V[] { - let results: V[] = new Array(); + const results: V[] = new Array(); this.tail0(value, inclusive, this._root, results); return results; } // Returns all elements between the provided values (sorted from low to high) subSet(low: V, high: V, lowInclusive: boolean = true, highInclusive: boolean = false): V[] { - let results: V[] = new Array(); + const results: V[] = new Array(); this.sub0(low, high, lowInclusive, highInclusive, this._root, results); return results; } // Returns all elements in the tree (sorted from low to high) toArray(): V[] { - let results: V[] = new Array(); + const results: V[] = new Array(); this.addAll0(this._root, results); return results; } @@ -151,7 +151,7 @@ export class BinaryTree { // find the first node by traversing left links down the tree let node: TreeNode = this._root; let down: boolean; - let stack: TreeNode[] = new Array>(); + const stack: TreeNode[] = new Array>(); while (node != null && node.left != null) { stack.push(node); node = node.left; @@ -160,7 +160,7 @@ export class BinaryTree { return { next: function (): V { - let value = node.value; + const value = node.value; // down indicates we should follow the right link if (down && node != null && node.right != null) { @@ -182,7 +182,7 @@ export class BinaryTree { hasNext: function (): boolean { return node != null; } - } + }; } compare(node1: V, node2: V): number { @@ -194,7 +194,7 @@ export class BinaryTree { return null; } - let comp: number = this.compare(value, node.value); + const comp: number = this.compare(value, node.value); if (comp > 0) { return this.contains0(value, node.right); } @@ -223,7 +223,9 @@ export class BinaryTree { // * return this node's value if lower // * otherwise return null candidate = this.lower0(value, node.left, inclusive); - if (candidate == null) candidate = node.value; + if (candidate == null) { + candidate = node.value; + } comp = this.compare(value, candidate); return comp > 0 || (inclusive && comp === 0) ? candidate : null; } @@ -250,7 +252,9 @@ export class BinaryTree { // * return this node's value if higher // * otherwise return null candidate = this.higher0(value, node.right, inclusive); - if (candidate == null) candidate = node.value; + if (candidate == null) { + candidate = node.value; + } comp = this.compare(value, candidate); return comp < 0 || (inclusive && comp === 0) ? candidate : null; } @@ -266,13 +270,13 @@ export class BinaryTree { } // low end of range is above node value - let compLow: number = this.compare(low, node.value); + const compLow: number = this.compare(low, node.value); if (compLow > 0 || (compLow === 0 && !lowInclusive)) { return this.sub0(low, high, lowInclusive, highInclusive, node.right, results); } // high end of range is below node value - let compHigh: number = this.compare(high, node.value); + const compHigh: number = this.compare(high, node.value); if (compHigh < 0 || (compHigh === 0 && !highInclusive)) { return this.sub0(low, high, lowInclusive, highInclusive, node.left, results); } @@ -288,7 +292,7 @@ export class BinaryTree { return; } - let comp: number = this.compare(value, node.value); + const comp: number = this.compare(value, node.value); if (comp < 0 || (comp === 0 && inclusive)) { this.head0(value, inclusive, node.left, results); results.push(node.value); @@ -304,7 +308,7 @@ export class BinaryTree { return; } - let comp: number = this.compare(value, node.value); + const comp: number = this.compare(value, node.value); if (comp > 0 || (comp === 0 && inclusive)) { this.addAll0(node.left, results); results.push(node.value); @@ -336,7 +340,7 @@ export class BinaryTree { } // find and remove the node - let comp: number = this.compare(value, node.value); + const comp: number = this.compare(value, node.value); if (comp < 0) { node.left = this.remove0(value, node.left); } @@ -348,12 +352,12 @@ export class BinaryTree { return null; } else if (node.left == null) { - let lower = node.getSuccessor(); + const lower = node.getSuccessor(); node.right = this.remove0(lower.value, node.right); node.value = lower.value; } else { - let lower = node.getPredecessor(); + const lower = node.getPredecessor(); node.left = this.remove0(lower.value, node.left); node.value = lower.value; } @@ -387,7 +391,7 @@ export class BinaryTree { // lower the level of nodes which violate invariants 1, 2, and/or 3 private decreaseLevel0(node: TreeNode): TreeNode { - let correctLevel = Math.min(this.level0(node.left), this.level0(node.right)) + 1; + const correctLevel = Math.min(this.level0(node.left), this.level0(node.right)) + 1; if (correctLevel < node.level) { node.level = correctLevel; @@ -409,7 +413,7 @@ export class BinaryTree { } // find the appropriate spot and insert the node - let comp: number = this.compare(value, node.value); + const comp: number = this.compare(value, node.value); if (comp < 0) { node.left = this.insert0(value, node.left); } @@ -438,7 +442,7 @@ export class BinaryTree { } else if (node.left.level === node.level) { // swap the pointers of the horizontal (same level value) left links - let left = node.left; + const left = node.left; node.left = left.right; left.right = node; return left; @@ -458,7 +462,7 @@ export class BinaryTree { else if (node.level === node.right.right.level) { // two horizontal (same level value) right links // take the middle node, elevate it, and return it - let right = node.right; + const right = node.right; node.right = right.left; right.left = node; right.level = right.level + 1; diff --git a/src/webglimpse/util/cache.ts b/src/webglimpse/util/cache.ts index dff3ad9..6e0816e 100644 --- a/src/webglimpse/util/cache.ts +++ b/src/webglimpse/util/cache.ts @@ -38,7 +38,7 @@ export interface CacheHelper { class CacheEntry { value: V; - touched: boolean = false; + touched = false; constructor(value: V) { this.value = value; @@ -59,14 +59,14 @@ export class Cache { if (!this.map.hasOwnProperty(key)) { this.map[key] = new CacheEntry(this.helper.create(key)); } - let en = this.map[key]; + const en = this.map[key]; en.touched = true; return en.value; } clear() { - for (let k in this.map) { + for (const k in this.map) { if (this.map.hasOwnProperty(k)) { this.helper.dispose(this.map[k].value, k); } @@ -88,12 +88,12 @@ export class Cache { } retain(key: string) { - let newMap: { [k: string]: CacheEntry; } = {}; + const newMap: { [k: string]: CacheEntry; } = {}; if (this.map.hasOwnProperty(key)) { newMap[key] = this.map[key]; delete this.map[key]; } - for (let k in this.map) { + for (const k in this.map) { if (this.map.hasOwnProperty(k)) { this.helper.dispose(this.map[k].value, k); } @@ -102,15 +102,15 @@ export class Cache { } retainAll(keys: string[]) { - let newMap: { [key: string]: CacheEntry; } = {}; + const newMap: { [key: string]: CacheEntry; } = {}; for (let i = 0; i < keys.length; i++) { - let k = keys[i]; + const k = keys[i]; if (this.map.hasOwnProperty(k)) { newMap[k] = this.map[k]; delete this.map[k]; } } - for (let k2 in this.map) { + for (const k2 in this.map) { if (this.map.hasOwnProperty(k2)) { this.helper.dispose(this.map[k2].value, k2); } @@ -119,7 +119,7 @@ export class Cache { } resetTouches() { - for (let k in this.map) { + for (const k in this.map) { if (this.map.hasOwnProperty(k)) { this.map[k].touched = false; } @@ -127,10 +127,10 @@ export class Cache { } retainTouched() { - let newMap: { [k: string]: CacheEntry; } = {}; - for (let k in this.map) { + const newMap: { [k: string]: CacheEntry; } = {}; + for (const k in this.map) { if (this.map.hasOwnProperty(k)) { - let en = this.map[k]; + const en = this.map[k]; if (en.touched) { newMap[k] = this.map[k]; } diff --git a/src/webglimpse/util/multikey_cache.ts b/src/webglimpse/util/multikey_cache.ts index 02428ef..9a4caf2 100644 --- a/src/webglimpse/util/multikey_cache.ts +++ b/src/webglimpse/util/multikey_cache.ts @@ -39,7 +39,7 @@ export interface MultiKeyCacheHelper { class MultiKeyCacheEntry { keyParts: string[]; value: V; - touched: boolean = false; + touched = false; constructor(keyParts: string[], value: V) { this.keyParts = keyParts; @@ -58,12 +58,12 @@ export class MultiKeyCache { } private combineKeyParts(keyParts: string[]): string { - let esc = '\\'; - let sep = ';'; - let escapedEsc = esc + esc; - let escapedSep = esc + sep; + const esc = '\\'; + const sep = ';'; + const escapedEsc = esc + esc; + const escapedSep = esc + sep; - let escapedParts = []; + const escapedParts = []; for (let n = 0; n < keyParts.length; n++) { escapedParts[n] = keyParts[n].replace(esc, escapedEsc).replace(sep, escapedSep); } @@ -71,35 +71,35 @@ export class MultiKeyCache { } value(...keyParts: string[]): V { - let key = this.combineKeyParts(keyParts); + const key = this.combineKeyParts(keyParts); if (!this.map.hasOwnProperty(key)) { this.map[key] = new MultiKeyCacheEntry(keyParts, this.helper.create(keyParts)); } - let en = this.map[key]; + const en = this.map[key]; en.touched = true; return en.value; } remove(...keyParts: string[]) { - let key = this.combineKeyParts(keyParts); + const key = this.combineKeyParts(keyParts); if (this.map.hasOwnProperty(key)) { - let en = this.map[key]; + const en = this.map[key]; this.helper.dispose(en.value, en.keyParts); delete this.map[key]; } } retain(...keyParts: string[]) { - let newMap: { [k: string]: MultiKeyCacheEntry; } = {}; - let retainKey = this.combineKeyParts(keyParts); + const newMap: { [k: string]: MultiKeyCacheEntry; } = {}; + const retainKey = this.combineKeyParts(keyParts); if (this.map.hasOwnProperty(retainKey)) { newMap[retainKey] = this.map[retainKey]; delete this.map[retainKey]; } - for (let key in this.map) { + for (const key in this.map) { if (this.map.hasOwnProperty(key)) { - let en = this.map[key]; + const en = this.map[key]; this.helper.dispose(en.value, en.keyParts); } } @@ -107,7 +107,7 @@ export class MultiKeyCache { } resetTouches() { - for (let key in this.map) { + for (const key in this.map) { if (this.map.hasOwnProperty(key)) { this.map[key].touched = false; } @@ -115,10 +115,10 @@ export class MultiKeyCache { } retainTouched() { - let newMap: { [key: string]: MultiKeyCacheEntry; } = {}; - for (let key in this.map) { + const newMap: { [key: string]: MultiKeyCacheEntry; } = {}; + for (const key in this.map) { if (this.map.hasOwnProperty(key)) { - let en = this.map[key]; + const en = this.map[key]; if (en.touched) { newMap[key] = this.map[key]; } @@ -131,9 +131,9 @@ export class MultiKeyCache { } clear() { - for (let key in this.map) { + for (const key in this.map) { if (this.map.hasOwnProperty(key)) { - let en = this.map[key]; + const en = this.map[key]; this.helper.dispose(en.value, en.keyParts); } } diff --git a/src/webglimpse/util/notification.ts b/src/webglimpse/util/notification.ts index 13d609e..23f8f29 100644 --- a/src/webglimpse/util/notification.ts +++ b/src/webglimpse/util/notification.ts @@ -30,51 +30,29 @@ import { OrderedSet } from './ordered_set'; import { getObjectId } from './util'; -export interface Listener { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - (): any; -} +export type Listener = () => any; -export interface Listener1 { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - (a: A): any; -} +export type Listener1 = (a: A) => any; -export interface Listener2 { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - (a: A, b: B): any; -} +export type Listener2 = (a: A, b: B) => any; -export interface Listener3 { - /** - * A truthy return value indicates the event was consumed by the listener and no other listeners should be notified - */ - (a: A, b: B, c: C): any; -} +export type Listener3 = (a: A, b: B, c: C) => any; -interface Action { - (): void; -} +type Action = () => void; export class Notification { private _listeners: OrderedSet = new OrderedSet([], getObjectId, false); - private _deferring: boolean = false; + private _deferring = false; private _deferred: Action[] = []; on(listener: Listener) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { @@ -84,7 +62,7 @@ export class Notification { off(listener: Listener) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { @@ -100,8 +78,10 @@ export class Notification { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { - let consumed = this._listeners.valueAt(n)(); - if (consumed) return consumed; + const consumed = this._listeners.valueAt(n)(); + if (consumed) { + return consumed; + } } return false; } @@ -120,12 +100,12 @@ export class Notification { export class Notification1 { private _listeners: OrderedSet> = new OrderedSet>([], getObjectId, false); - private _deferring: boolean = false; + private _deferring = false; private _deferred: Action[] = []; on(listener: Listener1) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { @@ -135,7 +115,7 @@ export class Notification1 { off(listener: Listener1) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { @@ -151,8 +131,10 @@ export class Notification1 { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { - let consumed = this._listeners.valueAt(n)(a); - if (consumed) return consumed; + const consumed = this._listeners.valueAt(n)(a); + if (consumed) { + return consumed; + } } return false; } @@ -171,12 +153,12 @@ export class Notification1 { export class Notification2 { private _listeners: OrderedSet> = new OrderedSet>([], getObjectId, false); - private _deferring: boolean = false; + private _deferring = false; private _deferred: Action[] = []; on(listener: Listener2) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { @@ -186,7 +168,7 @@ export class Notification2 { off(listener: Listener2) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { @@ -202,8 +184,10 @@ export class Notification2 { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { - let consumed = this._listeners.valueAt(n)(a, b); - if (consumed) return consumed; + const consumed = this._listeners.valueAt(n)(a, b); + if (consumed) { + return consumed; + } } return false; } @@ -222,12 +206,12 @@ export class Notification2 { export class Notification3 { private _listeners: OrderedSet> = new OrderedSet>([], getObjectId, false); - private _deferring: boolean = false; + private _deferring = false; private _deferred: Action[] = []; on(listener: Listener3) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { @@ -237,7 +221,7 @@ export class Notification3 { off(listener: Listener3) { if (this._deferring) { - let self = this; + const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { @@ -253,8 +237,10 @@ export class Notification3 { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { - let consumed = this._listeners.valueAt(n)(a, b, c); - if (consumed) return consumed; + const consumed = this._listeners.valueAt(n)(a, b, c); + if (consumed) { + return consumed; + } } return false; } diff --git a/src/webglimpse/util/ordered_set.ts b/src/webglimpse/util/ordered_set.ts index 4d7c2a0..fdfccc1 100644 --- a/src/webglimpse/util/ordered_set.ts +++ b/src/webglimpse/util/ordered_set.ts @@ -58,8 +58,8 @@ export class OrderedSet { this._indexes = {}; this._valuesMap = {}; for (let n = 0; n < this._valuesArray.length; n++) { - let value = this._valuesArray[n]; - let id = requireString(this._idOf(value)); + const value = this._valuesArray[n]; + const id = requireString(this._idOf(value)); this._ids[n] = id; this._indexes[id] = n; this._valuesMap[id] = value; @@ -203,23 +203,27 @@ export class OrderedSet { add(value: V, index?: number, moveIfExists?: boolean) { index = (hasval(index) ? index : this._valuesArray.length); - if (!hasval(moveIfExists)) moveIfExists = false; + if (!hasval(moveIfExists)) { + moveIfExists = false; + } this._add(value, index, moveIfExists); } addAll(values: V[], index?: number, moveIfExists?: boolean) { index = (hasval(index) ? index : this._valuesArray.length); - if (!hasval(moveIfExists)) moveIfExists = false; + if (!hasval(moveIfExists)) { + moveIfExists = false; + } for (let n = 0; n < values.length; n++) { - let actualIndex = this._add(values[n], index, moveIfExists); + const actualIndex = this._add(values[n], index, moveIfExists); index = actualIndex + 1; } } private _add(value: V, newIndex: number, moveIfExists: boolean): number { - let id = requireString(this._idOf(value)); + const id = requireString(this._idOf(value)); - let oldIndex = this._indexes[id]; + const oldIndex = this._indexes[id]; if (!hasval(oldIndex)) { this._ids.splice(newIndex, 0, id); this._valuesArray.splice(newIndex, 0, value); @@ -268,7 +272,7 @@ export class OrderedSet { removeId(id: string) { if (isString(id)) { - let index = this._indexes[id]; + const index = this._indexes[id]; if (hasval(index)) { this._remove(id, index); } @@ -276,7 +280,7 @@ export class OrderedSet { } removeIndex(index: number) { - let id = this._ids[index]; + const id = this._ids[index]; if (isString(id)) { this._remove(id, index); } @@ -285,15 +289,15 @@ export class OrderedSet { removeAll() { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { - let id = this._ids[n]; + const id = this._ids[n]; this._remove(id, n); } } retainValues(values: V[]) { - let idsToRetain: StringMap = {}; + const idsToRetain: StringMap = {}; for (let n = 0; n < values.length; n++) { - let id = this._idOf(values[n]); + const id = this._idOf(values[n]); if (isString(id)) { idsToRetain[id] = true; } @@ -302,9 +306,9 @@ export class OrderedSet { } retainIds(ids: string[]) { - let idsToRetain: StringMap = {}; + const idsToRetain: StringMap = {}; for (let n = 0; n < ids.length; n++) { - let id = ids[n]; + const id = ids[n]; if (isString(id)) { idsToRetain[id] = true; } @@ -313,9 +317,9 @@ export class OrderedSet { } retainIndices(indices: number[]) { - let idsToRetain: StringMap = {}; + const idsToRetain: StringMap = {}; for (let n = 0; n < indices.length; n++) { - let id = this._ids[indices[n]]; + const id = this._ids[indices[n]]; idsToRetain[id] = true; } this._retain(idsToRetain); @@ -324,7 +328,7 @@ export class OrderedSet { private _retain(ids: StringMap) { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { - let id = this._ids[n]; + const id = this._ids[n]; if (!ids.hasOwnProperty(id)) { this._remove(id, n); } @@ -332,7 +336,7 @@ export class OrderedSet { } private _remove(id: string, index: number) { - let value = this._valuesArray[index]; + const value = this._valuesArray[index]; this._ids.splice(index, 1); this._valuesArray.splice(index, 1); delete this._indexes[id]; @@ -359,7 +363,7 @@ export class OrderedStringSet { this._valuesArray = []; this._indexes = {}; for (let n = 0; n < values.length; n++) { - let value = requireString(values[n]); + const value = requireString(values[n]); this._valuesArray[n] = value; this._indexes[value] = n; } @@ -473,15 +477,19 @@ export class OrderedStringSet { add(value: string, index?: number, moveIfExists?: boolean) { index = (hasval(index) ? index : this._valuesArray.length); - if (!hasval(moveIfExists)) moveIfExists = false; + if (!hasval(moveIfExists)) { + moveIfExists = false; + } this._add(value, index, moveIfExists); } addAll(values: string[], index?: number, moveIfExists?: boolean) { index = (hasval(index) ? index : this._valuesArray.length); - if (!hasval(moveIfExists)) moveIfExists = false; + if (!hasval(moveIfExists)) { + moveIfExists = false; + } for (let n = 0; n < values.length; n++) { - let actualIndex = this._add(values[n], index, moveIfExists); + const actualIndex = this._add(values[n], index, moveIfExists); index = actualIndex + 1; } } @@ -489,7 +497,7 @@ export class OrderedStringSet { private _add(value: string, newIndex: number, moveIfExists: boolean): number { requireString(value); - let oldIndex = this._indexes[value]; + const oldIndex = this._indexes[value]; if (!hasval(oldIndex)) { this._valuesArray.splice(newIndex, 0, value); for (let n = newIndex; n < this._valuesArray.length; n++) { @@ -529,7 +537,7 @@ export class OrderedStringSet { removeValue(value: string) { if (isString(value)) { - let index = this._indexes[value]; + const index = this._indexes[value]; if (hasval(index)) { this._remove(value, index); } @@ -537,7 +545,7 @@ export class OrderedStringSet { } removeIndex(index: number) { - let value = this._valuesArray[index]; + const value = this._valuesArray[index]; if (isString(value)) { this._remove(value, index); } @@ -546,15 +554,15 @@ export class OrderedStringSet { removeAll() { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { - let value = this._valuesArray[n]; + const value = this._valuesArray[n]; this._remove(value, n); } } retainValues(values: string[]) { - let valuesToRetain: StringMap = {}; + const valuesToRetain: StringMap = {}; for (let n = 0; n < values.length; n++) { - let value = values[n]; + const value = values[n]; if (isString(value)) { valuesToRetain[value] = true; } @@ -563,9 +571,9 @@ export class OrderedStringSet { } retainIndices(indices: number[]) { - let valuesToRetain: StringMap = {}; + const valuesToRetain: StringMap = {}; for (let n = 0; n < indices.length; n++) { - let value = this._valuesArray[indices[n]]; + const value = this._valuesArray[indices[n]]; valuesToRetain[value] = true; } this._retain(valuesToRetain); @@ -574,7 +582,7 @@ export class OrderedStringSet { private _retain(values: StringMap) { // Remove from last to first, to minimize index shifting for (let n = this._valuesArray.length - 1; n >= 0; n--) { - let value = this._valuesArray[n]; + const value = this._valuesArray[n]; if (!values.hasOwnProperty(value)) { this._remove(value, n); } diff --git a/src/webglimpse/util/sorted_arrays.ts b/src/webglimpse/util/sorted_arrays.ts index 03fe25f..e581dbc 100644 --- a/src/webglimpse/util/sorted_arrays.ts +++ b/src/webglimpse/util/sorted_arrays.ts @@ -38,8 +38,9 @@ export function indexOf(vs: number[], x: number): number { while (a <= b) { // Bitwise-or-zero truncates to integer - let pivot = ((a + b) / 2) | 0; - let vPivot = vs[pivot]; + // tslint:disable-next-line:no-bitwise + const pivot = ((a + b) / 2) | 0; + const vPivot = vs[pivot]; if (vPivot < x) { a = pivot + 1; @@ -59,20 +60,26 @@ export function indexOf(vs: number[], x: number): number { export function indexNearest(vs: number[], x: number): number { - let i = indexOf(vs, x); + const i = indexOf(vs, x); // Exact value found - if (i >= 0) return i; + if (i >= 0) { + return i; + } // Find the closer of the adjacent values - let iAfter = -i - 1; - let iBefore = iAfter - 1; + const iAfter = -i - 1; + const iBefore = iAfter - 1; - if (iAfter >= vs.length) return iBefore; - if (iBefore < 0) return iAfter; + if (iAfter >= vs.length) { + return iBefore; + } + if (iBefore < 0) { + return iAfter; + } - let diffAfter = vs[iAfter] - x; - let diffBefore = x - vs[iBefore]; + const diffAfter = vs[iAfter] - x; + const diffBefore = x - vs[iBefore]; return (diffAfter <= diffBefore ? iAfter : iBefore); } @@ -80,15 +87,19 @@ export function indexNearest(vs: number[], x: number): number { export function indexAfter(vs: number[], x: number): number { - let i = indexOf(vs, x); + const i = indexOf(vs, x); // Exact value not found - if (i < 0) return (-i - 1); + if (i < 0) { + return (-i - 1); + } // If the exact value was found, find the value's last occurrence - let n = vs.length; + const n = vs.length; for (let j = i + 1; j < n; j++) { - if (vs[j] > x) return j; + if (vs[j] > x) { + return j; + } } return n; } @@ -96,15 +107,19 @@ export function indexAfter(vs: number[], x: number): number { export function indexAtOrAfter(vs: number[], x: number): number { - let i = indexOf(vs, x); + const i = indexOf(vs, x); // Exact value not found - if (i < 0) return (-i - 1); + if (i < 0) { + return (-i - 1); + } // If the exact value was found, find the value's first occurrence - let n = vs.length; + const n = vs.length; for (let j = i; j > 0; j--) { - if (vs[j - 1] < x) return j; + if (vs[j - 1] < x) { + return j; + } } return 0; } diff --git a/src/webglimpse/util/sorted_multimap.ts b/src/webglimpse/util/sorted_multimap.ts index 6484771..a8b5715 100644 --- a/src/webglimpse/util/sorted_multimap.ts +++ b/src/webglimpse/util/sorted_multimap.ts @@ -41,17 +41,17 @@ export class SortedMultimap { this._idFn = idFn; } - private createContainerComparator(comparator: Comparator): Comparator> { + private createContainerComparator(comparator: Comparator): Comparator> { return { - compare: function (container1: Container, container2: Container): number { + compare: function (container1: Container, container2: Container): number { return comparator.compare(container1.key, container2.key); } - } + }; } // Inserts the value into the tree. Nothing is inserted if the value already exists insert(key: K, value: V) { - let wrappedKey = new Container(key); + const wrappedKey = new Container(key); let values: Container = this._tree.getValue(wrappedKey); if (values === null) { @@ -63,10 +63,12 @@ export class SortedMultimap { } remove(key: K, value: V) { - let wrappedKey = new Container(key); - let values: Container = this._tree.getValue(wrappedKey); + const wrappedKey = new Container(key); + const values: Container = this._tree.getValue(wrappedKey); - if (values === null) return; + if (values === null) { + return; + } values.remove(value, this._idFn); @@ -76,8 +78,8 @@ export class SortedMultimap { } contains(key: K, value: V) { - let wrappedKey = new Container(key); - let values: Container = this._tree.getValue(wrappedKey); + const wrappedKey = new Container(key); + const values: Container = this._tree.getValue(wrappedKey); if (values === null) { return false; @@ -119,9 +121,9 @@ export class SortedMultimap { // Returns all elements between the provided values (sorted from low to high) subSet(low: K, high: K, lowInclusive: boolean = true, highInclusive: boolean = false): V[] { - let wrappedLow = new Container(low); - let wrappedHigh = new Container(high); - let values: Container[] = this._tree.subSet(wrappedLow, wrappedHigh, lowInclusive, highInclusive); + const wrappedLow = new Container(low); + const wrappedHigh = new Container(high); + const values: Container[] = this._tree.subSet(wrappedLow, wrappedHigh, lowInclusive, highInclusive); return this.unwrapArray(values); } @@ -132,9 +134,9 @@ export class SortedMultimap { iterator(): Iterator { - let iter: Iterator> = this._tree.iterator(); + const iter: Iterator> = this._tree.iterator(); let currentArray: V[] = null; - let currentIndex: number = 0; + let currentIndex = 0; return { next: function (): V { @@ -157,7 +159,7 @@ export class SortedMultimap { hasNext: function (): boolean { return iter.hasNext() || (currentArray != null && currentIndex < currentArray.length); } - } + }; } private wrap(key: K): Container { @@ -174,10 +176,10 @@ export class SortedMultimap { } private unwrapArray(values: Container[]): V[] { - let unwrappedValues: V[] = new Array(); + const unwrappedValues: V[] = new Array(); values.forEach(function (value: Container) { - value.toArray().forEach(function (value: V) { - unwrappedValues.push(value); + value.toArray().forEach(function (val: V) { + unwrappedValues.push(val); }); }); diff --git a/src/webglimpse/util/split.ts b/src/webglimpse/util/split.ts index c58faa8..e1b20c4 100644 --- a/src/webglimpse/util/split.ts +++ b/src/webglimpse/util/split.ts @@ -30,7 +30,7 @@ import { Notification } from './notification'; export function initSplitContainer(container: HTMLElement): Notification { - let tilesResized = new Notification(); + const tilesResized = new Notification(); _initSplitContainer(container, tilesResized); @@ -49,11 +49,11 @@ function _initSplitContainer(container: HTMLElement, tilesResized: Notification) let tileA: HTMLElement = null; let tileB: HTMLElement = null; let sep: HTMLElement = null; - let children = container.childNodes; + const children = container.childNodes; for (let n = 0; n < children.length; n++) { - let child = children[n]; + const child = children[n]; if (child.nodeType === 1 && (child).classList) { - let element = child; + const element = child; if (tileA == null) { if (element.classList.contains('splitContainerNS') || element.classList.contains('splitContainerEW') || element.classList.contains('splitTile')) { tileA = element; @@ -74,9 +74,15 @@ function _initSplitContainer(container: HTMLElement, tilesResized: Notification) } } } - if (tileA == null) throw new Error('Failed to init split-container: could not find first tile'); - if (sep == null) throw new Error('Failed to init split-container: could not find separator'); - if (tileB == null) throw new Error('Failed to init split-container: could not find second tile'); + if (tileA == null) { + throw new Error('Failed to init split-container: could not find first tile'); + } + if (sep == null) { + throw new Error('Failed to init split-container: could not find separator'); + } + if (tileB == null) { + throw new Error('Failed to init split-container: could not find second tile'); + } if (container.classList.contains('splitContainerNS')) { _initSplitNS(container, tileA, sep, tileB, tilesResized); @@ -106,36 +112,36 @@ function _initSplitNS(container: HTMLElement, tileA: HTMLElement, sep: HTMLEleme tileB.style.left = '0px'; tileB.style.right = '0px'; - let minHeightA = 1; - let minHeightB = 1; + const minHeightA = 1; + const minHeightB = 1; let recentFracA: number = null; function layoutTiles(prelimHeightA?: number) { - let heightSep = sep.getBoundingClientRect().height; - let heightContainer = container.getBoundingClientRect().height; - let heightContent = heightContainer - heightSep; + const heightSep = sep.getBoundingClientRect().height; + const heightContainer = container.getBoundingClientRect().height; + const heightContent = heightContainer - heightSep; if (recentFracA == null) { recentFracA = tileA.getBoundingClientRect().height / heightContent; } - let keepFracA = (prelimHeightA == null); + const keepFracA = (prelimHeightA == null); if (keepFracA) { prelimHeightA = Math.round(recentFracA * heightContent); } - let maxHeightA = heightContainer - heightSep - minHeightB; + const maxHeightA = heightContainer - heightSep - minHeightB; - let topA = 0; - let heightA = Math.max(minHeightA, Math.min(maxHeightA, prelimHeightA)); + const topA = 0; + const heightA = Math.max(minHeightA, Math.min(maxHeightA, prelimHeightA)); tileA.style.top = topA + 'px'; tileA.style.height = heightA + 'px'; - let topSep = topA + heightA; + const topSep = topA + heightA; sep.style.top = topSep + 'px'; sep.style.height = heightSep + 'px'; - let topB = topSep + heightSep; - let heightB = Math.max(minHeightB, heightContainer - topB); + const topB = topSep + heightSep; + const heightB = Math.max(minHeightB, heightContainer - topB); tileB.style.top = topB + 'px'; tileB.style.height = heightB + 'px'; @@ -185,36 +191,36 @@ function _initSplitEW(container: HTMLElement, tileA: HTMLElement, sep: HTMLEleme tileB.style.top = '0px'; tileB.style.bottom = '0px'; - let minWidthA = 1; - let minWidthB = 1; + const minWidthA = 1; + const minWidthB = 1; let recentFracA: number = null; function layoutTiles(prelimWidthA?: number) { - let widthSep = sep.getBoundingClientRect().width; - let widthContainer = container.getBoundingClientRect().width; - let widthContent = widthContainer - widthSep; + const widthSep = sep.getBoundingClientRect().width; + const widthContainer = container.getBoundingClientRect().width; + const widthContent = widthContainer - widthSep; if (recentFracA == null) { recentFracA = tileA.getBoundingClientRect().width / widthContent; } - let keepFracA = (prelimWidthA == null); + const keepFracA = (prelimWidthA == null); if (keepFracA) { prelimWidthA = Math.round(recentFracA * widthContent); } - let maxWidthA = widthContainer - widthSep - minWidthB; + const maxWidthA = widthContainer - widthSep - minWidthB; - let leftA = 0; - let widthA = Math.max(minWidthA, Math.min(maxWidthA, prelimWidthA)); + const leftA = 0; + const widthA = Math.max(minWidthA, Math.min(maxWidthA, prelimWidthA)); tileA.style.left = leftA + 'px'; tileA.style.width = widthA + 'px'; - let leftSep = leftA + widthA; + const leftSep = leftA + widthA; sep.style.left = leftSep + 'px'; sep.style.width = widthSep + 'px'; - let leftB = leftSep + widthSep; - let widthB = Math.max(minWidthB, widthContainer - leftB); + const leftB = leftSep + widthSep; + const widthB = Math.max(minWidthB, widthContainer - leftB); tileB.style.left = leftB + 'px'; tileB.style.width = widthB + 'px'; diff --git a/src/webglimpse/util/util.ts b/src/webglimpse/util/util.ts index 9ad13da..428f479 100644 --- a/src/webglimpse/util/util.ts +++ b/src/webglimpse/util/util.ts @@ -102,7 +102,7 @@ export function ensureCapacityFloat32(buffer: Float32Array, minNewCapacity: numb return buffer; } else { - let newCapacity = Math.max(minNewCapacity, 2 * buffer.length); + const newCapacity = Math.max(minNewCapacity, 2 * buffer.length); return new Float32Array(newCapacity); } } @@ -114,7 +114,7 @@ export function ensureCapacityUint32(buffer: Uint32Array, minNewCapacity: number return buffer; } else { - let newCapacity = Math.max(minNewCapacity, 2 * buffer.length); + const newCapacity = Math.max(minNewCapacity, 2 * buffer.length); return new Uint32Array(newCapacity); } } @@ -126,7 +126,7 @@ export function ensureCapacityUint16(buffer: Uint16Array, minNewCapacity: number return buffer; } else { - let newCapacity = Math.max(minNewCapacity, 2 * buffer.length); + const newCapacity = Math.max(minNewCapacity, 2 * buffer.length); return new Uint16Array(newCapacity); } } @@ -136,13 +136,11 @@ export interface StringMap { [key: string]: V; } -export interface IdFunction { - (value: V): string; -} +export type IdFunction = (value: V) => string; export let getObjectId = (function () { - let keyName = 'webglimpse_ObjectId'; + const keyName = 'webglimpse_ObjectId'; let nextValue = 0; return function (obj: any): string { let value = obj[keyName]; @@ -188,16 +186,24 @@ export function parseTime_PMILLIS(time_ISO8601: string): number { // let m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ssZZ', true); - if (m.isValid()) return m.valueOf(); + if (m.isValid()) { + return m.valueOf(); + } m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSSZZ', true); - if (m.isValid()) return m.valueOf(); + if (m.isValid()) { + return m.valueOf(); + } m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSZZ', true); - if (m.isValid()) return m.valueOf(); + if (m.isValid()) { + return m.valueOf(); + } m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SZZ', true); - if (m.isValid()) return m.valueOf(); + if (m.isValid()) { + return m.valueOf(); + } throw new Error('Failed to parse time-string: \'' + time_ISO8601 + '\''); } diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..a98c5eb --- /dev/null +++ b/tslint.json @@ -0,0 +1,144 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs", + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + false, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + false, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} From cdb296db5c65ce3f28f46040b52e906d16474399 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 12 Apr 2018 13:53:24 -0700 Subject: [PATCH 18/69] Fixed missing moment import, update version to 2.0.5 --- CHANGELOG | 4 ++++ package.json | 2 +- src/webglimpse/util/util.ts | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c118990..445a0ef 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Webglimpse 2.0.5 (release 2018-4-12) + +* Fixed a missing moment import. + Webglimpse 2.0.4 (release 2018-4-11) * Fixed some issues with variables being re-declared in if block scopes diff --git a/package.json b/package.json index b13040e..bfe4946 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.4", + "version": "2.0.5", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", diff --git a/src/webglimpse/util/util.ts b/src/webglimpse/util/util.ts index 428f479..8093ac0 100644 --- a/src/webglimpse/util/util.ts +++ b/src/webglimpse/util/util.ts @@ -173,7 +173,8 @@ export function concatLines(...lines: string[]) { * places. * */ -declare var moment: any; +import * as momentNs from 'moment'; +const moment = momentNs; export function parseTime_PMILLIS(time_ISO8601: string): number { From d06c3959723c7c35b9337027852bf3c62f5034db Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 12 Jul 2018 14:10:32 -0700 Subject: [PATCH 19/69] Truncate event start/end times to prevent sub-millisecond values --- CHANGELOG | 4 + package-lock.json | 4307 ++++++++--------- package.json | 2 +- .../timeline/timeline_events_row.ts | 4 +- src/webglimpse/timeline/timeline_lanes.ts | 4 +- src/webglimpse/timeline/timeline_model.ts | 36 +- 6 files changed, 2113 insertions(+), 2244 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 445a0ef..42c0d86 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Webglimpse 2.0.6 (release 2018-7-12) + +* Truncate event start/end times, so they are never sub-millisecond. + Webglimpse 2.0.5 (release 2018-4-12) * Fixed a missing moment import. diff --git a/package-lock.json b/package-lock.json index 52d44b5..265b5d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "webglimpse", - "version": "2.0.4", + "version": "2.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", - "integrity": "sha1-d9TR5PzQlXXwIA4tbSHBo/mVCW8=", + "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -27,12 +27,12 @@ "@angular-devkit/core": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", - "integrity": "sha1-tv1qouT0rDw5R4GYupGlPUwPiNU=", + "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", "dev": true, "requires": { "ajv": "5.5.2", "chokidar": "1.7.0", - "rxjs": "5.5.8", + "rxjs": "5.5.11", "source-map": "0.5.7" }, "dependencies": { @@ -53,26 +53,26 @@ "@angular-devkit/schematics": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", - "integrity": "sha1-CaImj61h9PlW9C24eRO4dIxRKng=", + "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", "dev": true, "requires": { "@ngtools/json-schema": "1.2.0", - "rxjs": "5.5.8" + "rxjs": "5.5.11" } }, "@angular/animations": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.9.tgz", - "integrity": "sha1-Ig25+1pSoZPbACPXIbI93SWnV3A=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz", + "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/cli": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.3.tgz", - "integrity": "sha1-rJF7aSQLsbNAQh6fmFE1iQ4NU7Q=", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz", + "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==", "dev": true, "requires": { "@angular-devkit/build-optimizer": "0.3.2", @@ -82,13 +82,13 @@ "@ngtools/webpack": "1.10.2", "@schematics/angular": "0.3.2", "@schematics/package-update": "0.3.2", - "ajv": "6.4.0", + "ajv": "6.5.2", "autoprefixer": "7.2.6", "cache-loader": "1.2.2", "chalk": "2.2.2", "circular-dependency-plugin": "4.4.0", "clean-css": "4.1.11", - "common-tags": "1.7.2", + "common-tags": "1.8.0", "copy-webpack-plugin": "4.4.3", "core-object": "3.1.5", "denodeify": "1.2.1", @@ -99,26 +99,26 @@ "glob": "7.1.2", "html-webpack-plugin": "2.30.1", "istanbul-instrumenter-loader": "3.0.1", - "karma-source-map-support": "1.2.0", + "karma-source-map-support": "1.3.0", "less": "2.7.3", "less-loader": "4.1.0", "license-webpack-plugin": "1.3.1", "loader-utils": "1.1.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "memory-fs": "0.4.1", "minimatch": "3.0.4", "node-modules-path": "1.0.1", - "node-sass": "4.8.3", + "node-sass": "4.9.2", "nopt": "4.0.1", "opn": "5.1.0", "portfinder": "1.0.13", - "postcss": "6.0.21", + "postcss": "6.0.23", "postcss-import": "11.1.0", - "postcss-loader": "2.1.3", - "postcss-url": "7.3.1", + "postcss-loader": "2.1.6", + "postcss-url": "7.3.2", "raw-loader": "0.5.1", - "resolve": "1.6.0", - "rxjs": "5.5.8", + "resolve": "1.8.1", + "rxjs": "5.5.11", "sass-loader": "6.0.7", "semver": "5.5.0", "silent-error": "1.1.0", @@ -126,44 +126,44 @@ "style-loader": "0.19.1", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "uglifyjs-webpack-plugin": "1.2.4", + "uglifyjs-webpack-plugin": "1.2.7", "url-loader": "0.6.2", "webpack": "3.11.0", "webpack-dev-middleware": "1.12.2", "webpack-dev-server": "2.11.2", - "webpack-merge": "4.1.2", + "webpack-merge": "4.1.3", "webpack-sources": "1.1.0", "webpack-subresource-integrity": "1.0.4" } }, "@angular/common": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.9.tgz", - "integrity": "sha1-vrJdRDRJirrla9jcLAGt4/bEXoE=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz", + "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/compiler": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.9.tgz", - "integrity": "sha1-HQO8Hos4wlm8WBFNaRwhQNJE+PU=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz", + "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/compiler-cli": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.9.tgz", - "integrity": "sha1-NqBpk31QqKKU7aIztbGyxxE5dR8=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz", + "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==", "dev": true, "requires": { "chokidar": "1.7.0", "minimist": "1.2.0", "reflect-metadata": "0.1.12", - "tsickle": "0.27.2" + "tsickle": "0.27.5" }, "dependencies": { "minimist": { @@ -175,98 +175,99 @@ } }, "@angular/core": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.9.tgz", - "integrity": "sha1-Pa8T75qnVLmVTtIdo+syLosg9mc=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz", + "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/forms": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.9.tgz", - "integrity": "sha1-EsRbOgLDmLNU8JzHQNkUzZBMDJw=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz", + "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/http": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.9.tgz", - "integrity": "sha1-L/6lNuGBvJfihnWT1XQl6nhTKFs=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", + "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/language-service": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.9.tgz", - "integrity": "sha1-SDi7YxnJno9b6wi9+zku6aEXN2Y=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.11.tgz", + "integrity": "sha512-tgnFAhwBmUs1W0dmcmlBmUlMaOgkoyuSdrcF23lz8W5+nSLb+LnbH5a3blU2NVqA4ESvLKQkPW5dpKa/LuhrPQ==", "dev": true }, "@angular/platform-browser": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.9.tgz", - "integrity": "sha1-nudjJ7Gzr/rWj/qDkFhmG3cEvCw=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz", + "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/platform-browser-dynamic": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.9.tgz", - "integrity": "sha1-hgdbe7aUhh9yLO2imq4YawRca30=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz", + "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@angular/router": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.9.tgz", - "integrity": "sha1-A2nfbmDG2jpYQsbrNeOVjU/+cn4=", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz", + "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "@compodoc/compodoc": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.0.9.tgz", - "integrity": "sha1-NSXS30n+T/v54LYnuSphB7YSA9w=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.3.tgz", + "integrity": "sha512-MXo8O5Ar5HB0OSayGQknUWCo/zLglz348tDkoOii020y+bEBPRTRcwCjKaORJZG1Nw9nmStGyVxPlf1cxW6w8A==", "dev": true, "requires": { "@compodoc/ngd-transformer": "2.0.0", - "chalk": "2.3.2", + "chalk": "2.4.1", "cheerio": "1.0.0-rc.2", - "chokidar": "2.0.3", - "colors": "1.2.1", - "commander": "2.15.0", + "chokidar": "2.0.4", + "colors": "1.3.0", + "commander": "2.15.1", + "cosmiconfig": "5.0.5", "fancy-log": "1.3.2", "findit2": "2.2.3", - "fs-extra": "5.0.0", + "fs-extra": "6.0.1", "glob": "7.1.2", - "handlebars": "4.0.11", + "handlebars": "4.0.10", "html-entities": "1.2.1", - "json5": "0.5.1", + "json5": "1.0.1", "live-server": "1.1.0", - "lodash": "4.17.5", - "lunr": "2.1.6", + "lodash": "4.17.10", + "lunr": "2.2.0", "marked": "0.3.19", "os-name": "2.0.1", "traverse": "0.6.6", - "ts-simple-ast": "6.12.0", - "typescript": "2.4.2" + "ts-simple-ast": "11.2.0", + "uuid": "3.3.2" }, "dependencies": { "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { "micromatch": "3.1.10", @@ -286,18 +287,16 @@ "dev": true }, "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "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", - "define-property": "1.0.0", "extend-shallow": "2.0.1", "fill-range": "4.0.0", "isobject": "3.0.1", - "kind-of": "6.0.2", "repeat-element": "1.1.2", "snapdragon": "0.8.2", "snapdragon-node": "2.1.1", @@ -305,15 +304,6 @@ "to-regex": "3.0.2" }, "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.2" - } - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -326,42 +316,54 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "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" + "supports-color": "5.4.0" } }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", + "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.1", - "braces": "2.3.1", - "fsevents": "1.1.3", + "braces": "2.3.2", + "fsevents": "1.2.4", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", "readdirp": "2.1.0", - "upath": "1.0.4" + "upath": "1.1.0" } }, "commander": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", - "integrity": "sha1-rSojocOwNuOSRpuAEs7GsztMEyI=", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, + "cosmiconfig": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.5.tgz", + "integrity": "sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.12.0", + "parse-json": "4.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -395,10 +397,50 @@ "is-extendable": "0.1.1" } }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -409,7 +451,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -417,7 +459,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "0.3.2", @@ -474,14 +516,14 @@ } }, "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "dev": true, "requires": { "graceful-fs": "4.1.11", "jsonfile": "4.0.0", - "universalify": "0.1.1" + "universalify": "0.1.2" } }, "glob-parent": { @@ -512,43 +554,32 @@ "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=", + "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": "3.2.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.6" - } - } + "kind-of": "6.0.2" } }, "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=", + "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": "3.2.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.6" - } - } + "kind-of": "6.0.2" + } + }, + "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-extglob": { @@ -592,37 +623,62 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "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" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", - "braces": "2.3.1", + "braces": "2.3.2", "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", + "nanomatch": "1.2.13", "object.pick": "1.3.0", "regex-not": "1.0.2", "snapdragon": "0.8.2", "to-regex": "3.0.2" } }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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.2", + "json-parse-better-errors": "1.0.2" + } + }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "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" @@ -633,7 +689,7 @@ "@compodoc/ngd-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.0.0.tgz", - "integrity": "sha1-4xpsu9+o3mSLAnqkFpRovEllRMk=", + "integrity": "sha512-6HpYvXRZBdIYFojWxW5EVNkhYPmblytCve62CNoYBSWfy++vTGH7Ypg2Bhjg2CsqeV8JOVxrPO7JM9M3MgWKEA==", "dev": true, "requires": { "ansi-colors": "1.1.0", @@ -644,25 +700,35 @@ "@compodoc/ngd-transformer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0.tgz", - "integrity": "sha1-iehY3TMhmM3iYvDPNki9CWnQ2mI=", + "integrity": "sha512-9J0KkmuuuvDHxH0oREgrgbqdEFqcltQXIBofeYdIyMKzI3A+pN1Ji4zfi7x1ql0Ax7qQKemp8XWP+cCpP0qY+w==", "dev": true, "requires": { "@compodoc/ngd-core": "2.0.0", "dot": "1.1.2", "fs-extra": "4.0.3", - "viz.js": "1.8.1" + "viz.js": "1.8.2" + } + }, + "@dsherret/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "is-negated-glob": "1.0.0" } }, "@ngtools/json-schema": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", - "integrity": "sha1-BuXs0p6aN9JgpEfdhz6ivs0ijE8=", + "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", "dev": true }, "@ngtools/webpack": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", - "integrity": "sha1-NzcF/RmZKzbpliA0gLHUEulCyNY=", + "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", "dev": true, "requires": { "chalk": "2.2.2", @@ -678,7 +744,7 @@ "@schematics/angular": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", - "integrity": "sha1-viCaAyo+RXeZLZT7qhS9S/3kheI=", + "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", "dev": true, "requires": { "typescript": "2.6.2" @@ -695,33 +761,42 @@ "@schematics/package-update": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", - "integrity": "sha1-xaKZzrqLnlbz4fgE+G8HZk7G4Bw=", + "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", "dev": true, "requires": { - "rxjs": "5.5.8", + "rxjs": "5.5.11", "semver": "5.5.0", "semver-intersect": "1.3.1" } }, + "@types/fs-extra": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.4.tgz", + "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", + "dev": true, + "requires": { + "@types/node": "6.0.114" + } + }, "@types/jasmine": { "version": "2.5.54", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", - "integrity": "sha1-prXyrir7bgMHd06MfGCOA31JHGM=", + "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", "dev": true }, "@types/jasminewd2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha1-DSiGsMva5MDuulXjB5L1hL8ECpU=", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", "dev": true, "requires": { "@types/jasmine": "2.5.54" } }, "@types/node": { - "version": "6.0.103", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.103.tgz", - "integrity": "sha1-T922wlR1bpgAQDnaTk9CMNHjl8o=", + "version": "6.0.114", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz", + "integrity": "sha512-5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==", "dev": true }, "@types/q": { @@ -733,13 +808,13 @@ "@types/selenium-webdriver": { "version": "2.53.43", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", - "integrity": "sha1-LePXGIGbwgFldUxKWa+36YM/Zwc=", + "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", "dev": true }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { @@ -753,9 +828,9 @@ } }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha1-9HPdR+AnegjijpvsWu6wR1HwuMk=", + "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": { @@ -776,9 +851,9 @@ } }, "adm-zip": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", - "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", "dev": true }, "after": { @@ -806,21 +881,35 @@ } }, "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { - "fast-deep-equal": "1.1.0", + "fast-deep-equal": "2.0.1", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1", - "uri-js": "3.0.2" + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "ajv-keywords": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", - "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "align-text": { @@ -874,7 +963,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -895,7 +984,7 @@ "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { "ansi-wrap": "0.1.0" @@ -925,10 +1014,10 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "1.9.2" } }, "ansi-wrap": { @@ -940,7 +1029,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { "micromatch": "2.3.11", @@ -963,40 +1052,40 @@ "dev": true }, "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", "dev": true }, "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "2.0.0" } }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { "delegates": "1.0.0", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "1.0.3" @@ -1014,7 +1103,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { @@ -1054,7 +1143,7 @@ "dev": true, "requires": { "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "es-abstract": "1.12.0" } }, "array-map": { @@ -1124,12 +1213,12 @@ "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "4.11.8", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -1139,6 +1228,23 @@ "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": { @@ -1154,12 +1260,12 @@ "dev": true }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "async-each": { @@ -1181,22 +1287,22 @@ "dev": true }, "atob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", - "integrity": "sha1-qysVDlHXsSK578jXNAwGtsQQdrw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, "autoprefixer": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha1-JWZy+G98c12oScTwfQCKuwVgZ9w=", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", "dev": true, "requires": { "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000821", + "caniuse-lite": "1.0.30000865", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "6.0.21", + "postcss": "6.0.23", "postcss-value-parser": "3.3.0" } }, @@ -1207,9 +1313,9 @@ "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "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": { @@ -1253,7 +1359,7 @@ "babel-generator": { "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", @@ -1261,7 +1367,7 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "source-map": "0.5.7", "trim-right": "1.0.1" } @@ -1281,7 +1387,7 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.4", + "core-js": "2.5.7", "regenerator-runtime": "0.11.1" } }, @@ -1295,7 +1401,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "babel-traverse": { @@ -1312,7 +1418,7 @@ "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.4", - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "babel-types": { @@ -1323,14 +1429,14 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.5", + "lodash": "4.17.10", "to-fast-properties": "1.0.3" } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "backo2": { @@ -1348,7 +1454,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "1.0.1", @@ -1369,11 +1475,46 @@ "is-descriptor": "1.0.2" } }, + "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.2" + } + }, + "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.2" + } + }, + "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 } } }, @@ -1384,9 +1525,9 @@ "dev": true }, "base64-js": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", - "integrity": "sha1-+xNmgjPZYUz1+0vOlam6QJbN+AE=", + "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 }, "base64id": { @@ -1402,6 +1543,14 @@ "dev": true, "requires": { "safe-buffer": "5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } } }, "batch": { @@ -1411,9 +1560,9 @@ "dev": true }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "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": { @@ -1432,7 +1581,7 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, "binary-extensions": { @@ -1476,13 +1625,13 @@ "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "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": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -1495,7 +1644,7 @@ "content-type": "1.0.4", "debug": "2.6.9", "depd": "1.1.2", - "http-errors": "1.6.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.19", "on-finished": "2.3.0", "qs": "6.5.1", @@ -1506,7 +1655,7 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true } } @@ -1543,7 +1692,7 @@ "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { "ansi-align": "2.0.0", @@ -1576,7 +1725,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -1597,7 +1746,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "1.0.0", @@ -1622,39 +1771,40 @@ "dev": true }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=", + "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.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "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.1.1", - "browserify-des": "1.0.0", + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "1.0.4", "des.js": "1.0.0", - "inherits": "2.0.3" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "browserify-rsa": { @@ -1675,17 +1825,17 @@ "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "elliptic": "6.4.0", "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "parse-asn1": "5.1.1" } }, "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { "pako": "1.0.6" @@ -1694,11 +1844,11 @@ "browserslist": { "version": "2.11.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha1-/jYWeu0bvN5IJ+v+cTR6LMcLmbI=", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000821", - "electron-to-chromium": "1.3.41" + "caniuse-lite": "1.0.30000865", + "electron-to-chromium": "1.3.52" } }, "buffer": { @@ -1707,8 +1857,8 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.11", + "base64-js": "1.3.0", + "ieee754": "1.1.12", "isarray": "1.0.0" } }, @@ -1719,15 +1869,15 @@ "dev": true }, "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha1-TLiDLSNhJYmwQG6eKVbBfwb99TE=", + "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-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, "buffer-xor": { @@ -1757,14 +1907,14 @@ "cacache": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=", + "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.2", + "lru-cache": "4.1.3", "mississippi": "2.0.0", "mkdirp": "0.5.1", "move-concurrently": "1.0.1", @@ -1778,7 +1928,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "1.0.0", @@ -1803,12 +1953,12 @@ "cache-loader": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", - "integrity": "sha1-bVw43tlZoJzF1YGQq1r29zvTU/U=", + "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", "dev": true, "requires": { "loader-utils": "1.1.0", "mkdirp": "0.5.1", - "neo-async": "2.5.0", + "neo-async": "2.5.1", "schema-utils": "0.4.5" } }, @@ -1845,9 +1995,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000821", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000821.tgz", - "integrity": "sha1-DzIj8eBI7ZZFHFbKbPGXBYxCy5M=", + "version": "1.0.30000865", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", + "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==", "dev": true }, "capture-stack-trace": { @@ -1875,7 +2025,7 @@ "chalk": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha1-RAP1zxjzXAX1H73xUr9Yj5Vs98s=", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", "dev": true, "requires": { "ansi-styles": "3.2.1", @@ -1893,14 +2043,14 @@ "dom-serializer": "0.1.0", "entities": "1.1.1", "htmlparser2": "3.9.2", - "lodash": "4.17.5", + "lodash": "4.17.10", "parse5": "3.0.3" }, "dependencies": { "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "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.3.0" @@ -1913,11 +2063,11 @@ "dev": true, "requires": { "domelementtype": "1.3.0", - "domhandler": "2.4.1", + "domhandler": "2.4.2", "domutils": "1.5.1", "entities": "1.1.1", "inherits": "2.0.3", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } } } @@ -1930,7 +2080,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.3", + "fsevents": "1.2.4", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -1948,29 +2098,29 @@ "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha1-cQGTJkuwXHe4yQ0C9aryIhamZ7I=", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", "dev": true }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "circular-dependency-plugin": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", - "integrity": "sha1-+KGnRqP2yOV/Ta6bVNmRzSpYL10=", + "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", "dev": true }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "3.1.0", @@ -1988,68 +2138,11 @@ "is-descriptor": "0.1.6" } }, - "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.2.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.6" - } - } - } - }, - "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.2.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.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true } } }, @@ -2080,15 +2173,15 @@ } }, "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", "dev": true }, "clone-deep": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha1-ANs6Hhc2VnMNEYjD1qztbX6pdxM=", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", "dev": true, "requires": { "for-own": "1.0.0", @@ -2109,7 +2202,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } @@ -2121,9 +2214,9 @@ "dev": true }, "code-block-writer": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.7.1.tgz", - "integrity": "sha1-F0u8O4xzRcfW4+R6dRWfXlAr2g0=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.1.0.tgz", + "integrity": "sha1-AMrBYl2Ek6d1JlGQkzPIHllqIUo=", "dev": true }, "code-point-at": { @@ -2133,17 +2226,25 @@ "dev": true }, "codelyzer": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.2.1.tgz", - "integrity": "sha1-1W6qzvyn6BOKrApjDkhL2wmYhUQ=", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.4.2.tgz", + "integrity": "sha512-tW796ECKMAynFtl/yyS5NRYhufbT3CEKjjMQ450kUeCcQlK7OIqD9VGRVwC3gSQSK4VaewCKCaVL0bzv9PhsLg==", "dev": true, "requires": { - "app-root-path": "2.0.1", + "app-root-path": "2.1.0", "css-selector-tokenizer": "0.7.0", "cssauron": "1.4.0", "semver-dsl": "1.0.1", "source-map": "0.5.7", - "sprintf-js": "1.0.3" + "sprintf-js": "1.1.1" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", + "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "dev": true + } } }, "collection-visit": { @@ -2157,30 +2258,30 @@ } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "1.1.1" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, "colors": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", - "integrity": "sha1-9KPTApdqrwQjVroa3jsaLGLZ15Q=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", "dev": true }, "combine-lists": { @@ -2189,7 +2290,7 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "combined-stream": { @@ -2202,25 +2303,22 @@ } }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", "dev": true }, "commenting": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.0.5.tgz", - "integrity": "sha1-MQTVQsrIpPJ7PVFDj0uAQx/kUms=", + "integrity": "sha512-U7qGbcDLSNpOcV3RQRKHp7hFpy9WUmfawbkPdS4R2RhrSu4dOF85QQpx/Zjcv7uLF6tWSUKEKUIkxknPCrVjwg==", "dev": true }, "common-tags": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz", - "integrity": "sha1-JNl2jGPSU6Vuz/k4RbRLTfHVJ3E=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -2229,9 +2327,9 @@ "dev": true }, "compare-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", - "integrity": "sha1-QzECVqXFVartQZPATY8VTPnG79U=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", + "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==", "dev": true }, "component-bind": { @@ -2253,27 +2351,43 @@ "dev": true }, "compressible": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", - "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", + "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "1.34.0" + }, + "dependencies": { + "mime-db": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", + "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=", + "dev": true + } } }, "compression": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "dev": true, "requires": { "accepts": "1.3.5", "bytes": "3.0.0", - "compressible": "2.0.13", + "compressible": "2.0.14", "debug": "2.6.9", "on-headers": "1.0.1", "safe-buffer": "5.1.1", "vary": "1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } } }, "concat-map": { @@ -2285,24 +2399,24 @@ "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.0.0", + "buffer-from": "1.1.0", "inherits": "2.0.3", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "typedarray": "0.0.6" } }, "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", - "make-dir": "1.2.0", + "make-dir": "1.3.0", "unique-string": "1.0.0", "write-file-atomic": "2.3.0", "xdg-basedir": "3.0.0" @@ -2391,7 +2505,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { @@ -2415,7 +2529,7 @@ "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { "aproba": "1.2.0", @@ -2435,7 +2549,7 @@ "copy-webpack-plugin": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", - "integrity": "sha1-ZdVvueGTaznhKfmqKuwJfOH9RL4=", + "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", "dev": true, "requires": { "cacache": "10.0.4", @@ -2444,8 +2558,8 @@ "is-glob": "4.0.0", "loader-utils": "1.1.0", "minimatch": "3.0.4", - "p-limit": "1.2.0", - "serialize-javascript": "1.4.0" + "p-limit": "1.3.0", + "serialize-javascript": "1.5.0" }, "dependencies": { "is-extglob": { @@ -2466,15 +2580,15 @@ } }, "core-js": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.4.tgz", - "integrity": "sha1-8si/GB8qgLkvNgEhQpzmOi8K6uA=", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true }, "core-object": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", - "integrity": "sha1-+mJ7h1Aq3JgEXkRnjpqOw7nA0qk=", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", "dev": true, "requires": { "chalk": "2.2.2" @@ -2497,25 +2611,26 @@ } }, "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { "is-directory": "0.3.1", - "js-yaml": "3.11.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" + "js-yaml": "3.12.0", + "parse-json": "4.0.0", + "require-from-string": "2.0.2" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "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.2", + "json-parse-better-errors": "1.0.2" + } } } }, @@ -2532,16 +2647,16 @@ "glob2base": "0.0.12", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "resolve": "1.6.0", - "safe-buffer": "5.1.1", + "resolve": "1.8.1", + "safe-buffer": "5.1.2", "shell-quote": "1.6.1", "subarg": "1.0.0" } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "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.11.8", @@ -2558,28 +2673,29 @@ } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "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.4", "inherits": "2.0.3", - "ripemd160": "2.0.1", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", "sha.js": "2.4.11" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "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.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", "sha.js": "2.4.11" } }, @@ -2589,8 +2705,8 @@ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "lru-cache": "4.1.2", - "which": "1.3.0" + "lru-cache": "4.1.3", + "which": "1.3.1" } }, "cryptiles": { @@ -2605,18 +2721,18 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", + "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", "randombytes": "2.0.6", "randomfill": "1.0.4" } @@ -2630,7 +2746,7 @@ "csextends": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", - "integrity": "sha1-Y3SyEJhLVNRJXynJnT3QabgFQ+U=", + "integrity": "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==", "dev": true }, "css-parse": { @@ -2716,7 +2832,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.42" + "es5-ext": "0.10.45" } }, "dashdash": { @@ -2745,7 +2861,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -2770,18 +2886,26 @@ "dev": true }, "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "define-properties": { @@ -2791,24 +2915,59 @@ "dev": true, "requires": { "foreach": "2.0.5", - "object-keys": "1.0.11" + "object-keys": "1.0.12" } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "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.2" + } + }, + "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.2" + } + }, + "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 } } }, @@ -2880,7 +3039,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -2913,13 +3072,13 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "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.11.8", @@ -2930,7 +3089,7 @@ "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { "arrify": "1.0.1", @@ -2946,11 +3105,11 @@ "dns-packet": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { "ip": "1.1.5", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "dns-txt": { @@ -3012,7 +3171,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domelementtype": { @@ -3049,7 +3208,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { "is-obj": "1.0.1" @@ -3068,14 +3227,14 @@ "dev": true }, "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha1-S7RsF5bqvr7sTKmi5muAjLej2LQ=", + "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.4.1", "inherits": "2.0.3", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "stream-shift": "1.0.0" } }, @@ -3102,7 +3261,7 @@ "editions": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha1-NmLLWSNHwxaOuOSYoP9zJx1n9Qs=", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", "dev": true }, "ee-first": { @@ -3112,15 +3271,15 @@ "dev": true }, "ejs": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.8.tgz", - "integrity": "sha1-KraVRhnyJeYZO3rF98OcSP7+Q4A=", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", "dev": true }, "electron-to-chromium": { - "version": "1.3.41", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.41.tgz", - "integrity": "sha1-fjNkPgDNhe39F+BBlPbQDnNzcjU=", + "version": "1.3.52", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz", + "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=", "dev": true }, "elliptic": { @@ -3131,10 +3290,10 @@ "requires": { "bn.js": "4.11.8", "brorand": "1.1.0", - "hash.js": "1.1.3", + "hash.js": "1.1.5", "hmac-drbg": "1.0.1", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -3159,7 +3318,7 @@ "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "1.4.0" @@ -3284,31 +3443,31 @@ "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "1.0.1" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "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.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha1-zOh9UY8Elok7GjDNhGGDVTVIBoE=", + "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", + "has": "1.0.3", + "is-callable": "1.1.4", "is-regex": "1.0.4" } }, @@ -3318,15 +3477,15 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", + "is-callable": "1.1.4", "is-date-object": "1.0.1", "is-symbol": "1.0.1" } }, "es5-ext": { - "version": "0.10.42", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", - "integrity": "sha1-jAfdM68E1dzRMQtc7xO+pjqJuo0=", + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", "dev": true, "requires": { "es6-iterator": "2.0.3", @@ -3341,7 +3500,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.42", + "es5-ext": "0.10.45", "es6-symbol": "3.1.1" } }, @@ -3352,7 +3511,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.42", + "es5-ext": "0.10.45", "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -3372,7 +3531,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.42", + "es5-ext": "0.10.45", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -3385,7 +3544,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.42" + "es5-ext": "0.10.45" } }, "es6-weak-map": { @@ -3395,7 +3554,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.42", + "es5-ext": "0.10.45", "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } @@ -3427,13 +3586,13 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { "estraverse": "4.2.0" @@ -3446,9 +3605,9 @@ "dev": true }, "estree-walker": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz", - "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", "dev": true }, "esutils": { @@ -3470,12 +3629,12 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.42" + "es5-ext": "0.10.45" } }, "event-stream": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -3489,9 +3648,9 @@ } }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "events": { @@ -3506,17 +3665,17 @@ "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "dev": true, "requires": { - "original": "1.0.0" + "original": "1.0.1" } }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "execa": { @@ -3540,9 +3699,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.2", + "lru-cache": "4.1.3", "shebang-command": "1.2.0", - "which": "1.3.0" + "which": "1.3.1" } } } @@ -3612,7 +3771,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "2.2.4" } }, "express": { @@ -3662,7 +3821,13 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true } } @@ -3686,7 +3851,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -3697,7 +3862,7 @@ "extendr": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/extendr/-/extendr-3.3.0.tgz", - "integrity": "sha1-amGtOti5sDr6VhaWxIvvR94FPjc=", + "integrity": "sha512-BmBSu+KOX2XOo3XMECiekGY8VAr3O4aGYgOaHQDNg2ez5rOYW+SDfNStao4VNzr+6N27Vw3A7HJKJMrHmAAXvQ==", "dev": true, "requires": { "editions": "1.3.4", @@ -3727,10 +3892,10 @@ "extract-text-webpack-plugin": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha1-XwQ+qgL5dQqSWLeMCm4NwUCPsvc=", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "2.6.0", + "async": "2.6.1", "loader-utils": "1.1.0", "schema-utils": "0.3.0", "webpack-sources": "1.1.0" @@ -3814,7 +3979,7 @@ "file-loader": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha1-b+iGRJsPKpNuQ8q6rAzb+zaVBvg=", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -3838,14 +4003,14 @@ } }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", - "randomatic": "1.1.7", + "randomatic": "3.0.0", "repeat-element": "1.1.2", "repeat-string": "1.6.1" } @@ -3853,7 +4018,7 @@ "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { "debug": "2.6.9", @@ -3872,7 +4037,7 @@ "dev": true, "requires": { "commondir": "1.0.1", - "make-dir": "1.2.0", + "make-dir": "1.3.0", "pkg-dir": "2.0.0" } }, @@ -3906,11 +4071,31 @@ "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" + } + }, + "follow-redirects": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", + "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "dev": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "for-in": { @@ -3985,7 +4170,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "fs-access": { @@ -4000,21 +4185,21 @@ "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { "graceful-fs": "4.1.11", "jsonfile": "4.0.0", - "universalify": "0.1.1" + "universalify": "0.1.2" } }, "fs-minipass": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha1-BsJ3IYRU7CiN93raVKA7hwKqy50=", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "requires": { - "minipass": "2.2.4" + "minipass": "2.3.3" } }, "fs-write-stream-atomic": { @@ -4026,7 +4211,7 @@ "graceful-fs": "4.1.11", "iferr": "0.1.5", "imurmurhash": "0.1.4", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "fs.realpath": { @@ -4036,39 +4221,29 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, "optional": true, "requires": { "nan": "2.10.0", - "node-pre-gyp": "0.6.39" + "node-pre-gyp": "0.10.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -4080,91 +4255,25 @@ "optional": true, "requires": { "delegates": "1.0.0", - "readable-stream": "2.2.9" + "readable-stream": "2.3.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", + "version": "1.0.0", "bundled": true, "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true @@ -4174,14 +4283,6 @@ "bundled": true, "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, "concat-map": { "version": "0.0.1", "bundled": true, @@ -4195,35 +4296,11 @@ "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, "dev": true, "optional": true, @@ -4232,16 +4309,11 @@ } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -4249,179 +4321,85 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "ecc-jsbn": { - "version": "0.1.1", + "fs-minipass": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "minipass": "2.2.4" } }, - "extend": { - "version": "3.0.1", + "fs.realpath": { + "version": "1.0.0", "bundled": true, "dev": true, "optional": true }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", + "gauge": { + "version": "2.7.4", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } }, - "form-data": { - "version": "2.1.4", + "glob": { + "version": "7.1.2", "bundled": true, "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, - "fs.realpath": { - "version": "1.0.0", + "has-unicode": { + "version": "2.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, - "fstream": { - "version": "1.0.11", + "iconv-lite": { + "version": "0.4.21", "bundled": true, "dev": true, + "optional": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "safer-buffer": "2.1.2" } }, - "fstream-ignore": { - "version": "1.0.5", + "ignore-walk": { + "version": "3.0.1", "bundled": true, "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", "minimatch": "3.0.4" } }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -4433,7 +4411,7 @@ "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -4446,111 +4424,43 @@ "number-is-nan": "1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, "dev": true, "optional": true }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "jsonify": "0.0.0" + "brace-expansion": "1.1.11" } }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", + "minimist": { + "version": "0.0.8", "bundled": true, "dev": true }, - "mime-types": { - "version": "2.1.15", + "minipass": { + "version": "2.2.4", "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "minimatch": { - "version": "3.0.4", + "minizlib": { + "version": "1.1.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "minipass": "2.2.4" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -4565,23 +4475,33 @@ "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.10.0", "bundled": true, "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", + "detect-libc": "1.0.3", "mkdirp": "0.5.1", + "needle": "2.2.0", "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -4590,12 +4510,28 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, @@ -4611,12 +4547,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -4644,7 +4574,7 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, @@ -4656,39 +4586,23 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", + "deep-extend": "0.5.1", + "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" }, @@ -4702,112 +4616,63 @@ } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.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.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, + "optional": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, "dev": true }, - "semver": { - "version": "5.3.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "set-blocking": { - "version": "2.0.0", + "sax": { + "version": "1.2.4", "bundled": true, "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "semver": { + "version": "5.5.0", "bundled": true, "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, - "sshpk": { - "version": "1.13.0", + "signal-exit": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "string-width": { "version": "1.0.2", @@ -4820,19 +4685,14 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "5.1.1" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, @@ -4848,81 +4708,26 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", + "version": "4.4.1", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, @@ -4936,6 +4741,11 @@ "version": "1.0.2", "bundled": true, "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true } } }, @@ -4954,7 +4764,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "gauge": { @@ -4970,37 +4780,22 @@ "signal-exit": "3.0.2", "string-width": "1.0.2", "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "wide-align": "1.1.3" } }, "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "dev": true, - "requires": { - "globule": "1.2.0" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { - "is-property": "1.0.2" + "globule": "1.2.1" } }, "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=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-stdin": { @@ -5041,7 +4836,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -5092,7 +4887,7 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globby": { @@ -5104,19 +4899,19 @@ "array-union": "1.0.2", "dir-glob": "2.0.0", "glob": "7.1.2", - "ignore": "3.3.7", + "ignore": "3.3.10", "pify": "3.0.0", "slash": "1.0.0" } }, "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "dev": true, "requires": { "glob": "7.1.2", - "lodash": "4.17.5", + "lodash": "4.17.10", "minimatch": "3.0.4" } }, @@ -5133,7 +4928,7 @@ "is-retry-allowed": "1.1.0", "is-stream": "1.1.0", "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "timed-out": "4.0.1", "unzip-response": "2.0.1", "url-parse-lax": "1.0.0" @@ -5152,9 +4947,9 @@ "dev": true }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", "dev": true, "requires": { "async": "1.5.2", @@ -5262,9 +5057,9 @@ } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "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" @@ -5375,22 +5170,23 @@ } }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "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.3" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", + "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.0" + "minimalistic-assert": "1.0.1" } }, "hawk": { @@ -5417,8 +5213,8 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", + "hash.js": "1.1.5", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -5438,9 +5234,9 @@ } }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha1-IyNbKasjDFdqqw1PE/wEawsDgiI=", + "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 }, "hpack.js": { @@ -5451,7 +5247,7 @@ "requires": { "inherits": "2.0.3", "obuf": "1.1.2", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "wbuf": "1.7.3" } }, @@ -5462,19 +5258,18 @@ "dev": true }, "html-minifier": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.12.tgz", - "integrity": "sha1-a/rU0DJ/W40rYvWFRlSsNwO5sDE=", + "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.0", "clean-css": "4.1.11", - "commander": "2.15.1", + "commander": "2.16.0", "he": "1.1.1", - "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.3.16" + "uglify-js": "3.4.4" } }, "html-webpack-plugin": { @@ -5484,11 +5279,11 @@ "dev": true, "requires": { "bluebird": "3.5.1", - "html-minifier": "3.5.12", + "html-minifier": "3.5.18", "loader-utils": "0.2.17", - "lodash": "4.17.5", + "lodash": "4.17.10", "pretty-error": "2.1.1", - "toposort": "1.0.6" + "toposort": "1.0.7" }, "dependencies": { "loader-utils": { @@ -5578,44 +5373,31 @@ "dev": true }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.1", + "depd": "1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", + "setprototypeof": "1.1.0", "statuses": "1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } } }, "http-parser-js": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz", - "integrity": "sha1-W3IIScZQkDwn5SFjPZRpbulfNSk=", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", "dev": true }, "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { - "eventemitter3": "1.2.0", + "eventemitter3": "3.1.0", + "follow-redirects": "1.5.1", "requires-port": "1.0.0" } }, @@ -5625,9 +5407,9 @@ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "dev": true, "requires": { - "http-proxy": "1.16.2", + "http-proxy": "1.17.0", "is-glob": "3.1.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "micromatch": "2.3.11" }, "dependencies": { @@ -5656,7 +5438,7 @@ "requires": { "assert-plus": "0.2.0", "jsprim": "1.4.1", - "sshpk": "1.14.1" + "sshpk": "1.14.2" } }, "https-browserify": { @@ -5679,13 +5461,13 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha1-wWOE/+APW3g1gk5ntvK9RKUilFU=", + "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": { @@ -5695,9 +5477,9 @@ "dev": true }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, "ignorefs": { @@ -5723,6 +5505,24 @@ "dev": true, "optional": true }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "2.1.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -5732,7 +5532,7 @@ "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { "pkg-dir": "2.0.0", @@ -5785,13 +5585,13 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "injection-js": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.1.tgz", - "integrity": "sha1-qNaghbLwuNhlD29Eh/aruMwNZ84=", + "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", "dev": true }, "internal-ip": { @@ -5812,10 +5612,10 @@ "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "1.4.0" } }, "invert-kv": { @@ -5836,21 +5636,23 @@ "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", "dev": true }, - "is-accessor-descriptor": { + "is-absolute": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "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": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } + "is-relative": "1.0.0", + "is-windows": "1.0.2" + } + }, + "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.2.2" } }, "is-arrayish": { @@ -5871,7 +5673,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -5884,35 +5686,27 @@ } }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "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": "1.1.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha1-JH5BYueGDOu9rzC3dNawrH3P56U=", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { "ci-info": "1.1.3" } }, "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "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": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", - "dev": true - } + "kind-of": "3.2.2" } }, "is-date-object": { @@ -5922,20 +5716,20 @@ "dev": true }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "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": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "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 } } @@ -6016,25 +5810,12 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, - "is-my-ip-valid": { + "is-negated-glob": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha1-ayEDoojpTvPeXPFdKd2F/Et41lw=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - } - }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -6056,23 +5837,6 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", - "dev": true - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -6082,7 +5846,7 @@ "is-path-in-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "1.0.1" @@ -6100,7 +5864,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "3.0.1" @@ -6126,12 +5890,6 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -6144,7 +5902,16 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "1.0.3" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" } }, "is-retry-allowed": { @@ -6171,6 +5938,15 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -6180,7 +5956,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "is-wsl": { @@ -6225,19 +6001,19 @@ "istanbul-api": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha1-TDsF0YwAFtECLgebmNyCxA9IiVQ=", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "dev": true, "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", + "async": "2.6.1", + "compare-versions": "3.3.0", "fileset": "2.0.3", "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", + "istanbul-lib-hook": "1.2.1", "istanbul-lib-instrument": "1.10.1", "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", + "istanbul-lib-source-maps": "1.2.5", "istanbul-reports": "1.3.0", - "js-yaml": "3.11.0", + "js-yaml": "3.12.0", "mkdirp": "0.5.1", "once": "1.4.0" } @@ -6245,7 +6021,7 @@ "istanbul-instrumenter-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", "dev": true, "requires": { "convert-source-map": "1.5.1", @@ -6280,22 +6056,22 @@ "istanbul-lib-coverage": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha1-99jy5CuX43/nlhFMsPnWi146Q0E=", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, "istanbul-lib-hook": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", - "integrity": "sha1-rlVv1aQabo76CxACseQW3+r5gWw=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", + "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "1.0.0" } }, "istanbul-lib-instrument": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha1-cktLbKzrqGktPx+dByfiecQBr3s=", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { "babel-generator": "6.26.1", @@ -6310,7 +6086,7 @@ "istanbul-lib-report": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha1-6IbN9QXE672OCZ5DlqkNCijirLU=", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "dev": true, "requires": { "istanbul-lib-coverage": "1.2.0", @@ -6337,9 +6113,9 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", - "integrity": "sha1-zHzK1hYp9O//ji94rbjFIsmXbsc=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "dev": true, "requires": { "debug": "3.1.0", @@ -6352,7 +6128,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -6363,10 +6139,10 @@ "istanbul-reports": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha1-LzIugeHZUgdnWX3KPCCgzOiaNVQ=", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "4.0.10" } }, "jasmine": { @@ -6418,9 +6194,9 @@ "dev": true }, "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha1-LlRewrDylX9BNWUQIFIU6Y+tZYI=", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", + "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", "dev": true }, "js-tokens": { @@ -6430,9 +6206,9 @@ "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha1-WXwai9VxUvJtYizkEXhRpR9euu8=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "1.0.10", @@ -6455,13 +6231,13 @@ "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, "json-parse-better-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha1-UBg80bLSUnXeBp6ecbRnrJ6rlzo=", + "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": { @@ -6518,12 +6294,6 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -6547,22 +6317,22 @@ "karma": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", "dev": true, "requires": { "bluebird": "3.5.1", "body-parser": "1.18.2", "chokidar": "1.7.0", - "colors": "1.2.1", + "colors": "1.3.0", "combine-lists": "1.0.1", "connect": "3.6.6", - "core-js": "2.5.4", + "core-js": "2.5.7", "di": "0.0.1", "dom-serialize": "2.2.1", "expand-braces": "0.1.2", "glob": "7.1.2", "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", + "http-proxy": "1.17.0", "isbinaryfile": "3.0.2", "lodash": "3.10.1", "log4js": "0.6.38", @@ -6572,7 +6342,7 @@ "qjobs": "1.2.0", "range-parser": "1.2.0", "rimraf": "2.6.2", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "socket.io": "1.7.3", "source-map": "0.5.7", "tmp": "0.0.31", @@ -6627,7 +6397,7 @@ "dev": true, "requires": { "fs-access": "1.0.1", - "which": "1.3.0" + "which": "1.3.1" } }, "karma-cli": { @@ -6636,13 +6406,13 @@ "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", "dev": true, "requires": { - "resolve": "1.6.0" + "resolve": "1.8.1" } }, "karma-coverage-istanbul-reporter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.2.tgz", - "integrity": "sha1-qNDIgVx9b2zqFaOUp8SznvFRqTk=", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", + "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", "dev": true, "requires": { "istanbul-api": "1.3.1", @@ -6650,9 +6420,9 @@ } }, "karma-jasmine": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", - "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", "dev": true }, "karma-jasmine-html-reporter": { @@ -6661,16 +6431,34 @@ "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", "dev": true, "requires": { - "karma-jasmine": "1.1.1" + "karma-jasmine": "1.1.2" } }, "karma-source-map-support": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", - "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", "dev": true, "requires": { - "source-map-support": "0.4.18" + "source-map-support": "0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "source-map": "0.6.1" + } + } } }, "killable": { @@ -6715,7 +6503,7 @@ "less": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", "dev": true, "requires": { "errno": "0.1.7", @@ -6731,10 +6519,10 @@ "less-loader": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", "dev": true, "requires": { - "clone": "2.1.2", + "clone": "2.1.1", "loader-utils": "1.1.0", "pify": "3.0.0" } @@ -6742,10 +6530,10 @@ "license-webpack-plugin": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", - "integrity": "sha1-aIt2RyGI71l5GLfK4+7H3C+loOg=", + "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==", "dev": true, "requires": { - "ejs": "2.5.8" + "ejs": "2.6.1" } }, "live-server": { @@ -6754,7 +6542,7 @@ "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", "dev": true, "requires": { - "colors": "1.2.1", + "colors": "1.3.0", "connect": "3.4.1", "cors": "2.8.4", "event-stream": "3.3.4", @@ -6770,9 +6558,9 @@ }, "dependencies": { "colors": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", - "integrity": "sha1-9KPTApdqrwQjVroa3jsaLGLZ15Q=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", "dev": true }, "faye-websocket": { @@ -6787,7 +6575,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, "object-assign": { @@ -6799,7 +6587,7 @@ "opn": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha1-ZIcVZchjh18FLP31PT48ta21Oxw=", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { "is-wsl": "1.1.0" @@ -6808,7 +6596,7 @@ "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { "debug": "2.6.9", @@ -6818,7 +6606,7 @@ "escape-html": "1.0.3", "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", "on-finished": "2.3.0", @@ -6877,9 +6665,9 @@ } }, "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "lodash.assign": { @@ -6894,10 +6682,16 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha1-Y5BX5ybDr72z59QnQcqo1uQzWSc=", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", "dev": true }, "lodash.tail": { @@ -6961,9 +6755,9 @@ "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=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { "js-tokens": "3.0.2" @@ -6988,13 +6782,13 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha1-RSNLLm4vKzPaElYkxGZJKaAiTD8=", + "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", @@ -7002,30 +6796,30 @@ } }, "lunr": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.1.6.tgz", - "integrity": "sha1-Zx0jIcTFvExSKRSVPRxU1hL2Cqc=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.2.0.tgz", + "integrity": "sha512-HNuCi0meEZZpfORgJuxmXu5yHkdWrWew9dphUj+ouCbNNT38ud5YXWKVcLo1gSwQcDdKMXn+lRuDiXLfllnnjA==", "dev": true }, "macos-release": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", - "integrity": "sha1-gxlF4pNltHCqhySwqzbI+JWdEPs=", + "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", "dev": true }, "magic-string": { "version": "0.22.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha1-jpz1r930Q4XB2lvCpqDb0QsDZX4=", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { "vlq": "0.2.3" } }, "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha1-bWpJ7q1KrilsU7vzoaAIvWyJRps=", + "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" @@ -7034,7 +6828,7 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha1-GZeO1XX56VRdL/jBPjO10Ypn1TU=", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", "dev": true }, "map-cache": { @@ -7067,7 +6861,13 @@ "marked": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha1-XUf3CcTJ/Dwha21GEnKA9As515A=", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", "dev": true }, "md5.js": { @@ -7078,18 +6878,6 @@ "requires": { "hash-base": "3.0.4", "inherits": "2.0.3" - }, - "dependencies": { - "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.3", - "safe-buffer": "5.1.1" - } - } } }, "media-typer": { @@ -7114,7 +6902,7 @@ "dev": true, "requires": { "errno": "0.1.7", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "meow": { @@ -7179,7 +6967,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -7189,19 +6977,19 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, "mime-types": { "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { "mime-db": "1.33.0" @@ -7210,13 +6998,13 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "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": { @@ -7228,7 +7016,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.11" @@ -7241,12 +7029,12 @@ "dev": true }, "minipass": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha1-A8gk2EVR7Dio0btbw1Clowo1SkA=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", + "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", "dev": true, "requires": { - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "yallist": "3.0.2" }, "dependencies": { @@ -7261,26 +7049,26 @@ "minizlib": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha1-EeE2WM5GvDpwomeqxYNZ0eDCnOs=", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "dev": true, "requires": { - "minipass": "2.2.4" + "minipass": "2.3.3" } }, "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { "concat-stream": "1.6.2", - "duplexify": "3.5.4", + "duplexify": "3.6.0", "end-of-stream": "1.4.1", "flush-write-stream": "1.0.3", "from2": "2.3.0", "parallel-transform": "1.1.0", "pump": "2.0.1", - "pumpify": "1.4.0", + "pumpify": "1.5.1", "stream-each": "1.2.2", "through2": "2.0.3" } @@ -7288,7 +7076,7 @@ "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { "for-in": "1.0.2", @@ -7298,7 +7086,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -7334,9 +7122,9 @@ } }, "moment": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", - "integrity": "sha1-KhFLUdKm7J5tg8+AP4OKh42KAjo=" + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" }, "morgan": { "version": "1.9.0", @@ -7374,7 +7162,7 @@ "multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { "dns-packet": "1.3.1", @@ -7402,13 +7190,13 @@ "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8=", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", "dev": true }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", + "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", @@ -7416,7 +7204,6 @@ "define-property": "2.0.2", "extend-shallow": "3.0.2", "fragment-cache": "0.2.1", - "is-odd": "2.0.0", "is-windows": "1.0.2", "kind-of": "6.0.2", "object.pick": "1.3.0", @@ -7440,20 +7227,11 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "1.0.0" - } - }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -7461,9 +7239,9 @@ "dev": true }, "neo-async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", - "integrity": "sha1-drHIIxMMyias+6zMj7rwovozsY8=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", "dev": true }, "next-tick": { @@ -7473,62 +7251,62 @@ "dev": true }, "ng-packagr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-2.4.1.tgz", - "integrity": "sha1-J6ta2TNyWkicXtp+VlbOWpRcOcI=", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-2.4.5.tgz", + "integrity": "sha512-1SnzFGIM2urn0fFp2aP9+fv5xs1HyhiDwwHbowZIBlPQ+gVRuhVNLTM3L21URDakDt3+rO9D+DipyyvRWnBRLw==", "dev": true, "requires": { "@ngtools/json-schema": "1.2.0", "autoprefixer": "7.2.6", "browserslist": "2.11.3", - "chalk": "2.3.2", - "commander": "2.15.1", + "chalk": "2.4.1", + "commander": "2.16.0", "cpx": "1.5.0", "fs-extra": "5.0.0", "glob": "7.1.2", "injection-js": "2.2.1", "less": "2.7.3", - "node-sass": "4.8.3", + "node-sass": "4.9.2", "node-sass-tilde-importer": "1.0.2", - "postcss": "6.0.21", + "postcss": "6.0.23", "postcss-clean": "1.1.0", - "postcss-url": "7.3.1", + "postcss-url": "7.3.2", "read-pkg-up": "3.0.0", "rimraf": "2.6.2", "rollup": "0.55.5", - "rollup-plugin-cleanup": "2.0.0", + "rollup-plugin-cleanup": "2.0.1", "rollup-plugin-commonjs": "8.3.0", "rollup-plugin-license": "0.6.0", "rollup-plugin-node-resolve": "3.3.0", - "rxjs": "5.5.8", + "rxjs": "5.5.11", "sorcery": "0.10.0", "strip-bom": "3.0.0", "stylus": "0.54.5", - "tar": "4.4.1", - "uglify-js": "3.3.16", - "update-notifier": "2.4.0" + "tar": "4.4.4", + "uglify-js": "3.4.4", + "update-notifier": "2.5.0" }, "dependencies": { "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "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" + "supports-color": "5.4.0" } }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "dev": true, "requires": { "graceful-fs": "4.1.11", "jsonfile": "4.0.0", - "universalify": "0.1.1" + "universalify": "0.1.2" } }, "has-flag": { @@ -7555,8 +7333,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.1" + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" } }, "read-pkg": { @@ -7587,26 +7365,26 @@ "dev": true }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "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" } }, "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha1-sl1ahHDJdv16moo1D0LFnp+oF0k=", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.4.tgz", + "integrity": "sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w==", "dev": true, "requires": { "chownr": "1.0.1", "fs-minipass": "1.2.5", - "minipass": "2.2.4", + "minipass": "2.3.3", "minizlib": "1.1.0", "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "yallist": "3.0.2" } }, @@ -7621,28 +7399,27 @@ "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "1.1.4" } }, "node-forge": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", "dev": true }, "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz", + "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==", "dev": true, "requires": { "fstream": "1.0.11", "glob": "7.1.2", "graceful-fs": "4.1.11", - "minimatch": "3.0.4", "mkdirp": "0.5.1", "nopt": "3.0.6", "npmlog": "4.1.2", @@ -7651,7 +7428,7 @@ "rimraf": "2.6.2", "semver": "5.3.0", "tar": "2.2.1", - "which": "1.3.0" + "which": "1.3.1" }, "dependencies": { "nopt": { @@ -7674,7 +7451,7 @@ "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { "assert": "1.4.1", @@ -7691,14 +7468,14 @@ "process": "0.11.10", "punycode": "1.4.1", "querystring-es3": "0.2.1", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "stream-browserify": "2.0.1", - "stream-http": "2.8.1", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.6", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", "url": "0.11.0", - "util": "0.10.3", + "util": "0.10.4", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7717,15 +7494,15 @@ "dev": true }, "node-sass": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.8.3.tgz", - "integrity": "sha1-0HfMIKCKwG9mHKRPtvGc0u1B3rs=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.2.tgz", + "integrity": "sha512-LdxoJLZutx0aQXHtWIYwJKMj+9pTjneTcLWJgzf2XbGu0q5pRNqW5QvFCEdm3mc5rJOdru/mzln5d0EZLacf6g==", "dev": true, "requires": { "async-foreach": "0.1.3", "chalk": "1.1.3", "cross-spawn": "3.0.1", - "gaze": "1.1.2", + "gaze": "1.1.3", "get-stdin": "4.0.1", "glob": "7.1.2", "in-publish": "2.0.0", @@ -7735,24 +7512,42 @@ "meow": "3.7.0", "mkdirp": "0.5.1", "nan": "2.10.0", - "node-gyp": "3.6.2", + "node-gyp": "3.7.0", "npmlog": "4.1.2", - "request": "2.79.0", + "request": "2.87.0", "sass-graph": "2.2.4", "stdout-stream": "1.4.0", "true-case-path": "1.0.2" }, "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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "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 }, "chalk": { @@ -7768,50 +7563,82 @@ "supports-color": "2.0.0" } }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "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": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.15.1", - "is-my-json-valid": "2.17.2", - "pinkie-promise": "2.0.1" + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "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.4.1", + "sshpk": "1.14.2" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "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.6.0", - "aws4": "1.6.0", - "caseless": "0.11.0", + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", "combined-stream": "1.0.6", "extend": "3.0.1", "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", + "form-data": "2.3.2", + "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.18", "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", "tough-cookie": "2.3.4", - "tunnel-agent": "0.4.3", - "uuid": "3.2.1" + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" } }, "supports-color": { @@ -7819,19 +7646,13 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true } } }, "node-sass-tilde-importer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", - "integrity": "sha1-GhUQXBU/ZIMjtDR2k/2w8zG60c4=", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", "dev": true, "requires": { "find-parent-dir": "0.3.0" @@ -7850,10 +7671,10 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", + "hosted-git-info": "2.7.1", "is-builtin-module": "1.0.0", "semver": "5.5.0", "validate-npm-package-license": "3.0.3" @@ -7886,10 +7707,10 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { - "are-we-there-yet": "1.1.4", + "are-we-there-yet": "1.1.5", "console-control-strings": "1.1.0", "gauge": "2.7.4", "set-blocking": "2.0.0" @@ -7959,50 +7780,13 @@ "requires": { "is-descriptor": "0.1.6" } - }, - "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.2.2" - } - }, - "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.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } } } }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "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": { @@ -8052,7 +7836,7 @@ "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, "on-finished": { @@ -8082,7 +7866,7 @@ "opn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "dev": true, "requires": { "is-wsl": "1.1.0" @@ -8105,24 +7889,12 @@ "dev": true }, "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", + "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", "dev": true, "requires": { - "url-parse": "1.0.5" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "dev": true, - "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" - } - } + "url-parse": "1.4.1" } }, "os-browserify": { @@ -8165,7 +7937,7 @@ "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { "os-homedir": "1.0.2", @@ -8179,9 +7951,9 @@ "dev": true }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", + "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" @@ -8193,13 +7965,13 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "1.3.0" } }, "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-try": { @@ -8223,7 +7995,7 @@ "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", "dev": true }, "parallel-transform": { @@ -8234,7 +8006,7 @@ "requires": { "cyclist": "0.2.2", "inherits": "2.0.3", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "param-case": { @@ -8247,16 +8019,16 @@ } }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "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.10.1", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "pbkdf2": "3.0.16" } }, "parse-glob": { @@ -8277,7 +8049,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "1.3.2" } }, "parse-passwd": { @@ -8289,10 +8061,10 @@ "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w=", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, "requires": { - "@types/node": "6.0.103" + "@types/node": "6.0.114" } }, "parsejson": { @@ -8385,7 +8157,7 @@ "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "3.0.0" @@ -8401,15 +8173,15 @@ } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", + "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.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", "sha.js": "2.4.11" } }, @@ -8475,25 +8247,25 @@ "dev": true }, "postcss": { - "version": "6.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", - "integrity": "sha1-gmVmJpTt356aWWDbbaM8OeTNBp0=", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.3.2", + "chalk": "2.4.1", "source-map": "0.6.1", - "supports-color": "5.3.0" + "supports-color": "5.4.0" }, "dependencies": { "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "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" + "supports-color": "5.4.0" } }, "has-flag": { @@ -8505,13 +8277,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "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" @@ -8522,79 +8294,57 @@ "postcss-clean": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/postcss-clean/-/postcss-clean-1.1.0.tgz", - "integrity": "sha1-wtYdXYyvGaWFrboWiXcmwmdMQgc=", + "integrity": "sha512-83g3GqMbCM5NL6MlbbPLJ/m2NrUepBF44MoDk4Gt04QGXeXKh9+ilQa0DzLnYnvqYHQCw83nckuEzBFr2muwbg==", "dev": true, "requires": { "clean-css": "4.1.11", - "postcss": "6.0.21" + "postcss": "6.0.23" } }, "postcss-import": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", - "integrity": "sha1-Vck2LJGSmU7GiGXSJEGd8dspgfA=", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", "dev": true, "requires": { - "postcss": "6.0.21", + "postcss": "6.0.23", "postcss-value-parser": "3.3.0", "read-cache": "1.0.0", - "resolve": "1.6.0" + "resolve": "1.8.1" } }, "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "dev": true, - "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", "dev": true, "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "4.0.0", + "import-cwd": "2.1.0" } }, "postcss-loader": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.3.tgz", - "integrity": "sha1-6yENpzTkdaJE92zNYfmGD1uz7gk=", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", "dev": true, "requires": { "loader-utils": "1.1.0", - "postcss": "6.0.21", - "postcss-load-config": "1.2.0", + "postcss": "6.0.23", + "postcss-load-config": "2.0.0", "schema-utils": "0.4.5" } }, "postcss-url": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.1.tgz", - "integrity": "sha1-tDrg8NrkzQbIMfo66sLXpbc3VO0=", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", + "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", "dev": true, "requires": { "mime": "1.6.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "postcss": "6.0.21", + "postcss": "6.0.23", "xxhashjs": "0.2.2" } }, @@ -8635,13 +8385,13 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "optional": true, "requires": { @@ -8660,7 +8410,7 @@ "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", "dev": true, "requires": { - "@types/node": "6.0.103", + "@types/node": "6.0.114", "@types/q": "0.0.32", "@types/selenium-webdriver": "2.53.43", "blocking-proxy": "0.0.5", @@ -8674,15 +8424,39 @@ "selenium-webdriver": "3.0.1", "source-map-support": "0.4.18", "webdriver-js-extender": "1.0.0", - "webdriver-manager": "12.0.6" + "webdriver-manager": "12.1.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.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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 + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -8711,6 +8485,17 @@ "rimraf": "2.6.2" } }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -8725,18 +8510,85 @@ "pinkie-promise": "2.0.1" } }, + "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.5.2", + "har-schema": "2.0.0" + } + }, + "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.4.1", + "sshpk": "1.14.2" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "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.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "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.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -8744,19 +8596,19 @@ "dev": true }, "webdriver-manager": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", - "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", + "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", "dev": true, "requires": { - "adm-zip": "0.4.7", + "adm-zip": "0.4.11", "chalk": "1.1.3", "del": "2.2.2", "glob": "7.1.2", "ini": "1.3.5", "minimist": "1.2.0", "q": "1.4.1", - "request": "2.81.0", + "request": "2.87.0", "rimraf": "2.6.2", "semver": "5.5.0", "xml2js": "0.4.19" @@ -8767,7 +8619,7 @@ "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha1-NV8mJQWmIWRrMTCnKOtkfiIFU0E=", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "dev": true, "requires": { "forwarded": "0.1.2", @@ -8793,22 +8645,22 @@ "dev": true }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "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.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", "randombytes": "2.0.6" } }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { "end-of-stream": "1.4.1", @@ -8816,20 +8668,20 @@ } }, "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha1-gLfF334kFT0D8OesigWl0Gi9B/s=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.5.4", + "duplexify": "3.6.0", "inherits": "2.0.3", "pump": "2.0.1" } }, "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "q": { @@ -8841,7 +8693,7 @@ "qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, "qs": { @@ -8863,69 +8715,53 @@ "dev": true }, "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", "dev": true }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.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.2.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.6" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true }, "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.6" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, "randombytes": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "range-parser": { @@ -8944,6 +8780,32 @@ "http-errors": "1.6.2", "iconv-lite": "0.4.19", "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } } }, "raw-loader": { @@ -8953,12 +8815,12 @@ "dev": true }, "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "0.4.2", + "deep-extend": "0.6.0", "ini": "1.3.5", "minimist": "1.2.0", "strip-json-comments": "2.0.1" @@ -9051,17 +8913,17 @@ } }, "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha1-tPhQA6k4y7bsvOKhJPsQEr0ag40=", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", "util-deprecate": "1.0.2" } }, @@ -9073,7 +8935,7 @@ "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "set-immediate-shim": "1.0.1" } }, @@ -9090,25 +8952,25 @@ "reflect-metadata": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", - "integrity": "sha1-MRvwxrY814LyKKgavhRqK/qcVvI=", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", "dev": true }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha1-DDNtOYBVPXVcObWGrjsgqknIK38=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { "is-equal-shallow": "0.1.3" @@ -9117,7 +8979,7 @@ "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { "extend-shallow": "3.0.2", @@ -9130,7 +8992,7 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.3.3", + "regenerate": "1.4.0", "regjsgen": "0.2.0", "regjsparser": "0.1.5" } @@ -9138,11 +9000,11 @@ "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "1.2.6", - "safe-buffer": "5.1.1" + "rc": "1.2.8", + "safe-buffer": "5.1.2" } }, "registry-url": { @@ -9151,7 +9013,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.6" + "rc": "1.2.8" } }, "regjsgen": { @@ -9238,7 +9100,7 @@ "dev": true, "requires": { "aws-sign2": "0.6.0", - "aws4": "1.6.0", + "aws4": "1.7.0", "caseless": "0.12.0", "combined-stream": "1.0.6", "extend": "3.0.1", @@ -9254,11 +9116,11 @@ "oauth-sign": "0.8.2", "performance-now": "0.2.0", "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", + "safe-buffer": "5.1.2", + "stringstream": "0.0.6", "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "uuid": "3.3.2" } }, "require-directory": { @@ -9268,9 +9130,9 @@ "dev": true }, "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-main-filename": { @@ -9286,9 +9148,9 @@ "dev": true }, "resolve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", - "integrity": "sha1-D70hJ4sntABEgcOVNJ56umCp/1w=", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -9318,7 +9180,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "right-align": { @@ -9333,37 +9195,37 @@ "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" } }, "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "2.0.2", + "hash-base": "3.0.4", "inherits": "2.0.3" } }, "rollup": { "version": "0.55.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.5.tgz", - "integrity": "sha1-L4jDAPfPJLXsLcqKarpzsE4IfpM=", + "integrity": "sha512-2hke9NOy332kxvnmMQOgl7DHm94zihNyYJNd8ZLWo4U0EjFvjUkeWa0+ge+70bTg+mY0xJ7NUsf5kIhDtrGrtA==", "dev": true }, "rollup-plugin-cleanup": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.0.tgz", - "integrity": "sha1-hZdzGaO/VHUKnXX7kJx+UfWaLaQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.1.tgz", + "integrity": "sha512-Z2UpMe3l2Oo8jzoB2gAWcb3UqIyiGxlh8kKlcs/W53yTPtwdF8RGfhuTx+/kjRlkSc5TC03t3sX3Lj3B40k9Eg==", "dev": true, "requires": { "acorn": "4.0.13", "magic-string": "0.22.5", - "rollup-pluginutils": "2.0.1" + "rollup-pluginutils": "2.3.0" }, "dependencies": { "acorn": { @@ -9377,28 +9239,20 @@ "rollup-plugin-commonjs": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.3.0.tgz", - "integrity": "sha1-kbS6GPNAlR457XsZAfN3qAqz+cM=", + "integrity": "sha512-PYs3OiYgENFYEmI3vOEm5nrp3eY90YZqd5vGmQqeXmhJsAWFIrFdROCvOasqJ1HgeTvqyYo9IGXnFDyoboNcgQ==", "dev": true, "requires": { - "acorn": "5.5.3", - "estree-walker": "0.5.1", + "acorn": "5.7.1", + "estree-walker": "0.5.2", "magic-string": "0.22.5", - "resolve": "1.6.0", - "rollup-pluginutils": "2.0.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.1.tgz", - "integrity": "sha1-ZPw3UFOrxvV9c+m9LwBGRK08WFQ=", - "dev": true - } + "resolve": "1.8.1", + "rollup-pluginutils": "2.3.0" } }, "rollup-plugin-license": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-0.6.0.tgz", - "integrity": "sha1-2OXnWsD8taevfF2JpkTvQvBfSKQ=", + "integrity": "sha512-Ttz65oRtNKcfV5icDkQTixc8ja64ueoXejRJoAtmjXYAWVg0qx+tu5rXmEOXWXmUXeGs0ARUVIAG0p1JK0gACQ==", "dev": true, "requires": { "commenting": "1.0.5", @@ -9408,43 +9262,55 @@ "moment": "2.21.0" }, "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, "magic-string": { "version": "0.22.4", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha1-MQObTkA2Y5VhjB1s+Bk8U5F0df8=", + "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", "dev": true, "requires": { "vlq": "0.2.3" } + }, + "moment": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==", + "dev": true } } }, "rollup-plugin-node-resolve": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", - "integrity": "sha1-wm0RCjaBLL76fOEXytzTQ5qhxxM=", + "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", "dev": true, "requires": { "builtin-modules": "2.0.0", "is-module": "1.0.0", - "resolve": "1.6.0" + "resolve": "1.8.1" }, "dependencies": { "builtin-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha1-YLfvWuZUa9fe76dLCLYqQ6IyZI4=", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", "dev": true } } }, "rollup-pluginutils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz", - "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", + "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", "dev": true, "requires": { - "estree-walker": "0.3.1", + "estree-walker": "0.5.2", "micromatch": "2.3.11" } }, @@ -9458,18 +9324,18 @@ } }, "rxjs": { - "version": "5.5.8", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz", - "integrity": "sha1-srCAmldhStYlTAPXRG3qDYPKN5E=", + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", "dev": true, "requires": { "symbol-observable": "1.0.1" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { @@ -9491,6 +9357,12 @@ "graceful-fs": "4.1.11" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sander": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", @@ -9510,7 +9382,7 @@ "dev": true, "requires": { "glob": "7.1.2", - "lodash": "4.17.5", + "lodash": "4.17.10", "scss-tokenizer": "0.2.3", "yargs": "7.1.0" } @@ -9518,13 +9390,13 @@ "sass-loader": { "version": "6.0.7", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha1-3S/bPn7v9KU/NbpqxAhxVIg1PQA=", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", "dev": true, "requires": { "clone-deep": "2.0.2", "loader-utils": "1.1.0", "lodash.tail": "4.1.1", - "neo-async": "2.5.0", + "neo-async": "2.5.1", "pify": "3.0.0" } }, @@ -9578,11 +9450,11 @@ "schema-utils": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha1-IYNvBgiqwXt4+ePiTa/xSlyhOj4=", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", "dev": true, "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.1.0" + "ajv": "6.5.2", + "ajv-keywords": "3.2.0" } }, "scss-tokenizer": { @@ -9591,7 +9463,7 @@ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { - "js-base64": "2.4.3", + "js-base64": "2.4.5", "source-map": "0.4.4" }, "dependencies": { @@ -9618,7 +9490,7 @@ "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", "dev": true, "requires": { - "adm-zip": "0.4.7", + "adm-zip": "0.4.11", "rimraf": "2.6.2", "tmp": "0.0.30", "xml2js": "0.4.19" @@ -9636,18 +9508,18 @@ } }, "selfsigned": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", - "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", "dev": true, "requires": { - "node-forge": "0.7.1" + "node-forge": "0.7.5" } }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "semver-diff": { @@ -9680,7 +9552,7 @@ "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "dev": true, "requires": { "debug": "2.6.9", @@ -9690,7 +9562,7 @@ "escape-html": "1.0.3", "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", "on-finished": "2.3.0", @@ -9701,15 +9573,15 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true } } }, "serialize-javascript": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", - "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "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 }, "serve-index": { @@ -9722,7 +9594,7 @@ "batch": "0.6.1", "debug": "2.6.9", "escape-html": "1.0.3", - "http-errors": "1.6.2", + "http-errors": "1.6.3", "mime-types": "2.1.18", "parseurl": "1.3.2" } @@ -9730,7 +9602,7 @@ "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { "encodeurl": "1.0.2", @@ -9754,7 +9626,7 @@ "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { "extend-shallow": "2.0.1", @@ -9783,23 +9655,23 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "shallow-clone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha1-RIDNBuiC72iyrYij6lSDLixItXE=", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", "dev": true, "requires": { "is-extendable": "0.1.1", @@ -9810,7 +9682,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -9866,7 +9738,7 @@ "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { "base": "0.11.2", @@ -9875,7 +9747,7 @@ "extend-shallow": "2.0.1", "map-cache": "0.2.2", "source-map": "0.5.7", - "source-map-resolve": "0.5.1", + "source-map-resolve": "0.5.2", "use": "3.1.0" }, "dependencies": { @@ -9896,70 +9768,13 @@ "requires": { "is-extendable": "0.1.1" } - }, - "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.2.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.6" - } - } - } - }, - "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.2.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.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true } } }, "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "1.0.0", @@ -9976,18 +9791,53 @@ "is-descriptor": "1.0.2" } }, + "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.2" + } + }, + "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.2" + } + }, + "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": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "3.2.2" @@ -10147,11 +9997,11 @@ "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { "faye-websocket": "0.10.0", - "uuid": "3.2.1" + "uuid": "3.3.2" } }, "sockjs-client": { @@ -10165,7 +10015,7 @@ "faye-websocket": "0.11.1", "inherits": "2.0.3", "json3": "3.3.2", - "url-parse": "1.2.0" + "url-parse": "1.4.1" }, "dependencies": { "faye-websocket": { @@ -10202,7 +10052,7 @@ "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", "dev": true }, "source-map": { @@ -10212,12 +10062,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", + "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.0", + "atob": "2.1.1", "decode-uri-component": "0.2.0", "resolve-url": "0.2.1", "source-map-url": "0.4.0", @@ -10227,7 +10077,7 @@ "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { "source-map": "0.5.7" @@ -10242,13 +10092,13 @@ "sourcemap-codec": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz", - "integrity": "sha1-yP2S2RiJ6QKgeu45K90sWGOVi6I=", + "integrity": "sha512-hX1eNBNuilj8yfFnECh0DzLgwKpBLMIvmhgEhixXNui8lMLBInTI8Kyxt++RwJnMNu7cAUo635L2+N1TxMJCzA==", "dev": true }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { "spdx-expression-parse": "3.0.0", @@ -10258,13 +10108,13 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "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": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "2.1.0", @@ -10274,7 +10124,7 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", "dev": true }, "spdy": { @@ -10286,7 +10136,7 @@ "debug": "2.6.9", "handle-thing": "1.2.5", "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "select-hose": "2.0.0", "spdy-transport": "2.1.0" } @@ -10294,15 +10144,15 @@ "spdy-transport": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha1-S7sVqv/tC+791WrWHb3Iuj4st6E=", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "dev": true, "requires": { "debug": "2.6.9", "detect-node": "2.0.3", "hpack.js": "2.1.6", "obuf": "1.1.2", - "readable-stream": "2.3.5", - "safe-buffer": "5.1.1", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", "wbuf": "1.7.3" } }, @@ -10318,7 +10168,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "3.0.2" @@ -10331,18 +10181,19 @@ "dev": true }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "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.1", + "bcrypt-pbkdf": "1.0.2", "dashdash": "1.14.1", "ecc-jsbn": "0.1.1", "getpass": "0.1.7", "jsbn": "0.1.1", + "safer-buffer": "2.1.2", "tweetnacl": "0.14.5" }, "dependencies": { @@ -10356,95 +10207,38 @@ }, "ssri": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "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.2.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.6" - } - } - } - }, - "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.2.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.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "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.2" + } + }, + "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-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-descriptor": "0.1.6" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true } } }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, "stdout-stream": { @@ -10453,7 +10247,7 @@ "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", "dev": true, "requires": { - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "stream-browserify": { @@ -10463,7 +10257,7 @@ "dev": true, "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.5" + "readable-stream": "2.3.6" } }, "stream-combiner": { @@ -10478,7 +10272,7 @@ "stream-each": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha1-joxGP5HaiZF3h2WHP+TZYNj2Fr0=", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "dev": true, "requires": { "end-of-stream": "1.4.1", @@ -10486,14 +10280,14 @@ } }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha1-0EQb4aRXpzpzOop7U1cL69nvZqQ=", + "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.3", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" } @@ -10516,18 +10310,18 @@ } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", "dev": true }, "strip-ansi": { @@ -10572,7 +10366,7 @@ "style-loader": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha1-WR/8gLzv4mi3fF2evAUF13Jhn4U=", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -10644,7 +10438,7 @@ "stylus-loader": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", - "integrity": "sha1-J6cGQgsFo44DjnyssVNXjUUFE8Y=", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -10734,7 +10528,7 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "xtend": "4.0.1" } }, @@ -10757,9 +10551,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha1-JB52kn2coF9NlZgZAi9bNmS2S64=", + "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.5" @@ -10804,7 +10598,7 @@ "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { "define-property": "2.0.2", @@ -10835,15 +10629,15 @@ } }, "toposort": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", - "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "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": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { "punycode": "1.4.1" @@ -10866,7 +10660,7 @@ "tree-kill": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha1-WEZ4Yje0I5AU8F2xVrZDIS1MbzY=", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", "dev": true }, "trim-newlines": { @@ -10919,7 +10713,7 @@ "mkdirp": "0.5.1", "source-map-support": "0.4.18", "tsconfig": "6.0.0", - "v8flags": "3.0.2", + "v8flags": "3.1.1", "yn": "2.0.0" }, "dependencies": { @@ -10932,18 +10726,45 @@ } }, "ts-simple-ast": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-6.12.0.tgz", - "integrity": "sha1-vSMtf8fj8f8SEYJVTeHkIW+SWC4=", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-11.2.0.tgz", + "integrity": "sha1-WKRGneU5HF4fnV9etX1nXB4xVjY=", "dev": true, "requires": { - "code-block-writer": "6.7.1", + "@dsherret/to-absolute-glob": "2.0.2", + "@types/fs-extra": "5.0.4", + "code-block-writer": "7.1.0", + "fs-extra": "5.0.0", + "glob-parent": "3.1.0", "globby": "6.1.0", + "is-negated-glob": "1.0.0", "multimatch": "2.1.0", "object-assign": "4.1.1", - "typescript": "2.4.2" + "tslib": "1.9.3", + "typescript": "2.8.3" }, "dependencies": { + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "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.2" + } + }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -10957,11 +10778,32 @@ "pinkie-promise": "2.0.1" } }, + "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-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.1" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true + }, + "typescript": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", + "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", + "dev": true } } }, @@ -10984,15 +10826,15 @@ } }, "tsickle": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.2.tgz", - "integrity": "sha1-8z1G0Eb3PdXBVaN5IuQigW6HhzY=", + "version": "0.27.5", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", + "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", "dev": true, "requires": { "minimist": "1.2.0", "mkdirp": "0.5.1", "source-map": "0.6.1", - "source-map-support": "0.5.4" + "source-map-support": "0.5.6" }, "dependencies": { "minimist": { @@ -11004,24 +10846,25 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", - "integrity": "sha1-VEVu+onKqScK981iTMLxI+Ufuug=", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { + "buffer-from": "1.1.0", "source-map": "0.6.1" } } } }, "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, "tslint": { @@ -11031,24 +10874,24 @@ "dev": true, "requires": { "babel-code-frame": "6.26.0", - "colors": "1.2.1", - "commander": "2.15.1", + "colors": "1.3.0", + "commander": "2.16.0", "diff": "3.5.0", "glob": "7.1.2", "minimatch": "3.0.4", - "resolve": "1.6.0", + "resolve": "1.8.1", "semver": "5.5.0", - "tslib": "1.9.0", - "tsutils": "2.25.0" + "tslib": "1.9.3", + "tsutils": "2.27.2" } }, "tsutils": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.25.0.tgz", - "integrity": "sha1-FNYW71kiSjyft+tIPhwYK2Zlrl4=", + "version": "2.27.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", + "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "1.9.3" } }, "tty-browserify": { @@ -11063,7 +10906,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -11076,7 +10919,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "dev": true, "requires": { "media-typer": "0.3.0", @@ -11086,7 +10929,7 @@ "typechecker": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.5.0.tgz", - "integrity": "sha1-w4KSAJeBI2S7r0WVsKtliCRBF6Y=", + "integrity": "sha512-bqPE/ck3bVIaXP7gMKTKSHrypT32lpYTpiqzPYeYzdSQnmaGvaGhy7TnN/M/+5R+2rs/kKcp9ZLPRp/Q9Yj+4w==", "dev": true, "requires": { "editions": "1.3.4" @@ -11105,19 +10948,19 @@ "dev": true }, "uglify-js": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.16.tgz", - "integrity": "sha1-I7oT76J6oAiFvnQXgZ6Kl4f5QCg=", + "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.15.1", + "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": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -11130,15 +10973,15 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz", - "integrity": "sha1-XuyUGy6bhTi+CiD8btolsUx8EEM=", + "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", + "serialize-javascript": "1.5.0", "source-map": "0.6.1", "uglify-es": "3.3.9", "webpack-sources": "1.1.0", @@ -11148,19 +10991,19 @@ "commander": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=", + "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": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "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": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { "commander": "2.13.0", @@ -11175,6 +11018,12 @@ "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", "dev": true }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -11238,9 +11087,9 @@ } }, "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unix-crypt-td-js": { @@ -11308,15 +11157,15 @@ "dev": true }, "upath": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", - "integrity": "sha1-7iMhugp4bFCXPbBDpQt7y6giNh0=", + "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 }, "update-notifier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.4.0.tgz", - "integrity": "sha1-+bTHAPv9TsEsgRWHJYd31WPYyGY=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { "boxen": "1.3.0", @@ -11338,12 +11187,12 @@ "dev": true }, "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "2.1.1" } }, "urix": { @@ -11373,7 +11222,7 @@ "url-loader": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha1-oAenEJYg6dmI0UvOZ3od7Lmpk/c=", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "dev": true, "requires": { "loader-utils": "1.1.0", @@ -11405,21 +11254,13 @@ } }, "url-parse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", - "integrity": "sha1-OhnoqqbQI93SfcxEy0/I9/7COYY=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", + "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", "dev": true, "requires": { - "querystringify": "1.0.0", + "querystringify": "2.0.0", "requires-port": "1.0.0" - }, - "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", - "dev": true - } } }, "url-parse-lax": { @@ -11434,7 +11275,7 @@ "use": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha1-FHFr8D/f79AwQK71jYtLhfOnxUQ=", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { "kind-of": "6.0.2" @@ -11443,7 +11284,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true } } @@ -11451,28 +11292,20 @@ "useragent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "dev": true, "requires": { - "lru-cache": "4.1.2", + "lru-cache": "4.1.3", "tmp": "0.0.31" } }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "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.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "inherits": "2.0.3" } }, "util-deprecate": { @@ -11494,15 +11327,15 @@ "dev": true }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "v8flags": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", - "integrity": "sha1-rWp4ogprI9A6jevBEhHjzCMUlHc=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", + "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", "dev": true, "requires": { "homedir-polyfill": "1.0.1" @@ -11511,7 +11344,7 @@ "validate-npm-package-license": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { "spdx-correct": "3.0.0", @@ -11544,15 +11377,15 @@ } }, "viz.js": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.1.tgz", - "integrity": "sha1-J3qzz0NnxgipWygadHIIPD4u5s8=", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", + "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", "dev": true }, "vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha1-jz5DKM9jsVQMDWfhsneDhviXWyY=", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", "dev": true }, "vm-browserify": { @@ -11571,20 +11404,20 @@ "dev": true }, "watchpack": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", - "integrity": "sha1-Ix54Ovgwoi+JZvZcTEusyBQHLu0=", + "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.3", + "chokidar": "2.0.4", "graceful-fs": "4.1.11", - "neo-async": "2.5.0" + "neo-async": "2.5.1" }, "dependencies": { "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { "micromatch": "3.1.10", @@ -11604,18 +11437,16 @@ "dev": true }, "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "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", - "define-property": "1.0.0", "extend-shallow": "2.0.1", "fill-range": "4.0.0", "isobject": "3.0.1", - "kind-of": "6.0.2", "repeat-element": "1.1.2", "snapdragon": "0.8.2", "snapdragon-node": "2.1.1", @@ -11623,15 +11454,6 @@ "to-regex": "3.0.2" }, "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.2" - } - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -11644,23 +11466,24 @@ } }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", + "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.1", - "braces": "2.3.1", - "fsevents": "1.1.3", + "braces": "2.3.2", + "fsevents": "1.2.4", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", "readdirp": "2.1.0", - "upath": "1.0.4" + "upath": "1.1.0" } }, "expand-brackets": { @@ -11696,10 +11519,50 @@ "is-extendable": "0.1.1" } }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -11710,7 +11573,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -11718,7 +11581,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "0.3.2", @@ -11796,43 +11659,32 @@ } }, "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=", + "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": "3.2.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.6" - } - } + "kind-of": "6.0.2" } }, "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=", + "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": "3.2.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.6" - } - } + "kind-of": "6.0.2" + } + }, + "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-extglob": { @@ -11879,24 +11731,24 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", - "braces": "2.3.1", + "braces": "2.3.2", "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", + "nanomatch": "1.2.13", "object.pick": "1.3.0", "regex-not": "1.0.2", "snapdragon": "0.8.2", @@ -11924,10 +11776,10 @@ "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "webdriver-js-extender": { @@ -11986,14 +11838,14 @@ "webpack": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha1-d9pFGx17SxF62vQaGpO1dC8k2JQ=", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "dev": true, "requires": { - "acorn": "5.5.3", + "acorn": "5.7.1", "acorn-dynamic-import": "2.0.2", - "ajv": "6.4.0", - "ajv-keywords": "3.1.0", - "async": "2.6.0", + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "async": "2.6.1", "enhanced-resolve": "3.4.1", "escope": "3.6.0", "interpret": "1.1.0", @@ -12008,7 +11860,7 @@ "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.5.0", + "watchpack": "1.6.0", "webpack-sources": "1.1.0", "yargs": "8.0.2" }, @@ -12051,7 +11903,7 @@ "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { "execa": "0.7.0", @@ -12098,7 +11950,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -12185,7 +12037,7 @@ "camelcase": "4.1.0", "cliui": "3.2.0", "decamelize": "1.2.0", - "get-caller-file": "1.0.2", + "get-caller-file": "1.0.3", "os-locale": "2.1.0", "read-pkg-up": "2.0.0", "require-directory": "2.1.1", @@ -12278,7 +12130,7 @@ "webpack-dev-middleware": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha1-+PwRIM47T8VoDO7LQ9d3lmshEF4=", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "dev": true, "requires": { "memory-fs": "0.4.1", @@ -12291,13 +12143,13 @@ "webpack-dev-server": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", - "integrity": "sha1-H09MeL8YlTePN2gVkQgS2veaIW8=", + "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", "dev": true, "requires": { "ansi-html": "0.0.7", "array-includes": "3.0.3", "bonjour": "3.5.0", - "chokidar": "2.0.3", + "chokidar": "2.0.4", "compression": "1.7.2", "connect-history-api-fallback": "1.5.0", "debug": "3.1.0", @@ -12312,13 +12164,13 @@ "loglevel": "1.6.1", "opn": "5.1.0", "portfinder": "1.0.13", - "selfsigned": "1.10.2", + "selfsigned": "1.10.3", "serve-index": "1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.1.4", "spdy": "3.4.7", "strip-ansi": "3.0.1", - "supports-color": "5.3.0", + "supports-color": "5.4.0", "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" }, @@ -12326,7 +12178,7 @@ "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { "micromatch": "3.1.10", @@ -12346,18 +12198,16 @@ "dev": true }, "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", + "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", - "define-property": "1.0.0", "extend-shallow": "2.0.1", "fill-range": "4.0.0", "isobject": "3.0.1", - "kind-of": "6.0.2", "repeat-element": "1.1.2", "snapdragon": "0.8.2", "snapdragon-node": "2.1.1", @@ -12365,15 +12215,6 @@ "to-regex": "3.0.2" }, "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.2" - } - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -12392,29 +12233,30 @@ "dev": true }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha1-3L1PbLsqVbR5m6ioQKxSfl9LEXY=", + "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.1", - "braces": "2.3.1", - "fsevents": "1.1.3", + "braces": "2.3.2", + "fsevents": "1.2.4", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", "readdirp": "2.1.0", - "upath": "1.0.4" + "upath": "1.1.0" } }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -12438,7 +12280,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -12462,10 +12304,50 @@ "is-extendable": "0.1.1" } }, + "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.2.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.6" + } + } + } + }, + "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.2.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.6" + } + } + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -12476,7 +12358,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -12484,7 +12366,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { "array-unique": "0.3.2", @@ -12568,43 +12450,32 @@ "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=", + "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": "3.2.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.6" - } - } + "kind-of": "6.0.2" } }, "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=", + "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": "3.2.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.6" - } - } + "kind-of": "6.0.2" + } + }, + "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-extglob": { @@ -12651,24 +12522,24 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", - "braces": "2.3.1", + "braces": "2.3.2", "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", + "nanomatch": "1.2.13", "object.pick": "1.3.0", "regex-not": "1.0.2", "snapdragon": "0.8.2", @@ -12676,9 +12547,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "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" @@ -12699,7 +12570,7 @@ "camelcase": "3.0.0", "cliui": "3.2.0", "decamelize": "1.2.0", - "get-caller-file": "1.0.2", + "get-caller-file": "1.0.3", "os-locale": "1.4.0", "read-pkg-up": "1.0.1", "require-directory": "2.1.1", @@ -12723,18 +12594,18 @@ } }, "webpack-merge": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", - "integrity": "sha1-XTct3dPh5fiHT1v1qOkp2wn+shY=", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.3.tgz", + "integrity": "sha512-zxwAIGK7nKdu5CIZL0BjTQoq3elV0t0MfB7rUC1zj668geid52abs6hN/ACwZdK6LeMS8dC9B6WmtF978zH5mg==", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "webpack-sources": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { "source-list-map": "2.0.0", @@ -12744,7 +12615,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -12764,14 +12635,14 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "0.4.11", + "http-parser-js": "0.4.13", "websocket-extensions": "0.1.3" } }, "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, "when": { @@ -12781,9 +12652,9 @@ "dev": true }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "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" @@ -12796,9 +12667,9 @@ "dev": true }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "1.0.2" @@ -12828,7 +12699,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -12870,7 +12741,7 @@ "worker-farm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { "errno": "0.1.7" @@ -12895,7 +12766,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { "graceful-fs": "4.1.11", @@ -12925,16 +12796,10 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true - }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { "sax": "1.2.4", @@ -12944,7 +12809,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true } } @@ -12970,7 +12835,7 @@ "xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha1-imJRVnYhocRqWuIE2gJJx/jKqdg=", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, "requires": { "cuint": "0.2.2" @@ -12979,7 +12844,7 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yallist": { @@ -12997,7 +12862,7 @@ "camelcase": "3.0.0", "cliui": "3.2.0", "decamelize": "1.2.0", - "get-caller-file": "1.0.2", + "get-caller-file": "1.0.3", "os-locale": "1.4.0", "read-pkg-up": "1.0.1", "require-directory": "2.1.1", @@ -13053,9 +12918,9 @@ "dev": true }, "zone.js": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", - "integrity": "sha1-ohjEjbCUZLGf9vyPDUu1sQRuGF0=", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", + "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==", "dev": true } } diff --git a/package.json b/package.json index bfe4946..16c2466 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.5", + "version": "2.0.6", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", diff --git a/src/webglimpse/timeline/timeline_events_row.ts b/src/webglimpse/timeline/timeline_events_row.ts index 5d65cda..cfaf4ca 100644 --- a/src/webglimpse/timeline/timeline_events_row.ts +++ b/src/webglimpse/timeline/timeline_events_row.ts @@ -457,7 +457,7 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt for (let n = 0; n < eventDragEvents.length; n++) { const event = eventDragEvents[n]; const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; - event.start_PMILLIS = Math.min(event.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS); + event.start_PMILLIS = Math.trunc(Math.min(event.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS)); } } }; @@ -502,7 +502,7 @@ export function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOpt for (let n = 0; n < eventDragEvents.length; n++) { const event = eventDragEvents[n]; const newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS; - event.end_PMILLIS = Math.max(event.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS); + event.end_PMILLIS = Math.trunc(Math.max(event.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS)); } } }; diff --git a/src/webglimpse/timeline/timeline_lanes.ts b/src/webglimpse/timeline/timeline_lanes.ts index f73bdf7..f855141 100644 --- a/src/webglimpse/timeline/timeline_lanes.ts +++ b/src/webglimpse/timeline/timeline_lanes.ts @@ -274,8 +274,8 @@ export function effectiveEdges_PMILLIS(ui: TimelineUi, event: TimelineEventModel const iconStart_PMILLIS = iconTime_PMILLIS - (millisPerPx * icon.hAlign * icon.displayWidth); const iconEnd_PMILLIS = iconTime_PMILLIS + (millisPerPx * (1 - icon.hAlign) * icon.displayWidth); - start_PMILLIS = Math.min(start_PMILLIS, iconStart_PMILLIS); - end_PMILLIS = Math.max(end_PMILLIS, iconEnd_PMILLIS); + start_PMILLIS = Math.trunc(Math.min(start_PMILLIS, iconStart_PMILLIS)); + end_PMILLIS = Math.trunc(Math.max(end_PMILLIS, iconEnd_PMILLIS)); } return [start_PMILLIS, end_PMILLIS]; diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 077bdb8..1fb96c5 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -685,10 +685,10 @@ export class TimelineEventModel { setAttrs(event: TimelineEvent) { // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here - this._startLimit_PMILLIS = (hasval(event.startLimit_ISO8601) ? parseTime_PMILLIS(event.startLimit_ISO8601) : null); - this._endLimit_PMILLIS = (hasval(event.endLimit_ISO8601) ? parseTime_PMILLIS(event.endLimit_ISO8601) : null); - this._start_PMILLIS = parseTime_PMILLIS(event.start_ISO8601); - this._end_PMILLIS = parseTime_PMILLIS(event.end_ISO8601); + this._startLimit_PMILLIS = (hasval(event.startLimit_ISO8601) ? Math.trunc(parseTime_PMILLIS(event.startLimit_ISO8601)) : null); + this._endLimit_PMILLIS = (hasval(event.endLimit_ISO8601) ? Math.trunc(parseTime_PMILLIS(event.endLimit_ISO8601)) : null); + this._start_PMILLIS = Math.trunc(parseTime_PMILLIS(event.start_ISO8601)); + this._end_PMILLIS = Math.trunc(parseTime_PMILLIS(event.end_ISO8601)); this._label = event.label; this._labelIcon = event.labelIcon; this._userEditable = (hasval(event.userEditable) ? event.userEditable : false); @@ -726,21 +726,21 @@ export class TimelineEventModel { // If both limits are present and the event is larger than the total distance between them // then shrink the event to fit between the limits. if (hasval(this._startLimit_PMILLIS) && hasval(this._endLimit_PMILLIS) && durationLimit_PMILLIS < duration_PMILLIS) { - this._start_PMILLIS = this._startLimit_PMILLIS; - this._end_PMILLIS = this._endLimit_PMILLIS; + this._start_PMILLIS = Math.trunc(this._startLimit_PMILLIS); + this._end_PMILLIS = Math.trunc(this._endLimit_PMILLIS); } // Otherwise shift the event to comply with the limits without adjusting its total duration else if (underStartLimit) { - this._start_PMILLIS = this._startLimit_PMILLIS; - this._end_PMILLIS = this._start_PMILLIS + duration_PMILLIS; + this._start_PMILLIS = Math.trunc(this._startLimit_PMILLIS); + this._end_PMILLIS = Math.trunc(this._start_PMILLIS + duration_PMILLIS); } else if (overEndLimit) { - this._end_PMILLIS = this._endLimit_PMILLIS; - this._start_PMILLIS = this._end_PMILLIS - duration_PMILLIS; + this._end_PMILLIS = Math.trunc(this._endLimit_PMILLIS); + this._start_PMILLIS = Math.trunc(this._end_PMILLIS - duration_PMILLIS); } else { - this._end_PMILLIS = end_PMILLIS; - this._start_PMILLIS = start_PMILLIS; + this._end_PMILLIS = Math.trunc(end_PMILLIS); + this._start_PMILLIS = Math.trunc(start_PMILLIS); } // its possible due to the limits that the values didn't actually change @@ -765,7 +765,7 @@ export class TimelineEventModel { set start_PMILLIS(start_PMILLIS: number) { if (start_PMILLIS !== this._start_PMILLIS) { - this._start_PMILLIS = this.limit_start_PMILLIS(start_PMILLIS); + this._start_PMILLIS = Math.trunc(this.limit_start_PMILLIS(start_PMILLIS)); this._attrsChanged.fire(); } } @@ -776,7 +776,7 @@ export class TimelineEventModel { set end_PMILLIS(end_PMILLIS: number) { if (end_PMILLIS !== this._end_PMILLIS) { - this._end_PMILLIS = this.limit_end_PMILLIS(end_PMILLIS); + this._end_PMILLIS = Math.trunc(this.limit_end_PMILLIS(end_PMILLIS)); this._attrsChanged.fire(); } } @@ -787,8 +787,8 @@ export class TimelineEventModel { set startLimit_PMILLIS(startLimit_PMILLIS: number) { if (startLimit_PMILLIS !== this._startLimit_PMILLIS) { - this._startLimit_PMILLIS = startLimit_PMILLIS; - this._start_PMILLIS = this.limit_start_PMILLIS(this._start_PMILLIS); + this._startLimit_PMILLIS = Math.trunc(startLimit_PMILLIS); + this._start_PMILLIS = Math.trunc(this.limit_start_PMILLIS(this._start_PMILLIS)); this._attrsChanged.fire(); } } @@ -799,8 +799,8 @@ export class TimelineEventModel { set endLimit_PMILLIS(endLimit_PMILLIS: number) { if (endLimit_PMILLIS !== this._endLimit_PMILLIS) { - this._endLimit_PMILLIS = endLimit_PMILLIS; - this._end_PMILLIS = this.limit_end_PMILLIS(this._end_PMILLIS); + this._endLimit_PMILLIS = Math.trunc(endLimit_PMILLIS); + this._end_PMILLIS = Math.trunc(this.limit_end_PMILLIS(this._end_PMILLIS)); this._attrsChanged.fire(); } } From 5155598bc0ba74e5edb6b97c8ae6aef592f641de Mon Sep 17 00:00:00 2001 From: Anita Tunggal Date: Tue, 29 Jan 2019 12:26:43 -0800 Subject: [PATCH 20/69] Added highlightColor attribute to TimelineGroupModel --- src/webglimpse/timeline/timeline_model.ts | 14 ++++++++++++++ src/webglimpse/timeline/timeline_pane.ts | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 1fb96c5..aa9f006 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -168,6 +168,7 @@ export interface TimelineGroup { hidden?: boolean; collapsed?: boolean; highlighted?: boolean; + highlightColor?: Color; rowGuids: string[]; } @@ -1253,6 +1254,7 @@ export class TimelineGroupModel { private _label: string; private _collapsed: boolean; private _highlighted: boolean; + private _highlightColor: Color; private _rowGuids: OrderedStringSet; constructor(group: TimelineGroup) { @@ -1286,6 +1288,7 @@ export class TimelineGroupModel { this._label = group.label; this._collapsed = group.collapsed; this._highlighted = hasval(group.highlighted) ? group.highlighted : false; + this._highlightColor = hasval(group.highlightColor) ? group.highlightColor : parseCssColor('white'); this._attrsChanged.fire(); } @@ -1331,6 +1334,17 @@ export class TimelineGroupModel { } } + get highlightColor(): Color { + return this._highlightColor; + } + + set highlightColor(highlightColor: Color) { + if (highlightColor !== this._highlightColor) { + this._highlightColor = highlightColor; + this._attrsChanged.fire(); + } + } + get rowGuids(): OrderedStringSet { return this._rowGuids; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index c6494a7..fbdcbcc 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -1025,7 +1025,7 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { /// handle rollup group row /// const groupHeaderHighlight = new Pane(newColumnLayout()); - groupHeaderHighlight.addPane(newSolidPane(groupHighlightColor), 1, { width: 6, height: null }); + groupHeaderHighlight.addPane(newSolidPane(group.highlightColor), 1, { width: 6, height: null }); const groupHeaderStripe = new Pane(newRowLayout()); groupHeaderStripe.addPane(new Pane(null), 0, { height: null }); From 205225265c2c43b6173014aa31c7dc848beb1020 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Tue, 5 Feb 2019 17:00:16 -0800 Subject: [PATCH 21/69] Add new background class to use for highlight --- src/webglimpse/misc.ts | 62 ++++++++++++++++++++++-- src/webglimpse/timeline/timeline_pane.ts | 14 ++++-- 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index a95119a..9690eaa 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -86,6 +86,65 @@ export function newBlendingBackgroundPainter(color: Color): Painter { }; } +export class Highlight { + + private _color: Color; + + program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + u_Color = new UniformColor(this.program, 'u_Color'); + a_XyNdc = new Attribute(this.program, 'a_XyNdc'); + + numVertices = 4; + xy_NDC = new Float32Array(2 * this.numVertices); + xyBuffer_NDC = newDynamicBuffer(); + + constructor(color?: Color) { + this._color = color; + } + + get color(): Color { + return this._color; + } + + set color(color: Color) { + if (!sameColor(this._color, color)) { + this._color = color; + } + } + + newPainter() { + return (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) => { + if (this.color.a >= 1) { + gl.disable(GL.BLEND); + } + else { + gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); + gl.enable(GL.BLEND); + } + + this.program.use(gl); + this.u_Color.setData(gl, this.color); + + this.xy_NDC[0] = -1; + this.xy_NDC[1] = 1; + this.xy_NDC[2] = -1; + this.xy_NDC[3] = -1; + this.xy_NDC[4] = 1; + this.xy_NDC[5] = 1; + this.xy_NDC[6] = 1; + this.xy_NDC[7] = -1; + + this.xyBuffer_NDC.setData(this.xy_NDC); + this.a_XyNdc.setDataAndEnable(gl, this.xyBuffer_NDC, 2, GL.FLOAT); + + gl.drawArrays(GL.TRIANGLE_STRIP, 0, this.numVertices); + + this.a_XyNdc.disable(gl); + this.program.endUse(gl); + }; + } +} + export class Background { private _color: Color; @@ -395,6 +454,3 @@ export class XyModel { } } } - - - diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index fbdcbcc..b39fd6f 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -41,7 +41,7 @@ import { axisZoomStep, Axis1D } from '../plot/axis'; import { newColumnLayout } from '../layout/column_layout'; import { newCardLayout } from '../layout/card_layout'; import { newRowLayout } from '../layout/row_layout'; -import { Side, newBackgroundPainter, xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys, newSolidPane, Background } from '../misc'; +import { Side, newBackgroundPainter, xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys, newSolidPane, Background, Highlight } from '../misc'; import { newOverlayLayout } from '../layout/overlay_layout'; import { alwaysTrue, GL, StringMap, hasval, isNumber } from '../util/util'; import { BoundsUnmodifiable, Size } from '../bounds'; @@ -1025,7 +1025,10 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { /// handle rollup group row /// const groupHeaderHighlight = new Pane(newColumnLayout()); - groupHeaderHighlight.addPane(newSolidPane(group.highlightColor), 1, { width: 6, height: null }); + const groupHighlight = new Highlight(group.highlightColor); + const pane = newSolidPane(new Color(0, 0, 0, 1)); + pane.addPainter(groupHighlight.newPainter()); + groupHeaderHighlight.addPane(pane, 1, { width: 6, height: null }); const groupHeaderStripe = new Pane(newRowLayout()); groupHeaderStripe.addPane(new Pane(null), 0, { height: null }); @@ -1123,6 +1126,10 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupHighlightLayoutOpts.hide = !timelineGroup.highlighted; redraw = true; } + if (timelineGroup.highlightColor !== (groupHighlight.color)) { + groupHighlightLayoutOpts.hide = !timelineGroup.highlighted; + redraw = true; + } if (timelineGroup.collapsed !== groupContentLayoutOpts.hide) { groupContentLayoutOpts.hide = timelineGroup.collapsed; redraw = true; @@ -1440,6 +1447,3 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P guidList.valueRemoved.off(unattachAttrsChangedListener); }); } - - - From bdffdcc4bafa9be731fefb22b1a1012178cb02b3 Mon Sep 17 00:00:00 2001 From: "scott.przybylski" Date: Wed, 6 Feb 2019 19:03:46 -0800 Subject: [PATCH 22/69] Got dashed group highlight working, trying to make it fill the height of the entire group --- src/webglimpse/misc.ts | 39 +++++++++++++-- src/webglimpse/timeline/timeline_model.ts | 31 ++++++++++++ src/webglimpse/timeline/timeline_pane.ts | 61 +++++++++++++++-------- 3 files changed, 107 insertions(+), 24 deletions(-) diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index 9690eaa..42a6f23 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -30,8 +30,8 @@ import { Painter, Pane } from './core'; import { BoundsUnmodifiable, Size } from './bounds'; import { Color, sameColor } from './color'; -import { Program, UniformColor, Attribute } from './shader'; -import { newDynamicBuffer } from './buffer'; +import { Program, UniformColor, Attribute, Uniform1f } from './shader'; +import { newDynamicBuffer, DynamicBuffer } from './buffer'; import { GL, concatLines, hasval } from './util/util'; import { Texture2D, TextureDrawOptions, TextureRenderer } from './texture'; import { Notification } from './util/notification'; @@ -89,14 +89,18 @@ export function newBlendingBackgroundPainter(color: Color): Painter { export class Highlight { private _color: Color; + private _dashPattern = 0xFFFF; + private _dashLength = 16; - program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); + program = new Program(xyNdc_VERTSHADER, dash2_FRAGSHADER); u_Color = new UniformColor(this.program, 'u_Color'); a_XyNdc = new Attribute(this.program, 'a_XyNdc'); + u_DashPattern = new Uniform1f(this.program, 'u_DashPattern'); + u_DashLength = new Uniform1f(this.program, 'u_DashLength'); numVertices = 4; xy_NDC = new Float32Array(2 * this.numVertices); - xyBuffer_NDC = newDynamicBuffer(); + xyBuffer_NDC: DynamicBuffer = newDynamicBuffer(); constructor(color?: Color) { this._color = color; @@ -112,6 +116,14 @@ export class Highlight { } } + set dashPattern(pattern: number) { + this._dashPattern = pattern; + } + + set dashLength(length: number) { + this._dashLength = length; + } + newPainter() { return (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) => { if (this.color.a >= 1) { @@ -124,6 +136,8 @@ export class Highlight { this.program.use(gl); this.u_Color.setData(gl, this.color); + this.u_DashPattern.setData(gl, this._dashPattern); + this.u_DashLength.setData(gl, this._dashLength); this.xy_NDC[0] = -1; this.xy_NDC[1] = 1; @@ -273,6 +287,23 @@ export let dash_FRAGSHADER = concatLines( ' ' ); +export let dash2_FRAGSHADER = +`precision highp float; +uniform float u_DashLength; +uniform float u_DashPattern; +uniform vec4 u_Color; +const float maskLength = 16.0; + +void main( ) { + float dashPosition = fract(gl_FragCoord.y / u_DashLength); + float maskIndex = floor(dashPosition * maskLength); + float maskTest = floor(u_DashPattern / pow(2.0, maskIndex)); + + if(mod(maskTest, 2.0) < 1.0) + discard; + else + gl_FragColor = u_Color; +}`; export let varyingColor_FRAGSHADER = concatLines( ' ', diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index aa9f006..a38ea0a 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -169,6 +169,8 @@ export interface TimelineGroup { collapsed?: boolean; highlighted?: boolean; highlightColor?: Color; + dashPattern?: number; + dashLength?: number; rowGuids: string[]; } @@ -1255,6 +1257,8 @@ export class TimelineGroupModel { private _collapsed: boolean; private _highlighted: boolean; private _highlightColor: Color; + private _dashPattern: number; + private _dashLength: number; private _rowGuids: OrderedStringSet; constructor(group: TimelineGroup) { @@ -1289,6 +1293,8 @@ export class TimelineGroupModel { this._collapsed = group.collapsed; this._highlighted = hasval(group.highlighted) ? group.highlighted : false; this._highlightColor = hasval(group.highlightColor) ? group.highlightColor : parseCssColor('white'); + this._dashPattern = hasval(group.dashPattern) ? group.dashPattern : 0xFFFF; + this._dashLength = hasval(group.dashLength) ? group.dashLength : 16; this._attrsChanged.fire(); } @@ -1345,6 +1351,28 @@ export class TimelineGroupModel { } } + get dashPattern(): number { + return this._dashPattern; + } + + set dashPattern(dashPattern: number) { + if (dashPattern !== this._dashPattern) { + this._dashPattern = dashPattern; + this._attrsChanged.fire(); + } + } + + get dashLength(): number { + return this._dashLength; + } + + set dashLength(dashLength: number) { + if (dashLength !== this._dashLength) { + this._dashLength = dashLength; + this._attrsChanged.fire(); + } + } + get rowGuids(): OrderedStringSet { return this._rowGuids; } @@ -1357,6 +1385,9 @@ export class TimelineGroupModel { hidden: this._hidden, collapsed: (hasval(this._collapsed) ? this._collapsed : false), highlighted: (hasval(this._highlighted) ? this._highlighted : false), + highlightColor: hasval(this.highlightColor) ? this.highlightColor : parseCssColor('white'), + dashPattern: hasval(this.dashPattern) ? this.dashPattern : 0xFFFF, + dashLength: hasval(this.dashLength) ? this.dashLength : 16, rowGuids: this._rowGuids.toArray() }; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index b39fd6f..3e7a103 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -994,6 +994,7 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { const groupHeaderPanes: StringMap = {}; const groupContentPanes: StringMap = {}; + const groupContainerPanes: StringMap = {}; const addGroup = function (groupGuid: string, groupIndex: number) { const group = model.group(groupGuid); @@ -1107,19 +1108,24 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { } + const groupContainerColPane = new Pane(newColumnLayout()); + const groupContainerRowPane = new Pane(newRowLayout()); const groupContentPane = new Pane(newRowLayout()); - - timelineContentPane.updateLayoutArgs(function (layoutArg: any): any { + groupContainerColPane.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); + groupContainerColPane.addPane(groupContainerRowPane); + groupContainerRowPane.updateLayoutArgs(function (layoutArg: any): any { const shift = (isNumber(layoutArg) && layoutArg >= 2 * groupIndex); return (shift ? layoutArg + 2 : layoutArg); }); - timelineContentPane.addPane(groupHeaderPane, 2 * groupIndex); - timelineContentPane.addPane(groupContentPane, 2 * groupIndex + 1, { hide: group.collapsed }); + groupContainerRowPane.addPane(groupHeaderPane, 2 * groupIndex); + groupContainerRowPane.addPane(groupContentPane, 2 * groupIndex + 1, { hide: group.collapsed }); + timelineContentPane.addPane(groupContainerColPane, groupIndex); groupHeaderPanes[groupGuid] = groupHeaderPane; groupContentPanes[groupGuid] = groupContentPane; + groupContainerPanes[groupGuid] = groupContainerColPane; const groupAttrsChanged = function (timelineGroup: TimelineGroup) { - const groupContentLayoutOpts = timelineContentPane.layoutOptions(groupContentPane); + const groupContentLayoutOpts = groupContainerRowPane.layoutOptions(groupContentPane); const groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); let redraw = false; if (timelineGroup.highlighted !== (!groupHighlightLayoutOpts.hide)) { @@ -1127,7 +1133,15 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { redraw = true; } if (timelineGroup.highlightColor !== (groupHighlight.color)) { - groupHighlightLayoutOpts.hide = !timelineGroup.highlighted; + groupHighlight.color = timelineGroup.highlightColor; + redraw = true; + } + if (timelineGroup.dashPattern !== (groupHighlight.dashPattern)) { + groupHighlight.dashPattern = timelineGroup.dashPattern; + redraw = true; + } + if (timelineGroup.dashLength !== (groupHighlight.dashLength)) { + groupHighlight.dashLength = timelineGroup.dashLength; redraw = true; } if (timelineGroup.collapsed !== groupContentLayoutOpts.hide) { @@ -1150,8 +1164,8 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { // Handle hidden property // - timelineContentPane.layoutOptions(groupContentPane).hide = group.hidden; - timelineContentPane.layoutOptions(groupHeaderPane).hide = group.hidden; + groupContainerRowPane.layoutOptions(groupContentPane).hide = group.hidden; + groupContainerRowPane.layoutOptions(groupHeaderPane).hide = group.hidden; setupRowContainerPane(args, groupContentPane, group.rowGuids, false, group.groupGuid); @@ -1169,8 +1183,9 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { const nMax = Math.max(groupOldIndex, groupNewIndex); for (let n = nMin; n <= nMax; n++) { const groupGuidTemp = root.groupGuids.valueAt(n); - timelineContentPane.setLayoutArg(groupHeaderPanes[groupGuidTemp], 2 * n); - timelineContentPane.setLayoutArg(groupContentPanes[groupGuidTemp], 2 * n + 1); + timelineContentPane.setLayoutArg(groupContainerPanes[groupGuidTemp], n); + // timelineContentPane.setLayoutArg(groupHeaderPanes[groupGuidTemp], 2 * n); + // timelineContentPane.setLayoutArg(groupContentPanes[groupGuidTemp], 2 * n + 1); } drawable.redraw(); @@ -1178,18 +1193,24 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { root.groupGuids.valueMoved.on(moveGroup); const removeGroup = function (groupGuid: string, groupIndex: number) { - const contentPane: Pane = groupContentPanes[groupGuid]; - const headerPane: Pane = groupHeaderPanes[groupGuid]; - contentPane.dispose.fire(); - headerPane.dispose.fire(); - timelineContentPane.removePane(contentPane); - timelineContentPane.removePane(headerPane); + // const contentPane: Pane = groupContentPanes[groupGuid]; + // const headerPane: Pane = groupHeaderPanes[groupGuid]; + const groupPane: Pane = groupContainerPanes[groupGuid]; + // contentPane.dispose.fire(); + // headerPane.dispose.fire(); + groupPane.dispose.fire(); + // timelineContentPane.removePane(contentPane); + // timelineContentPane.removePane(headerPane); + timelineContentPane.removePane(groupPane); timelineContentPane.updateLayoutArgs(function (layoutArg: any): any { - const shift = (isNumber(layoutArg) && layoutArg > 2 * groupIndex + 1); - return (shift ? layoutArg - 2 : layoutArg); + // const shift = (isNumber(layoutArg) && layoutArg > 2 * groupIndex + 1); + // return (shift ? layoutArg - 2 : layoutArg); + const shift = (isNumber(layoutArg) && layoutArg > groupIndex); + return (shift ? layoutArg - 1 : layoutArg); }); - delete groupHeaderPanes[groupGuid]; - delete groupContentPanes[groupGuid]; + // delete groupHeaderPanes[groupGuid]; + // delete groupContentPanes[groupGuid]; + delete groupContainerPanes[groupGuid]; drawable.redraw(); }; From 40bd24dcfef59eb7f59cd24c899b6c7664cd63ea Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 7 Feb 2019 16:56:09 -0800 Subject: [PATCH 23/69] Made group highlight fill height of the entire group. Added dash support --- package-lock.json | 9337 ++++++++++++--------- src/webglimpse/core.ts | 2 +- src/webglimpse/misc.ts | 39 +- src/webglimpse/timeline/timeline_model.ts | 31 + src/webglimpse/timeline/timeline_pane.ts | 52 +- 5 files changed, 5440 insertions(+), 4021 deletions(-) diff --git a/package-lock.json b/package-lock.json index 265b5d8..e4a635c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7", - "typescript": "2.6.2", - "webpack-sources": "1.1.0" + "loader-utils": "^1.1.0", + "source-map": "^0.5.6", + "typescript": "~2.6.2", + "webpack-sources": "^1.0.1" }, "dependencies": { "typescript": { @@ -30,10 +30,10 @@ "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", "dev": true, "requires": { - "ajv": "5.5.2", - "chokidar": "1.7.0", - "rxjs": "5.5.11", - "source-map": "0.5.7" + "ajv": "~5.5.1", + "chokidar": "^1.7.0", + "rxjs": "^5.5.6", + "source-map": "^0.5.6" }, "dependencies": { "ajv": { @@ -42,10 +42,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } } } @@ -56,8 +56,8 @@ "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", "dev": true, "requires": { - "@ngtools/json-schema": "1.2.0", - "rxjs": "5.5.11" + "@ngtools/json-schema": "^1.1.0", + "rxjs": "^5.5.6" } }, "@angular/animations": { @@ -66,7 +66,7 @@ "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/cli": { @@ -82,58 +82,58 @@ "@ngtools/webpack": "1.10.2", "@schematics/angular": "0.3.2", "@schematics/package-update": "0.3.2", - "ajv": "6.5.2", - "autoprefixer": "7.2.6", - "cache-loader": "1.2.2", - "chalk": "2.2.2", - "circular-dependency-plugin": "4.4.0", - "clean-css": "4.1.11", - "common-tags": "1.8.0", - "copy-webpack-plugin": "4.4.3", - "core-object": "3.1.5", - "denodeify": "1.2.1", - "ember-cli-string-utils": "1.1.0", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.11", - "fs-extra": "4.0.3", - "glob": "7.1.2", - "html-webpack-plugin": "2.30.1", - "istanbul-instrumenter-loader": "3.0.1", - "karma-source-map-support": "1.3.0", - "less": "2.7.3", - "less-loader": "4.1.0", - "license-webpack-plugin": "1.3.1", + "ajv": "^6.1.1", + "autoprefixer": "^7.2.3", + "cache-loader": "^1.2.0", + "chalk": "~2.2.0", + "circular-dependency-plugin": "^4.2.1", + "clean-css": "^4.1.11", + "common-tags": "^1.3.1", + "copy-webpack-plugin": "~4.4.1", + "core-object": "^3.1.0", + "denodeify": "^1.2.1", + "ember-cli-string-utils": "^1.0.0", + "extract-text-webpack-plugin": "^3.0.2", + "file-loader": "^1.1.5", + "fs-extra": "^4.0.0", + "glob": "^7.0.3", + "html-webpack-plugin": "^2.29.0", + "istanbul-instrumenter-loader": "^3.0.0", + "karma-source-map-support": "^1.2.0", + "less": "^2.7.2", + "less-loader": "^4.0.5", + "license-webpack-plugin": "^1.0.0", "loader-utils": "1.1.0", - "lodash": "4.17.10", - "memory-fs": "0.4.1", - "minimatch": "3.0.4", - "node-modules-path": "1.0.1", - "node-sass": "4.9.2", - "nopt": "4.0.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "postcss": "6.0.23", - "postcss-import": "11.1.0", - "postcss-loader": "2.1.6", - "postcss-url": "7.3.2", - "raw-loader": "0.5.1", - "resolve": "1.8.1", - "rxjs": "5.5.11", - "sass-loader": "6.0.7", - "semver": "5.5.0", - "silent-error": "1.1.0", - "source-map-support": "0.4.18", - "style-loader": "0.19.1", - "stylus": "0.54.5", - "stylus-loader": "3.0.2", - "uglifyjs-webpack-plugin": "1.2.7", - "url-loader": "0.6.2", - "webpack": "3.11.0", - "webpack-dev-middleware": "1.12.2", - "webpack-dev-server": "2.11.2", - "webpack-merge": "4.1.3", - "webpack-sources": "1.1.0", - "webpack-subresource-integrity": "1.0.4" + "lodash": "^4.11.1", + "memory-fs": "^0.4.1", + "minimatch": "^3.0.4", + "node-modules-path": "^1.0.0", + "node-sass": "^4.7.2", + "nopt": "^4.0.1", + "opn": "~5.1.0", + "portfinder": "~1.0.12", + "postcss": "^6.0.16", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.10", + "postcss-url": "^7.1.2", + "raw-loader": "^0.5.1", + "resolve": "^1.1.7", + "rxjs": "^5.5.6", + "sass-loader": "^6.0.6", + "semver": "^5.1.0", + "silent-error": "^1.0.0", + "source-map-support": "^0.4.1", + "style-loader": "^0.19.1", + "stylus": "^0.54.5", + "stylus-loader": "^3.0.1", + "uglifyjs-webpack-plugin": "^1.1.8", + "url-loader": "^0.6.2", + "webpack": "~3.11.0", + "webpack-dev-middleware": "~1.12.0", + "webpack-dev-server": "~2.11.0", + "webpack-merge": "^4.1.0", + "webpack-sources": "^1.0.0", + "webpack-subresource-integrity": "^1.0.1" } }, "@angular/common": { @@ -142,7 +142,7 @@ "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/compiler": { @@ -151,7 +151,7 @@ "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/compiler-cli": { @@ -160,10 +160,10 @@ "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==", "dev": true, "requires": { - "chokidar": "1.7.0", - "minimist": "1.2.0", - "reflect-metadata": "0.1.12", - "tsickle": "0.27.5" + "chokidar": "^1.4.2", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "tsickle": "^0.27.2" }, "dependencies": { "minimist": { @@ -180,7 +180,7 @@ "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/forms": { @@ -189,7 +189,7 @@ "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/http": { @@ -198,7 +198,7 @@ "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/language-service": { @@ -213,7 +213,7 @@ "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/platform-browser-dynamic": { @@ -222,7 +222,7 @@ "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@angular/router": { @@ -231,37 +231,40 @@ "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.7.1" } }, "@compodoc/compodoc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.3.tgz", - "integrity": "sha512-MXo8O5Ar5HB0OSayGQknUWCo/zLglz348tDkoOii020y+bEBPRTRcwCjKaORJZG1Nw9nmStGyVxPlf1cxW6w8A==", - "dev": true, - "requires": { - "@compodoc/ngd-transformer": "2.0.0", - "chalk": "2.4.1", - "cheerio": "1.0.0-rc.2", - "chokidar": "2.0.4", - "colors": "1.3.0", - "commander": "2.15.1", - "cosmiconfig": "5.0.5", - "fancy-log": "1.3.2", - "findit2": "2.2.3", - "fs-extra": "6.0.1", - "glob": "7.1.2", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.7.tgz", + "integrity": "sha512-bTqkv75T9b+3OxG517YL+5B0npAG0Q5nOMAk562Idr/fICTTHQ/xzSBsTptZ4QqYmtzRMV1OqOlk74FXfGPZWw==", + "dev": true, + "requires": { + "@compodoc/ngd-transformer": "^2.0.0", + "chalk": "^2.4.1", + "cheerio": "^1.0.0-rc.2", + "chokidar": "^2.0.4", + "colors": "^1.3.2", + "commander": "2.19.0", + "cosmiconfig": "^5.0.7", + "fancy-log": "^1.3.2", + "findit2": "^2.2.3", + "fs-extra": "^7.0.1", + "glob": "^7.1.3", "handlebars": "4.0.10", - "html-entities": "1.2.1", - "json5": "1.0.1", - "live-server": "1.1.0", - "lodash": "4.17.10", - "lunr": "2.2.0", - "marked": "0.3.19", - "os-name": "2.0.1", - "traverse": "0.6.6", - "ts-simple-ast": "11.2.0", - "uuid": "3.3.2" + "html-entities": "^1.2.1", + "i18next": "^12.1.0", + "inside": "^1.0.0", + "json5": "^2.1.0", + "live-server": "1.2.1", + "lodash": "^4.17.11", + "lunr": "2.3.5", + "marked": "^0.4.0", + "opencollective": "^1.0.3", + "os-name": "^3.0.0", + "traverse": "^0.6.6", + "ts-simple-ast": "12.4.0", + "uuid": "^3.3.2" }, "dependencies": { "anymatch": { @@ -270,8 +273,19 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "arr-diff": { @@ -292,16 +306,16 @@ "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.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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": { @@ -310,58 +324,58 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "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.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", + "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" } }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, "cosmiconfig": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.5.tgz", - "integrity": "sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" } }, "expand-brackets": { @@ -370,13 +384,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -385,7 +399,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -394,7 +408,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -403,7 +417,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -412,7 +426,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -423,7 +437,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -432,7 +446,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -443,9 +457,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -462,14 +476,14 @@ "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -478,7 +492,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -487,7 +501,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -498,10 +512,10 @@ "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.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -510,20 +524,20 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "glob-parent": { @@ -532,8 +546,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -542,7 +556,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -559,7 +573,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -568,7 +582,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -577,9 +591,9 @@ "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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -594,7 +608,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -603,7 +617,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -612,7 +626,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -624,12 +638,12 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" } }, "kind-of": { @@ -644,19 +658,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "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.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } }, "minimist": { @@ -665,23 +679,29 @@ "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 + }, "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.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "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": "^3.0.0" } } } @@ -692,9 +712,9 @@ "integrity": "sha512-6HpYvXRZBdIYFojWxW5EVNkhYPmblytCve62CNoYBSWfy++vTGH7Ypg2Bhjg2CsqeV8JOVxrPO7JM9M3MgWKEA==", "dev": true, "requires": { - "ansi-colors": "1.1.0", - "fancy-log": "1.3.2", - "typescript": "2.4.2" + "ansi-colors": "^1.0.1", + "fancy-log": "^1.3.2", + "typescript": "^2.4.2" } }, "@compodoc/ngd-transformer": { @@ -703,10 +723,10 @@ "integrity": "sha512-9J0KkmuuuvDHxH0oREgrgbqdEFqcltQXIBofeYdIyMKzI3A+pN1Ji4zfi7x1ql0Ax7qQKemp8XWP+cCpP0qY+w==", "dev": true, "requires": { - "@compodoc/ngd-core": "2.0.0", - "dot": "1.1.2", - "fs-extra": "4.0.3", - "viz.js": "1.8.2" + "@compodoc/ngd-core": "~2.0.0", + "dot": "^1.1.1", + "fs-extra": "^4.0.1", + "viz.js": "^1.8.0" } }, "@dsherret/to-absolute-glob": { @@ -715,8 +735,18 @@ "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", "dev": true, "requires": { - "is-absolute": "1.0.0", - "is-negated-glob": "1.0.0" + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, "@ngtools/json-schema": { @@ -731,23 +761,29 @@ "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", "dev": true, "requires": { - "chalk": "2.2.2", - "enhanced-resolve": "3.4.1", - "loader-utils": "1.1.0", - "magic-string": "0.22.5", - "semver": "5.5.0", - "source-map": "0.5.7", - "tree-kill": "1.2.0", - "webpack-sources": "1.1.0" + "chalk": "~2.2.0", + "enhanced-resolve": "^3.1.0", + "loader-utils": "^1.0.2", + "magic-string": "^0.22.3", + "semver": "^5.3.0", + "source-map": "^0.5.6", + "tree-kill": "^1.0.0", + "webpack-sources": "^1.1.0" } }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, "@schematics/angular": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", "dev": true, "requires": { - "typescript": "2.6.2" + "typescript": "~2.6.2" }, "dependencies": { "typescript": { @@ -764,18 +800,9 @@ "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", "dev": true, "requires": { - "rxjs": "5.5.11", - "semver": "5.5.0", - "semver-intersect": "1.3.1" - } - }, - "@types/fs-extra": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.4.tgz", - "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", - "dev": true, - "requires": { - "@types/node": "6.0.114" + "rxjs": "^5.5.6", + "semver": "^5.3.0", + "semver-intersect": "^1.1.2" } }, "@types/jasmine": { @@ -785,18 +812,18 @@ "dev": true }, "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", "dev": true, "requires": { - "@types/jasmine": "2.5.54" + "@types/jasmine": "*" } }, "@types/node": { - "version": "6.0.114", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz", - "integrity": "sha512-5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==", + "version": "6.0.118", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz", + "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==", "dev": true }, "@types/q": { @@ -823,14 +850,14 @@ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-dynamic-import": { @@ -839,7 +866,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -851,9 +878,9 @@ } }, "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", "dev": true }, "after": { @@ -868,8 +895,8 @@ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", "dev": true, "requires": { - "extend": "3.0.1", - "semver": "5.0.3" + "extend": "~3.0.0", + "semver": "~5.0.1" }, "dependencies": { "semver": { @@ -881,15 +908,15 @@ } }, "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", + "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", "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" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "dependencies": { "fast-deep-equal": { @@ -907,9 +934,9 @@ } }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", + "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", "dev": true }, "align-text": { @@ -918,19 +945,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "ambi": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", - "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=", - "dev": true, - "requires": { - "editions": "1.3.4", - "typechecker": "4.5.0" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -945,7 +962,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -966,8 +983,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -976,7 +993,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -987,9 +1004,15 @@ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { - "ansi-wrap": "0.1.0" + "ansi-wrap": "^0.1.0" } }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -1017,7 +1040,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.2" + "color-convert": "^1.9.0" } }, "ansi-wrap": { @@ -1032,23 +1055,23 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "apache-crypt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.1.2.tgz", - "integrity": "sha1-ggeCozu2pf0nEggvDtOiTjybAhQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz", + "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=", "dev": true, "requires": { - "unix-crypt-td-js": "1.0.0" + "unix-crypt-td-js": "^1.0.0" } }, "apache-md5": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.0.6.tgz", - "integrity": "sha1-RwI51AxU58Mt2dbrEbw1eOzJA8I=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz", + "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=", "dev": true }, "app-root-path": { @@ -1058,12 +1081,12 @@ "dev": true }, "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "2.0.0" + "default-require-extensions": "^1.0.0" } }, "aproba": { @@ -1078,8 +1101,8 @@ "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "argparse": { @@ -1088,7 +1111,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -1097,7 +1120,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -1131,9 +1154,9 @@ "dev": true }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "array-includes": { @@ -1142,8 +1165,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.12.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-map": { @@ -1170,7 +1193,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -1205,10 +1228,13 @@ "optional": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "asn1.js": { "version": "4.10.1", @@ -1216,9 +1242,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -1251,7 +1277,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true + "dev": true, + "optional": true }, "assign-symbols": { "version": "1.0.0", @@ -1265,7 +1292,7 @@ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "async-each": { @@ -1287,9 +1314,9 @@ "dev": true }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "autoprefixer": { @@ -1298,24 +1325,25 @@ "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", "dev": true, "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000865", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.23", - "postcss-value-parser": "3.3.0" + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" } }, "aws-sign2": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true + "dev": true, + "optional": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "babel-code-frame": { @@ -1324,9 +1352,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-styles": { @@ -1341,11 +1369,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" } }, "supports-color": { @@ -1362,14 +1390,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-messages": { @@ -1378,7 +1406,26 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" + } + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } } }, "babel-runtime": { @@ -1387,8 +1434,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1397,11 +1444,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1410,15 +1457,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1427,10 +1474,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1457,13 +1504,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "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": { @@ -1472,7 +1519,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1481,7 +1528,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1490,7 +1537,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1499,9 +1546,9 @@ "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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1537,20 +1584,12 @@ "dev": true }, "basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", - "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } + "safe-buffer": "5.1.2" } }, "batch": { @@ -1564,11 +1603,16 @@ "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.5" + "tweetnacl": "^0.14.3" } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", + "dev": true + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1585,9 +1629,9 @@ "dev": true }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", "dev": true }, "blob": { @@ -1602,7 +1646,7 @@ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "blocking-proxy": { @@ -1611,7 +1655,7 @@ "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" }, "dependencies": { "minimist": { @@ -1623,9 +1667,9 @@ } }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -1635,27 +1679,27 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.16" + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" }, "dependencies": { "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true } } @@ -1666,12 +1710,12 @@ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" } }, "boolbase": { @@ -1685,8 +1729,9 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "boxen": { @@ -1695,13 +1740,13 @@ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.2.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -1728,8 +1773,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -1738,7 +1783,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1749,7 +1794,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1759,9 +1804,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -1776,12 +1821,12 @@ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "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": { @@ -1790,9 +1835,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1801,10 +1846,10 @@ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -1813,8 +1858,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1823,13 +1868,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "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": { @@ -1838,7 +1883,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { @@ -1847,8 +1892,8 @@ "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000865", - "electron-to-chromium": "1.3.52" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } }, "buffer": { @@ -1857,21 +1902,43 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-indexof": { @@ -1887,9 +1954,9 @@ "dev": true }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", "dev": true }, "builtin-status-codes": { @@ -1910,19 +1977,19 @@ "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.3", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "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": { @@ -1931,15 +1998,15 @@ "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" + "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": { @@ -1951,15 +2018,39 @@ } }, "cache-loader": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", - "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.5.tgz", + "integrity": "sha512-enWKEQ4kO3YreDFd7AtVRjtJBmNiqh/X9hVDReu0C4qm8gsGmySkwuWtdc+N5O+vq5FzxL1mIZc30NyXCB7o/Q==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "mkdirp": "0.5.1", - "neo-async": "2.5.1", - "schema-utils": "0.4.5" + "loader-utils": "^1.1.0", + "mkdirp": "^0.5.1", + "neo-async": "^2.5.0", + "schema-utils": "^0.4.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" } }, "callsite": { @@ -1968,14 +2059,20 @@ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "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.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { @@ -1990,20 +2087,20 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caniuse-lite": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", - "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==", + "version": "1.0.30000935", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz", + "integrity": "sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==", "dev": true }, "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, "caseless": { @@ -2018,8 +2115,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -2028,23 +2125,29 @@ "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "cheerio": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "parse5": "3.0.3" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" }, "dependencies": { "domhandler": { @@ -2053,21 +2156,32 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", + "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6" + } + }, + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -2078,27 +2192,27 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.4", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, "cipher-base": { @@ -2107,8 +2221,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "circular-dependency-plugin": { @@ -2123,10 +2237,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -2135,7 +2249,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -2147,12 +2261,20 @@ } }, "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.5.7" + "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 + } } }, "cli-boxes": { @@ -2161,21 +2283,36 @@ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", "dev": true }, + "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-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": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-deep": { @@ -2184,10 +2321,10 @@ "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", "dev": true, "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "1.0.0" + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" }, "dependencies": { "for-own": { @@ -2196,7 +2333,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "kind-of": { @@ -2214,9 +2351,9 @@ "dev": true }, "code-block-writer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.1.0.tgz", - "integrity": "sha1-AMrBYl2Ek6d1JlGQkzPIHllqIUo=", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.2.2.tgz", + "integrity": "sha512-8SyXM1bWsMDCzvCoTdnDBhnnUbHntxcba4ApBIO3S3QX0M2Iq0xZCzs6SYdBOGaSUi4drysvrAK15JoXhlpsvQ==", "dev": true }, "code-point-at": { @@ -2226,23 +2363,23 @@ "dev": true }, "codelyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.4.2.tgz", - "integrity": "sha512-tW796ECKMAynFtl/yyS5NRYhufbT3CEKjjMQ450kUeCcQlK7OIqD9VGRVwC3gSQSK4VaewCKCaVL0bzv9PhsLg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", "dev": true, "requires": { - "app-root-path": "2.1.0", - "css-selector-tokenizer": "0.7.0", - "cssauron": "1.4.0", - "semver-dsl": "1.0.1", - "source-map": "0.5.7", - "sprintf-js": "1.1.1" + "app-root-path": "^2.1.0", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.1" }, "dependencies": { "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true } } @@ -2253,23 +2390,23 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "1.1.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "color-support": { @@ -2279,9 +2416,9 @@ "dev": true }, "colors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", - "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, "combine-lists": { @@ -2290,22 +2427,22 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.5.0" } }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "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==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, "commenting": { @@ -2326,12 +2463,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-versions": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", - "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==", - "dev": true - }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -2351,43 +2482,27 @@ "dev": true }, "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "dev": true, "requires": { - "mime-db": "1.34.0" - }, - "dependencies": { - "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=", - "dev": true - } + "mime-db": ">= 1.36.0 < 2" } }, "compression": { - "version": "1.7.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", - "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.14", + "compressible": "~2.0.14", "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" } }, "concat-map": { @@ -2402,10 +2517,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -2414,65 +2529,53 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "connect": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", - "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { - "debug": "2.2.0", - "finalhandler": "0.4.1", - "parseurl": "1.3.2", - "utils-merge": "1.0.0" + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" }, "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, "finalhandler": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "dev": true, "requires": { - "debug": "2.2.0", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "unpipe": "1.0.0" + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" } }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", "dev": true } } }, "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "console-browserify": { @@ -2481,7 +2584,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -2509,10 +2612,13 @@ "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=", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "cookie": { "version": "0.3.1", @@ -2532,12 +2638,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "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": { @@ -2552,14 +2658,14 @@ "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", "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.3.0", - "serialize-javascript": "1.5.0" + "cacache": "^10.0.1", + "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" }, "dependencies": { "is-extglob": { @@ -2574,15 +2680,15 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } } } }, "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==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", + "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==", "dev": true }, "core-object": { @@ -2591,7 +2697,7 @@ "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", "dev": true, "requires": { - "chalk": "2.2.2" + "chalk": "^2.0.0" } }, "core-util-is": { @@ -2601,13 +2707,13 @@ "dev": true }, "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" + "object-assign": "^4", + "vary": "^1" } }, "cosmiconfig": { @@ -2616,10 +2722,10 @@ "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" }, "dependencies": { "parse-json": { @@ -2628,8 +2734,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } } } @@ -2640,17 +2746,17 @@ "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "duplexer": "0.1.1", - "glob": "7.1.2", - "glob2base": "0.0.12", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "resolve": "1.8.1", - "safe-buffer": "5.1.2", - "shell-quote": "1.6.1", - "subarg": "1.0.0" + "babel-runtime": "^6.9.2", + "chokidar": "^1.6.0", + "duplexer": "^0.1.1", + "glob": "^7.0.5", + "glob2base": "^0.0.12", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "resolve": "^1.1.7", + "safe-buffer": "^5.0.1", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" } }, "create-ecdh": { @@ -2659,8 +2765,8 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-error-class": { @@ -2669,7 +2775,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "create-hash": { @@ -2678,11 +2784,11 @@ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "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": { @@ -2691,12 +2797,12 @@ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "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": { @@ -2705,8 +2811,8 @@ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "lru-cache": "4.1.3", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "cryptiles": { @@ -2714,8 +2820,9 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, + "optional": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "crypto-browserify": { @@ -2724,17 +2831,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "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" } }, "crypto-random-string": { @@ -2743,12 +2850,6 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, - "csextends": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", - "integrity": "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==", - "dev": true - }, "css-parse": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", @@ -2761,27 +2862,27 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.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=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "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=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", "dev": true }, "cssauron": { @@ -2790,7 +2891,7 @@ "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", "dev": true, "requires": { - "through": "2.3.8" + "through": "X.X.X" } }, "cssesc": { @@ -2811,7 +2912,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "custom-event": { @@ -2832,7 +2933,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.45" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -2841,7 +2942,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2892,30 +2993,21 @@ "dev": true }, "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "3.0.0" - }, - "dependencies": { - "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-bom": "^2.0.0" } }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "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": { - "foreach": "2.0.5", - "object-keys": "1.0.12" + "object-keys": "^1.0.12" } }, "define-property": { @@ -2924,8 +3016,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2934,7 +3026,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2943,7 +3035,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2952,9 +3044,9 @@ "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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -2977,12 +3069,12 @@ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "dev": true, "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" }, "dependencies": { "globby": { @@ -2991,11 +3083,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "pify": { @@ -3038,8 +3130,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -3054,13 +3146,13 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, "di": { @@ -3081,19 +3173,18 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "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==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "path-type": "^3.0.0" } }, "dns-equal": { @@ -3108,8 +3199,8 @@ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { @@ -3118,24 +3209,16 @@ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "0.3.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 - } + "utila": "~0.4" } }, "dom-serialize": { @@ -3144,10 +3227,10 @@ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, "dom-serializer": { @@ -3156,8 +3239,8 @@ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -3175,9 +3258,9 @@ "dev": true }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { @@ -3186,7 +3269,7 @@ "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -3195,8 +3278,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot": { @@ -3211,7 +3294,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "duplexer": { @@ -3227,43 +3310,27 @@ "dev": true }, "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.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - }, - "eachr": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz", - "integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "editions": "1.3.4", - "typechecker": "4.5.0" + "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=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3277,24 +3344,24 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz", - "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=", + "version": "1.3.113", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", + "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.5", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "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" } }, "ember-cli-string-utils": { @@ -3315,13 +3382,22 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "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" + "once": "^1.4.0" } }, "engine.io": { @@ -3344,7 +3420,7 @@ "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "dev": true, "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.11", "negotiator": "0.6.1" } }, @@ -3422,10 +3498,10 @@ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "ent": { @@ -3435,9 +3511,9 @@ "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "errno": { @@ -3446,7 +3522,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -3455,42 +3531,43 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "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==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4" + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "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=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "version": "0.10.47", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", + "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -3499,9 +3576,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -3510,12 +3587,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-promise": { @@ -3530,11 +3607,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -3543,8 +3620,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -3553,10 +3630,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -3577,16 +3654,16 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "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 }, "esrecurse": { @@ -3595,7 +3672,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -3628,23 +3705,23 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" + "d": "1", + "es5-ext": "~0.10.14" } }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, "eventemitter3": { @@ -3654,9 +3731,9 @@ "dev": true }, "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "eventsource": { @@ -3665,7 +3742,7 @@ "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "dev": true, "requires": { - "original": "1.0.1" + "original": ">=0.0.5" } }, "evp_bytestokey": { @@ -3674,8 +3751,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -3684,13 +3761,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "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": { @@ -3699,9 +3776,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } @@ -3718,9 +3795,9 @@ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" }, "dependencies": { "braces": { @@ -3729,7 +3806,7 @@ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "0.1.1" + "expand-range": "^0.1.0" } }, "expand-range": { @@ -3738,8 +3815,8 @@ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" } }, "is-number": { @@ -3762,7 +3839,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -3771,45 +3848,45 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" } }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { @@ -3819,23 +3896,17 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { @@ -3844,8 +3915,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3854,19 +3925,20 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } }, - "extendr": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/extendr/-/extendr-3.3.0.tgz", - "integrity": "sha512-BmBSu+KOX2XOo3XMECiekGY8VAr3O4aGYgOaHQDNg2ez5rOYW+SDfNStao4VNzr+6N27Vw3A7HJKJMrHmAAXvQ==", + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "editions": "1.3.4", - "typechecker": "4.5.0" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -3875,18 +3947,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" - } - }, - "extract-opts": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-3.3.1.tgz", - "integrity": "sha1-WrvtyYwNUgLjJ4cn+Rktfghsa+E=", - "dev": true, - "requires": { - "eachr": "3.2.0", - "editions": "1.3.4", - "typechecker": "4.5.0" + "is-extglob": "^1.0.0" } }, "extract-text-webpack-plugin": { @@ -3895,10 +3956,10 @@ "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "2.6.1", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.1.0" + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" }, "dependencies": { "ajv": { @@ -3907,10 +3968,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "schema-utils": { @@ -3919,7 +3980,7 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } } } @@ -3931,14 +3992,15 @@ "dev": true }, "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "time-stamp": "1.1.0" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" }, "dependencies": { "time-stamp": { @@ -3955,797 +4017,1225 @@ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - }, - "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.1.0", - "schema-utils": "0.4.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.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.3.0", - "pkg-dir": "2.0.0" - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, - "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" - } - }, - "findit2": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", - "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", - "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.3", - "readable-stream": "2.3.6" - } - }, - "follow-redirects": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", - "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", "dev": true, "requires": { - "debug": "3.1.0" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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": { - "ms": "2.0.0" + "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" + } + } } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "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.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "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" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "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.3", - "readable-stream": "2.3.6" - } - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "1.0.0" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "requires": { - "minipass": "2.3.3" - } - }, - "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.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" - } - }, - "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.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": 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, - "optional": 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 + } + } }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "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" + } + } + } }, - "aproba": { - "version": "1.2.0", - "bundled": true, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, - "optional": 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" + } + } + } }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, - "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "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" + } + } } }, - "balanced-match": { + "is-accessor-descriptor": { "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "kind-of": "^6.0.0" } }, - "chownr": { - "version": "1.0.1", - "bundled": 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, - "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 + "requires": { + "kind-of": "^6.0.0" + } }, - "core-util-is": { + "is-descriptor": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "optional": true, "requires": { - "ms": "2.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "deep-extend": { - "version": "0.5.1", - "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.4" - } - }, - "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.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } + "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 }, - "glob": { - "version": "7.1.2", - "bundled": 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, - "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "is-extglob": "^2.1.1" } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": 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, - "optional": true, "requires": { - "safer-buffer": "2.1.2" + "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" + } + } } }, - "ignore-walk": { + "isobject": { "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.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "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.1" - } - }, - "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.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": 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 }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, - "optional": true, "requires": { - "minipass": "2.2.4" + "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" } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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-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" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.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-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "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" + } + }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz", + "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "dev": true, "requires": { - "minimist": "0.0.8" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, + } + } + }, + "follow-redirects": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, - "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "ms": "2.0.0" } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "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.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "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" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "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-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } + "optional": true }, - "nopt": { - "version": "4.0.1", - "bundled": true, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } + "optional": true }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": 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, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, + "optional": true }, - "object-assign": { - "version": "4.1.1", - "bundled": 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, "optional": true }, - "once": { - "version": "1.4.0", - "bundled": true, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, - "requires": { - "wrappy": "1.0.2" - } + "optional": true }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, - "os-tmpdir": { + "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "ms": "2.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, - "rc": { - "version": "1.2.7", - "bundled": true, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "minipass": "^2.2.1" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "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.2" + "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" } }, - "rimraf": { - "version": "2.6.2", - "bundled": true, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "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" } }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, - "sax": { - "version": "1.2.4", - "bundled": true, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "optional": true + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, - "semver": { - "version": "5.5.0", - "bundled": true, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": 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=", "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "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, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "number-is-nan": "^1.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "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, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", + "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", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "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", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "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, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": 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==", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "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", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": 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==", + "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", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": 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", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { - "version": "4.4.1", - "bundled": true, + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "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, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { - "version": "1.1.2", - "bundled": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true }, "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "optional": true } } }, @@ -4755,10 +5245,10 @@ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "function-bind": { @@ -4773,14 +5263,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "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" } }, "gaze": { @@ -4789,7 +5279,7 @@ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { - "globule": "1.2.1" + "globule": "^1.0.0" } }, "get-caller-file": { @@ -4822,7 +5312,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -4834,17 +5324,17 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -4853,8 +5343,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -4863,16 +5353,22 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "glob2base": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", "dev": true, "requires": { - "find-index": "0.1.1" + "find-index": "^0.1.1" } }, "global-dirs": { @@ -4881,7 +5377,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "globals": { @@ -4896,12 +5392,12 @@ "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" + "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" } }, "globule": { @@ -4910,9 +5406,9 @@ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "minimatch": "3.0.4" + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" } }, "got": { @@ -4921,23 +5417,23 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^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=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "handle-thing": { @@ -4952,10 +5448,10 @@ "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -4978,8 +5474,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, @@ -4989,7 +5485,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "uglify-js": { @@ -4999,9 +5495,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "source-map": { @@ -5020,9 +5516,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -5032,16 +5528,18 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true + "dev": true, + "optional": true }, "har-validator": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, + "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" }, "dependencies": { "ajv": { @@ -5049,9 +5547,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, + "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } } } @@ -5062,7 +5561,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -5071,7 +5570,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-binary": { @@ -5103,6 +5602,12 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "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-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -5115,9 +5620,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -5134,8 +5639,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -5144,7 +5649,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5153,7 +5658,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5164,7 +5669,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5175,18 +5680,18 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "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==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "hawk": { @@ -5194,17 +5699,18 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "hmac-drbg": { @@ -5213,16 +5719,17 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.5", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true }, "homedir-polyfill": { "version": "1.0.1", @@ -5230,7 +5737,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -5245,10 +5752,10 @@ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "inherits": "2.0.3", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, "html-entities": { @@ -5258,18 +5765,18 @@ "dev": true }, "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==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.11", - "commander": "2.16.0", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.4" + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" } }, "html-webpack-plugin": { @@ -5278,12 +5785,12 @@ "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", "dev": true, "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.18", - "loader-utils": "0.2.17", - "lodash": "4.17.10", - "pretty-error": "2.1.1", - "toposort": "1.0.7" + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" }, "dependencies": { "loader-utils": { @@ -5292,10 +5799,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -5306,10 +5813,10 @@ "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" }, "dependencies": { "domutils": { @@ -5318,7 +5825,7 @@ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "isarray": { @@ -5333,10 +5840,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -5348,22 +5855,15 @@ } }, "http-auth": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-2.4.11.tgz", - "integrity": "sha1-YfAkpuDnxIk0lEiVyHoTlVCcYZs=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", + "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", "dev": true, "requires": { - "apache-crypt": "1.1.2", - "apache-md5": "1.0.6", - "node-uuid": "1.4.8" - }, - "dependencies": { - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - } + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.3.0", + "uuid": "^3.0.0" } }, "http-deceiver": { @@ -5378,16 +5878,16 @@ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", "dev": true }, "http-proxy": { @@ -5396,9 +5896,9 @@ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { - "eventemitter3": "3.1.0", - "follow-redirects": "1.5.1", - "requires-port": "1.0.0" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-middleware": { @@ -5407,10 +5907,10 @@ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "dev": true, "requires": { - "http-proxy": "1.17.0", - "is-glob": "3.1.0", - "lodash": "4.17.10", - "micromatch": "2.3.11" + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" }, "dependencies": { "is-extglob": { @@ -5425,7 +5925,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -5435,10 +5935,11 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, + "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -5453,17 +5954,26 @@ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", "dev": true, "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1" + "agent-base": "2", + "debug": "2", + "extend": "3" } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "i18next": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-12.1.0.tgz", + "integrity": "sha512-AexmwGkKxwKfo5fGeXTWEY4xqzRPigQ1S/0InOUUVziGO54cd4fKyYK8ED1Thx9fd+WA3fRSZ+1iekvFQMbsFw==", "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==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", @@ -5482,22 +5992,6 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "ignorefs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", - "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=", - "dev": true, - "requires": { - "editions": "1.3.4", - "ignorepatterns": "1.1.0" - } - }, - "ignorepatterns": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz", - "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=", - "dev": true - }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -5511,7 +6005,17 @@ "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, "requires": { - "import-from": "2.1.0" + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "import-from": { @@ -5520,7 +6024,7 @@ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "import-lazy": { @@ -5535,8 +6039,8 @@ "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -5557,7 +6061,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -5572,8 +6076,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -5594,19 +6098,106 @@ "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", "dev": true }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "inquirer": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.1", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^2.0.0", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + }, + "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": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "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" + } + }, + "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 + }, + "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": { + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inside/-/inside-1.0.0.tgz", + "integrity": "sha1-20Xpk1c82z23C5gy6ChbrUZCR3A=", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "dev": true, "requires": { - "meow": "3.7.0" + "meow": "^3.3.0" } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invariant": { @@ -5615,7 +6206,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -5631,9 +6222,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", "dev": true }, "is-absolute": { @@ -5642,8 +6233,8 @@ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.2" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, "is-accessor-descriptor": { @@ -5652,7 +6243,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -5667,7 +6258,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -5676,15 +6267,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -5692,12 +6274,12 @@ "dev": true }, "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.5.0" } }, "is-data-descriptor": { @@ -5706,7 +6288,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-date-object": { @@ -5721,9 +6303,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -5752,7 +6334,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -5773,7 +6355,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -5782,7 +6364,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -5791,7 +6373,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-installed-globally": { @@ -5800,8 +6382,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-module": { @@ -5828,7 +6410,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -5849,7 +6431,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -5858,7 +6440,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { @@ -5867,7 +6449,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -5890,6 +6472,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "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-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -5902,7 +6490,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.3" + "has": "^1.0.1" } }, "is-relative": { @@ -5911,7 +6499,7 @@ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { - "is-unc-path": "1.0.0" + "is-unc-path": "^1.0.0" } }, "is-retry-allowed": { @@ -5927,10 +6515,13 @@ "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 + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -5944,7 +6535,7 @@ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.2" } }, "is-utf8": { @@ -5972,10 +6563,13 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } }, "isexe": { "version": "2.0.0", @@ -5999,23 +6593,22 @@ "dev": true }, "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", - "dev": true, - "requires": { - "async": "2.6.1", - "compare-versions": "3.3.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.1", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.5", - "istanbul-reports": "1.3.0", - "js-yaml": "3.12.0", - "mkdirp": "0.5.1", - "once": "1.4.0" + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" } }, "istanbul-instrumenter-loader": { @@ -6024,10 +6617,10 @@ "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", "dev": true, "requires": { - "convert-source-map": "1.5.1", - "istanbul-lib-instrument": "1.10.1", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" }, "dependencies": { "ajv": { @@ -6036,10 +6629,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "schema-utils": { @@ -6048,51 +6641,51 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } } } }, "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", "dev": true }, "istanbul-lib-hook": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", - "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", "dev": true, "requires": { - "append-transform": "1.0.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" } }, "istanbul-lib-report": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { @@ -6107,42 +6700,48 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", - "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "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 } } }, "istanbul-reports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", "dev": true, "requires": { - "handlebars": "4.0.10" + "handlebars": "^4.0.3" } }, "jasmine": { @@ -6151,9 +6750,9 @@ "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", "dev": true, "requires": { - "exit": "0.1.2", - "glob": "7.1.2", - "jasmine-core": "2.99.1" + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.99.0" }, "dependencies": { "jasmine-core": { @@ -6194,9 +6793,9 @@ "dev": true }, "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-tokens": { @@ -6206,21 +6805,20 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsesc": { "version": "1.3.0", @@ -6257,8 +6855,9 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, + "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -6285,7 +6884,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -6308,268 +6907,595 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", - "colors": "1.3.0", - "combine-lists": "1.0.1", - "connect": "3.6.6", - "core-js": "2.5.7", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.17.0", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.6.0", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.2.0", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.2", - "socket.io": "1.7.3", - "source-map": "0.5.7", - "tmp": "0.0.31", - "useragent": "2.3.0" - }, - "dependencies": { - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "1.7.3", + "source-map": "^0.5.3", + "tmp": "0.0.31", + "useragent": "^2.1.12" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", + "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", + "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", + "dev": true, + "requires": { + "istanbul-api": "^1.3.1", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "^1.0.2" + } + }, + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "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" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "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" + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + } + }, + "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==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, + "license-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==", + "dev": true, + "requires": { + "ejs": "^2.5.7" + } + }, + "live-server": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz", + "integrity": "sha512-Yn2XCVjErTkqnM3FfTmM7/kWy3zP7+cEtC7x6u+wUzlQ+1UW3zEYbbyJrc0jNDwiMDZI0m4a0i3dxlGHVyXczw==", + "dev": true, + "requires": { + "chokidar": "^2.0.4", + "colors": "^1.3.3", + "connect": "^3.6.6", + "cors": "^2.8.5", + "event-stream": "3.3.4", + "faye-websocket": "0.11.x", + "http-auth": "3.1.x", + "morgan": "^1.9.1", + "object-assign": "^4.1.1", + "opn": "^5.4.0", + "proxy-middleware": "^0.15.0", + "send": "^0.16.2", + "serve-index": "^1.9.1" + }, + "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" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.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.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", + "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + } + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "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": { + "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" + } + } + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "1.3.2", - "utils-merge": "1.0.1" + "kind-of": "^6.0.0" } }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "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": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "kind-of": "^6.0.0" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true + "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" + } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", - "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", - "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.1" - } - }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "1.8.1" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", - "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", - "dev": true, - "requires": { - "istanbul-api": "1.3.1", - "minimatch": "3.0.4" - } - }, - "karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", - "dev": true - }, - "karma-jasmine-html-reporter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", - "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", - "dev": true, - "requires": { - "karma-jasmine": "1.1.2" - } - }, - "karma-source-map-support": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", - "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", - "dev": true, - "requires": { - "source-map-support": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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 }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "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": { - "buffer-from": "1.1.0", - "source-map": "0.6.1" + "is-extglob": "^2.1.1" } - } - } - }, - "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", - "dev": true - }, - "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.6" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "4.0.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "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" - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", - "dev": true, - "requires": { - "errno": "0.1.7", - "graceful-fs": "4.1.11", - "image-size": "0.5.5", - "mime": "1.6.0", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.81.0", - "source-map": "0.5.7" - } - }, - "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==", - "dev": true, - "requires": { - "clone": "2.1.1", - "loader-utils": "1.1.0", - "pify": "3.0.0" - } - }, - "license-webpack-plugin": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", - "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==", - "dev": true, - "requires": { - "ejs": "2.6.1" - } - }, - "live-server": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", - "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", - "dev": true, - "requires": { - "colors": "1.3.0", - "connect": "3.4.1", - "cors": "2.8.4", - "event-stream": "3.3.4", - "faye-websocket": "0.11.1", - "http-auth": "2.4.11", - "morgan": "1.9.0", - "object-assign": "4.1.1", - "opn": "5.3.0", - "proxy-middleware": "0.15.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "watchr": "2.6.0" - }, - "dependencies": { - "colors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", - "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==", + }, + "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 }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "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": { - "websocket-driver": "0.7.0" + "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" } }, "mime": { @@ -6578,6 +7504,12 @@ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "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 + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6585,12 +7517,12 @@ "dev": true }, "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "send": { @@ -6600,18 +7532,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" } } } @@ -6622,11 +7554,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "dependencies": { "pify": { @@ -6638,9 +7570,9 @@ } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -6649,9 +7581,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -6660,14 +7592,14 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash.assign": { @@ -6682,12 +7614,6 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", @@ -6706,8 +7632,8 @@ "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" + "readable-stream": "~1.0.2", + "semver": "~4.3.3" }, "dependencies": { "isarray": { @@ -6722,10 +7648,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "semver": { @@ -6760,7 +7686,7 @@ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { @@ -6769,8 +7695,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -6786,25 +7712,25 @@ "dev": true }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "lunr": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.2.0.tgz", - "integrity": "sha512-HNuCi0meEZZpfORgJuxmXu5yHkdWrWew9dphUj+ouCbNNT38ud5YXWKVcLo1gSwQcDdKMXn+lRuDiXLfllnnjA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.5.tgz", + "integrity": "sha512-EtnfmHsHJTr3u24sito9JctSxej5Ds0SgUD2Lm+qRHyLgM7BGesFlW14eNh1mil0fV5Muh8gf3dBBXzADlUlzQ==", "dev": true }, "macos-release": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", - "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", + "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", "dev": true }, "magic-string": { @@ -6813,7 +7739,7 @@ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { - "vlq": "0.2.3" + "vlq": "^0.2.2" } }, "make-dir": { @@ -6822,13 +7748,13 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, "map-cache": { @@ -6855,29 +7781,30 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", + "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==", "dev": true }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "media-typer": { @@ -6892,7 +7819,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "memory-fs": { @@ -6901,8 +7828,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "meow": { @@ -6911,16 +7838,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "minimist": { @@ -6937,6 +7864,12 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6949,19 +7882,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "miller-rabin": { @@ -6970,8 +7903,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { @@ -6981,18 +7914,18 @@ "dev": true }, "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==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "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==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { @@ -7019,7 +7952,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -7029,30 +7962,30 @@ "dev": true }, "minipass": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", - "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.2" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" }, "dependencies": { "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } }, "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "requires": { - "minipass": "2.3.3" + "minipass": "^2.2.1" } }, "mississippi": { @@ -7061,16 +7994,16 @@ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.0", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.2", - "through2": "2.0.3" + "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": { @@ -7079,8 +8012,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -7089,7 +8022,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -7100,8 +8033,8 @@ "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", "dev": true, "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" }, "dependencies": { "for-in": { @@ -7122,21 +8055,21 @@ } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "morgan": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", - "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", "dev": true, "requires": { - "basic-auth": "2.0.0", + "basic-auth": "~2.0.0", "debug": "2.6.9", - "depd": "1.1.2", - "on-finished": "2.3.0", - "on-headers": "1.0.1" + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" } }, "move-concurrently": { @@ -7145,12 +8078,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "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": { @@ -7165,8 +8098,8 @@ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.2" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { @@ -7181,16 +8114,22 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, + "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.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", "dev": true }, "nanomatch": { @@ -7199,17 +8138,17 @@ "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -7239,9 +8178,9 @@ "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==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, "next-tick": { @@ -7256,46 +8195,46 @@ "integrity": "sha512-1SnzFGIM2urn0fFp2aP9+fv5xs1HyhiDwwHbowZIBlPQ+gVRuhVNLTM3L21URDakDt3+rO9D+DipyyvRWnBRLw==", "dev": true, "requires": { - "@ngtools/json-schema": "1.2.0", - "autoprefixer": "7.2.6", - "browserslist": "2.11.3", - "chalk": "2.4.1", - "commander": "2.16.0", - "cpx": "1.5.0", - "fs-extra": "5.0.0", - "glob": "7.1.2", - "injection-js": "2.2.1", - "less": "2.7.3", - "node-sass": "4.9.2", - "node-sass-tilde-importer": "1.0.2", - "postcss": "6.0.23", - "postcss-clean": "1.1.0", - "postcss-url": "7.3.2", - "read-pkg-up": "3.0.0", - "rimraf": "2.6.2", - "rollup": "0.55.5", - "rollup-plugin-cleanup": "2.0.1", + "@ngtools/json-schema": "^1.1.0", + "autoprefixer": "^7.1.1", + "browserslist": "^2.1.5", + "chalk": "^2.3.1", + "commander": "^2.12.0", + "cpx": "^1.5.0", + "fs-extra": "^5.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^2.7.2", + "node-sass": "^4.5.3", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^6.0.2", + "postcss-clean": "^1.1.0", + "postcss-url": "^7.3.0", + "read-pkg-up": "^3.0.0", + "rimraf": "^2.6.1", + "rollup": "^0.55.0", + "rollup-plugin-cleanup": "^2.0.0", "rollup-plugin-commonjs": "8.3.0", - "rollup-plugin-license": "0.6.0", - "rollup-plugin-node-resolve": "3.3.0", - "rxjs": "5.5.11", - "sorcery": "0.10.0", - "strip-bom": "3.0.0", - "stylus": "0.54.5", - "tar": "4.4.4", - "uglify-js": "3.4.4", - "update-notifier": "2.5.0" + "rollup-plugin-license": "^0.6.0", + "rollup-plugin-node-resolve": "^3.0.0", + "rxjs": "^5.5.0", + "sorcery": "^0.10.0", + "strip-bom": "^3.0.0", + "stylus": "^0.54.5", + "tar": "^4.4.1", + "uglify-js": "^3.3.20", + "update-notifier": "^2.3.0" }, "dependencies": { "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "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.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "fs-extra": { @@ -7304,9 +8243,9 @@ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "has-flag": { @@ -7321,10 +8260,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "parse-json": { @@ -7333,8 +8272,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "read-pkg": { @@ -7343,9 +8282,9 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, "read-pkg-up": { @@ -7354,8 +8293,8 @@ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "strip-bom": { @@ -7365,44 +8304,60 @@ "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==", + "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": "^3.0.0" } }, "tar": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.4.tgz", - "integrity": "sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.3", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.2" + "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" } }, "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "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.4" + "lower-case": "^1.1.1" + } + }, + "node-fetch": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-forge": { @@ -7412,32 +8367,134 @@ "dev": true }, "node-gyp": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz", - "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "dev": true, "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.1" + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" }, "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "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 + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "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" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "semver": { @@ -7445,37 +8502,47 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } } } }, "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.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "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.4", + "url": "^0.11.0", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7488,50 +8555,38 @@ } }, "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.2.tgz", + "integrity": "sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg==", "dev": true }, "node-sass": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.2.tgz", - "integrity": "sha512-LdxoJLZutx0aQXHtWIYwJKMj+9pTjneTcLWJgzf2XbGu0q5pRNqW5QvFCEdm3mc5rJOdru/mzln5d0EZLacf6g==", - "dev": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.10.0", - "node-gyp": "3.7.0", - "npmlog": "4.1.2", - "request": "2.87.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0", - "true-case-path": "1.0.2" + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", + "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" }, "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.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -7556,22 +8611,22 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "har-schema": { @@ -7581,13 +8636,13 @@ "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=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "http-signature": { @@ -7596,17 +8651,29 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -7614,31 +8681,31 @@ "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.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "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.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "supports-color": { @@ -7646,6 +8713,16 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } } } }, @@ -7655,7 +8732,7 @@ "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", "dev": true, "requires": { - "find-parent-dir": "0.3.0" + "find-parent-dir": "^0.3.0" } }, "nopt": { @@ -7664,20 +8741,20 @@ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "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.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -7686,7 +8763,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { @@ -7701,7 +8778,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -7710,19 +8787,19 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~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=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "null-check": { @@ -7747,7 +8824,8 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -7767,9 +8845,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -7778,7 +8856,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -7795,7 +8873,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -7812,8 +8890,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -7822,7 +8900,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -7860,7 +8938,73 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "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" + } + }, + "opencollective": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "dev": true, + "requires": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "opn": { @@ -7869,7 +9013,7 @@ "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optimist": { @@ -7878,8 +9022,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.2" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "options": { @@ -7889,12 +9033,12 @@ "dev": true }, "original": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", - "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { - "url-parse": "1.4.1" + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -7915,17 +9059,17 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", - "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", + "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", "dev": true, "requires": { - "macos-release": "1.1.0", - "win-release": "1.1.1" + "macos-release": "^2.0.0", + "windows-release": "^3.1.0" } }, "os-tmpdir": { @@ -7940,8 +9084,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-finally": { @@ -7956,7 +9100,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -7965,7 +9109,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.3.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -7986,16 +9130,16 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "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==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "dev": true }, "parallel-transform": { @@ -8004,9 +9148,9 @@ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "param-case": { @@ -8015,20 +9159,21 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-glob": { @@ -8037,10 +9182,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -8049,9 +9194,15 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.2" + "error-ex": "^1.2.0" } }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -8064,7 +9215,7 @@ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, "requires": { - "@types/node": "6.0.114" + "@types/node": "*" } }, "parsejson": { @@ -8073,7 +9224,7 @@ "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseqs": { @@ -8082,7 +9233,7 @@ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseuri": { @@ -8091,7 +9242,7 @@ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseurl": { @@ -8143,9 +9294,9 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-to-regexp": { @@ -8160,7 +9311,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "pause-stream": { @@ -8169,27 +9320,28 @@ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "through": "2.3.8" + "through": "~2.3" } }, "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "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": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true + "dev": true, + "optional": true }, "pify": { "version": "3.0.0", @@ -8209,7 +9361,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -8218,18 +9370,18 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "dev": true, "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { @@ -8252,20 +9404,20 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" }, "dependencies": { "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "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.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -8281,12 +9433,12 @@ "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==", + "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": "^3.0.0" } } } @@ -8297,8 +9449,8 @@ "integrity": "sha512-83g3GqMbCM5NL6MlbbPLJ/m2NrUepBF44MoDk4Gt04QGXeXKh9+ilQa0DzLnYnvqYHQCw83nckuEzBFr2muwbg==", "dev": true, "requires": { - "clean-css": "4.1.11", - "postcss": "6.0.23" + "clean-css": "^4.x", + "postcss": "^6.x" } }, "postcss-import": { @@ -8307,10 +9459,10 @@ "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", "dev": true, "requires": { - "postcss": "6.0.23", - "postcss-value-parser": "3.3.0", - "read-cache": "1.0.0", - "resolve": "1.8.1" + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, "postcss-load-config": { @@ -8319,8 +9471,8 @@ "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", "dev": true, "requires": { - "cosmiconfig": "4.0.0", - "import-cwd": "2.1.0" + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" } }, "postcss-loader": { @@ -8329,10 +9481,10 @@ "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.23", - "postcss-load-config": "2.0.0", - "schema-utils": "0.4.5" + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" } }, "postcss-url": { @@ -8341,17 +9493,17 @@ "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", "dev": true, "requires": { - "mime": "1.6.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "postcss": "6.0.23", - "xxhashjs": "0.2.2" + "mime": "^1.4.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" } }, "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=", + "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 }, "prepend-http": { @@ -8372,8 +9524,8 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "process": { @@ -8395,7 +9547,7 @@ "dev": true, "optional": true, "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "promise-inflight": { @@ -8410,35 +9562,23 @@ "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", "dev": true, "requires": { - "@types/node": "6.0.114", - "@types/q": "0.0.32", - "@types/selenium-webdriver": "2.53.43", + "@types/node": "^6.0.46", + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "~2.53.39", "blocking-proxy": "0.0.5", - "chalk": "1.1.3", - "glob": "7.1.2", - "jasmine": "2.99.0", - "jasminewd2": "2.2.0", - "optimist": "0.6.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "^2.5.3", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", "q": "1.4.1", - "saucelabs": "1.3.0", + "saucelabs": "~1.3.0", "selenium-webdriver": "3.0.1", - "source-map-support": "0.4.18", - "webdriver-js-extender": "1.0.0", - "webdriver-manager": "12.1.0" + "source-map-support": "~0.4.0", + "webdriver-js-extender": "^1.0.0", + "webdriver-manager": "^12.0.6" }, "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.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -8463,11 +9603,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" } }, "del": { @@ -8476,24 +9616,24 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "globby": { @@ -8502,12 +9642,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "har-schema": { @@ -8517,13 +9657,13 @@ "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=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "http-signature": { @@ -8532,9 +9672,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "minimist": { @@ -8543,6 +9683,12 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -8555,6 +9701,12 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -8562,31 +9714,31 @@ "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.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "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.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "supports-color": { @@ -8595,35 +9747,45 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz", + "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==", "dev": true, "requires": { - "adm-zip": "0.4.11", - "chalk": "1.1.3", - "del": "2.2.2", - "glob": "7.1.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "q": "1.4.1", - "request": "2.87.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "xml2js": "0.4.19" + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" } } } }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "dev": true, "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.6.0" + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" } }, "proxy-middleware": { @@ -8644,17 +9806,24 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -8663,8 +9832,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -8673,9 +9842,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.6.0", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -8700,7 +9869,8 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true + "dev": true, + "optional": true }, "querystring": { "version": "0.2.0", @@ -8715,20 +9885,20 @@ "dev": true }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", "dev": true }, "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -8751,7 +9921,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -8760,8 +9930,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -8771,41 +9941,15 @@ "dev": true }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" } }, "raw-loader": { @@ -8820,10 +9964,10 @@ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -8840,7 +9984,7 @@ "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.3.0" }, "dependencies": { "pify": { @@ -8857,9 +10001,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" }, "dependencies": { "path-type": { @@ -8868,9 +10012,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pify": { @@ -8887,8 +10031,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { @@ -8897,8 +10041,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -8907,7 +10051,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -8918,25 +10062,300 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "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" + } + } + } + }, + "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-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" + } + } } }, "redent": { @@ -8945,14 +10364,14 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "reflect-metadata": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", - "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, "regenerate": { @@ -8973,7 +10392,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -8982,8 +10401,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -8992,9 +10411,9 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -9003,8 +10422,8 @@ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "1.2.8", - "safe-buffer": "5.1.2" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -9013,7 +10432,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.8" + "rc": "^1.0.1" } }, "regjsgen": { @@ -9028,7 +10447,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -9052,30 +10471,22 @@ "dev": true }, "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", + "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.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 - } + "css-select": "^1.1.0", + "dom-converter": "~0.2", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" } }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -9090,7 +10501,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -9098,29 +10509,30 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, + "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.2", - "stringstream": "0.0.6", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "require-directory": { @@ -9148,12 +10560,12 @@ "dev": true }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.6" } }, "resolve-cwd": { @@ -9162,7 +10574,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-from": { @@ -9177,6 +10589,16 @@ "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", @@ -9189,16 +10611,16 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "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.2" + "glob": "^7.1.3" } }, "ripemd160": { @@ -9207,8 +10629,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "rollup": { @@ -9223,9 +10645,9 @@ "integrity": "sha512-Z2UpMe3l2Oo8jzoB2gAWcb3UqIyiGxlh8kKlcs/W53yTPtwdF8RGfhuTx+/kjRlkSc5TC03t3sX3Lj3B40k9Eg==", "dev": true, "requires": { - "acorn": "4.0.13", - "magic-string": "0.22.5", - "rollup-pluginutils": "2.3.0" + "acorn": "4.x", + "magic-string": "^0.22.4", + "rollup-pluginutils": "^2.0.1" }, "dependencies": { "acorn": { @@ -9242,11 +10664,11 @@ "integrity": "sha512-PYs3OiYgENFYEmI3vOEm5nrp3eY90YZqd5vGmQqeXmhJsAWFIrFdROCvOasqJ1HgeTvqyYo9IGXnFDyoboNcgQ==", "dev": true, "requires": { - "acorn": "5.7.1", - "estree-walker": "0.5.2", - "magic-string": "0.22.5", - "resolve": "1.8.1", - "rollup-pluginutils": "2.3.0" + "acorn": "^5.2.1", + "estree-walker": "^0.5.0", + "magic-string": "^0.22.4", + "resolve": "^1.4.0", + "rollup-pluginutils": "^2.0.1" } }, "rollup-plugin-license": { @@ -9274,7 +10696,7 @@ "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", "dev": true, "requires": { - "vlq": "0.2.3" + "vlq": "^0.2.1" } }, "moment": { @@ -9286,32 +10708,33 @@ } }, "rollup-plugin-node-resolve": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz", - "integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", + "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", "dev": true, "requires": { - "builtin-modules": "2.0.0", - "is-module": "1.0.0", - "resolve": "1.8.1" - }, - "dependencies": { - "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "dev": true - } + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" } }, "rollup-pluginutils": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", + "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", + "dev": true, + "requires": { + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" + } + }, + "run-async": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", - "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "estree-walker": "0.5.2", - "micromatch": "2.3.11" + "is-promise": "^2.1.0" } }, "run-queue": { @@ -9320,13 +10743,19 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", "dev": true, "requires": { "symbol-observable": "1.0.1" @@ -9344,17 +10773,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" - } - }, - "safefs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.1.0.tgz", - "integrity": "sha1-+CrrS9165R9lPrIPZyizBYyNZEU=", - "dev": true, - "requires": { - "editions": "1.3.4", - "graceful-fs": "4.1.11" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -9369,10 +10788,10 @@ "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", "dev": true, "requires": { - "es6-promise": "3.3.1", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" } }, "sass-graph": { @@ -9381,10 +10800,10 @@ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" } }, "sass-loader": { @@ -9393,11 +10812,11 @@ "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", "dev": true, "requires": { - "clone-deep": "2.0.2", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "neo-async": "2.5.1", - "pify": "3.0.0" + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0" } }, "saucelabs": { @@ -9406,7 +10825,7 @@ "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", "dev": true, "requires": { - "https-proxy-agent": "1.0.0" + "https-proxy-agent": "^1.0.0" } }, "sax": { @@ -9415,46 +10834,14 @@ "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, - "scandirectory": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", - "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=", - "dev": true, - "requires": { - "ignorefs": "1.2.0", - "safefs": "3.2.2", - "taskgroup": "4.3.1" - }, - "dependencies": { - "safefs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", - "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "taskgroup": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", - "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=", - "dev": true, - "requires": { - "ambi": "2.5.0", - "csextends": "1.2.0" - } - } - } - }, "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==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "scss-tokenizer": { @@ -9463,8 +10850,8 @@ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { - "js-base64": "2.4.5", - "source-map": "0.4.4" + "js-base64": "^2.1.8", + "source-map": "^0.4.2" }, "dependencies": { "source-map": { @@ -9473,7 +10860,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -9490,10 +10877,10 @@ "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", "dev": true, "requires": { - "adm-zip": "0.4.11", - "rimraf": "2.6.2", + "adm-zip": "^0.4.7", + "rimraf": "^2.5.4", "tmp": "0.0.30", - "xml2js": "0.4.19" + "xml2js": "^0.4.17" }, "dependencies": { "tmp": { @@ -9502,24 +10889,24 @@ "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.1" } } } }, "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", "dev": true, "requires": { "node-forge": "0.7.5" } }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "semver-diff": { @@ -9528,7 +10915,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "semver-dsl": { @@ -9537,16 +10924,16 @@ "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "^5.3.0" } }, "semver-intersect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", - "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "^5.0.0" } }, "send": { @@ -9556,18 +10943,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "mime": { @@ -9579,9 +10966,9 @@ } }, "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==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "serve-index": { @@ -9590,13 +10977,13 @@ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.18", - "parseurl": "1.3.2" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" } }, "serve-static": { @@ -9605,9 +10992,9 @@ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -9617,22 +11004,16 @@ "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.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -9641,7 +11022,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -9664,8 +11045,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shallow-clone": { @@ -9674,9 +11055,9 @@ "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", "dev": true, "requires": { - "is-extendable": "0.1.1", - "kind-of": "5.1.0", - "mixin-object": "2.0.1" + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" }, "dependencies": { "kind-of": { @@ -9693,7 +11074,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -9708,10 +11089,10 @@ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "signal-exit": { @@ -9721,12 +11102,12 @@ "dev": true }, "silent-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", - "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.1.tgz", + "integrity": "sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==", "dev": true, "requires": { - "debug": "2.6.9" + "debug": "^2.2.0" } }, "slash": { @@ -9741,14 +11122,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.0" + "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": { "define-property": { @@ -9757,7 +11138,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -9766,7 +11147,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -9777,9 +11158,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -9788,7 +11169,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -9797,7 +11178,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -9806,7 +11187,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -9815,9 +11196,9 @@ "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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -9840,7 +11221,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sntp": { @@ -9848,8 +11229,9 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "socket.io": { @@ -10000,22 +11382,22 @@ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.3.2" + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" } }, "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", "dev": true, "requires": { - "debug": "2.6.9", + "debug": "^2.6.6", "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.1" + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" }, "dependencies": { "faye-websocket": { @@ -10024,7 +11406,7 @@ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } } } @@ -10035,10 +11417,10 @@ "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", "dev": true, "requires": { - "buffer-crc32": "0.2.13", - "minimist": "1.2.0", - "sander": "0.5.1", - "sourcemap-codec": "1.4.1" + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" }, "dependencies": { "minimist": { @@ -10050,9 +11432,9 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -10067,11 +11449,11 @@ "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" + "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-support": { @@ -10080,7 +11462,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -10090,25 +11472,25 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz", - "integrity": "sha512-hX1eNBNuilj8yfFnECh0DzLgwKpBLMIvmhgEhixXNui8lMLBInTI8Kyxt++RwJnMNu7cAUo635L2+N1TxMJCzA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "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-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "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": { @@ -10117,14 +11499,14 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "spdy": { @@ -10133,27 +11515,27 @@ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "dev": true, "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.2", - "select-hose": "2.0.0", - "spdy-transport": "2.1.0" + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" } }, "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", + "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", "dev": true, "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "safe-buffer": "5.1.2", - "wbuf": "1.7.3" + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" } }, "split": { @@ -10162,7 +11544,7 @@ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "split-string": { @@ -10171,7 +11553,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -10181,20 +11563,20 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "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" }, "dependencies": { "assert-plus": { @@ -10211,7 +11593,7 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.1" } }, "static-extend": { @@ -10220,8 +11602,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -10230,7 +11612,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -10242,22 +11624,22 @@ "dev": true }, "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.1" } }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-combiner": { @@ -10266,17 +11648,17 @@ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "0.1.1" + "duplexer": "~0.1.1" } }, "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { @@ -10285,11 +11667,11 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "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": { @@ -10304,9 +11686,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -10315,14 +11697,15 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "stringstream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true + "dev": true, + "optional": true }, "strip-ansi": { "version": "3.0.1", @@ -10330,7 +11713,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -10339,7 +11722,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -10354,7 +11737,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -10369,8 +11752,8 @@ "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" }, "dependencies": { "ajv": { @@ -10379,10 +11762,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "schema-utils": { @@ -10391,7 +11774,7 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } } } @@ -10402,12 +11785,12 @@ "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", "dev": true, "requires": { - "css-parse": "1.7.0", - "debug": "2.6.9", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" }, "dependencies": { "glob": { @@ -10416,12 +11799,12 @@ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "source-map": { @@ -10430,7 +11813,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -10441,9 +11824,9 @@ "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" } }, "subarg": { @@ -10452,7 +11835,7 @@ "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.1.0" }, "dependencies": { "minimist": { @@ -10469,7 +11852,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "symbol-observable": { @@ -10479,9 +11862,9 @@ "dev": true }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", "dev": true }, "tar": { @@ -10490,21 +11873,9 @@ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "taskgroup": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-5.0.1.tgz", - "integrity": "sha1-CHNsmyRoOxQ0d0Ix60tzqnw/ebU=", - "dev": true, - "requires": { - "ambi": "2.5.0", - "eachr": "3.2.0", - "editions": "1.3.4", - "extendr": "3.3.0" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "term-size": { @@ -10513,7 +11884,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "through": { @@ -10523,25 +11894,25 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", "dev": true }, "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", "dev": true }, "timed-out": { @@ -10556,16 +11927,16 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "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" + "os-tmpdir": "~1.0.2" } }, "to-array": { @@ -10592,7 +11963,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -10601,10 +11972,10 @@ "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" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -10613,8 +11984,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -10623,7 +11994,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -10639,15 +12010,17 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, + "optional": true, "requires": { - "punycode": "1.4.1" + "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 + "dev": true, + "optional": true } } }, @@ -10658,9 +12031,9 @@ "dev": true }, "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", "dev": true }, "trim-newlines": { @@ -10676,27 +12049,12 @@ "dev": true }, "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { - "glob": "6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "glob": "^7.1.2" } }, "ts-node": { @@ -10705,16 +12063,16 @@ "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", "dev": true, "requires": { - "arrify": "1.0.1", - "chalk": "2.2.2", - "diff": "3.5.0", - "make-error": "1.3.4", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", - "v8flags": "3.1.1", - "yn": "2.0.0" + "arrify": "^1.0.0", + "chalk": "^2.0.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.0", + "tsconfig": "^6.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" }, "dependencies": { "minimist": { @@ -10726,33 +12084,42 @@ } }, "ts-simple-ast": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-11.2.0.tgz", - "integrity": "sha1-WKRGneU5HF4fnV9etX1nXB4xVjY=", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-12.4.0.tgz", + "integrity": "sha512-7GJFZlyTZY7uMAEhX62ZLxdwOpGDJzc/nwpi1nRPZ7N2ICcqqrMjDtRnki15IUBv2ZjIGu6KBqk/pUqJFODFsg==", "dev": true, "requires": { - "@dsherret/to-absolute-glob": "2.0.2", - "@types/fs-extra": "5.0.4", - "code-block-writer": "7.1.0", - "fs-extra": "5.0.0", - "glob-parent": "3.1.0", - "globby": "6.1.0", - "is-negated-glob": "1.0.0", - "multimatch": "2.1.0", - "object-assign": "4.1.1", - "tslib": "1.9.3", - "typescript": "2.8.3" + "@dsherret/to-absolute-glob": "^2.0.2", + "code-block-writer": "^7.2.0", + "fs-extra": "^6.0.1", + "glob-parent": "^3.1.0", + "globby": "^8.0.1", + "is-negated-glob": "^1.0.0", + "multimatch": "^2.1.0", + "object-assign": "^4.1.1", + "tslib": "^1.9.0", + "typescript": "2.9.1" }, "dependencies": { + "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" + } + }, "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "glob-parent": { @@ -10761,21 +12128,23 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" } }, "is-extglob": { @@ -10790,19 +12159,13 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, "typescript": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", - "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", + "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", "dev": true } } @@ -10813,8 +12176,8 @@ "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", "dev": true, "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" }, "dependencies": { "strip-bom": { @@ -10831,10 +12194,10 @@ "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", "dev": true, "requires": { - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map": "0.6.1", - "source-map-support": "0.5.6" + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0", + "source-map-support": "^0.5.0" }, "dependencies": { "minimist": { @@ -10850,13 +12213,13 @@ "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { - "buffer-from": "1.1.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } } } @@ -10873,25 +12236,25 @@ "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "colors": "1.3.0", - "commander": "2.16.0", - "diff": "3.5.0", - "glob": "7.1.2", - "minimatch": "3.0.4", - "resolve": "1.8.1", - "semver": "5.5.0", - "tslib": "1.9.3", - "tsutils": "2.27.2" + "babel-code-frame": "^6.22.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "diff": "^3.2.0", + "glob": "^7.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.7.1", + "tsutils": "^2.8.1" } }, "tsutils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", - "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.8.1" } }, "tty-browserify": { @@ -10906,15 +12269,14 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "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 + "dev": true }, "type-is": { "version": "1.6.16", @@ -10923,16 +12285,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" - } - }, - "typechecker": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.5.0.tgz", - "integrity": "sha512-bqPE/ck3bVIaXP7gMKTKSHrypT32lpYTpiqzPYeYzdSQnmaGvaGhy7TnN/M/+5R+2rs/kKcp9ZLPRp/Q9Yj+4w==", - "dev": true, - "requires": { - "editions": "1.3.4" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -10948,13 +12301,13 @@ "dev": true }, "uglify-js": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.4.tgz", - "integrity": "sha512-RiB1kNcC9RMyqwRrjXC+EjgLoXULoDnCaOnEDzUCHkBN0bHwmtF5rzDMiDWU29gu0kXCRRWwtcTAVFWRECmU2Q==", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "requires": { - "commander": "2.16.0", - "source-map": "0.6.1" + "commander": "~2.17.1", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -10973,19 +12326,19 @@ "optional": 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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", "dev": true, "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.5", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.6.0" + "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": { @@ -11006,8 +12359,8 @@ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" + "commander": "~2.13.0", + "source-map": "~0.6.1" } } } @@ -11030,10 +12383,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -11042,7 +12395,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -11051,30 +12404,30 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^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=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unique-string": { @@ -11083,7 +12436,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -11110,8 +12463,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -11120,9 +12473,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -11168,16 +12521,16 @@ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.2.2", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "upper-case": { @@ -11192,7 +12545,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -11225,9 +12578,9 @@ "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "mime": "1.6.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "mime": "^1.4.1", + "schema-utils": "^0.3.0" }, "dependencies": { "ajv": { @@ -11236,10 +12589,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "schema-utils": { @@ -11248,19 +12601,19 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } } } }, "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "dev": true, "requires": { - "querystringify": "2.0.0", - "requires-port": "1.0.0" + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" } }, "url-parse-lax": { @@ -11269,25 +12622,14 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "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 - } - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true }, "useragent": { "version": "2.3.0", @@ -11295,14 +12637,14 @@ "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "dev": true, "requires": { - "lru-cache": "4.1.3", - "tmp": "0.0.31" + "lru-cache": "4.1.x", + "tmp": "0.0.x" } }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -11333,22 +12675,22 @@ "dev": true }, "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", + "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "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" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vary": { @@ -11363,9 +12705,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" }, "dependencies": { "assert-plus": { @@ -11409,9 +12751,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" }, "dependencies": { "anymatch": { @@ -11420,8 +12762,19 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "arr-diff": { @@ -11442,16 +12795,16 @@ "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.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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": { @@ -11460,30 +12813,29 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", + "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" } }, "expand-brackets": { @@ -11492,13 +12844,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -11507,7 +12859,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -11516,7 +12868,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -11525,7 +12877,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -11534,7 +12886,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11545,7 +12897,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -11554,7 +12906,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11565,9 +12917,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -11584,14 +12936,14 @@ "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -11600,7 +12952,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -11609,7 +12961,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -11620,10 +12972,10 @@ "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.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -11632,7 +12984,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -11643,8 +12995,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -11653,7 +13005,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -11664,7 +13016,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -11673,7 +13025,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -11682,9 +13034,9 @@ "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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -11699,7 +13051,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -11708,7 +13060,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -11717,7 +13069,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11740,46 +13092,36 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "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.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } + }, + "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 } } }, - "watchr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.6.0.tgz", - "integrity": "sha1-51xCOxC+eSZ6DD73bi6hBP4CZ6U=", - "dev": true, - "requires": { - "eachr": "3.2.0", - "extendr": "3.3.0", - "extract-opts": "3.3.1", - "ignorefs": "1.2.0", - "safefs": "4.1.0", - "scandirectory": "2.5.0", - "taskgroup": "5.0.1", - "typechecker": "4.5.0" - } - }, "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { - "minimalistic-assert": "1.0.1" + "minimalistic-assert": "^1.0.0" } }, "webdriver-js-extender": { @@ -11788,8 +13130,8 @@ "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", "dev": true, "requires": { - "@types/selenium-webdriver": "2.53.43", - "selenium-webdriver": "2.53.3" + "@types/selenium-webdriver": "^2.53.35", + "selenium-webdriver": "^2.53.2" }, "dependencies": { "adm-zip": { @@ -11811,9 +13153,9 @@ "dev": true, "requires": { "adm-zip": "0.4.4", - "rimraf": "2.6.2", + "rimraf": "^2.2.8", "tmp": "0.0.24", - "ws": "1.1.2", + "ws": "^1.0.1", "xml2js": "0.4.4" } }, @@ -11829,8 +13171,8 @@ "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", "dev": true, "requires": { - "sax": "0.6.1", - "xmlbuilder": "9.0.7" + "sax": "0.6.x", + "xmlbuilder": ">=1.0.0" } } } @@ -11841,28 +13183,28 @@ "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", "dev": true, "requires": { - "acorn": "5.7.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "async": "2.6.1", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "dependencies": { "ansi-regex": { @@ -11883,8 +13225,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, @@ -11894,10 +13236,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "os-locale": { @@ -11906,9 +13248,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "path-type": { @@ -11917,7 +13259,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pify": { @@ -11932,9 +13274,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -11943,8 +13285,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "string-width": { @@ -11953,8 +13295,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -11969,7 +13311,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -11986,9 +13328,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -11997,9 +13339,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -12011,9 +13353,9 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" } }, "which-module": { @@ -12034,19 +13376,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^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": "^7.0.0" }, "dependencies": { "camelcase": { @@ -12061,9 +13403,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -12072,9 +13414,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -12087,7 +13429,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -12100,77 +13442,50 @@ } } }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, "webpack-dev-middleware": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" } }, "webpack-dev-server": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", - "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz", + "integrity": "sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==", "dev": true, "requires": { "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "2.0.4", - "compression": "1.7.2", - "connect-history-api-fallback": "1.5.0", - "debug": "3.1.0", - "del": "3.0.0", - "express": "4.16.3", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "import-local": "1.0.0", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "import-local": "^1.0.0", "internal-ip": "1.2.0", - "ip": "1.1.5", - "killable": "1.0.0", - "loglevel": "1.6.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.3", - "serve-index": "1.9.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", "sockjs": "0.3.19", - "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "5.4.0", + "sockjs-client": "1.1.5", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" }, @@ -12181,8 +13496,19 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "arr-diff": { @@ -12203,16 +13529,16 @@ "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.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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": { @@ -12221,7 +13547,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12233,33 +13559,40 @@ "dev": true }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", + "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + }, + "dependencies": { + "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 + } } }, "expand-brackets": { @@ -12268,13 +13601,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -12292,7 +13625,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -12301,7 +13634,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -12310,7 +13643,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12319,7 +13652,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12330,7 +13663,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12339,7 +13672,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12350,9 +13683,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -12369,14 +13702,14 @@ "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -12385,7 +13718,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -12394,7 +13727,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12405,10 +13738,10 @@ "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.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -12417,7 +13750,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12428,8 +13761,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -12438,7 +13771,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -12455,7 +13788,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -12464,7 +13797,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -12473,9 +13806,9 @@ "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-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -12490,7 +13823,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -12499,7 +13832,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -12508,7 +13841,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12531,28 +13864,34 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "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.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } }, + "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 + }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "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": "^3.0.0" } }, "y18n": { @@ -12567,19 +13906,19 @@ "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true, "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" } }, "yargs-parser": { @@ -12588,28 +13927,28 @@ "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" } } } }, "webpack-merge": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.3.tgz", - "integrity": "sha512-zxwAIGK7nKdu5CIZL0BjTQoq3elV0t0MfB7rUC1zj668geid52abs6hN/ACwZdK6LeMS8dC9B6WmtF978zH5mg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", "dev": true, "requires": { - "lodash": "4.17.10" + "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -12621,12 +13960,12 @@ } }, "webpack-subresource-integrity": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", - "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.2.tgz", + "integrity": "sha512-VpBtk0Ha1W0GebTzPj3Y8UqbmPDp+HqGlegRv+hS8g8/x818dw9NuEfJEOp5CF6zTPs3KF6aqknVu52Bh5h1eQ==", "dev": true, "requires": { - "webpack-core": "0.6.9" + "webpack-sources": "^1.3.0" } }, "websocket-driver": { @@ -12635,8 +13974,8 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "0.4.13", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -12657,7 +13996,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -12672,16 +14011,16 @@ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { @@ -12702,8 +14041,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -12712,26 +14051,56 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, - "win-release": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", - "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", - "dev": true, - "requires": { - "semver": "5.5.0" - } - }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true }, + "windows-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", + "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", + "dev": true, + "requires": { + "execa": "^0.10.0" + }, + "dependencies": { + "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" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "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" + } + } + } + }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", @@ -12744,7 +14113,7 @@ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -12753,8 +14122,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -12764,14 +14133,14 @@ "dev": true }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "ws": { @@ -12780,8 +14149,8 @@ "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", "dev": true, "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, "wtf-8": { @@ -12802,8 +14171,8 @@ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.7" + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" }, "dependencies": { "sax": { @@ -12838,7 +14207,7 @@ "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, "requires": { - "cuint": "0.2.2" + "cuint": "^0.2.2" } }, "y18n": { @@ -12859,19 +14228,19 @@ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": true, "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" }, "dependencies": { "camelcase": { @@ -12894,7 +14263,7 @@ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { @@ -12918,9 +14287,9 @@ "dev": true }, "zone.js": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", - "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==", + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==", "dev": true } } diff --git a/src/webglimpse/core.ts b/src/webglimpse/core.ts index a57b1f6..3ce48b5 100644 --- a/src/webglimpse/core.ts +++ b/src/webglimpse/core.ts @@ -159,7 +159,7 @@ export class Pane { } get layout(): Layout { - return this.layout; + return this._layout; } set layout(layout: Layout) { diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index 42a6f23..4fcf8fa 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -95,6 +95,7 @@ export class Highlight { program = new Program(xyNdc_VERTSHADER, dash2_FRAGSHADER); u_Color = new UniformColor(this.program, 'u_Color'); a_XyNdc = new Attribute(this.program, 'a_XyNdc'); + u_yOffset = new Uniform1f(this.program, 'u_yOffset'); u_DashPattern = new Uniform1f(this.program, 'u_DashPattern'); u_DashLength = new Uniform1f(this.program, 'u_DashLength'); @@ -138,6 +139,7 @@ export class Highlight { this.u_Color.setData(gl, this.color); this.u_DashPattern.setData(gl, this._dashPattern); this.u_DashLength.setData(gl, this._dashLength); + this.u_yOffset.setData(gl, viewport.j + viewport.h); this.xy_NDC[0] = -1; this.xy_NDC[1] = 1; @@ -287,23 +289,26 @@ export let dash_FRAGSHADER = concatLines( ' ' ); -export let dash2_FRAGSHADER = -`precision highp float; -uniform float u_DashLength; -uniform float u_DashPattern; -uniform vec4 u_Color; -const float maskLength = 16.0; - -void main( ) { - float dashPosition = fract(gl_FragCoord.y / u_DashLength); - float maskIndex = floor(dashPosition * maskLength); - float maskTest = floor(u_DashPattern / pow(2.0, maskIndex)); - - if(mod(maskTest, 2.0) < 1.0) - discard; - else - gl_FragColor = u_Color; -}`; +export let dash2_FRAGSHADER = concatLines( + ' precision highp float; ', + ' uniform float u_DashLength; ', + ' uniform float u_DashPattern; ', + ' uniform float u_yOffset; ', + ' uniform vec4 u_Color; ', + ' const float maskLength = 16.0; ', + ' ', + ' void main( ) { ', + ' float dashPosition = fract((gl_FragCoord.y - u_yOffset) / u_DashLength); ', + ' float maskIndex = floor(dashPosition * maskLength); ', + ' float maskTest = floor(u_DashPattern / pow(2.0, maskIndex)); ', + ' ', + ' if(mod(maskTest, 2.0) < 1.0) ', + ' discard; ', + ' else ', + ' gl_FragColor = u_Color; ', + ' }; ', + ' ' +); export let varyingColor_FRAGSHADER = concatLines( ' ', diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index a38ea0a..04d3224 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -34,6 +34,7 @@ import { formatTime_ISO8601, order, hasval, parseTime_PMILLIS } from '../util/ut import { indexOf } from '../util/sorted_arrays'; import { FillPattern } from './timeline_events_row'; import { Axis1D } from '../plot/axis'; +import { Insets } from '../layout/inset_layout'; export interface TimelineCursor { @@ -169,6 +170,8 @@ export interface TimelineGroup { collapsed?: boolean; highlighted?: boolean; highlightColor?: Color; + highlightWidth?: number; + highlightInsets?: Insets; dashPattern?: number; dashLength?: number; rowGuids: string[]; @@ -1257,6 +1260,8 @@ export class TimelineGroupModel { private _collapsed: boolean; private _highlighted: boolean; private _highlightColor: Color; + private _highlightWidth: number; + private _highlightInsets: Insets; private _dashPattern: number; private _dashLength: number; private _rowGuids: OrderedStringSet; @@ -1295,6 +1300,8 @@ export class TimelineGroupModel { this._highlightColor = hasval(group.highlightColor) ? group.highlightColor : parseCssColor('white'); this._dashPattern = hasval(group.dashPattern) ? group.dashPattern : 0xFFFF; this._dashLength = hasval(group.dashLength) ? group.dashLength : 16; + this._highlightWidth = group.highlightWidth; + this._highlightInsets = group.highlightInsets; this._attrsChanged.fire(); } @@ -1351,6 +1358,28 @@ export class TimelineGroupModel { } } + get highlightWidth(): number { + return this._highlightWidth; + } + + set highlightWidth(highlightWidth: number) { + if (highlightWidth !== this._highlightWidth) { + this._highlightWidth = highlightWidth; + this._attrsChanged.fire(); + } + } + + get highlightInsets(): Insets { + return this._highlightInsets; + } + + set highlightInsets(highlightInsets: Insets) { + if (highlightInsets !== this._highlightInsets) { + this._highlightInsets = highlightInsets; + this._attrsChanged.fire(); + } + } + get dashPattern(): number { return this._dashPattern; } @@ -1386,6 +1415,8 @@ export class TimelineGroupModel { collapsed: (hasval(this._collapsed) ? this._collapsed : false), highlighted: (hasval(this._highlighted) ? this._highlighted : false), highlightColor: hasval(this.highlightColor) ? this.highlightColor : parseCssColor('white'), + highlightWidth: this._highlightWidth, + highlightInsets: this._highlightInsets, dashPattern: hasval(this.dashPattern) ? this.dashPattern : 0xFFFF, dashLength: hasval(this.dashLength) ? this.dashLength : 16, rowGuids: this._rowGuids.toArray() diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 3e7a103..c311d52 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -112,6 +112,8 @@ export interface TimelinePaneOptions { // Sizing groupLabelInsets?: Insets; + groupHighlightWidth?: number; + groupHighlightInsets?: Insets; rowLabelInsets?: Insets; rowLabelPaneWidth?: number; rowSeparatorHeight?: number; @@ -172,6 +174,8 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Sizing const groupLabelInsets = (hasval(options) && hasval(options.groupLabelInsets) ? options.groupLabelInsets : newInsets(6, 10)); + const groupHighlightWidth = (hasval(options) && hasval(options.groupHighlightWidth) ? options.groupHighlightWidth : 2); + const groupHighlightInsets = (hasval(options) && hasval(options.groupHighlightInsets) ? options.groupHighlightInsets : newInsets(6, 0, 2, 4)); const rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35)); const rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140); const rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2); @@ -235,7 +239,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Scroll Pane const tickTimeZone = (showTopAxis ? topTimeZone : bottomTimeZone); - const contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; + const contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, groupHighlightWidth: groupHighlightWidth, groupHighlightInsets: groupHighlightInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; let contentPaneArgs; let contentPane: Pane = null; @@ -918,6 +922,8 @@ interface TimelineContentPaneOptions { rowLabelBgColor: Color; groupLabelColor: Color; groupHighlightColor: Color; + groupHighlightWidth: number; + groupHighlightInsets: Insets; axisLabelColor: Color; bgColor: Color; rowBgColor: Color; @@ -966,6 +972,8 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { const rowLabelColor = options.rowLabelColor; const groupLabelColor = options.groupLabelColor; const groupHighlightColor = options.groupHighlightColor; + const groupHighlightWidth = options.groupHighlightWidth; + const groupHighlightInsets = options.groupHighlightInsets; const axisLabelColor = options.axisLabelColor; const bgColor = options.bgColor; const rowBgColor = options.rowBgColor; @@ -1025,12 +1033,6 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { group.attrsChanged.on(redrawLabel); /// handle rollup group row /// - const groupHeaderHighlight = new Pane(newColumnLayout()); - const groupHighlight = new Highlight(group.highlightColor); - const pane = newSolidPane(new Color(0, 0, 0, 1)); - pane.addPainter(groupHighlight.newPainter()); - groupHeaderHighlight.addPane(pane, 1, { width: 6, height: null }); - const groupHeaderStripe = new Pane(newRowLayout()); groupHeaderStripe.addPane(new Pane(null), 0, { height: null }); groupHeaderStripe.addPane(newSolidPane(groupLabelColor), 1, { height: 1 }); @@ -1081,9 +1083,8 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { refreshRollupContentPane(); const groupButtonHeaderUnderlay = new Pane(newColumnLayout()); - groupButtonHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); - groupButtonHeaderUnderlay.addPane(groupButton, 1); - groupButtonHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); + groupButtonHeaderUnderlay.addPane(groupButton, 0); + groupButtonHeaderUnderlay.addPane(groupHeaderStripe, 1, { ignoreHeight: true }); groupHeaderUnderlay = new Pane(newColumnLayout()); groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); @@ -1096,9 +1097,8 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupHeaderUnderlay = new Pane(newColumnLayout()); groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); - groupHeaderUnderlay.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); - groupHeaderUnderlay.addPane(groupButton, 1); - groupHeaderUnderlay.addPane(groupHeaderStripe, 2, { ignoreHeight: true }); + groupHeaderUnderlay.addPane(groupButton, 0); + groupHeaderUnderlay.addPane(groupHeaderStripe, 1, { ignoreHeight: true }); const groupHeaderOverlay = newTimeAxisPane(args, null); const groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); @@ -1108,25 +1108,39 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { } - const groupContainerColPane = new Pane(newColumnLayout()); + const groupHeaderHighlight = new Pane(newColumnLayout(), false); + const groupHighlight = new Highlight(group.highlightColor || groupHighlightColor); + const highlightInnerPane = new Pane(null); + highlightInnerPane.addPainter(groupHighlight.newPainter()); + const insets = group.highlightInsets || groupHighlightInsets; + const width = group.highlightWidth || groupHighlightWidth; + const containerWidth = insets ? insets.left + insets.right + width : width; + const highlightPane = newInsetPane(highlightInnerPane, insets); + groupHeaderHighlight.addPane(highlightPane, 0, { width: containerWidth, height: null }); + + const groupContainerOverlayPane = new Pane(newOverlayLayout()); const groupContainerRowPane = new Pane(newRowLayout()); const groupContentPane = new Pane(newRowLayout()); - groupContainerColPane.addPane(groupHeaderHighlight, 0, { ignoreHeight: true }); - groupContainerColPane.addPane(groupContainerRowPane); + groupContainerOverlayPane.addPane(groupContainerRowPane, true, { width: null, height: null }); + groupContainerOverlayPane.addPane(groupHeaderHighlight, false, { width: null, height: null }); + groupContainerRowPane.updateLayoutArgs(function (layoutArg: any): any { const shift = (isNumber(layoutArg) && layoutArg >= 2 * groupIndex); return (shift ? layoutArg + 2 : layoutArg); }); + groupContainerRowPane.addPane(groupHeaderPane, 2 * groupIndex); groupContainerRowPane.addPane(groupContentPane, 2 * groupIndex + 1, { hide: group.collapsed }); - timelineContentPane.addPane(groupContainerColPane, groupIndex); + + timelineContentPane.addPane(groupContainerOverlayPane, groupIndex); + groupHeaderPanes[groupGuid] = groupHeaderPane; groupContentPanes[groupGuid] = groupContentPane; - groupContainerPanes[groupGuid] = groupContainerColPane; + groupContainerPanes[groupGuid] = groupContainerOverlayPane; const groupAttrsChanged = function (timelineGroup: TimelineGroup) { const groupContentLayoutOpts = groupContainerRowPane.layoutOptions(groupContentPane); - const groupHighlightLayoutOpts = groupHeaderUnderlay.layoutOptions(groupHeaderHighlight); + const groupHighlightLayoutOpts = groupContainerOverlayPane.layoutOptions(groupHeaderHighlight); let redraw = false; if (timelineGroup.highlighted !== (!groupHighlightLayoutOpts.hide)) { groupHighlightLayoutOpts.hide = !timelineGroup.highlighted; From 88032fea954aea5bfc0a2b94b715f34950db46d1 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Thu, 7 Feb 2019 17:34:33 -0800 Subject: [PATCH 24/69] Fix error in shader --- src/webglimpse/misc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index 4fcf8fa..1e8d901 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -306,7 +306,7 @@ export let dash2_FRAGSHADER = concatLines( ' discard; ', ' else ', ' gl_FragColor = u_Color; ', - ' }; ', + ' } ', ' ' ); From cac0c090a8b4612e5127025f18d764e131406b0f Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 8 Feb 2019 10:48:58 -0800 Subject: [PATCH 25/69] Fix hide/show of group highlight. Added getters for dash properties. --- src/webglimpse/misc.ts | 8 ++++++++ src/webglimpse/timeline/timeline_pane.ts | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/webglimpse/misc.ts b/src/webglimpse/misc.ts index 1e8d901..b76cda2 100644 --- a/src/webglimpse/misc.ts +++ b/src/webglimpse/misc.ts @@ -117,10 +117,18 @@ export class Highlight { } } + get dashPattern(): number { + return this._dashPattern; + } + set dashPattern(pattern: number) { this._dashPattern = pattern; } + get dashLength(): number { + return this._dashLength; + } + set dashLength(length: number) { this._dashLength = length; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index c311d52..6d62d9b 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -1140,21 +1140,21 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { const groupAttrsChanged = function (timelineGroup: TimelineGroup) { const groupContentLayoutOpts = groupContainerRowPane.layoutOptions(groupContentPane); - const groupHighlightLayoutOpts = groupContainerOverlayPane.layoutOptions(groupHeaderHighlight); + const groupHighlightLayoutOpts = groupHeaderHighlight.layoutOptions(highlightPane); let redraw = false; if (timelineGroup.highlighted !== (!groupHighlightLayoutOpts.hide)) { groupHighlightLayoutOpts.hide = !timelineGroup.highlighted; redraw = true; } - if (timelineGroup.highlightColor !== (groupHighlight.color)) { + if (timelineGroup.highlightColor !== groupHighlight.color) { groupHighlight.color = timelineGroup.highlightColor; redraw = true; } - if (timelineGroup.dashPattern !== (groupHighlight.dashPattern)) { + if (timelineGroup.dashPattern !== groupHighlight.dashPattern) { groupHighlight.dashPattern = timelineGroup.dashPattern; redraw = true; } - if (timelineGroup.dashLength !== (groupHighlight.dashLength)) { + if (timelineGroup.dashLength !== groupHighlight.dashLength) { groupHighlight.dashLength = timelineGroup.dashLength; redraw = true; } From f32b1dbf66ddb6bac0948190af29619c9f24d9c7 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 8 Feb 2019 11:17:14 -0800 Subject: [PATCH 26/69] Update changelog and version. --- CHANGELOG | 13 ++++++++++--- package.json | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 42c0d86..34cabde 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,10 @@ +Webglimpse 2.0.7 (release 2019-2-8) + +* Re-structure groups, so they are in a container pane. +* Make group highlight extend to the height of the group instead of just the label. +* Add ability to make group highlight dashed. +* Make group highlight properties configurable per group. + Webglimpse 2.0.6 (release 2018-7-12) * Truncate event start/end times, so they are never sub-millisecond. @@ -59,7 +66,7 @@ Webglimpse 1.7.2-pre8 (released 2016-7-15) * Fix bug with maximized rows which broke y axis scrolling after unmaximizing. * Add TimelinePaneOptions.axisLabelAlign to control how date labels are centered relative to the start/end of the day on timeline. * Add TimelinePaneOptions.mouseWheelListener to provide an alternative listener to handle mouse wheel events on timeline. -* Add TimelinePaneOptions.centerSelectedIntervalOnDoubleClick to control whether timeline selection centers on double clicks. +* Add TimelinePaneOptions.centerSelectedIntervalOnDoubleClick to control whether timeline selection centers on double clicks. Webglimpse 1.7.2-pre7 (released 2016-7-8) @@ -107,9 +114,9 @@ Webglimpse 1.7.0 (released 2016-4-26) Webglimpse 1.7.0-pre4 (released 2016-3-12) - * Lock row. Rows can be locked to the top or the bottom of the timeline so + * Lock row. Rows can be locked to the top or the bottom of the timeline so that they are always visible. - * Maximize row. A set of rows can be temporarily set to maximized. In that + * Maximize row. A set of rows can be temporarily set to maximized. In that mode they take up all available timeline space. * Ability to customize individual row heights. * Fix bug with 0 length events when event overlaps are allowed. diff --git a/package.json b/package.json index 16c2466..bb242ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.6", + "version": "2.0.7", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 3aee91f16be982600e44c9260fc7b79e3f406006 Mon Sep 17 00:00:00 2001 From: Anita Tunggal Date: Tue, 26 Mar 2019 17:18:43 -0700 Subject: [PATCH 27/69] Added option to truncate row label --- src/webglimpse/label.ts | 18 ++++++++++++++---- src/webglimpse/timeline/timeline_model.ts | 15 +++++++++++++++ src/webglimpse/timeline/timeline_pane.ts | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/webglimpse/label.ts b/src/webglimpse/label.ts index 163349e..fcc5f9a 100644 --- a/src/webglimpse/label.ts +++ b/src/webglimpse/label.ts @@ -139,7 +139,7 @@ export function fitToLabel(label: Label): LayoutPhase1 { } -export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnchor?: number, yAnchor?: number, rotation_CCWRAD?: number) { +export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnchor?: number, yAnchor?: number, rotation_CCWRAD?: number, truncateLabel?: boolean) { const textureRenderer = new TextureRenderer(); return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) { @@ -148,10 +148,20 @@ export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnc gl.clear(GL.COLOR_BUFFER_BIT); } - const texture = label.texture; - if (texture) { + if (truncateLabel) { + const xRight = viewport.w - 2 / viewport.w; + while (!!label.text && label.text !== '...') { + if (label.texture.w > xRight) { + label.text = label.text.substring(0, label.text.length - 4).concat('...'); + } else { + break; + } + } + } + + if (label.texture) { textureRenderer.begin(gl, viewport); - textureRenderer.draw(gl, texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: texture.yAnchor(yAnchor), rotation_CCWRAD: rotation_CCWRAD }); + textureRenderer.draw(gl, label.texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: label.texture.yAnchor(yAnchor), rotation_CCWRAD: rotation_CCWRAD }); textureRenderer.end(gl); } }; diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 04d3224..6433273 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -146,6 +146,7 @@ export interface TimelineEvent { export interface TimelineRow { rowGuid: string; label: string; + truncate?: boolean; hidden?: boolean; rowHeight?: number; yMin?: number; @@ -1070,6 +1071,7 @@ export class TimelineRowModel { private _rowHeight: number; private _hidden: boolean; private _label: string; + private _truncate: boolean; private _uiHint: string; private _eventGuids: OrderedStringSet; private _timeseriesGuids: OrderedStringSet; @@ -1106,6 +1108,7 @@ export class TimelineRowModel { setAttrs(row: TimelineRow) { // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here this._label = row.label; + this._truncate = row.truncate; this._uiHint = row.uiHint; this._hidden = row.hidden; this._rowHeight = row.rowHeight; @@ -1164,6 +1167,17 @@ export class TimelineRowModel { } } + get truncate(): boolean { + return this._truncate; + } + + set truncate(truncate: boolean) { + if (truncate !== this._truncate) { + this._truncate = truncate; + this._attrsChanged.fire(); + } + } + get uiHint(): string { return this._uiHint; } @@ -1235,6 +1249,7 @@ export class TimelineRowModel { return { rowGuid: this._rowGuid, label: this._label, + truncate: this._truncate, rowHeight: this._rowHeight, hidden: this._hidden, uiHint: this._uiHint, diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 6d62d9b..4d5c0b7 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -1323,7 +1323,7 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const rowLabel = new Label(row.label, rowLabelFont, rowLabelColorFg); const rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false); - rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5)); + rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5, undefined, row.truncate)); const rowLabelBackground = new Background(rowLabelColorBg); const rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true); From d413a4197d80af552972e53b16dde2e3532e5b0c Mon Sep 17 00:00:00 2001 From: Anita Tunggal Date: Wed, 27 Mar 2019 17:00:56 -0700 Subject: [PATCH 28/69] Added option to set label font for groups --- src/webglimpse/timeline/timeline_model.ts | 15 +++++++++++++++ src/webglimpse/timeline/timeline_pane.ts | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 6433273..bdf31f8 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -176,6 +176,7 @@ export interface TimelineGroup { dashPattern?: number; dashLength?: number; rowGuids: string[]; + labelFont?: string; } @@ -1279,6 +1280,7 @@ export class TimelineGroupModel { private _highlightInsets: Insets; private _dashPattern: number; private _dashLength: number; + private _labelFont: string; private _rowGuids: OrderedStringSet; constructor(group: TimelineGroup) { @@ -1317,6 +1319,7 @@ export class TimelineGroupModel { this._dashLength = hasval(group.dashLength) ? group.dashLength : 16; this._highlightWidth = group.highlightWidth; this._highlightInsets = group.highlightInsets; + this._labelFont = group.labelFont; this._attrsChanged.fire(); } @@ -1417,6 +1420,17 @@ export class TimelineGroupModel { } } + get labelFont(): string { + return this._labelFont; + } + + set labelFont(labelFont: string) { + if (labelFont !== this._labelFont) { + this._labelFont = labelFont; + this._attrsChanged.fire(); + } + } + get rowGuids(): OrderedStringSet { return this._rowGuids; } @@ -1434,6 +1448,7 @@ export class TimelineGroupModel { highlightInsets: this._highlightInsets, dashPattern: hasval(this.dashPattern) ? this.dashPattern : 0xFFFF, dashLength: hasval(this.dashLength) ? this.dashLength : 16, + labelFont: this._labelFont, rowGuids: this._rowGuids.toArray() }; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 4d5c0b7..7ab1c13 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -1007,7 +1007,8 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { const addGroup = function (groupGuid: string, groupIndex: number) { const group = model.group(groupGuid); - const groupLabel = new Label(group.label, font, groupLabelColor); + const groupLabelFont = hasval(group.labelFont) ? group.labelFont : font; + const groupLabel = new Label(group.label, groupLabelFont, groupLabelColor); const groupLabelPane = new Pane({ updatePrefSize: fitToLabel(groupLabel) }, false); groupLabelPane.addPainter(newLabelPainter(groupLabel, 0, 1, 0, 1)); From 2c21ee431875ebcebbf4960c3801376249de3957 Mon Sep 17 00:00:00 2001 From: Anita Tunggal Date: Thu, 4 Apr 2019 11:10:11 -0700 Subject: [PATCH 29/69] Using local variable to truncate label text --- src/webglimpse/label.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/webglimpse/label.ts b/src/webglimpse/label.ts index fcc5f9a..5886e94 100644 --- a/src/webglimpse/label.ts +++ b/src/webglimpse/label.ts @@ -28,7 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import {Color, sameColor} from './color'; -import {TextTextureFactory, TextTexture2D, createTextTextureFactory} from './text'; +import {TextTextureFactory, TextTexture2D, createTextTextureFactory, getTextWidth} from './text'; import {Size, BoundsUnmodifiable} from './bounds'; import {TextureRenderer} from './texture'; import {GL, hasval} from './util/util'; @@ -127,6 +127,7 @@ export class Label { } return this._texture; } + } @@ -148,17 +149,19 @@ export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnc gl.clear(GL.COLOR_BUFFER_BIT); } + let labelText = label.text; if (truncateLabel) { const xRight = viewport.w - 2 / viewport.w; - while (!!label.text && label.text !== '...') { - if (label.texture.w > xRight) { - label.text = label.text.substring(0, label.text.length - 4).concat('...'); + while (labelText && labelText !== '...') { + if (getTextWidth(label.font, labelText) > xRight) { + labelText = labelText.substring(0, labelText.length - 4).concat('...'); } else { break; } } } + label.text = labelText; if (label.texture) { textureRenderer.begin(gl, viewport); textureRenderer.draw(gl, label.texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: label.texture.yAnchor(yAnchor), rotation_CCWRAD: rotation_CCWRAD }); @@ -168,3 +171,4 @@ export function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnc } + From 95ab121947bf1d640063ff2ceaf6bf6da4698188 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Tue, 16 Apr 2019 10:28:38 -0700 Subject: [PATCH 30/69] Export getTextWidth --- src/webglimpse/text.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index b703b39..cad9d08 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -145,7 +145,7 @@ const getRawFontMetrics = (function () { })(); -const getTextWidth = (function () { +export const getTextWidth = (function () { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; @@ -535,5 +535,3 @@ export class HintedTextRenderer { this.program.endUse(gl); } } - - From f9e6b6d19d78c35f0d14262d976c22e5ab26770e Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Tue, 16 Apr 2019 10:29:21 -0700 Subject: [PATCH 31/69] Update version to 2.1.0 --- package-lock.json | 6 ++---- package.json | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e4a635c..9bd9674 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.6", + "version": "2.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1729,7 +1729,6 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -5728,8 +5727,7 @@ "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true + "dev": true }, "homedir-polyfill": { "version": "1.0.1", diff --git a/package.json b/package.json index bb242ed..36e74fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.0.7", + "version": "2.1.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From dc434613b86505d8bfa0539ae64352aeca582c23 Mon Sep 17 00:00:00 2001 From: Anita Tunggal Date: Tue, 16 Apr 2019 14:57:05 -0700 Subject: [PATCH 32/69] added group label font to groupAttrsChanged --- src/webglimpse/timeline/timeline_pane.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 7ab1c13..2ca39db 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -1163,6 +1163,10 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupContentLayoutOpts.hide = timelineGroup.collapsed; redraw = true; } + if (timelineGroup.labelFont !== groupContentLayoutOpts.labelFont) { + groupLabel.font = timelineGroup.labelFont; + redraw = true; + } if (redraw) { drawable.redraw(); } From b787534fec2270141363ece9fe079b878c5d4053 Mon Sep 17 00:00:00 2001 From: "scott.przybylski" Date: Tue, 16 Apr 2019 15:04:38 -0700 Subject: [PATCH 33/69] Update version to 2.1.1 --- CHANGELOG | 4 + package-lock.json | 2211 +++++++++++++++++++++++++++++++-------------- package.json | 2 +- 3 files changed, 1561 insertions(+), 656 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 34cabde..5429938 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Webglimpse 2.1.1 (release 2019-4-16) +* Added support for truncating label text with ellipsis. +* Added support for changing row and group label fonts. + Webglimpse 2.0.7 (release 2019-2-8) * Re-structure groups, so they are in a container pane. diff --git a/package-lock.json b/package-lock.json index 9bd9674..d3f98b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -234,34 +234,54 @@ "tslib": "^1.7.1" } }, + "@babel/runtime": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz", + "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "dev": true + } + } + }, "@compodoc/compodoc": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.7.tgz", - "integrity": "sha512-bTqkv75T9b+3OxG517YL+5B0npAG0Q5nOMAk562Idr/fICTTHQ/xzSBsTptZ4QqYmtzRMV1OqOlk74FXfGPZWw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.9.tgz", + "integrity": "sha512-LFdbF/fO9qOGgdrCHg4irMBrl3sD8ySIlL6XabFAz8QbUdf2+77xOVnZJ/PYdcuI8h8vXo4UGS7MFg0pDR2jsw==", "dev": true, "requires": { "@compodoc/ngd-transformer": "^2.0.0", - "chalk": "^2.4.1", + "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.2", - "chokidar": "^2.0.4", - "colors": "^1.3.2", - "commander": "2.19.0", - "cosmiconfig": "^5.0.7", - "fancy-log": "^1.3.2", + "chokidar": "^2.1.2", + "colors": "^1.3.3", + "commander": "^2.19.0", + "cosmiconfig": "^5.1.0", + "fancy-log": "^1.3.3", "findit2": "^2.2.3", "fs-extra": "^7.0.1", "glob": "^7.1.3", - "handlebars": "4.0.10", + "handlebars": "^4.1.0", "html-entities": "^1.2.1", - "i18next": "^12.1.0", + "i18next": "^15.0.4", "inside": "^1.0.0", "json5": "^2.1.0", - "live-server": "1.2.1", + "live-server": "^1.2.1", "lodash": "^4.17.11", - "lunr": "2.3.5", - "marked": "^0.4.0", + "lunr": "^2.3.6", + "marked": "^0.6.1", + "minimist": "^1.2.0", "opencollective": "^1.0.3", "os-name": "^3.0.0", + "pdfmake": "^0.1.53", + "semver": "^5.6.0", "traverse": "^0.6.6", "ts-simple-ast": "12.4.0", "uuid": "^3.3.2" @@ -341,9 +361,9 @@ } }, "chokidar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", - "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -357,24 +377,24 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" + "upath": "^1.1.1" } }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, "cosmiconfig": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", - "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", + "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", + "js-yaml": "^3.13.0", "parse-json": "^4.0.0" } }, @@ -603,9 +623,9 @@ "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -908,9 +928,9 @@ } }, "ajv": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", - "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "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", @@ -934,9 +954,9 @@ } }, "ajv-keywords": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", - "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, "align-text": { @@ -1075,9 +1095,9 @@ "dev": true }, "app-root-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", - "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", "dev": true }, "append-transform": { @@ -1286,19 +1306,78 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", + "dev": true, + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", + "dev": true, + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", + "dev": true + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", + "dev": true + }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-foreach": { @@ -1629,9 +1708,9 @@ "dev": true }, "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "blob": { @@ -1667,9 +1746,9 @@ } }, "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", "dev": true }, "bn.js": { @@ -1808,12 +1887,50 @@ "repeat-element": "^1.1.2" } }, + "brfs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", + "dev": true, + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^2.2.0", + "through2": "^2.0.0" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "brotli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", + "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "dev": true, + "requires": { + "base64-js": "^1.1.2" + } + }, + "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", @@ -1851,6 +1968,17 @@ "safe-buffer": "^5.1.2" } }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", + "dev": true, + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", @@ -1928,6 +2056,12 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -2091,9 +2225,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000935", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz", - "integrity": "sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==", + "version": "1.0.30000960", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000960.tgz", + "integrity": "sha512-7nK5qs17icQaX6V3/RYrJkOsZyRNnroA4+ZwxaKJzIKy+crIy0Mz5CBlLySd2SNV+4nbUZeqeNfiaEieUBu3aA==", "dev": true }, "capture-stack-trace": { @@ -2136,53 +2270,17 @@ "dev": true }, "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "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.0", + "dom-serializer": "~0.1.1", "entities": "~1.1.1", "htmlparser2": "^3.9.1", "lodash": "^4.15.0", "parse5": "^3.0.1" - }, - "dependencies": { - "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" - } - }, - "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6" - } - }, - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "chokidar": { @@ -2350,9 +2448,9 @@ "dev": true }, "code-block-writer": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.2.2.tgz", - "integrity": "sha512-8SyXM1bWsMDCzvCoTdnDBhnnUbHntxcba4ApBIO3S3QX0M2Iq0xZCzs6SYdBOGaSUi4drysvrAK15JoXhlpsvQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.3.1.tgz", + "integrity": "sha512-3Jfe6ZmmGzvdQWFo3MUzobn3WdX++jc3Tj0rsviJWYPnP7NGMFEE4qheNeOXeJgB1TTgxYT8XuNvhS/u596yGg==", "dev": true }, "code-point-at": { @@ -2469,9 +2567,9 @@ "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=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "component-inherit": { @@ -2481,25 +2579,25 @@ "dev": true }, "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", + "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", "dev": true, "requires": { - "mime-db": ">= 1.36.0 < 2" + "mime-db": ">= 1.38.0 < 2" } }, "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.14", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "~1.0.1", + "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" } @@ -2674,9 +2772,9 @@ "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -2685,9 +2783,9 @@ } }, "core-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", - "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", "dev": true }, "core-object": { @@ -2843,6 +2941,12 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "3.1.9-1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", + "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=", + "dev": true + }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", @@ -2879,9 +2983,9 @@ } }, "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, "cssauron": { @@ -2991,6 +3095,12 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "default-require-extensions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", @@ -3154,6 +3264,15 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "dfa": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.1.0.tgz", + "integrity": "sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E=", + "dev": true, + "requires": { + "babel-runtime": "^6.11.6" + } + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -3233,21 +3352,13 @@ } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "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.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 - } + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, "domain-browser": { @@ -3263,9 +3374,9 @@ "dev": true }, "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "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" @@ -3302,6 +3413,15 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -3343,9 +3463,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", - "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", + "version": "1.3.124", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz", + "integrity": "sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w==", "dev": true }, "elliptic": { @@ -3460,6 +3580,12 @@ "yeast": "0.1.2" }, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", @@ -3559,14 +3685,14 @@ } }, "es5-ext": { - "version": "0.10.47", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", - "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", + "version": "0.10.49", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", + "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", "dev": true, "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.1", - "next-tick": "1" + "next-tick": "^1.0.0" } }, "es6-iterator": { @@ -3647,6 +3773,34 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "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": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "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 + } + } + }, "escope": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", @@ -3681,9 +3835,9 @@ "dev": true }, "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", + "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", "dev": true }, "esutils": { @@ -3990,6 +4144,26 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "foreach": "^2.0.5", + "isarray": "0.0.1", + "object-keys": "^1.0.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", @@ -4279,9 +4453,9 @@ "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -4348,6 +4522,12 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -4465,45 +4645,65 @@ "dev": true }, "flush-write-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz", - "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" }, "dependencies": { - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "ms": "^2.1.1" } + }, + "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 } } }, - "follow-redirects": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", - "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "fontkit": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz", + "integrity": "sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ==", "dev": true, "requires": { - "debug": "=3.1.0" + "babel-runtime": "^6.11.6", + "brfs": "^1.4.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.0", + "clone": "^1.0.1", + "deep-equal": "^1.0.0", + "dfa": "^1.0.0", + "restructure": "^0.5.3", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.0.0", + "unicode-trie": "^0.3.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true } } }, @@ -4522,6 +4722,12 @@ "for-in": "^1.0.1" } }, + "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", @@ -4625,41 +4831,36 @@ "dev": true }, "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz", + "integrity": "sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "bundled": true, "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true + "bundled": true, + "dev": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "bundled": true, "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4669,17 +4870,13 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true + "bundled": true, + "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==", + "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4687,74 +4884,61 @@ }, "chownr": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "bundled": true, "dev": true, "optional": 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, - "optional": true + "bundled": true, + "dev": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true + "bundled": true, + "dev": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true + "bundled": true, + "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=", + "bundled": true, "dev": true, "optional": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "bundled": true, "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bundled": true, "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4763,15 +4947,13 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4787,8 +4969,7 @@ }, "glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4802,15 +4983,13 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4819,8 +4998,7 @@ }, "ignore-walk": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4829,8 +5007,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4840,58 +5017,46 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true + "bundled": true, + "dev": true }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "bundled": true, "dev": true, "optional": true }, "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=", + "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, - "optional": 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, - "optional": true + "bundled": true, + "dev": true }, "minipass": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4899,8 +5064,7 @@ }, "minizlib": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4909,37 +5073,32 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.1", + "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "version": "2.3.0", + "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", + "version": "0.12.0", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4957,8 +5116,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4967,16 +5125,14 @@ } }, "npm-bundled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "version": "1.0.6", + "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", - "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", + "version": "1.4.1", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4986,8 +5142,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -4999,46 +5154,38 @@ }, "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, - "optional": true + "bundled": true, + "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=", + "bundled": true, "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true, "optional": true }, "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=", + "bundled": true, "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5048,22 +5195,19 @@ }, "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=", + "bundled": true, "dev": true, "optional": 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==", + "bundled": true, "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5075,8 +5219,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "dev": true, "optional": true } @@ -5084,8 +5227,7 @@ }, "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==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5100,8 +5242,7 @@ }, "rimraf": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5110,52 +5251,43 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true + "bundled": true, + "dev": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "bundled": true, "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "bundled": true, "dev": true, "optional": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "bundled": true, "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5164,8 +5296,7 @@ }, "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==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5174,25 +5305,21 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } }, "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=", + "bundled": true, "dev": true, "optional": true }, "tar": { "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5207,15 +5334,13 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5224,17 +5349,13 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true + "bundled": true, + "dev": true }, "yallist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true + "bundled": true, + "dev": true } } }, @@ -5436,90 +5557,28 @@ "dev": true }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^1.4.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -5730,9 +5789,9 @@ "dev": true }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" @@ -5806,49 +5865,29 @@ } }, "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" + "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": { - "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" - } - }, - "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=", + "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": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "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 } } }, @@ -5900,17 +5939,238 @@ } }, "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "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" + } + } + } + }, + "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-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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5918,12 +6178,65 @@ "dev": true }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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" } } } @@ -5958,10 +6271,13 @@ } }, "i18next": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-12.1.0.tgz", - "integrity": "sha512-AexmwGkKxwKfo5fGeXTWEY4xqzRPigQ1S/0InOUUVziGO54cd4fKyYK8ED1Thx9fd+WA3fRSZ+1iekvFQMbsFw==", - "dev": true + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-15.0.9.tgz", + "integrity": "sha512-IdVj7DqErUuMbGuj2dFT431T7zKlmDci63eae6pNA/bMwgBZKT74/KnwHXE0WH7ivo2EV/LNme4pP4Yw6vB79w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1" + } }, "iconv-lite": { "version": "0.4.23", @@ -5973,9 +6289,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -6220,9 +6536,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", "dev": true }, "is-absolute": { @@ -6803,9 +7119,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "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", @@ -7008,9 +7324,9 @@ } }, "karma-source-map-support": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", - "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "requires": { "source-map-support": "^0.5.5" @@ -7023,9 +7339,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "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", @@ -7100,6 +7416,16 @@ "pify": "^3.0.0" } }, + "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" + } + }, "license-webpack-plugin": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", @@ -7109,6 +7435,25 @@ "ejs": "^2.5.7" } }, + "linebreak": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz", + "integrity": "sha1-BSZICmLAW9Z58+nZmDDgnGp9DtY=", + "dev": true, + "requires": { + "base64-js": "0.0.8", + "brfs": "^1.3.0", + "unicode-trie": "^0.3.0" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "dev": true + } + } + }, "live-server": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz", @@ -7124,7 +7469,7 @@ "http-auth": "3.1.x", "morgan": "^1.9.1", "object-assign": "^4.1.1", - "opn": "^5.4.0", + "opn": "^6.0.0", "proxy-middleware": "^0.15.0", "send": "^0.16.2", "serve-index": "^1.9.1" @@ -7193,9 +7538,9 @@ } }, "chokidar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", - "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -7209,7 +7554,7 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" + "upath": "^1.1.1" } }, "colors": { @@ -7435,9 +7780,9 @@ "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -7515,9 +7860,9 @@ "dev": true }, "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -7720,15 +8065,15 @@ } }, "lunr": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.5.tgz", - "integrity": "sha512-EtnfmHsHJTr3u24sito9JctSxej5Ds0SgUD2Lm+qRHyLgM7BGesFlW14eNh1mil0fV5Muh8gf3dBBXzADlUlzQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.6.tgz", + "integrity": "sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q==", "dev": true }, "macos-release": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", - "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", + "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", "dev": true }, "magic-string": { @@ -7783,9 +8128,9 @@ } }, "marked": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", - "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", "dev": true }, "math-random": { @@ -7862,6 +8207,15 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, "merge2": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", @@ -7912,18 +8266,18 @@ "dev": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "~1.38.0" } }, "mimic-fn": { @@ -8125,9 +8479,9 @@ "dev": true }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true }, "nanomatch": { @@ -8859,10 +9213,16 @@ } } }, + "object-inspect": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", + "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", + "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -8925,9 +9285,9 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "once": { @@ -9024,6 +9384,28 @@ "wordwrap": "~0.0.2" } }, + "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" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "options": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", @@ -9061,12 +9443,12 @@ } }, "os-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", - "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", "dev": true, "requires": { - "macos-release": "^2.0.0", + "macos-release": "^2.2.0", "windows-release": "^3.1.0" } }, @@ -9135,9 +9517,9 @@ } }, "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "parallel-transform": { @@ -9161,9 +9543,9 @@ } }, "parse-asn1": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", - "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -9244,9 +9626,9 @@ } }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascalcase": { @@ -9334,6 +9716,41 @@ "sha.js": "^2.4.8" } }, + "pdfkit": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.9.0.tgz", + "integrity": "sha512-j/tJvvoEM7qMiOfodNkz6XRNBvAhVohWP1mUvgg+Xy8X8S3aMBpVGXJGZWNCoCUH2ywLidZSbHyn5mJaqv9umw==", + "dev": true, + "requires": { + "crypto-js": "^3.1.9-1", + "fontkit": "^1.0.0", + "linebreak": "^0.3.0", + "png-js": ">=0.1.0", + "saslprep": "1.0.1" + } + }, + "pdfmake": { + "version": "0.1.54", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.54.tgz", + "integrity": "sha512-HO2FX+czmO+8LpWXQMFQfdUCCKnqwSvSEJExGkUKfsV34DRIV5PZjNg0xWS7ypGrnTY6RTTssWpdreX/pbyeyw==", + "dev": true, + "requires": { + "iconv-lite": "^0.4.24", + "linebreak": "^0.3.0", + "pdfkit": "^0.9.0" + }, + "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" + } + } + } + }, "performance-now": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", @@ -9371,6 +9788,12 @@ "find-up": "^2.1.0" } }, + "png-js": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", + "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=", + "dev": true + }, "portfinder": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", @@ -9504,6 +9927,12 @@ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, + "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 + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -9777,13 +10206,13 @@ } }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" } }, "proxy-middleware": { @@ -9883,11 +10312,30 @@ "dev": true }, "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -9914,9 +10362,9 @@ } }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -10415,9 +10863,9 @@ } }, "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { "rc": "^1.1.6", @@ -10469,14 +10917,14 @@ "dev": true }, "renderkid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", - "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "dev": true, "requires": { "css-select": "^1.1.0", - "dom-converter": "~0.2", - "htmlparser2": "~3.3.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", "strip-ansi": "^3.0.0", "utila": "^0.4.0" } @@ -10597,6 +11045,15 @@ "signal-exit": "^3.0.2" } }, + "restructure": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", + "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", + "dev": true, + "requires": { + "browserify-optional": "^1.0.0" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -10667,6 +11124,14 @@ "magic-string": "^0.22.4", "resolve": "^1.4.0", "rollup-pluginutils": "^2.0.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + } } }, "rollup-plugin-license": { @@ -10688,44 +11153,320 @@ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, - "magic-string": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "magic-string": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "dev": true, + "requires": { + "vlq": "^0.2.1" + } + }, + "moment": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==", + "dev": true + } + } + }, + "rollup-plugin-node-resolve": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", + "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "dev": true, + "requires": { + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" + } + }, + "rollup-pluginutils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", + "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.0", + "micromatch": "^3.1.10" + }, + "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" + } + } + } + }, + "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": { - "vlq": "^0.2.1" + "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" + } + } } }, - "moment": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", - "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==", + "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" + } + }, + "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" + } } } }, - "rollup-plugin-node-resolve": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", - "dev": true, - "requires": { - "builtin-modules": "^2.0.0", - "is-module": "^1.0.0", - "resolve": "^1.1.6" - } - }, - "rollup-pluginutils": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", - "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", - "dev": true, - "requires": { - "estree-walker": "^0.5.2", - "micromatch": "^2.3.11" - } - }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -10792,6 +11533,12 @@ "rimraf": "^2.5.2" } }, + "saslprep": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.1.tgz", + "integrity": "sha512-ntN6SbE3hRqd45PKKadRPgA+xHPWg5lPSj2JWJdJvjTwXDDfkPVtXWvP8jJojvnm+rAsZ2b299C5NwZqq818EA==", + "dev": true + }, "sass-graph": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", @@ -10902,9 +11649,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "semver-diff": { @@ -10964,9 +11711,9 @@ } }, "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", "dev": true }, "serve-index": { @@ -11066,6 +11813,12 @@ } } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -11316,6 +12069,12 @@ "to-array": "0.1.4" }, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", @@ -11502,38 +12261,81 @@ } }, "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "dev": true, "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" + }, + "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" + } + }, + "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 + } } }, "spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "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" + } + }, + "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 + }, + "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" + } + } } }, "split": { @@ -11594,6 +12396,15 @@ "safe-buffer": "^5.1.1" } }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dev": true, + "requires": { + "escodegen": "^1.8.1" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -11615,6 +12426,28 @@ } } }, + "static-module": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", + "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", + "dev": true, + "requires": { + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "~1.9.0", + "falafel": "^2.1.0", + "has": "^1.0.1", + "magic-string": "^0.22.4", + "merge-source-map": "1.0.4", + "object-inspect": "~1.4.0", + "quote-stream": "~1.0.2", + "readable-stream": "~2.3.3", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.0", + "through2": "~2.0.3" + } + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -11928,6 +12761,12 @@ "setimmediate": "^1.0.4" } }, + "tiny-inflate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz", + "integrity": "sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c=", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -12211,9 +13050,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "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", @@ -12276,6 +13115,15 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": 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-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -12299,15 +13147,21 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.19.0", "source-map": "~0.6.1" }, "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12375,6 +13229,34 @@ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, + "unicode-properties": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.1.0.tgz", + "integrity": "sha1-epbu9J91aC6mnSMV7smsQ//fAME=", + "dev": true, + "requires": { + "brfs": "^1.4.0", + "unicode-trie": "^0.3.0" + } + }, + "unicode-trie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", + "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", + "dev": true, + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + } + } + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -12508,9 +13390,9 @@ "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "update-notifier": { @@ -12605,9 +13487,9 @@ } }, "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.6.tgz", + "integrity": "sha512-/B8AD9iQ01seoXmXf9z/MjLZQIdOoYl/+gvsQF6+mpnxaTfG9P7srYaiqaDMyKkR36XMXfhqSHss5MyFAO8lew==", "dev": true, "requires": { "querystringify": "^2.0.0", @@ -12817,9 +13699,9 @@ } }, "chokidar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", - "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -12833,7 +13715,7 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" + "upath": "^1.1.1" } }, "expand-brackets": { @@ -13044,9 +13926,9 @@ "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -13454,22 +14336,22 @@ } }, "webpack-dev-server": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz", - "integrity": "sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg==", + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", + "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", "dev": true, "requires": { "ansi-html": "0.0.7", "array-includes": "^3.0.3", "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", + "chokidar": "^2.1.2", + "compression": "^1.7.3", "connect-history-api-fallback": "^1.3.0", "debug": "^3.1.0", "del": "^3.0.0", "express": "^4.16.2", "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", + "http-proxy-middleware": "^0.19.1", "import-local": "^1.0.0", "internal-ip": "1.2.0", "ip": "^1.1.5", @@ -13478,10 +14360,10 @@ "opn": "^5.1.0", "portfinder": "^1.0.9", "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", + "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.1.5", - "spdy": "^3.4.1", + "spdy": "^4.0.0", "strip-ansi": "^3.0.0", "supports-color": "^5.1.0", "webpack-dev-middleware": "1.12.2", @@ -13557,9 +14439,9 @@ "dev": true }, "chokidar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.0.tgz", - "integrity": "sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -13573,7 +14455,7 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" + "upath": "^1.1.1" } }, "debug": { @@ -13816,9 +14698,9 @@ "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=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -14061,12 +14943,12 @@ "dev": true }, "windows-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", - "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", "dev": true, "requires": { - "execa": "^0.10.0" + "execa": "^1.0.0" }, "dependencies": { "cross-spawn": { @@ -14083,19 +14965,38 @@ } }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "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": "^3.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" + } } } }, diff --git a/package.json b/package.json index 36e74fc..8ce902f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.1.0", + "version": "2.1.1", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From b5d65f64a17e2ff0e8572cf4ba3b57399b33d8bb Mon Sep 17 00:00:00 2001 From: "anita.tunggal" Date: Fri, 14 Jun 2019 15:52:59 -0700 Subject: [PATCH 34/69] Added option to set cursor type to 'move' when hovering over scrollable areas of the timeline --- src/webglimpse/timeline/timeline_model.ts | 32 ++++++++++++++++++++++- src/webglimpse/timeline/timeline_pane.ts | 16 ++++++++---- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index bdf31f8..159a1b6 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -160,6 +160,7 @@ export interface TimelineRow { fgLabelColor?: string; bgLabelColor?: string; labelFont?: string; + showGrabHand?: boolean; } @@ -177,6 +178,7 @@ export interface TimelineGroup { dashLength?: number; rowGuids: string[]; labelFont?: string; + showGrabHand?: boolean; } @@ -1083,6 +1085,7 @@ export class TimelineRowModel { private _labelFont: string; private _dataAxis: Axis1D; private _bgColor: Color; + private _showGrabHand: boolean; constructor(row: TimelineRow) { this._rowGuid = row.rowGuid; @@ -1118,6 +1121,7 @@ export class TimelineRowModel { this._fgLabelColor = (hasval(row.fgLabelColor) ? parseCssColor(row.fgLabelColor) : null); this._bgLabelColor = (hasval(row.bgLabelColor) ? parseCssColor(row.bgLabelColor) : null); this._labelFont = row.labelFont; + this._showGrabHand = row.showGrabHand; this._attrsChanged.fire(); } @@ -1234,6 +1238,17 @@ export class TimelineRowModel { } } + get showGrabHand(): boolean { + return this._showGrabHand; + } + + set showGrabHand(showGrabHand: boolean) { + if (showGrabHand != this._showGrabHand) { + this._showGrabHand = showGrabHand + this._attrsChanged.fire(); + } + } + get eventGuids(): OrderedStringSet { return this._eventGuids; } @@ -1261,7 +1276,8 @@ export class TimelineRowModel { bgColor: (hasval(this._bgColor) ? this._bgColor.cssString : null), bgLabelColor: (hasval(this._bgLabelColor) ? this._bgLabelColor.cssString : null), fgLabelColor: (hasval(this._fgLabelColor) ? this._fgLabelColor.cssString : null), - labelFont: this._labelFont + labelFont: this._labelFont, + showGrabHand: this._showGrabHand }; } } @@ -1282,6 +1298,7 @@ export class TimelineGroupModel { private _dashLength: number; private _labelFont: string; private _rowGuids: OrderedStringSet; + private _showGrabHand: boolean; constructor(group: TimelineGroup) { this._groupGuid = group.groupGuid; @@ -1320,6 +1337,7 @@ export class TimelineGroupModel { this._highlightWidth = group.highlightWidth; this._highlightInsets = group.highlightInsets; this._labelFont = group.labelFont; + this._showGrabHand = group.showGrabHand; this._attrsChanged.fire(); } @@ -1431,6 +1449,17 @@ export class TimelineGroupModel { } } + get showGrabHand(): boolean { + return this._showGrabHand; + } + + set showGrabHand(showGrabHand: boolean) { + if (showGrabHand != this._showGrabHand) { + this._showGrabHand = showGrabHand + this._attrsChanged.fire(); + } + } + get rowGuids(): OrderedStringSet { return this._rowGuids; } @@ -1449,6 +1478,7 @@ export class TimelineGroupModel { dashPattern: hasval(this.dashPattern) ? this.dashPattern : 0xFFFF, dashLength: hasval(this.dashLength) ? this.dashLength : 16, labelFont: this._labelFont, + showGrabHand: this._showGrabHand, rowGuids: this._rowGuids.toArray() }; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 2ca39db..6503225 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -75,6 +75,7 @@ export interface TimelinePaneOptions { // Misc font?: string; rowPaneFactoryChooser?: TimelineRowPaneFactoryChooser; + showGrabHand?: boolean; // Scroll showScrollbar?: boolean; @@ -145,6 +146,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Misc const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); const rowPaneFactoryChooser = (hasval(options) && hasval(options.rowPaneFactoryChooser) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT); + const showGrabHand = (hasval(options) && hasval(options.showGrabHand) ? options.showGrabHand : false); // Scroll const showScrollbar = (hasval(options) && hasval(options.showScrollbar) ? options.showScrollbar : true); @@ -312,7 +314,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // top time axis pane const axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive: options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; if (showTopAxis) { - const topAxisPane = newTimeAxisPane(contentPaneArgs, null); + const topAxisPane = newTimeAxisPane(contentPaneArgs, null, showGrabHand); ui.addPane('top-axis-pane', topAxisPane); topAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.TOP, topTimeZone, tickTimeZone, axisOpts)); underlayPane.addPane(newInsetPane(topAxisPane, axisInsets), 0, { height: axisPaneHeight, width: null }); @@ -343,7 +345,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // bottom time axis pane if (showBottomAxis) { - const bottomAxisPane = newTimeAxisPane(contentPaneArgs, null); + const bottomAxisPane = newTimeAxisPane(contentPaneArgs, null, showGrabHand); ui.addPane('bottom-axis-pane', bottomAxisPane); bottomAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.BOTTOM, bottomTimeZone, tickTimeZone, axisOpts)); underlayPane.addPane(newInsetPane(bottomAxisPane, axisInsets), 4, { height: axisPaneHeight, width: null }); @@ -463,7 +465,7 @@ function attachTimeAxisMouseListeners(pane: Pane, axis: Axis1D, args: TimelineCo pane.mouseWheel.on(args.options.mouseWheelListener); } -function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel): Pane { +function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel, showGrabHand: boolean): Pane { const timeAxis = args.timeAxis; const ui = args.ui; const draggableEdgeWidth = args.options.draggableEdgeWidth; @@ -513,6 +515,10 @@ function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowMod }; axisPane.contextMenu.on(onContextMenu); + if (showGrabHand) { + axisPane.mouseCursor = 'move'; + } + if (selectedIntervalMode === 'single' || selectedIntervalMode === 'range') { const selection = ui.selection; const selectedIntervalPane = new Pane(null, true, newTimeIntervalMask(timeAxis, selection.selectedInterval, selectedIntervalMode)); @@ -1100,7 +1106,7 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); groupHeaderUnderlay.addPane(groupButton, 0); groupHeaderUnderlay.addPane(groupHeaderStripe, 1, { ignoreHeight: true }); - const groupHeaderOverlay = newTimeAxisPane(args, null); + const groupHeaderOverlay = newTimeAxisPane(args, null, group.showGrabHand); const groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); groupHeaderPane = new Pane(newOverlayLayout()); @@ -1287,7 +1293,7 @@ function newRowBackgroundPainter(args: TimelineContentPaneArguments, guidList: O } function newRowBackgroundPanes(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) { - const rowBackgroundPane = newTimeAxisPane(args, row); + const rowBackgroundPane = newTimeAxisPane(args, row, row.showGrabHand); rowBackgroundPane.addPainter(newRowBackgroundPainter(args, guidList, row)); const timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; From 30447766a10491e940ae874501bc1648a8fc2e74 Mon Sep 17 00:00:00 2001 From: Anita Tunggal Date: Mon, 17 Jun 2019 17:46:13 -0700 Subject: [PATCH 35/69] Updated to specify cursor type instead of using 'move' --- src/webglimpse/timeline/timeline_model.ts | 36 +++++++++++------------ src/webglimpse/timeline/timeline_pane.ts | 18 ++++++------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 159a1b6..5bf61ab 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -160,7 +160,7 @@ export interface TimelineRow { fgLabelColor?: string; bgLabelColor?: string; labelFont?: string; - showGrabHand?: boolean; + cursor?: string; } @@ -178,7 +178,7 @@ export interface TimelineGroup { dashLength?: number; rowGuids: string[]; labelFont?: string; - showGrabHand?: boolean; + cursor?: string; } @@ -1085,7 +1085,7 @@ export class TimelineRowModel { private _labelFont: string; private _dataAxis: Axis1D; private _bgColor: Color; - private _showGrabHand: boolean; + private _cursor: string; constructor(row: TimelineRow) { this._rowGuid = row.rowGuid; @@ -1121,7 +1121,7 @@ export class TimelineRowModel { this._fgLabelColor = (hasval(row.fgLabelColor) ? parseCssColor(row.fgLabelColor) : null); this._bgLabelColor = (hasval(row.bgLabelColor) ? parseCssColor(row.bgLabelColor) : null); this._labelFont = row.labelFont; - this._showGrabHand = row.showGrabHand; + this._cursor = row.cursor; this._attrsChanged.fire(); } @@ -1238,13 +1238,13 @@ export class TimelineRowModel { } } - get showGrabHand(): boolean { - return this._showGrabHand; + get cursor(): string { + return this._cursor; } - set showGrabHand(showGrabHand: boolean) { - if (showGrabHand != this._showGrabHand) { - this._showGrabHand = showGrabHand + set cursor(cursor: string) { + if (cursor !== this._cursor) { + this._cursor = cursor; this._attrsChanged.fire(); } } @@ -1277,7 +1277,7 @@ export class TimelineRowModel { bgLabelColor: (hasval(this._bgLabelColor) ? this._bgLabelColor.cssString : null), fgLabelColor: (hasval(this._fgLabelColor) ? this._fgLabelColor.cssString : null), labelFont: this._labelFont, - showGrabHand: this._showGrabHand + cursor: this._cursor }; } } @@ -1298,7 +1298,7 @@ export class TimelineGroupModel { private _dashLength: number; private _labelFont: string; private _rowGuids: OrderedStringSet; - private _showGrabHand: boolean; + private _cursor: string; constructor(group: TimelineGroup) { this._groupGuid = group.groupGuid; @@ -1337,7 +1337,7 @@ export class TimelineGroupModel { this._highlightWidth = group.highlightWidth; this._highlightInsets = group.highlightInsets; this._labelFont = group.labelFont; - this._showGrabHand = group.showGrabHand; + this._cursor = group.cursor; this._attrsChanged.fire(); } @@ -1449,13 +1449,13 @@ export class TimelineGroupModel { } } - get showGrabHand(): boolean { - return this._showGrabHand; + get cursor(): string { + return this._cursor; } - set showGrabHand(showGrabHand: boolean) { - if (showGrabHand != this._showGrabHand) { - this._showGrabHand = showGrabHand + set cursor(cursor: string) { + if (cursor !== this._cursor) { + this._cursor = cursor; this._attrsChanged.fire(); } } @@ -1478,7 +1478,7 @@ export class TimelineGroupModel { dashPattern: hasval(this.dashPattern) ? this.dashPattern : 0xFFFF, dashLength: hasval(this.dashLength) ? this.dashLength : 16, labelFont: this._labelFont, - showGrabHand: this._showGrabHand, + cursor: this._cursor, rowGuids: this._rowGuids.toArray() }; } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 6503225..23e6d84 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -75,7 +75,7 @@ export interface TimelinePaneOptions { // Misc font?: string; rowPaneFactoryChooser?: TimelineRowPaneFactoryChooser; - showGrabHand?: boolean; + cursor?: string; // Scroll showScrollbar?: boolean; @@ -146,7 +146,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Misc const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif'); const rowPaneFactoryChooser = (hasval(options) && hasval(options.rowPaneFactoryChooser) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT); - const showGrabHand = (hasval(options) && hasval(options.showGrabHand) ? options.showGrabHand : false); + const cursor = (hasval(options) && hasval(options.cursor) ? options.cursor : 'auto'); // Scroll const showScrollbar = (hasval(options) && hasval(options.showScrollbar) ? options.showScrollbar : true); @@ -314,7 +314,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // top time axis pane const axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive: options.isFuturePositive, timeAxisFormat: options.timeAxisFormat }; if (showTopAxis) { - const topAxisPane = newTimeAxisPane(contentPaneArgs, null, showGrabHand); + const topAxisPane = newTimeAxisPane(contentPaneArgs, null, cursor); ui.addPane('top-axis-pane', topAxisPane); topAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.TOP, topTimeZone, tickTimeZone, axisOpts)); underlayPane.addPane(newInsetPane(topAxisPane, axisInsets), 0, { height: axisPaneHeight, width: null }); @@ -345,7 +345,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // bottom time axis pane if (showBottomAxis) { - const bottomAxisPane = newTimeAxisPane(contentPaneArgs, null, showGrabHand); + const bottomAxisPane = newTimeAxisPane(contentPaneArgs, null, cursor); ui.addPane('bottom-axis-pane', bottomAxisPane); bottomAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.BOTTOM, bottomTimeZone, tickTimeZone, axisOpts)); underlayPane.addPane(newInsetPane(bottomAxisPane, axisInsets), 4, { height: axisPaneHeight, width: null }); @@ -465,7 +465,7 @@ function attachTimeAxisMouseListeners(pane: Pane, axis: Axis1D, args: TimelineCo pane.mouseWheel.on(args.options.mouseWheelListener); } -function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel, showGrabHand: boolean): Pane { +function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel, cursor: string): Pane { const timeAxis = args.timeAxis; const ui = args.ui; const draggableEdgeWidth = args.options.draggableEdgeWidth; @@ -515,8 +515,8 @@ function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowMod }; axisPane.contextMenu.on(onContextMenu); - if (showGrabHand) { - axisPane.mouseCursor = 'move'; + if (cursor) { + axisPane.mouseCursor = cursor; } if (selectedIntervalMode === 'single' || selectedIntervalMode === 'range') { @@ -1106,7 +1106,7 @@ function newTimelineContentPane(args: TimelineContentPaneArguments): Pane { groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor)); groupHeaderUnderlay.addPane(groupButton, 0); groupHeaderUnderlay.addPane(groupHeaderStripe, 1, { ignoreHeight: true }); - const groupHeaderOverlay = newTimeAxisPane(args, null, group.showGrabHand); + const groupHeaderOverlay = newTimeAxisPane(args, null, group.cursor); const groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth); groupHeaderPane = new Pane(newOverlayLayout()); @@ -1293,7 +1293,7 @@ function newRowBackgroundPainter(args: TimelineContentPaneArguments, guidList: O } function newRowBackgroundPanes(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) { - const rowBackgroundPane = newTimeAxisPane(args, row, row.showGrabHand); + const rowBackgroundPane = newTimeAxisPane(args, row, row.cursor); rowBackgroundPane.addPainter(newRowBackgroundPainter(args, guidList, row)); const timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate }; From 547ab64040f10a097d6a6e3dab9d410c6f1c90e1 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 19 Jun 2019 15:34:16 -0700 Subject: [PATCH 36/69] [v2.x] Update version to 2.2.0. Updated typescript to 3.4.5. Updated other dependency versions. Fixed deprecated MouseWheelEvents. --- CHANGELOG | 7 + dist.tgz | Bin 0 -> 1080052 bytes package-lock.json | 16099 +++++++++++++-------------------------- package.json | 61 +- src/webglimpse/core.ts | 15 +- tsconfig.json | 19 + 6 files changed, 5428 insertions(+), 10773 deletions(-) create mode 100644 dist.tgz create mode 100644 tsconfig.json diff --git a/CHANGELOG b/CHANGELOG index 5429938..224aa0d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,11 @@ +Webglimpse 2.2.0 (release 2019-6-19) + +* Added ability to specify custom mouse cursor for TimelineRow and TimelineGroup. +* Updated Typescript to ~3.4.5 and other dev dependencies. +* Replaced deprecated MouseWheelEvent listener with WheelEvent listener. + Webglimpse 2.1.1 (release 2019-4-16) + * Added support for truncating label text with ellipsis. * Added support for changing row and group label fonts. diff --git a/dist.tgz b/dist.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f32c855699e9ebcb44a1d0c61ccc5767b947a15e GIT binary patch literal 1080052 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

id7HU4-xGA0LMAM#pe$y#^U-amEbmuRCT{f88mQ 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%0AiPzZK6L{xxfR3IDhiZ0=kbiV-MpN4;ljee zuf*c*i_oe`r}H}uH>H!3n5UxF4t3d-0mX)rbyzf0;xANv9aqOLlS%`i_D@@odR zu(6lscNeo?nW~8NR8z=iTZGTB90hsqVBqhb{_tg6q2xV}<6e1P9RjWvk%e5WJQLse z9{P-Jx^dTU+;Q447*eaZs-^i5JXRmRxmGB#Dv5c?cQdP7yGoFV3SnKLiJI#%QRt}dsponl)F>M zszS~E{!kI$?`_2Y0TKUouTU50)-ibAtk(rV5}Z^$)FsJcaUPkAUjcCFN{e0DvMtmk zoK?nl=`r=_`_Kxvvx~OBqavQX{^pIcc^%bMdia@wibNWovkvLfBhzzFdGrY9d8z-7 zvyTIvtcr|1q~E{eGRtd_Y;AWlM%eWGPfiq!%0afP9|pdPYKGzgH18fOuaaD=AE`rS(}Y1q%wrT{XM0y5EjapAJQ2a5binp19)d)B z+#K2p6rQ0SX;2Uv_ecYq|Z2q17x1;a>>9LM8IXHzGpg6)V-k8 zfthukSVIt+B+D$Aa2Im6Xp%IuV3eMcvljVJU3bsPlx6fTjr|9#ZpBTXS_e-22((VH z>h}Oe;MQ)J2-4cxzZW)XhdU5PM#BoSK+!cOd?v(a$y?ngZmCp#Q3Pct0#{mW;)5AX za*LU^#P` z+ildApv3~PRtmv3^QhUISw$$p$B8=n#C$R67C`1@D~BM?f%^gh_YVj@#6TuRtK=*= z6`tvMo-}jE7vpt{^te!X6cdf9^KQ6$AiDqtfAltP_qw;+*MgfAWA1Tym&J+!{>X$m zyD!Nuu-)|4$1V!n+g2pu-#LO2evtW5pg7}IabrFHqbLcFb>~zyG^t2*`vg*DIEZ}% zLo0yT)vks`k$=#&ZabqTn`-hC1GqJ?Kn#+8kb54qesFGW&Mf1bC&o}i%LZm5!2u&K z38DFo2Q|ja(>jx24)r3a8#np#^h7Z1JvjQR+{an2XE{y!5);~hiSLe5h(_Q|Dlxya zOcu}HPfiG4(LFa{aS6l|)C6H%y{rmL<2(#jKta@+YBBi@Ycg1WP;T zt4LJ?S`(-7W5-m_wOM!L_f^M{R*Ewl(0Mp5x#b&w2H`Ht;<MV4PRnBX2Xp+`DjcYxorHSc7Qv31w;kkqNW(!CXka$yN+6Q&lMV~j95goeIH#jnm%6W z&9I=QnT2vTD@ky+eqk~&c5DTvU?~1KiK$p|z5je=+1lMf=P=2KLT=Tq{MZ*SpsYig zF0irKikXnSpw@3h`3_YJuW4_!YqUaEZwl;n-u;UvWpqLH?y&#n_`&emX>uS;w;2=a5C3?LV?*Iims05L1IE z(=;_YrBr8`Qk$<&Xtw;fjJu{elw;~?qIODbM>CbVY(-+n%+z31o@Rs=rFOEjwGpvy ztI<4sv;!x{nq&9Ug3H+tB6sMKGQEj*VFENILUMyp_#^1ls)m}xP~=09u39_+hm@B1 zAh>XQ*bWr)q$qDIb*{>dn5HkebY1E$gWfp!F%`hgNRKKsnW@HU5ex7a6BIH?k>N7v zVA28Hg$byq{=HAkBBP|tBhk&9C7`E38nT}ZAxv+`%oHH5#RLvFq7GsQbXr~pX^$S} z6HCre?0hyKaTUWn{i)HvF*@BbXK#Nz^$UX^qaVW@)IU-2FFVO6+GvWc*d-Kp7;`)1GIk5 z)#~Neyc|ym*06RF82D(D=cO&MJ3&eX)R>$sJYt}=RZYq!EwLq%xr_s^pw^zfZo>F1 zg6pw9L`c^?O)rE=@uc4`Rq#@>bM)$q=!J`XEH;p{5ZfvZ`q>l+hMC?NS|yGO&@`8c zVTm|PJq9K|u>7s(rXhf4YQ}F;xINXipK`lGqKPh<*tr|I!25zZEUH}Tmu4eq)7X2^ zxGNbwJvWem^Wq((EICE=C>O+%>+{s^&t7aru-S0R%0D+_t#62#57plhu#js0qcvOF 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

}4dFM!Kc- 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⩔j%jB3jx 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

    !c16SSK-fPh%L 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 b&-+{7qS<}BZ};uKAMgABloan@0KjYj>gAcI literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index d3f98b6..c4cb061 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,289 +4,331 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@angular-devkit/build-optimizer": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", - "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", + "@angular-devkit/architect": { + "version": "0.800.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.800.3.tgz", + "integrity": "sha512-SikMkzkBPtiRdaFIXB0+0NZUBI3bU7XfQRof/uHp9Xc+U1K3ORAtGGOIJtLdkk7RsWqePu5CiRX8XczgFKq5eA==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "source-map": "^0.5.6", - "typescript": "~2.6.2", - "webpack-sources": "^1.0.1" + "@angular-devkit/core": "8.0.3", + "rxjs": "6.4.0" }, "dependencies": { - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } } } }, "@angular-devkit/core": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", - "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.0.3.tgz", + "integrity": "sha512-Q5+jw2JQ7xfrDbo1VYH2cr+NysGV+psZ1TtC9eoVJ44fp8pCQAnvGJkeT7eLVEgMrpoBorUy7nqebCOR3WnkXA==", "dev": true, "requires": { - "ajv": "~5.5.1", - "chokidar": "^1.7.0", - "rxjs": "^5.5.6", - "source-map": "^0.5.6" + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.2", + "rxjs": "6.4.0", + "source-map": "0.7.3" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "magic-string": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", + "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "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" + "tslib": "^1.9.0" } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, "@angular-devkit/schematics": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", - "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.0.3.tgz", + "integrity": "sha512-Oj1VLsTEJhzAZjKWEjHXLMKD8B0Qp+3vaozYM22bNIfxP9B1XyUSPPv3UhhRhWusm4T6GRDvMVVLQ1k3mkusuA==", "dev": true, "requires": { - "@ngtools/json-schema": "^1.1.0", - "rxjs": "^5.5.6" + "@angular-devkit/core": "8.0.3", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "@angular/animations": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz", - "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.0.2.tgz", + "integrity": "sha512-6buaGp6sgyLWbjioGU0Wp/O9nFEQqD2L18uX5g5P5hdpq0bgopAbBee7AefJ8Kc/Kf79FlaKu9fKP5AEkeC8tA==", "dev": true, "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/cli": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz", - "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==", - "dev": true, - "requires": { - "@angular-devkit/build-optimizer": "0.3.2", - "@angular-devkit/core": "0.3.2", - "@angular-devkit/schematics": "0.3.2", - "@ngtools/json-schema": "1.2.0", - "@ngtools/webpack": "1.10.2", - "@schematics/angular": "0.3.2", - "@schematics/package-update": "0.3.2", - "ajv": "^6.1.1", - "autoprefixer": "^7.2.3", - "cache-loader": "^1.2.0", - "chalk": "~2.2.0", - "circular-dependency-plugin": "^4.2.1", - "clean-css": "^4.1.11", - "common-tags": "^1.3.1", - "copy-webpack-plugin": "~4.4.1", - "core-object": "^3.1.0", - "denodeify": "^1.2.1", - "ember-cli-string-utils": "^1.0.0", - "extract-text-webpack-plugin": "^3.0.2", - "file-loader": "^1.1.5", - "fs-extra": "^4.0.0", - "glob": "^7.0.3", - "html-webpack-plugin": "^2.29.0", - "istanbul-instrumenter-loader": "^3.0.0", - "karma-source-map-support": "^1.2.0", - "less": "^2.7.2", - "less-loader": "^4.0.5", - "license-webpack-plugin": "^1.0.0", - "loader-utils": "1.1.0", - "lodash": "^4.11.1", - "memory-fs": "^0.4.1", - "minimatch": "^3.0.4", - "node-modules-path": "^1.0.0", - "node-sass": "^4.7.2", - "nopt": "^4.0.1", - "opn": "~5.1.0", - "portfinder": "~1.0.12", - "postcss": "^6.0.16", - "postcss-import": "^11.0.0", - "postcss-loader": "^2.0.10", - "postcss-url": "^7.1.2", - "raw-loader": "^0.5.1", - "resolve": "^1.1.7", - "rxjs": "^5.5.6", - "sass-loader": "^6.0.6", - "semver": "^5.1.0", - "silent-error": "^1.0.0", - "source-map-support": "^0.4.1", - "style-loader": "^0.19.1", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.1", - "uglifyjs-webpack-plugin": "^1.1.8", - "url-loader": "^0.6.2", - "webpack": "~3.11.0", - "webpack-dev-middleware": "~1.12.0", - "webpack-dev-server": "~2.11.0", - "webpack-merge": "^4.1.0", - "webpack-sources": "^1.0.0", - "webpack-subresource-integrity": "^1.0.1" - } - }, - "@angular/common": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz", - "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/compiler": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz", - "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/compiler-cli": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz", - "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==", - "dev": true, - "requires": { - "chokidar": "^1.4.2", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "tsickle": "^0.27.2" + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.0.3.tgz", + "integrity": "sha512-ZOrZHtDDWO1J7CLGeEUOI9YHjQHGqfUz/SUrNzzTfwctFq77QfXjnYtx+ejk/+h/dwSHQEOQ8aN5sVP6JvDGoA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.800.3", + "@angular-devkit/core": "8.0.3", + "@angular-devkit/schematics": "8.0.3", + "@schematics/angular": "8.0.3", + "@schematics/update": "0.800.3", + "@yarnpkg/lockfile": "1.1.0", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.3.1", + "npm-package-arg": "6.1.0", + "open": "6.2.0", + "pacote": "9.5.0", + "read-package-tree": "5.2.2", + "semver": "6.0.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" }, "dependencies": { - "minimist": { + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + }, + "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": { + "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" + } + } + } + }, + "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" + }, + "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 + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true } } }, - "@angular/core": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz", - "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/forms": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz", - "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/http": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", - "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/language-service": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.11.tgz", - "integrity": "sha512-tgnFAhwBmUs1W0dmcmlBmUlMaOgkoyuSdrcF23lz8W5+nSLb+LnbH5a3blU2NVqA4ESvLKQkPW5dpKa/LuhrPQ==", - "dev": true - }, - "@angular/platform-browser": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz", - "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/platform-browser-dynamic": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz", - "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==", - "dev": true, - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/router": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz", - "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==", + "@angular/common": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.0.2.tgz", + "integrity": "sha512-9lwrKso0XjyS7wu+8dEWa5yN1kCTdbelP6JElFhh0kAt0TbPVHJ/dXEwvIFk9/2MjYv2PbooQo1zsc5kAB2Rlg==", "dev": true, "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, - "@babel/runtime": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz", - "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==", + "@angular/compiler": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.0.2.tgz", + "integrity": "sha512-ktobrxpWX1eCwbDKOIUm5GRj8WGlHW/8MAQvDDFUnsGqXBHfOGiaySiEYX/XjeN8qu34IfXs736QkdzpMM4+iw==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } + "tslib": "^1.9.0" } }, - "@compodoc/compodoc": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.9.tgz", - "integrity": "sha512-LFdbF/fO9qOGgdrCHg4irMBrl3sD8ySIlL6XabFAz8QbUdf2+77xOVnZJ/PYdcuI8h8vXo4UGS7MFg0pDR2jsw==", + "@angular/compiler-cli": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.0.2.tgz", + "integrity": "sha512-9jdpB8WC47oSgQ/jA+ExTYqbe4xw3ZCEhgLhPd8BQukBOHodaIHKnkinrVJAPZORpY1CKRaImoAHieSvRhiPjA==", "dev": true, "requires": { - "@compodoc/ngd-transformer": "^2.0.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.2", - "chokidar": "^2.1.2", - "colors": "^1.3.3", - "commander": "^2.19.0", - "cosmiconfig": "^5.1.0", - "fancy-log": "^1.3.3", - "findit2": "^2.2.3", - "fs-extra": "^7.0.1", - "glob": "^7.1.3", - "handlebars": "^4.1.0", - "html-entities": "^1.2.1", - "i18next": "^15.0.4", - "inside": "^1.0.0", - "json5": "^2.1.0", - "live-server": "^1.2.1", - "lodash": "^4.17.11", - "lunr": "^2.3.6", - "marked": "^0.6.1", + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", "minimist": "^1.2.0", - "opencollective": "^1.0.3", - "os-name": "^3.0.0", - "pdfmake": "^0.1.53", - "semver": "^5.6.0", - "traverse": "^0.6.6", - "ts-simple-ast": "12.4.0", - "uuid": "^3.3.2" + "reflect-metadata": "^0.1.2", + "shelljs": "^0.8.1", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.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 + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -349,21 +391,16 @@ } } }, - "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" - } - }, - "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -380,22 +417,55 @@ "upath": "^1.1.1" } }, - "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 + "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": { + "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" + } + } + } }, - "cosmiconfig": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", - "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", + "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" + } + }, + "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": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.0", - "parse-json": "^4.0.0" + "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" } }, "expand-brackets": { @@ -549,15 +619,28 @@ } } }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "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" } }, "glob-parent": { @@ -581,10 +664,10 @@ } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 }, "is-accessor-descriptor": { @@ -622,6 +705,12 @@ "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-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -657,21 +746,40 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "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==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "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 }, + "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" + } + }, + "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" + } + }, + "magic-string": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", + "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -705,198 +813,567 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "parse-json": { + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + }, + "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 + }, + "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" + } + } + } + }, + "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "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==", + "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 + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "@compodoc/ngd-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.0.0.tgz", - "integrity": "sha512-6HpYvXRZBdIYFojWxW5EVNkhYPmblytCve62CNoYBSWfy++vTGH7Ypg2Bhjg2CsqeV8JOVxrPO7JM9M3MgWKEA==", + "@angular/core": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.0.2.tgz", + "integrity": "sha512-g8BRvGZxTXb5GZ/xoC5Z94DGK3wMiD2jbmEQEbXGNM+c8E/Mo/W8GF44P7EU2d+V1oJoUh75SRK6U/StC+rLqA==", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "fancy-log": "^1.3.2", - "typescript": "^2.4.2" + "tslib": "^1.9.0" } }, - "@compodoc/ngd-transformer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0.tgz", - "integrity": "sha512-9J0KkmuuuvDHxH0oREgrgbqdEFqcltQXIBofeYdIyMKzI3A+pN1Ji4zfi7x1ql0Ax7qQKemp8XWP+cCpP0qY+w==", + "@angular/forms": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.0.2.tgz", + "integrity": "sha512-LGu3b/wjNMCki5PnMUsfQlyaVZVOedNO+XccfluP4ZBQ5G/E2cz2tJ0UIHg3RhLbbpWntmqokpYLyd7leUPpIQ==", "dev": true, "requires": { - "@compodoc/ngd-core": "~2.0.0", - "dot": "^1.1.1", - "fs-extra": "^4.0.1", - "viz.js": "^1.8.0" + "tslib": "^1.9.0" } }, - "@dsherret/to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", + "@angular/http": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", + "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" + "tslib": "^1.7.1" } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "@angular/language-service": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.0.2.tgz", + "integrity": "sha512-oFB6KhHJVfVcLt4rmJHeZyPSnb+OdzN2CmmCxxnG7TXP73wvycnqVQ2pbcAsyRGj1759+DnY9X3VpJGhlc7H4Q==", + "dev": true + }, + "@angular/platform-browser": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.0.2.tgz", + "integrity": "sha512-iUoyhJ81jqvpmQI6Lu5NzRZR8azmnb2kX2FQ+LbwCvWQLfkLbTaa/Jl09/qN6KWpTsMogNQXVnjjgwoeaObvBw==", "dev": true, "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "tslib": "^1.9.0" } }, - "@ngtools/json-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", - "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", - "dev": true + "@angular/platform-browser-dynamic": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.0.2.tgz", + "integrity": "sha512-i9hBmcXauiQpvzRRNbBpMbQSsRh9YMv9phw9Ih54w2LdTUB64Vtrm3scQEWZ0sIONY3QbwEtu57k8euQPASErQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } }, - "@ngtools/webpack": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", - "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", + "@angular/router": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.0.2.tgz", + "integrity": "sha512-kgSqkvx3cgY0+ZTzkBVLa0sf0y0Fl7q3N+KX746pbCNjRRGa5gBkN7z+oyPDoG1l0fEiM6NLbFfcmuFwsdBO5w==", "dev": true, "requires": { - "chalk": "~2.2.0", - "enhanced-resolve": "^3.1.0", - "loader-utils": "^1.0.2", - "magic-string": "^0.22.3", - "semver": "^5.3.0", - "source-map": "^0.5.6", - "tree-kill": "^1.0.0", - "webpack-sources": "^1.1.0" + "tslib": "^1.9.0" } }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true + "@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" + } }, - "@schematics/angular": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", - "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "typescript": "~2.6.2" + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" }, "dependencies": { - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true } } }, - "@schematics/package-update": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", - "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", + "@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": { - "rxjs": "^5.5.6", - "semver": "^5.3.0", - "semver-intersect": "^1.1.2" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "@types/jasmine": { - "version": "2.5.54", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", - "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", - "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", + "@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": { - "@types/jasmine": "*" + "@babel/types": "^7.0.0" } }, - "@types/node": { - "version": "6.0.118", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz", - "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==", - "dev": true - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true + "@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" + } }, - "@types/selenium-webdriver": { - "version": "2.53.43", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", - "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", - "dev": true + "@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" + } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", "dev": true }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "@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": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", "dev": true, "requires": { - "acorn": "^4.0.3" + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "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" + } + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@compodoc/compodoc": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.0.9.tgz", + "integrity": "sha512-/ur68Kzayyn6vXw6y7MxJRX0Gry4DgxgtGGo8x3AH2lQMkJ2/RWXf0CQSgANHPtM05Zs5DqYqcAqfCCNMLpb/Q==", + "dev": true, + "requires": { + "@compodoc/ngd-transformer": "^2.0.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "chokidar": "^2.0.2", + "colors": "^1.1.2", + "commander": "2.15.0", + "fancy-log": "^1.3.2", + "findit2": "^2.2.3", + "fs-extra": "^5.0.0", + "glob": "^7.1.2", + "handlebars": "^4.0.11", + "html-entities": "^1.2.1", + "json5": "^0.5.1", + "live-server": "1.1.0", + "lodash": "^4.17.5", + "lunr": "2.1.6", + "marked": "^0.3.17", + "os-name": "^2.0.1", + "traverse": "^0.6.6", + "ts-simple-ast": "6.12.0", + "typescript": "2.4.2" + }, + "dependencies": { + "typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "dev": true + } + } + }, + "@compodoc/ngd-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.0.0.tgz", + "integrity": "sha512-6HpYvXRZBdIYFojWxW5EVNkhYPmblytCve62CNoYBSWfy++vTGH7Ypg2Bhjg2CsqeV8JOVxrPO7JM9M3MgWKEA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "fancy-log": "^1.3.2", + "typescript": "^2.4.2" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } + } + }, + "@compodoc/ngd-transformer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0.tgz", + "integrity": "sha512-9J0KkmuuuvDHxH0oREgrgbqdEFqcltQXIBofeYdIyMKzI3A+pN1Ji4zfi7x1ql0Ax7qQKemp8XWP+cCpP0qY+w==", + "dev": true, + "requires": { + "@compodoc/ngd-core": "~2.0.0", + "dot": "^1.1.1", + "fs-extra": "^4.0.1", + "viz.js": "^1.8.0" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@ngtools/json-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", + "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", + "dev": true + }, + "@schematics/angular": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.0.3.tgz", + "integrity": "sha512-pOy5hPxhyCQNaxkYMardnmwqMeT1rHX5JEl4QRaUHvfOmgLekthXyp31e2CkKfZOOhT6MUeK1GhVqMiZsMvS9A==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.0.3", + "@angular-devkit/schematics": "8.0.3" + } + }, + "@schematics/update": { + "version": "0.800.3", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.800.3.tgz", + "integrity": "sha512-8pPwtr6n23RTNBWp3fEMNvaEM7EN5OyNn8WL+hWkZNQWC3VuUw5b06EnayeS9/VfRI1LENAgfQXqQkdo6/MJyg==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.0.3", + "@angular-devkit/schematics": "8.0.3", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.0", + "rxjs": "6.4.0", + "semver": "6.0.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/jasmine": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.13.tgz", + "integrity": "sha512-iczmLoIiVymaD1TIr2UctxjFkNEslVE/QtNAUmpDsD71cZfZBAsPCUv1Y+8AwsfA8bLx2ccr7d95T9w/UAirlQ==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/node": { + "version": "6.0.118", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz", + "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" }, "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } } } }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, "adm-zip": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", @@ -910,21 +1387,21 @@ "dev": true }, "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "extend": "~3.0.0", - "semver": "~5.0.1" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" } }, "ajv": { @@ -953,21 +1430,14 @@ } } }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "ambi": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", + "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "editions": "^1.1.1", + "typechecker": "^4.3.0" } }, "amdefine": { @@ -977,18 +1447,18 @@ "dev": true }, "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "dev": true, "requires": { - "string-width": "^2.0.0" + "string-width": "^3.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=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { @@ -998,22 +1468,23 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -1027,12 +1498,6 @@ "ansi-wrap": "^0.1.0" } }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -1042,12 +1507,6 @@ "ansi-wrap": "0.1.0" } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -1070,28 +1529,39 @@ "dev": true }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "apache-crypt": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz", - "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.1.2.tgz", + "integrity": "sha1-ggeCozu2pf0nEggvDtOiTjybAhQ=", "dev": true, "requires": { "unix-crypt-td-js": "^1.0.0" } }, "apache-md5": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz", - "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.0.6.tgz", + "integrity": "sha1-RwI51AxU58Mt2dbrEbw1eOzJA8I=", "dev": true }, "app-root-path": { @@ -1101,12 +1571,12 @@ "dev": true }, "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "^2.0.0" } }, "aproba": { @@ -1115,16 +1585,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1132,17 +1592,32 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } } }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" } }, + "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", @@ -1161,56 +1636,10 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-find-index": { + "array-union": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "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-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { "array-uniq": "^1.0.1" @@ -1223,15 +1652,15 @@ "dev": true }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, "arrify": { @@ -1244,8 +1673,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true + "dev": true }, "asn1": { "version": "0.2.4", @@ -1256,49 +1684,11 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "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": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "assign-symbols": { "version": "1.0.0", @@ -1306,63 +1696,10 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-transform": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", - "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", - "dev": true, - "requires": { - "escodegen": "~1.2.0", - "esprima": "~1.0.4", - "through": "~2.3.4" - }, - "dependencies": { - "escodegen": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", - "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", - "dev": true, - "requires": { - "esprima": "~1.0.4", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.30" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", - "dev": true - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "ast-types": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", - "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, "async": { @@ -1380,10 +1717,10 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "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": { @@ -1399,25 +1736,25 @@ "dev": true }, "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", "dev": true, "requires": { - "browserslist": "^2.11.3", - "caniuse-lite": "^1.0.30000805", + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^6.0.17", - "postcss-value-parser": "^3.2.3" + "postcss": "^7.0.16", + "postcss-value-parser": "^3.3.1" } }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true + "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.8.0", @@ -1425,146 +1762,15 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "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=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "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" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "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=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "ast-types-flow": "0.0.7" } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -1650,12 +1856,6 @@ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "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 - }, "base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", @@ -1686,12 +1886,6 @@ "tweetnacl": "^0.14.3" } }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", - "dev": true - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1701,12 +1895,6 @@ "callsite": "1.0.0" } }, - "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==", - "dev": true - }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -1714,24 +1902,15 @@ "dev": true }, "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "blocking-proxy": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", - "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -1751,92 +1930,61 @@ "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", "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 - }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "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" + } } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", "dev": true, "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", "term-size": "^1.2.0", + "type-fest": "^0.3.0", "widest-line": "^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 - }, - "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { @@ -1846,23 +1994,30 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": "^3.0.0" + "ansi-regex": "^4.1.0" } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true } } }, @@ -1877,171 +2032,62 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "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" + } + } } }, - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", "dev": true, "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "brotli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", - "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "browserstack": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", + "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", "dev": true, "requires": { - "base64-js": "^1.1.2" + "https-proxy-agent": "^2.2.1" } }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "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.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", - "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", - "dev": true, - "requires": { - "ast-transform": "0.0.0", - "ast-types": "^0.7.0", - "browser-resolve": "^1.8.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": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" - } - }, - "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-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, "buffer-alloc-unsafe": { @@ -2050,18 +2096,6 @@ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -2074,55 +2108,81 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "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-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "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=", + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "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", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "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" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } } }, "cache-base": { @@ -2150,40 +2210,42 @@ } } }, - "cache-loader": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.5.tgz", - "integrity": "sha512-enWKEQ4kO3YreDFd7AtVRjtJBmNiqh/X9hVDReu0C4qm8gsGmySkwuWtdc+N5O+vq5FzxL1mIZc30NyXCB7o/Q==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mkdirp": "^0.5.1", - "neo-async": "^2.5.0", - "schema-utils": "^0.4.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "dev": true, "requires": { - "caller-callsite": "^2.0.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } } }, "callsite": { @@ -2192,48 +2254,22 @@ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "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": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, "caniuse-lite": { - "version": "1.0.30000960", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000960.tgz", - "integrity": "sha512-7nK5qs17icQaX6V3/RYrJkOsZyRNnroA4+ZwxaKJzIKy+crIy0Mz5CBlLySd2SNV+4nbUZeqeNfiaEieUBu3aA==", + "version": "1.0.30000975", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000975.tgz", + "integrity": "sha512-ZsXA9YWQX6ATu5MNg+Vx/cMQ+hM6vBBSqDeJs8ruk9z0ky4yIHML15MoxcFt088ST2uyjgqyUGRJButkptWf0w==", "dev": true }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", "dev": true }, "caseless": { @@ -2242,33 +2278,17 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "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.1.0", + "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, "cheerio": { "version": "1.0.0-rc.3", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", @@ -2284,20 +2304,23 @@ } }, "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "chownr": { @@ -2307,25 +2330,9 @@ "dev": true }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "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" - } - }, - "circular-dependency-plugin": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", - "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "class-utils": { @@ -2375,9 +2382,9 @@ } }, "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", "dev": true }, "cli-cursor": { @@ -2395,62 +2402,25 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "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==", + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "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 - } + "mimic-response": "^1.0.0" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "code-block-writer": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-7.3.1.tgz", - "integrity": "sha512-3Jfe6ZmmGzvdQWFo3MUzobn3WdX++jc3Tj0rsviJWYPnP7NGMFEE4qheNeOXeJgB1TTgxYT8XuNvhS/u596yGg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.14.0.tgz", + "integrity": "sha1-AkXuMa680hqCMWziBh1fvpVQ3m8=", "dev": true }, "code-point-at": { @@ -2460,25 +2430,20 @@ "dev": true }, "codelyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", - "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.0.tgz", + "integrity": "sha512-QiyY2/oDQnYx4mAVEDqr+z9MwrOto18tQFjExiuRChXCy0yvngS5fQpWIxvAGpbOmZFiR1PRTRLbEI71u10maA==", "dev": true, "requires": { - "app-root-path": "^2.1.0", - "css-selector-tokenizer": "^0.7.0", + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "^2.0.2", + "css-selector-tokenizer": "^0.7.1", "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", "semver-dsl": "^1.0.1", "source-map": "^0.5.7", - "sprintf-js": "^1.1.1" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - } + "sprintf-js": "^1.1.2" } }, "collection-visit": { @@ -2518,15 +2483,6 @@ "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "^4.5.0" - } - }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", @@ -2537,27 +2493,15 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "commenting": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.0.5.tgz", - "integrity": "sha512-U7qGbcDLSNpOcV3RQRKHp7hFpy9WUmfawbkPdS4R2RhrSu4dOF85QQpx/Zjcv7uLF6tWSUKEKUIkxknPCrVjwg==", - "dev": true - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "compare-versions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", + "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", "dev": true }, "component-bind": { @@ -2578,30 +2522,6 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, - "compressible": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.16.tgz", - "integrity": "sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA==", - "dev": true, - "requires": { - "mime-db": ">= 1.38.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2621,9 +2541,9 @@ } }, "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", "dev": true, "requires": { "dot-prop": "^4.1.0", @@ -2632,75 +2552,53 @@ "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" }, "dependencies": { - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "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": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" + "pify": "^3.0.0" } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", "dev": true, "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "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 - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "debug": "~2.2.0", + "finalhandler": "0.4.1", + "parseurl": "~1.3.1", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } }, "content-type": { "version": "1.0.4", @@ -2723,12 +2621,6 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -2749,54 +2641,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "copy-webpack-plugin": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", - "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", - "dev": true, - "requires": { - "cacache": "^10.0.1", - "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" - }, - "dependencies": { - "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-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", "dev": true }, - "core-object": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", - "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", - "dev": true, - "requires": { - "chalk": "^2.0.0" - } - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2813,146 +2663,29 @@ "vary": "^1" } }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - }, - "dependencies": { - "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" - } - } - } - }, - "cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "chokidar": "^1.6.0", - "duplexer": "^0.1.1", - "glob": "^7.0.5", - "glob2base": "^0.0.12", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "resolve": "^1.1.7", - "safe-buffer": "^5.0.1", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" - } - }, - "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-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.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": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "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" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "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" - } - }, - "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=", - "dev": true - }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "csextends": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", + "integrity": "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==", + "dev": true + }, "css-parse": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", @@ -3009,15 +2742,6 @@ "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", "dev": true }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -3030,14 +2754,11 @@ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "dev": true }, "dashdash": { "version": "1.14.1", @@ -3056,10 +2777,10 @@ } } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "date-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", + "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", "dev": true }, "debug": { @@ -3071,6 +2792,12 @@ "ms": "2.0.0" } }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -3083,11 +2810,14 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } }, "deep-extend": { "version": "0.6.0", @@ -3095,29 +2825,20 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "^3.0.0" } }, - "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" - } + "defer-to-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", + "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "dev": true }, "define-property": { "version": "2.0.2", @@ -3173,38 +2894,32 @@ } }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "^6.1.0", + "globby": "^5.0.0", "is-path-cwd": "^1.0.0", "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", "rimraf": "^2.2.8" }, "dependencies": { "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { "array-union": "^1.0.1", + "arrify": "^1.0.0", "glob": "^7.0.3", "object-assign": "^4.0.1", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } } } } @@ -3215,33 +2930,17 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "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" - } + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true }, "destroy": { "version": "1.0.4", @@ -3249,28 +2948,14 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "dfa": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.1.0.tgz", - "integrity": "sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E=", + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, "requires": { - "babel-runtime": "^6.11.6" + "asap": "^2.0.0", + "wrappy": "1" } }, "di": { @@ -3285,60 +2970,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "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.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -3361,12 +2992,6 @@ "entities": "^1.1.1" } }, - "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.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -3413,15 +3038,6 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -3440,6 +3056,16 @@ "stream-shift": "^1.0.0" } }, + "eachr": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz", + "integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=", + "dev": true, + "requires": { + "editions": "^1.1.1", + "typechecker": "^4.3.0" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -3450,49 +3076,28 @@ "safer-buffer": "^2.1.0" } }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, "electron-to-chromium": { - "version": "1.3.124", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz", - "integrity": "sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w==", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "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" - } - }, - "ember-cli-string-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", - "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", + "version": "1.3.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.165.tgz", + "integrity": "sha512-iIS8axR524EAnvUtWUNnREnYjQrS0zUvutIKYgTVuN3MzcjrV31EuJYKw7DGOtFO9DQw+JiXeaVDPQWMskG1wQ==", "dev": true }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "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 }, "encodeurl": { @@ -3520,63 +3125,46 @@ } }, "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", "dev": true, "requires": { - "accepts": "1.3.3", + "accepts": "~1.3.4", "base64id": "1.0.0", "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "~2.1.11", - "negotiator": "0.6.1" - } - }, "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", "has-cors": "1.1.0", "indexof": "0.0.1", - "parsejson": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { @@ -3587,46 +3175,27 @@ "dev": true }, "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { "after": "0.8.2", - "arraybuffer.slice": "0.0.6", + "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, "ent": { @@ -3641,11 +3210,39 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errlop": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz", + "integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==", + "dev": true, + "requires": { + "editions": "^2.1.2" + }, + "dependencies": { + "editions": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", + "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", + "dev": true, + "requires": { + "errlop": "^1.1.1", + "semver": "^5.6.0" + } + } + } + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, + "optional": true, "requires": { "prr": "~1.0.1" } @@ -3659,106 +3256,21 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.49", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", - "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + } } }, "escape-html": { @@ -3773,71 +3285,16 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "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": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "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 - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "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 }, - "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.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, "estree-walker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", - "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, "esutils": { @@ -3852,62 +3309,27 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" } }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", "dev": true }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "requires": { - "original": ">=0.0.5" - } - }, - "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" - } - }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -3921,19 +3343,6 @@ "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": { @@ -3942,117 +3351,38 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "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": { - "array-slice": "^0.2.3", - "array-unique": "^0.2.1", - "braces": "^0.1.2" + "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": { - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "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": { - "expand-range": "^0.1.0" + "is-descriptor": "^0.1.0" } }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "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-number": "^0.1.1", - "repeat-string": "^0.2.2" + "is-extendable": "^0.1.0" } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true } } }, @@ -4083,338 +3413,60 @@ } } }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "extendr": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/extendr/-/extendr-3.4.1.tgz", + "integrity": "sha512-xcdwhNFctt6U7XVBYgB35YG/CZFOZUZw+OCNiMPsgbENLlajgrZLVV6bgS/9zLHnY7s5nW6nJZcNrBvq033l1w==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "editions": "^2.1.0", + "typechecker": "^4.7.0" + }, + "dependencies": { + "editions": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", + "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", + "dev": true, + "requires": { + "errlop": "^1.1.1", + "semver": "^5.6.0" + } + } } }, "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "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": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "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": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "is-descriptor": "^1.0.0" } }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "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": { - "ajv": "^5.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "foreach": "^2.0.5", - "isarray": "0.0.1", - "object-keys": "^1.0.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "dependencies": { - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - } - } - }, - "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 - }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "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" - } - } - } - }, - "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-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -4446,88 +3498,49 @@ "kind-of": "^6.0.2" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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 - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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" - } } } }, + "extract-opts": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-3.3.1.tgz", + "integrity": "sha1-WrvtyYwNUgLjJ4cn+Rktfghsa+E=", + "dev": true, + "requires": { + "eachr": "^3.2.0", + "editions": "^1.1.1", + "typechecker": "^4.3.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -4535,14 +3548,20 @@ "dev": true }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -4552,22 +3571,6 @@ "escape-string-regexp": "^1.0.5" } }, - "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" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -4579,50 +3582,57 @@ } }, "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "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" + } + } } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", + "debug": "~2.2.0", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } } }, - "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-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, "find-parent-dir": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", @@ -4630,12 +3640,12 @@ "dev": true }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": "^2.0.0" + "locate-path": "^3.0.0" } }, "findit2": { @@ -4644,6 +3654,12 @@ "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", "dev": true }, + "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.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -4673,36 +3689,9 @@ } }, "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 - } - } - }, - "fontkit": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-1.8.0.tgz", - "integrity": "sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ==", - "dev": true, - "requires": { - "babel-runtime": "^6.11.6", - "brfs": "^1.4.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.0", - "clone": "^1.0.1", - "deep-equal": "^1.0.0", - "dfa": "^1.0.0", - "restructure": "^0.5.3", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.0.0", - "unicode-trie": "^0.3.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -4713,21 +3702,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "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", @@ -4735,23 +3709,16 @@ "dev": true }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, - "optional": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -4793,9 +3760,9 @@ } }, "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4850,7 +3817,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4871,12 +3839,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4891,17 +3861,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5018,7 +3991,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5030,6 +4004,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5044,6 +4019,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5051,12 +4027,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5075,6 +4053,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5155,7 +4134,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5167,6 +4147,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5252,7 +4233,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5288,6 +4270,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5307,6 +4290,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5350,68 +4334,21 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": 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" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, "get-stream": { @@ -5457,38 +4394,25 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "find-index": "^0.1.1" + "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" + } + } } }, "global-dirs": { @@ -5501,53 +4425,52 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "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 }, "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "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" + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "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" + } + } } }, "graceful-fs": { @@ -5556,12 +4479,6 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", - "dev": true - }, "handlebars": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", @@ -5583,43 +4500,19 @@ } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true + "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": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -5631,19 +4524,19 @@ "ansi-regex": "^2.0.0" } }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dev": true, "requires": { - "isarray": "0.0.1" + "isarray": "2.0.1" }, "dependencies": { "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true } } @@ -5655,21 +4548,9 @@ "dev": true }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "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-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-value": { @@ -5732,138 +4613,24 @@ } } }, - "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.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "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 }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "dev": true }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^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", @@ -5879,9 +4646,9 @@ }, "dependencies": { "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==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5892,39 +4659,39 @@ } }, "http-auth": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", - "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-2.4.11.tgz", + "integrity": "sha1-YfAkpuDnxIk0lEiVyHoTlVCcYZs=", "dev": true, "requires": { - "apache-crypt": "^1.1.2", - "apache-md5": "^1.0.6", - "bcryptjs": "^2.3.0", - "uuid": "^3.0.0" + "apache-crypt": "1.1.2", + "apache-md5": "1.0.6", + "node-uuid": "^1.4.7" } }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", "dev": true }, "http-proxy": { @@ -5938,345 +4705,81 @@ "requires-port": "^1.0.0" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "agent-base": "4", + "debug": "3.1.0" }, "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==", + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "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" - } - } + "es6-promisify": "^5.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=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "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-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-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-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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" + "ms": "2.0.0" } } } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, - "optional": true, "requires": { - "assert-plus": "^0.2.0", + "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 - }, "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3" + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } } }, - "i18next": { - "version": "15.0.9", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-15.0.9.tgz", - "integrity": "sha512-IdVj7DqErUuMbGuj2dFT431T7zKlmDci63eae6pNA/bMwgBZKT74/KnwHXE0WH7ivo2EV/LNme4pP4Yw6vB79w==", + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dev": true, "requires": { - "@babel/runtime": "^7.3.1" + "ms": "^2.0.0" } }, "iconv-lite": { @@ -6288,58 +4791,49 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, - "ignore": { - "version": "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-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "requires": { - "import-from": "^2.1.0" + "minimatch": "^3.0.4" } }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "ignorefs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", + "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "editions": "^1.3.3", + "ignorepatterns": "^1.1.0" } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "ignorepatterns": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz", + "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=", + "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, - "requires": { - "resolve-from": "^3.0.0" - } + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true }, "import-lazy": { "version": "2.1.0", @@ -6347,37 +4841,12 @@ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, - "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 }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -6412,145 +4881,18 @@ "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", "dev": true }, - "inquirer": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", - "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", - "dev": true, - "requires": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.1", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^2.0.0", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - }, - "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": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "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" - } - }, - "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 - }, - "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": { - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inside/-/inside-1.0.0.tgz", - "integrity": "sha1-20Xpk1c82z23C5gy6ChbrUZCR3A=", - "dev": true - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "requires": { - "meow": "^3.3.0" - } - }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "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 - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -6581,19 +4923,13 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "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": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "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": "^1.5.0" + "ci-info": "^2.0.0" } }, "is-data-descriptor": { @@ -6605,12 +4941,6 @@ "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", @@ -6630,27 +4960,6 @@ } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -6658,20 +4967,11 @@ "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "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", @@ -6682,12 +4982,12 @@ } }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.1" } }, "is-installed-globally": { @@ -6706,22 +5006,16 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", "dev": true }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "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" @@ -6774,90 +5068,33 @@ } } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "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-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "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-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "is-reference": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.2.tgz", + "integrity": "sha512-Kn5g8c7XHKejFOpTf2QN9YjiHHKl5xRj+2uAZf9iM2//nkBNi/NNeB5JMoun28nEaUVHyPUzqzhfRlfAirEjXg==", "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "@types/estree": "0.0.39" } }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, "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-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6870,6 +5107,12 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6892,13 +5135,10 @@ "dev": true }, "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" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -6907,186 +5147,160 @@ "dev": true }, "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", "once": "^1.4.0" } }, - "istanbul-instrumenter-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", - "dev": true, - "requires": { - "convert-source-map": "^1.5.0", - "istanbul-lib-instrument": "^1.7.3", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.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" - } - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, "istanbul-lib-coverage": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "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-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, "requires": { - "append-transform": "^0.4.0" + "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", - "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "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": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.1", - "semver": "^5.3.0" + "@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": { + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + } } }, "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "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": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "^1.0.0" + "has-flag": "^3.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "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": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "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": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "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" } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "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": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "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.0.3" + "handlebars": "^4.1.2" } }, "jasmine": { - "version": "2.99.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", - "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", "dev": true, "requires": { "exit": "^0.1.2", "glob": "^7.0.6", - "jasmine-core": "~2.99.0" + "jasmine-core": "~2.8.0" }, "dependencies": { "jasmine-core": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", "dev": true } } }, "jasmine-core": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", - "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", "dev": true }, "jasmine-spec-reporter": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", - "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", "dev": true, "requires": { "colors": "1.1.2" @@ -7106,16 +5320,10 @@ "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", "dev": true }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "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=", + "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": { @@ -7135,15 +5343,15 @@ "dev": true }, "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, "json-parse-better-errors": { @@ -7158,34 +5366,12 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "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 - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, "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 }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -7201,10 +5387,10 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, "jsprim": { @@ -7227,62 +5413,110 @@ } } }, + "jszip": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", + "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", "dev": true, "requires": { "bluebird": "^3.3.0", "body-parser": "^1.16.1", - "chokidar": "^1.4.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", "colors": "^1.1.0", - "combine-lists": "^1.0.0", "connect": "^3.6.0", "core-js": "^2.2.0", "di": "^0.0.1", "dom-serialize": "^2.2.0", - "expand-braces": "^0.1.1", + "flatted": "^2.0.0", "glob": "^7.1.1", "graceful-fs": "^4.1.2", "http-proxy": "^1.13.0", "isbinaryfile": "^3.0.0", - "lodash": "^3.8.0", - "log4js": "^0.6.31", - "mime": "^1.3.4", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", "minimatch": "^3.0.2", "optimist": "^0.6.1", "qjobs": "^1.1.4", "range-parser": "^1.2.0", "rimraf": "^2.6.0", "safe-buffer": "^5.0.1", - "socket.io": "1.7.3", - "source-map": "^0.5.3", - "tmp": "0.0.31", - "useragent": "^2.1.12" + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" }, "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", "dev": true }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "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 + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true } } }, "karma-chrome-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", - "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true, "requires": { "fs-access": "^1.0.0", @@ -7299,63 +5533,39 @@ } }, "karma-coverage-istanbul-reporter": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", - "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.5.tgz", + "integrity": "sha512-yPvAlKtY3y+rKKWbOo0CzBMVTvJEeMOgbMXuVv3yWvS8YtYKC98AU9vFF0mVBZ2RP1E9SgS90+PT6Kf14P3S4w==", "dev": true, "requires": { - "istanbul-api": "^1.3.1", + "istanbul-api": "^2.1.1", "minimatch": "^3.0.4" } }, "karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", - "dev": true - }, - "karma-jasmine-html-reporter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", - "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", "dev": true, "requires": { - "karma-jasmine": "^1.0.2" + "jasmine-core": "^3.3" } }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "karma-jasmine-html-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", + "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { - "source-map-support": "^0.5.5" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-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" - } - } + "json-buffer": "3.0.0" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -7366,4596 +5576,566 @@ } }, "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "package-json": "^6.3.0" } }, "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", "dev": true, "requires": { + "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", - "mime": "^1.2.11", + "mime": "^1.4.1", "mkdirp": "^0.5.0", "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" + "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==", + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" + }, + "dependencies": { + "promise": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" + "immediate": "~3.0.5" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "live-server": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", + "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "colors": "^1.3.3", + "connect": "3.4.x", + "cors": "^2.8.5", + "event-stream": "^4.0.1", + "faye-websocket": "0.11.x", + "http-auth": "2.4.x", + "morgan": "^1.6.1", + "object-assign": "^4.1.1", + "opn": "^6.0.0", + "proxy-middleware": "^0.15.0", + "send": "^0.17.1", + "serve-index": "^1.7.2", + "watchr": "2.6.x" + }, + "dependencies": { + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + } } }, - "license-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==", + "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": { - "ejs": "^2.5.7" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "linebreak": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz", - "integrity": "sha1-BSZICmLAW9Z58+nZmDDgnGp9DtY=", + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "log4js": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.3.1.tgz", + "integrity": "sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==", "dev": true, "requires": { - "base64-js": "0.0.8", - "brfs": "^1.3.0", - "unicode-trie": "^0.3.0" + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.2", + "streamroller": "^1.0.5" }, "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "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" + } + }, + "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 } } }, - "live-server": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz", - "integrity": "sha512-Yn2XCVjErTkqnM3FfTmM7/kWy3zP7+cEtC7x6u+wUzlQ+1UW3zEYbbyJrc0jNDwiMDZI0m4a0i3dxlGHVyXczw==", + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "chokidar": "^2.0.4", - "colors": "^1.3.3", - "connect": "^3.6.6", - "cors": "^2.8.5", - "event-stream": "3.3.4", - "faye-websocket": "0.11.x", - "http-auth": "3.1.x", - "morgan": "^1.9.1", - "object-assign": "^4.1.1", - "opn": "^6.0.0", - "proxy-middleware": "^0.15.0", - "send": "^0.16.2", - "serve-index": "^1.9.1" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lunr": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.1.6.tgz", + "integrity": "sha512-ydJpB8CX8cZ/VE+KMaYaFcZ6+o2LruM6NG76VXdflYTgluvVemz1lW4anE+pyBbLvxJHZdvD1Jy/fOqdzAEJog==", + "dev": true + }, + "macos-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", + "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "dev": true + }, + "magic-string": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", + "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "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" }, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", + "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "es6-promisify": "^5.0.0" } }, - "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==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "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" - } - } + "ms": "^2.1.1" } }, - "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "agent-base": "^4.1.0", + "debug": "^3.1.0" } }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "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 - }, - "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" - } - } - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "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-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-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-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "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 - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "opn": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", - "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - } - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "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.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "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 - }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", - "dev": true, - "requires": { - "readable-stream": "~1.0.2", - "semver": "~4.3.3" - }, - "dependencies": { - "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" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "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 - } - } - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^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 - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "lunr": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.6.tgz", - "integrity": "sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q==", - "dev": true - }, - "macos-release": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", - "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", - "dev": true - }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "^0.2.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" - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "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-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", - "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", - "dev": true - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "dev": true, - "requires": { - "mime-db": "~1.38.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 - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "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.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", - "dev": true, - "requires": { - "basic-auth": "~2.0.0", - "debug": "2.6.9", - "depd": "~1.1.2", - "on-finished": "~2.3.0", - "on-headers": "~1.0.1" - } - }, - "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=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "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 - }, - "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 - } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "ng-packagr": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-2.4.5.tgz", - "integrity": "sha512-1SnzFGIM2urn0fFp2aP9+fv5xs1HyhiDwwHbowZIBlPQ+gVRuhVNLTM3L21URDakDt3+rO9D+DipyyvRWnBRLw==", - "dev": true, - "requires": { - "@ngtools/json-schema": "^1.1.0", - "autoprefixer": "^7.1.1", - "browserslist": "^2.1.5", - "chalk": "^2.3.1", - "commander": "^2.12.0", - "cpx": "^1.5.0", - "fs-extra": "^5.0.0", - "glob": "^7.1.2", - "injection-js": "^2.2.1", - "less": "^2.7.2", - "node-sass": "^4.5.3", - "node-sass-tilde-importer": "^1.0.0", - "postcss": "^6.0.2", - "postcss-clean": "^1.1.0", - "postcss-url": "^7.3.0", - "read-pkg-up": "^3.0.0", - "rimraf": "^2.6.1", - "rollup": "^0.55.0", - "rollup-plugin-cleanup": "^2.0.0", - "rollup-plugin-commonjs": "8.3.0", - "rollup-plugin-license": "^0.6.0", - "rollup-plugin-node-resolve": "^3.0.0", - "rxjs": "^5.5.0", - "sorcery": "^0.10.0", - "strip-bom": "^3.0.0", - "stylus": "^0.54.5", - "tar": "^4.4.1", - "uglify-js": "^3.3.20", - "update-notifier": "^2.3.0" - }, - "dependencies": { - "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" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.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 - }, - "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" - } - }, - "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" - } - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.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 - }, - "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" - } - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": 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" - } - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "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.6.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", - "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", - "dev": true - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "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 - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "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" - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.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.11.0", - "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-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.2.tgz", - "integrity": "sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg==", - "dev": true - }, - "node-sass": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", - "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.10.0", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "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 - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "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" - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "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" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "node-sass-tilde-importer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", - "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", - "dev": true, - "requires": { - "find-parent-dir": "^0.3.0" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "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" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "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" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "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 - }, - "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, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "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" - } - }, - "opencollective": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", - "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", - "dev": true, - "requires": { - "babel-polyfill": "6.23.0", - "chalk": "1.1.3", - "inquirer": "3.0.6", - "minimist": "1.2.0", - "node-fetch": "1.6.3", - "opn": "4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "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" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "dev": true, - "requires": { - "is-wsl": "^1.1.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" - } - }, - "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" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "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 - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^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-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-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "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 - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "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" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "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": "*" - } - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.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=", - "dev": true - }, - "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==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "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" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "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" - } - }, - "pdfkit": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/pdfkit/-/pdfkit-0.9.0.tgz", - "integrity": "sha512-j/tJvvoEM7qMiOfodNkz6XRNBvAhVohWP1mUvgg+Xy8X8S3aMBpVGXJGZWNCoCUH2ywLidZSbHyn5mJaqv9umw==", - "dev": true, - "requires": { - "crypto-js": "^3.1.9-1", - "fontkit": "^1.0.0", - "linebreak": "^0.3.0", - "png-js": ">=0.1.0", - "saslprep": "1.0.1" - } - }, - "pdfmake": { - "version": "0.1.54", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.54.tgz", - "integrity": "sha512-HO2FX+czmO+8LpWXQMFQfdUCCKnqwSvSEJExGkUKfsV34DRIV5PZjNg0xWS7ypGrnTY6RTTssWpdreX/pbyeyw==", - "dev": true, - "requires": { - "iconv-lite": "^0.4.24", - "linebreak": "^0.3.0", - "pdfkit": "^0.9.0" - }, - "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" - } - } - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "png-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", - "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=", - "dev": true - }, - "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", - "dev": true, - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "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": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "postcss-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-clean/-/postcss-clean-1.1.0.tgz", - "integrity": "sha512-83g3GqMbCM5NL6MlbbPLJ/m2NrUepBF44MoDk4Gt04QGXeXKh9+ilQa0DzLnYnvqYHQCw83nckuEzBFr2muwbg==", - "dev": true, - "requires": { - "clean-css": "^4.x", - "postcss": "^6.x" - } - }, - "postcss-import": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", - "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", - "dev": true, - "requires": { - "postcss": "^6.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", - "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^0.4.0" - } - }, - "postcss-url": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", - "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", - "dev": true, - "requires": { - "mime": "^1.4.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.0", - "postcss": "^6.0.1", - "xxhashjs": "^0.2.1" - } - }, - "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 - }, - "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 - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "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" - } - }, - "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==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "protractor": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", - "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", - "dev": true, - "requires": { - "@types/node": "^6.0.46", - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "~2.53.39", - "blocking-proxy": "0.0.5", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "^2.5.3", - "jasminewd2": "^2.1.0", - "optimist": "~0.6.0", - "q": "1.4.1", - "saucelabs": "~1.3.0", - "selenium-webdriver": "3.0.1", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "^1.0.0", - "webdriver-manager": "^12.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "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 - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "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" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "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" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "webdriver-manager": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz", - "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - } - } - } - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "proxy-middleware": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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==", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", - "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "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 - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": 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", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "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" - } - } - } - }, - "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-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" - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "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" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "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-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "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 - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "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" - } - }, - "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-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" - } - }, - "restructure": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", - "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", - "dev": true, - "requires": { - "browserify-optional": "^1.0.0" - } - }, - "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 - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "0.55.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.5.tgz", - "integrity": "sha512-2hke9NOy332kxvnmMQOgl7DHm94zihNyYJNd8ZLWo4U0EjFvjUkeWa0+ge+70bTg+mY0xJ7NUsf5kIhDtrGrtA==", - "dev": true - }, - "rollup-plugin-cleanup": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-2.0.1.tgz", - "integrity": "sha512-Z2UpMe3l2Oo8jzoB2gAWcb3UqIyiGxlh8kKlcs/W53yTPtwdF8RGfhuTx+/kjRlkSc5TC03t3sX3Lj3B40k9Eg==", - "dev": true, - "requires": { - "acorn": "4.x", - "magic-string": "^0.22.4", - "rollup-pluginutils": "^2.0.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "rollup-plugin-commonjs": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.3.0.tgz", - "integrity": "sha512-PYs3OiYgENFYEmI3vOEm5nrp3eY90YZqd5vGmQqeXmhJsAWFIrFdROCvOasqJ1HgeTvqyYo9IGXnFDyoboNcgQ==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "estree-walker": "^0.5.0", - "magic-string": "^0.22.4", - "resolve": "^1.4.0", - "rollup-pluginutils": "^2.0.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", - "dev": true - } - } - }, - "rollup-plugin-license": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-0.6.0.tgz", - "integrity": "sha512-Ttz65oRtNKcfV5icDkQTixc8ja64ueoXejRJoAtmjXYAWVg0qx+tu5rXmEOXWXmUXeGs0ARUVIAG0p1JK0gACQ==", - "dev": true, - "requires": { - "commenting": "1.0.5", - "lodash": "4.17.5", - "magic-string": "0.22.4", - "mkdirp": "0.5.1", - "moment": "2.21.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "magic-string": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", - "dev": true, - "requires": { - "vlq": "^0.2.1" - } - }, - "moment": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", - "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==", - "dev": true - } - } - }, - "rollup-plugin-node-resolve": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", - "dev": true, - "requires": { - "builtin-modules": "^2.0.0", - "is-module": "^1.0.0", - "resolve": "^1.1.6" - } - }, - "rollup-pluginutils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz", - "integrity": "sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "micromatch": "^3.1.10" - }, - "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" - } - } - } - }, - "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-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" - } } } }, - "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" - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "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": { - "symbol-observable": "1.0.1" + "p-defer": "^1.0.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==", + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", "dev": true }, - "sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", + "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": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" + "object-visit": "^1.0.0" } }, - "saslprep": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.1.tgz", - "integrity": "sha512-ntN6SbE3hRqd45PKKadRPgA+xHPWg5lPSj2JWJdJvjTwXDDfkPVtXWvP8jJojvnm+rAsZ2b299C5NwZqq818EA==", + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - } - }, - "sass-loader": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", - "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" - } - }, - "saucelabs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", - "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", - "dev": true, - "requires": { - "https-proxy-agent": "^1.0.0" - } - }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "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 } } }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selenium-webdriver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", - "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "adm-zip": "^0.4.7", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" + "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": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~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 } } }, - "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", - "dev": true, - "requires": { - "node-forge": "0.7.5" - } + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "semver": "^5.0.3" + "mime-db": "~1.38.0" } }, - "semver-dsl": { + "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 + }, + "mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - } + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "semver": "^5.0.0" + "brace-expansion": "^1.1.7" } }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" }, "dependencies": { - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } }, - "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "minipass": "^2.2.1" } }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, - "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-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.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=", + "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-extendable": "^0.1.0" + "is-plain-object": "^2.0.4" } } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "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 - } + "minimist": "0.0.8" } }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", - "dev": true + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" } }, - "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 - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "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": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" + "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" } }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "silent-error": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.1.tgz", - "integrity": "sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==", + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "debug": "^2.2.0" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" } }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "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": { - "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" - } - } - } + "optional": true }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "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": { - "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" - } + "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 }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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": { @@ -11966,453 +6146,353 @@ } } }, - "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" - } + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ng-packagr": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.3.0.tgz", + "integrity": "sha512-i+964lzZC7VVzatDCLDZndiXTog1XGozY7K1Bs78+uBF8O1YHNQP9wB9C5fR4uEaSKVhCWEBYekoS69flCugMA==", "dev": true, - "optional": true, "requires": { - "hoek": "2.x.x" - } - }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" + "@ngtools/json-schema": "^1.1.0", + "autoprefixer": "^9.6.0", + "browserslist": "^4.0.0", + "chalk": "^2.3.1", + "chokidar": "^3.0.0", + "clean-css": "^4.1.11", + "commander": "^2.12.0", + "fs-extra": "^8.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.8.0", + "less-plugin-npm-import": "^2.1.0", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^7.0.0", + "postcss-url": "^8.0.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^2.6.1", + "rollup": "^1.12.1", + "rollup-plugin-commonjs": "^10.0.0", + "rollup-plugin-json": "^4.0.0", + "rollup-plugin-node-resolve": "^5.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rxjs": "^6.0.0", + "sass": "^1.17.3", + "stylus": "^0.54.5", + "terser": "^4.0.0", + "update-notifier": "^3.0.0" }, "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "anymatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.2.tgz", + "integrity": "sha512-rUe9SxpRQlVg4EM8It7JMNWWYHAirTPpbTuvaSKybb5IejNgWB3PGBBX9rrPKDx2pM/p3Wh+7+ASaWRyyAbxmQ==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "ms": "0.7.2" + "fill-range": "^7.0.1" } }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "chokidar": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.1.tgz", + "integrity": "sha512-2ww34sJWehnbpV0Q4k4V5Hh7juo7po6z7LUWkcIQnSGN1lHOL8GGtLtfwabKvLFQw/hbSUQ0u6V7OgGYgBzlkQ==", "dev": true, "requires": { - "ms": "0.7.2" + "anymatch": "^3.0.1", + "async-each": "^1.0.3", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.0.2" } }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "fs-extra": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", + "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", "dev": true, "requires": { - "ms": "0.7.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "dev": true, + "optional": true }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", "dev": true, "requires": { - "ms": "0.7.1" + "is-glob": "^4.0.1" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, - "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + }, + "readdirp": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.0.2.tgz", + "integrity": "sha512-LbyJYv48eywrhOlScq16H/VkCiGKGPC2TpOdZCJ7QXnYEjn3NN/Oblh8QEU3vqfSRBB7OGvh5x45NKiVeNujIQ==", "dev": true, "requires": { - "websocket-driver": ">=0.5.1" + "picomatch": "^2.0.4" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" } } } }, - "sorcery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", - "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0", - "sourcemap-codec": "^1.3.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "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==", + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "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" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" } }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "node-releases": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz", + "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==", "dev": true, "requires": { - "source-map": "^0.5.6" + "semver": "^5.3.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 - }, - "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "find-parent-dir": "^0.3.0" } }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", "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==", + "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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "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 }, - "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "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" - } - }, - "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 - } - } + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "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" - } - }, - "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 - }, - "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" - } - } - } + "normalize-url": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", + "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "dev": true + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", "dev": true, "requires": { - "through": "2" + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" } }, - "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==", + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", "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" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "npm-registry-fetch": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz", + "integrity": "sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "npm-package-arg": "^6.1.0" } }, - "static-eval": { + "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "escodegen": "^1.8.1" + "path-key": "^2.0.0" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "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 + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { + "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -12426,490 +6506,740 @@ } } }, - "static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", + "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": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" + "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 + } } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "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": { - "readable-stream": "^2.0.1" + "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 + } } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "ee-first": "1.1.1" } }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "duplexer": "~0.1.1" + "wrappy": "1" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "mimic-fn": "^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==", + "open": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.2.0.tgz", + "integrity": "sha512-Vxf6HJkwrqmvh9UAID3MnMYXntbTxKLOSfOnO7LJdzPf3NE3KQYFNV0/Lcz2VAndbRFil58XVCyh8tiX11fiYw==", "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" + "is-wsl": "^1.1.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 - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-wsl": "^1.1.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true, - "optional": true + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "os-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "macos-release": "^1.0.0", + "win-release": "^1.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "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 + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "strip-eof": { + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-defer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "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": "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": { - "get-stdin": "^4.0.1" + "p-try": "^2.0.0" } }, - "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=", + "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 }, - "style-loader": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "package-json": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.4.0.tgz", + "integrity": "sha512-bd1T8OBG7hcvMd9c/udgv6u5v9wISP3Oyl9Cm7Weop8EFwrtcQDnS2sb6zhwqus2WslSr5wSTIPiTTpxxmPm7Q==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^3.4.0", + "registry-url": "^5.0.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + } + } + }, + "pacote": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.0.tgz", + "integrity": "sha512-aUplXozRbzhaJO48FaaeClmN+2Mwt741MC6M3bevIGZwdCaP7frXzbUOfOWa91FPHoLITzG0hYaKY363lxO3bg==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "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": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "pump": "^3.0.0" } }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "^5.0.0" - } - } - } - }, - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", - "dev": true, - "requires": { - "css-parse": "1.7.x", - "debug": "*", - "glob": "7.0.x", - "mkdirp": "0.5.x", - "sax": "0.5.x", - "source-map": "0.1.x" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "yallist": "^3.0.2" } }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "tar": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true } } }, - "stylus-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", - "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "lodash.clonedeep": "^4.5.0", - "when": "~3.6.x" - } + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "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": { - "minimist": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": { - "has-flag": "^2.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "symbol-observable": { + "parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, - "tapable": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", - "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", - "dev": true + "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": "*" + } }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "better-assert": "~1.0.0" } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "execa": "^0.7.0" + "better-assert": "~1.0.0" } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "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=", + "dev": true + }, + "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==", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "through": "~2.3" } }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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" + } + }, + "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 }, - "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==", + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } } }, - "tiny-inflate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.2.tgz", - "integrity": "sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c=", + "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 }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "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==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, + "optional": true, "requires": { - "os-tmpdir": "~1.0.2" + "asap": "~2.0.3" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { + "promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "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=", + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "err-code": "^1.0.0", + "retry": "^0.10.0" } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "genfun": "^5.0.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=", + "protractor": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.5.tgz", + "integrity": "sha512-f1apDjMpZ8SHlXtXGzqBxOjV+WQcDRz5PN7pWScgjXS7vhUIFcM3V89Shetf4A04n8DDR2MxiVQq6JproFcRZw==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" } } } }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", "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==", + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "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, - "optional": true, "requires": { - "punycode": "^1.4.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, - "optional": true + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } } } }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { - "glob": "^7.1.2" + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "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" + } + } } }, - "ts-node": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", - "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "arrify": "^1.0.0", - "chalk": "^2.0.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", + "deep-extend": "^0.6.0", + "ini": "~1.3.0", "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.0", - "tsconfig": "^6.0.0", - "v8flags": "^3.0.0", - "yn": "^2.0.0" + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -12920,974 +7250,1039 @@ } } }, - "ts-simple-ast": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-12.4.0.tgz", - "integrity": "sha512-7GJFZlyTZY7uMAEhX62ZLxdwOpGDJzc/nwpi1nRPZ7N2ICcqqrMjDtRnki15IUBv2ZjIGu6KBqk/pUqJFODFsg==", + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.2.tgz", + "integrity": "sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "read-pkg": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", + "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^4.0.0", + "type-fest": "^0.4.1" + } + }, + "read-pkg-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", + "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^5.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "@dsherret/to-absolute-glob": "^2.0.2", - "code-block-writer": "^7.2.0", - "fs-extra": "^6.0.1", - "glob-parent": "^3.1.0", - "globby": "^8.0.1", - "is-negated-glob": "^1.0.0", - "multimatch": "^2.1.0", - "object-assign": "^4.1.1", - "tslib": "^1.9.0", - "typescript": "2.9.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "dependencies": { - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "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": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "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" + } + } } }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "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 + } } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "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" + } + } } }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "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": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "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-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-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "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": { - "is-extglob": "^2.1.0" + "kind-of": "^6.0.0" } }, - "typescript": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", - "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", - "dev": true - } - } - }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tsickle": { - "version": "0.27.5", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", - "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", - "dev": true, - "requires": { - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0", - "source-map-support": "^0.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "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" + } }, - "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 + "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" + } }, - "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==", + "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": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "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" + } + } } - } - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", - "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "diff": "^3.2.0", - "glob": "^7.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.7.1", - "tsutils": "^2.8.1" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.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-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "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-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "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==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "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==", + "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 }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" + "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" } } } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "unicode-properties": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.1.0.tgz", - "integrity": "sha1-epbu9J91aC6mnSMV7smsQ//fAME=", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "brfs": "^1.4.0", - "unicode-trie": "^0.3.0" + "resolve": "^1.1.6" } }, - "unicode-trie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", - "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=", + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "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": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - }, - "dependencies": { - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - } + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "union-value": { + "regexpu-core": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "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" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { - "unique-slug": "^2.0.0" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "rc": "^1.2.8" } }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "crypto-random-string": "^1.0.0" + "jsesc": "~0.5.0" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "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 }, - "unix-crypt-td-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", - "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=", + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "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 }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "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=", + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "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 }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "path-parse": "^1.0.6" } }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "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 }, - "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==", + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, "requires": { - "punycode": "^2.1.0" + "lowercase-keys": "^1.0.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "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 + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "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" + } + }, + "rollup": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.15.6.tgz", + "integrity": "sha512-s3Vn3QJQ5YVFfIG4nXoG9VdL1I37IZsft+4ZyeBhxE0df1kCFz9e+4bEAbR4mKH3pvBO9e9xjdxWPhhIp0r9ow==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "@types/estree": "0.0.39", + "@types/node": "^12.0.8", + "acorn": "^6.1.1" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "@types/node": { + "version": "12.0.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.8.tgz", + "integrity": "sha512-b8bbUOTwzIY3V5vDTY1fIJ+ePKDUBqt2hC2woVGotdQQhG/2Sh62HOKHrT7ab+VerXAcPyAiTEipPu/FsreUtg==", "dev": true } } }, - "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "rollup-plugin-commonjs": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.0.tgz", + "integrity": "sha512-B8MoX5GRpj3kW4+YaFO/di2JsZkBxNjVmZ9LWjUoTAjq8N9wc7HObMXPsrvolVV9JXVtYSscflXM14A19dXPNQ==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "estree-walker": "^0.6.0", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.10.1", + "rollup-pluginutils": "^2.7.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", "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" + "path-parse": "^1.0.6" } - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + } + } + }, + "rollup-plugin-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", + "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.5.0" + } + }, + "rollup-plugin-node-resolve": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.0.3.tgz", + "integrity": "sha512-Mhhmf0x493xgUPEsRELnU1VM+4+WO82knWkAbZ0d2DvZQZJMbhzyQK/hqtpVscoRru1EqlK3TM1kK9ro469wPw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.0" + }, + "dependencies": { + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", "dev": true, "requires": { - "ajv": "^5.0.0" + "path-parse": "^1.0.6" } } } }, - "url-parse": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.6.tgz", - "integrity": "sha512-/B8AD9iQ01seoXmXf9z/MjLZQIdOoYl/+gvsQF6+mpnxaTfG9P7srYaiqaDMyKkR36XMXfhqSHss5MyFAO8lew==", + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", "dev": true, "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" } }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "rollup-pluginutils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", "dev": true, "requires": { - "prepend-http": "^1.0.1" + "estree-walker": "^0.6.1" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "useragent": { + "run-async": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" + "is-promise": "^2.1.0" } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "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": { - "inherits": "2.0.3" + "aproba": "^1.1.1" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "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" + } }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "v8flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", - "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", + "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": { - "homedir-polyfill": "^1.0.1" + "ret": "~0.1.10" } }, - "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==", + "safefs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.1.0.tgz", + "integrity": "sha1-+CrrS9165R9lPrIPZyizBYyNZEU=", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "editions": "^1.1.1", + "graceful-fs": "^4.1.4" } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "sass": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.21.0.tgz", + "integrity": "sha512-67hIIOZZtarbhI2aSgKBPDUgn+VqetduKoD+ZSYeIWg+ksNioTzeX+R2gUdebDoolvKNsQ/GY9NDxctbXluTNA==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "viz.js": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", - "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", - "dev": true - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true + "chokidar": "^2.0.0" + } }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, "requires": { - "indexof": "0.0.1" + "https-proxy-agent": "^2.2.1" } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "scandirectory": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", + "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=", "dev": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "ignorefs": "^1.0.0", + "safefs": "^3.1.2", + "taskgroup": "^4.0.5" }, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "safefs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", + "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "graceful-fs": "*" } }, - "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==", + "taskgroup": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", + "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=", "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" - } - } + "ambi": "^2.2.0", + "csextends": "^1.0.3" } - }, - "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + } + } + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "os-tmpdir": "~1.0.1" } - }, - "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 - } + } + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "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 + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "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.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "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": { - "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-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=", + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "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 + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "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": { - "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-descriptor": "^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=", + "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-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-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": { @@ -13919,942 +8314,1330 @@ "kind-of": "^6.0.2" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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" + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "ms": "2.0.0" } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "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" - } - } + "ms": "2.0.0" } }, - "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==", + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + } + } + }, + "socks": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "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" + "es6-promisify": "^5.0.0" } - }, - "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 } } }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.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": { - "minimalistic-assert": "^1.0.0" + "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" } }, - "webdriver-js-extender": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", - "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "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": { - "@types/selenium-webdriver": "^2.53.35", - "selenium-webdriver": "^2.53.2" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { - "adm-zip": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", - "dev": true - }, - "sax": { + "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "selenium-webdriver": { - "version": "2.53.3", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", - "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", - "dev": true, - "requires": { - "adm-zip": "0.4.4", - "rimraf": "^2.2.8", - "tmp": "0.0.24", - "ws": "^1.0.1", - "xml2js": "0.4.4" - } - }, - "tmp": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", - "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + } + } + }, + "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 + }, + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "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.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true - }, - "xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + } + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "sax": "0.6.x", - "xmlbuilder": ">=1.0.0" + "is-descriptor": "^0.1.0" } } } }, - "webpack": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", + "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", "dev": true, "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11" }, "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 - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "ms": "^2.1.1" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "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" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.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": { - "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 - }, - "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" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "jsonfile": "^4.0.0", + "universalify": "^0.1.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=", + "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 - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^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": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "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" - } - } - } - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } } } }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "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": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", - "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^2.1.2", - "compression": "^1.7.3", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "^0.19.1", - "import-local": "^1.0.0", - "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "^4.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "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 + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" }, "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "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==", + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "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" + } + }, + "taskgroup": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-5.3.0.tgz", + "integrity": "sha512-++j3Yi3XZGYgAvmGzRtNa+BnDvkPbdroyMffCY+Gj9A4iH2IJ1S7/g6LewGVXQkVw/KOzlfE1TimARYXvOEsgQ==", + "dev": true, + "requires": { + "ambi": "^3.0.0", + "eachr": "^3.2.0", + "editions": "^1.3.4", + "extendr": "^3.2.2", + "unbounded": "^1.1.0" + }, + "dependencies": { + "ambi": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ambi/-/ambi-3.2.0.tgz", + "integrity": "sha512-nj5sHLPFd7u2OLmHdFs4DHt3gK6edpNw35hTRIKyI/Vd2Th5e4io50rw1lhmCdUNO2Mm4/4FkHmv6shEANAWcw==", "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" + "editions": "^2.1.0", + "typechecker": "^4.3.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "editions": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", + "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "errlop": "^1.1.1", + "semver": "^5.6.0" } } } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "terser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", + "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "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 }, - "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "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 + } + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "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" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "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": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "kind-of": "^3.0.2" } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "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 + } + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-simple-ast": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-6.12.0.tgz", + "integrity": "sha1-vSMtf8fj8f8SEYJVTeHkIW+SWC4=", + "dev": true, + "requires": { + "code-block-writer": "^6.2.0", + "globby": "^6.1.0", + "multimatch": "^2.1.0", + "object-assign": "^4.1.1", + "typescript": "^2.4.x" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tslint": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.17.0.tgz", + "integrity": "sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "ms": "^2.1.1" - }, - "dependencies": { - "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 - } + "mime-db": "1.40.0" } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + } + } + }, + "typechecker": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz", + "integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==", + "dev": true, + "requires": { + "editions": "^2.1.0" + }, + "dependencies": { + "editions": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", + "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", "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" - } - }, - "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 - } + "errlop": "^1.1.1", + "semver": "^5.6.0" } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.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, - "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" - } - } - } + "optional": true }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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, - "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=", + "optional": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unbounded": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unbounded/-/unbounded-1.2.0.tgz", + "integrity": "sha512-D/ENuBtxxwhxEiSXHgHwM/UXsDRuXz7JwqBQ54zrbaqmbmSWPvsGMzslr5mEftsDo1KOfl7vEIXGCamWBlAT6Q==", + "dev": true, + "requires": { + "editions": "^2.1.3" + }, + "dependencies": { + "editions": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", + "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", "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" - } - } + "errlop": "^1.1.1", + "semver": "^5.6.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 - }, - "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==", + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "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": { - "kind-of": "^6.0.0" + "is-extendable": "^0.1.0" } }, - "is-data-descriptor": { + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "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 + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ms": "^2.1.1" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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": { - "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" - } - } + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "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" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unix-crypt-td-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", + "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "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" + } + } } }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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 }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, - "webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "update-notifier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.0.tgz", + "integrity": "sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg==", "dev": true, "requires": { - "lodash": "^4.17.5" + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "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-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "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 + }, + "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" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, - "webpack-subresource-integrity": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.2.tgz", - "integrity": "sha512-VpBtk0Ha1W0GebTzPj3Y8UqbmPDp+HqGlegRv+hS8g8/x818dw9NuEfJEOp5CF6zTPs3KF6aqknVu52Bh5h1eQ==", + "viz.js": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", + "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.6.0.tgz", + "integrity": "sha1-51xCOxC+eSZ6DD73bi6hBP4CZ6U=", + "dev": true, + "requires": { + "eachr": "^3.2.0", + "extendr": "^3.2.2", + "extract-opts": "^3.3.1", + "ignorefs": "^1.1.1", + "safefs": "^4.1.0", + "scandirectory": "^2.5.0", + "taskgroup": "^5.0.1", + "typechecker": "^4.3.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "dev": true, "requires": { - "webpack-sources": "^1.3.0" + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" } }, "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0", + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -14864,12 +9647,6 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -14879,21 +9656,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", @@ -14936,85 +9698,21 @@ } } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "windows-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", - "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", "dev": true, "requires": { - "execa": "^1.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - } + "semver": "^5.0.1" } }, "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "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" - } - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -15032,9 +9730,9 @@ "dev": true }, "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -15043,21 +9741,16 @@ } }, "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", @@ -15089,9 +9782,9 @@ "dev": true }, "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, "xtend": { @@ -15121,74 +9814,16 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "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-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, "zone.js": { - "version": "0.8.29", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", - "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==", "dev": true } } diff --git a/package.json b/package.json index 8ce902f..1b61993 100644 --- a/package.json +++ b/package.json @@ -25,41 +25,40 @@ "serve-docs": "node_modules/.bin/compodoc -s -d docs" }, "dependencies": { - "moment": "^2.21.0" + "moment": "^2.24.0" }, "devDependencies": { - "@angular/animations": "^5.2.0", - "@angular/cli": "^1.7.0", - "@angular/common": "^5.2.0", - "@angular/compiler": "^5.2.0", - "@angular/compiler-cli": "^5.2.0", - "@angular/core": "^5.2.0", - "@angular/forms": "^5.2.0", + "@angular/animations": "^8.0.2", + "@angular/cli": "^8.0.3", + "@angular/common": "^8.0.2", + "@angular/compiler": "^8.0.2", + "@angular/compiler-cli": "^8.0.2", + "@angular/core": "^8.0.2", + "@angular/forms": "^8.0.2", "@angular/http": "^5.2.0", - "@angular/language-service": "^5.2.0", - "@angular/platform-browser": "^5.2.0", - "@angular/platform-browser-dynamic": "^5.2.0", - "@angular/router": "^5.2.0", - "@compodoc/compodoc": "^1.0.8", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", + "@angular/language-service": "^8.0.2", + "@angular/platform-browser": "^8.0.2", + "@angular/platform-browser-dynamic": "^8.0.2", + "@angular/router": "^8.0.2", + "@compodoc/compodoc": "~1.0.8", + "@types/jasmine": "~3.3.13", + "@types/jasminewd2": "~2.0.6", "@types/node": "~6.0.60", - "codelyzer": "^4.0.1", - "core-js": "^2.4.1", - "jasmine-core": "~2.6.2", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", - "karma-chrome-launcher": "~2.1.1", + "codelyzer": "^5.1.0", + "core-js": "^3.1.4", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.2.1", - "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "ng-packagr": "^2.0.0", - "protractor": "~5.1.2", - "rxjs": "^5.5.6", - "ts-node": "~3.2.0", - "tslint": "~5.7.0", - "typescript": "~2.4.2", - "zone.js": "^0.8.14" + "karma-coverage-istanbul-reporter": "^2.0.5", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.2", + "ng-packagr": "^5.3.0", + "protractor": "~5.4.2", + "rxjs": "^6.5.2", + "tslint": "~5.17.0", + "typescript": "~3.4.5", + "zone.js": "^0.9.1" } } diff --git a/src/webglimpse/core.ts b/src/webglimpse/core.ts index 3ce48b5..d1d432e 100644 --- a/src/webglimpse/core.ts +++ b/src/webglimpse/core.ts @@ -400,10 +400,10 @@ function jMouse(element: HTMLElement, ev: MouseEvent): number { } -function mouseWheelSteps(ev: MouseWheelEvent): number { - // Firefox puts the scroll amount in the 'detail' field; everybody else puts it in 'wheelDelta' +function mouseWheelSteps(ev: WheelEvent): number { + // MouseWheelEvent.wheelDelta is deprecated, use WheelEvent.deltaY instead. // Firefox uses positive values for a downward scroll; everybody else uses positive for upward - const raw = (ev.wheelDelta !== undefined ? ev.wheelDelta : -ev.detail); + const raw = (ev.deltaY !== undefined ? ev.deltaY : -ev.detail); if (raw > 0) { return -1; } if (raw < 0) { return +1; } return 0; @@ -672,8 +672,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { } - // Firefox uses event type 'DOMMouseScroll' for mouse-wheel events; everybody else uses 'mousewheel' - const handleMouseWheel = function (ev: MouseWheelEvent) { + const handleMouseWheel = function (ev: WheelEvent) { const i = iMouse(element, ev); const j = jMouse(element, ev); @@ -696,8 +695,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { currentPanes[n].fireMouseWheel(i, j, wheelSteps, ev); } }; - element.addEventListener('mousewheel', handleMouseWheel); - element.addEventListener('DOMMouseScroll', handleMouseWheel, false); + element.addEventListener('wheel', handleMouseWheel); element.addEventListener('contextmenu', function (ev: MouseEvent) { const i = iMouse(element, ev); @@ -783,6 +781,3 @@ export function newDrawable(canvas: HTMLCanvasElement): Drawable { } }; } - - - diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6f300c5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom" + ] + } +} From ef8fc510cdb6851637f62256773ba1cf920f3748 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 19 Jun 2019 15:36:51 -0700 Subject: [PATCH 37/69] [v2.x] Update version to 2.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1b61993..8e52246 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.1.1", + "version": "2.2.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 1b80b23119b45d2b82165f5af9689b4d9a82fbd3 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 19 Jun 2019 15:39:13 -0700 Subject: [PATCH 38/69] [v2.x] Accidently commited dist.tgz and update package-lock version --- dist.tgz | Bin 1080052 -> 0 bytes package-lock.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 dist.tgz diff --git a/dist.tgz b/dist.tgz deleted file mode 100644 index f32c855699e9ebcb44a1d0c61ccc5767b947a15e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080052 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

    id7HU4-xGA0LMAM#pe$y#^U-amEbmuRCT{f88mQ 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%0AiPzZK6L{xxfR3IDhiZ0=kbiV-MpN4;ljee zuf*c*i_oe`r}H}uH>H!3n5UxF4t3d-0mX)rbyzf0;xANv9aqOLlS%`i_D@@odR zu(6lscNeo?nW~8NR8z=iTZGTB90hsqVBqhb{_tg6q2xV}<6e1P9RjWvk%e5WJQLse z9{P-Jx^dTU+;Q447*eaZs-^i5JXRmRxmGB#Dv5c?cQdP7yGoFV3SnKLiJI#%QRt}dsponl)F>M zszS~E{!kI$?`_2Y0TKUouTU50)-ibAtk(rV5}Z^$)FsJcaUPkAUjcCFN{e0DvMtmk zoK?nl=`r=_`_Kxvvx~OBqavQX{^pIcc^%bMdia@wibNWovkvLfBhzzFdGrY9d8z-7 zvyTIvtcr|1q~E{eGRtd_Y;AWlM%eWGPfiq!%0afP9|pdPYKGzgH18fOuaaD=AE`rS(}Y1q%wrT{XM0y5EjapAJQ2a5binp19)d)B z+#K2p6rQ0SX;2Uv_ecYq|Z2q17x1;a>>9LM8IXHzGpg6)V-k8 zfthukSVIt+B+D$Aa2Im6Xp%IuV3eMcvljVJU3bsPlx6fTjr|9#ZpBTXS_e-22((VH z>h}Oe;MQ)J2-4cxzZW)XhdU5PM#BoSK+!cOd?v(a$y?ngZmCp#Q3Pct0#{mW;)5AX za*LU^#P` z+ildApv3~PRtmv3^QhUISw$$p$B8=n#C$R67C`1@D~BM?f%^gh_YVj@#6TuRtK=*= z6`tvMo-}jE7vpt{^te!X6cdf9^KQ6$AiDqtfAltP_qw;+*MgfAWA1Tym&J+!{>X$m zyD!Nuu-)|4$1V!n+g2pu-#LO2evtW5pg7}IabrFHqbLcFb>~zyG^t2*`vg*DIEZ}% zLo0yT)vks`k$=#&ZabqTn`-hC1GqJ?Kn#+8kb54qesFGW&Mf1bC&o}i%LZm5!2u&K z38DFo2Q|ja(>jx24)r3a8#np#^h7Z1JvjQR+{an2XE{y!5);~hiSLe5h(_Q|Dlxya zOcu}HPfiG4(LFa{aS6l|)C6H%y{rmL<2(#jKta@+YBBi@Ycg1WP;T zt4LJ?S`(-7W5-m_wOM!L_f^M{R*Ewl(0Mp5x#b&w2H`Ht;<MV4PRnBX2Xp+`DjcYxorHSc7Qv31w;kkqNW(!CXka$yN+6Q&lMV~j95goeIH#jnm%6W z&9I=QnT2vTD@ky+eqk~&c5DTvU?~1KiK$p|z5je=+1lMf=P=2KLT=Tq{MZ*SpsYig zF0irKikXnSpw@3h`3_YJuW4_!YqUaEZwl;n-u;UvWpqLH?y&#n_`&emX>uS;w;2=a5C3?LV?*Iims05L1IE z(=;_YrBr8`Qk$<&Xtw;fjJu{elw;~?qIODbM>CbVY(-+n%+z31o@Rs=rFOEjwGpvy ztI<4sv;!x{nq&9Ug3H+tB6sMKGQEj*VFENILUMyp_#^1ls)m}xP~=09u39_+hm@B1 zAh>XQ*bWr)q$qDIb*{>dn5HkebY1E$gWfp!F%`hgNRKKsnW@HU5ex7a6BIH?k>N7v zVA28Hg$byq{=HAkBBP|tBhk&9C7`E38nT}ZAxv+`%oHH5#RLvFq7GsQbXr~pX^$S} z6HCre?0hyKaTUWn{i)HvF*@BbXK#Nz^$UX^qaVW@)IU-2FFVO6+GvWc*d-Kp7;`)1GIk5 z)#~Neyc|ym*06RF82D(D=cO&MJ3&eX)R>$sJYt}=RZYq!EwLq%xr_s^pw^zfZo>F1 zg6pw9L`c^?O)rE=@uc4`Rq#@>bM)$q=!J`XEH;p{5ZfvZ`q>l+hMC?NS|yGO&@`8c zVTm|PJq9K|u>7s(rXhf4YQ}F;xINXipK`lGqKPh<*tr|I!25zZEUH}Tmu4eq)7X2^ zxGNbwJvWem^Wq((EICE=C>O+%>+{s^&t7aru-S0R%0D+_t#62#57plhu#js0qcvOF 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

    }4dFM!Kc- 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⩔j%jB3jx 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

      !c16SSK-fPh%L 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 b&-+{7qS<}BZ};uKAMgABloan@0KjYj>gAcI diff --git a/package-lock.json b/package-lock.json index c4cb061..02f876d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.1.1", + "version": "2.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { From 0dede3e320e956f0ef332417be8b9fd4b90ef855 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 8 Nov 2019 13:08:22 -0800 Subject: [PATCH 39/69] [v2.x] Add ability specify whether or not annotations are pickable. --- CHANGELOG | 4 ++++ package-lock.json | 2 +- package.json | 2 +- src/webglimpse/timeline/timeline_model.ts | 15 +++++++++++++++ .../timeline/timeline_timeseries_row.ts | 3 +++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 224aa0d..047916f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Webglimpse 2.2.0 (release 2019-11-8) + +* Added ability to disable picking of timeline annotations. Set `picking` to false. + Webglimpse 2.2.0 (release 2019-6-19) * Added ability to specify custom mouse cursor for TimelineRow and TimelineGroup. diff --git a/package-lock.json b/package-lock.json index 02f876d..33df551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.2.0", + "version": "2.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8e52246..c85d5df 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.2.0", + "version": "2.3.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 5bf61ab..5b0706d 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -57,6 +57,7 @@ export interface TimelineAnnotation { y?: number; label: string; styleGuid: string; + pickable?: boolean; } @@ -283,6 +284,7 @@ export class TimelineAnnotationModel { private _y: number; private _label: string; private _styleGuid: string; + private _pickable: boolean; constructor(annotation: TimelineAnnotation) { this._annotationGuid = annotation.annotationGuid; @@ -351,12 +353,24 @@ export class TimelineAnnotationModel { } } + get pickable(): boolean { + return this._pickable; + } + + set pickable(pickable: boolean) { + if (pickable !== this.pickable) { + this._pickable = pickable; + this._attrsChanged.fire(); + } + } + setAttrs(annotation: TimelineAnnotation) { // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here this._time_PMILLIS = hasval(annotation.time_ISO8601) ? parseTime_PMILLIS(annotation.time_ISO8601) : undefined; this._y = annotation.y; this._label = annotation.label; this._styleGuid = annotation.styleGuid; + this._pickable = hasval(annotation.pickable) ? annotation.pickable : true; this._attrsChanged.fire(); } @@ -367,6 +381,7 @@ export class TimelineAnnotationModel { styleGuid: this._styleGuid, time_ISO8601: formatTime_ISO8601(this._time_PMILLIS), y: this._y, + pickable: this._pickable, }; } } diff --git a/src/webglimpse/timeline/timeline_timeseries_row.ts b/src/webglimpse/timeline/timeline_timeseries_row.ts index ea270fc..4c1a2b2 100644 --- a/src/webglimpse/timeline/timeline_timeseries_row.ts +++ b/src/webglimpse/timeline/timeline_timeseries_row.ts @@ -277,6 +277,9 @@ export function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPa for (let annotationIdx = 0; annotationIdx < row.annotationGuids.length; annotationIdx++) { const annotationGuid: string = row.annotationGuids.valueAt(annotationIdx); const annotation: TimelineAnnotationModel = model.annotation(annotationGuid); + if (!annotation.pickable) { + continue; + } const styleGuid: string = annotation.styleGuid; const style: TimelineAnnotationStyleUi = ui.annotationStyle(styleGuid); From bb9ab5af6746913a6189874a22a1b8f565e9efe4 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 8 Nov 2019 13:09:07 -0800 Subject: [PATCH 40/69] [v2.x] Update version in changelog. --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 047916f..72206a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -Webglimpse 2.2.0 (release 2019-11-8) +Webglimpse 2.3.0 (release 2019-11-8) * Added ability to disable picking of timeline annotations. Set `picking` to false. From 4b61bd16841a77887653ef706990d8e9d3880a6a Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 12 Jun 2020 16:42:46 -0700 Subject: [PATCH 41/69] [add-row-highlight] Initial test of adding row highlight. --- src/webglimpse/timeline/timeline_pane.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 23e6d84..36c6c77 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -1336,6 +1336,16 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false); rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5, undefined, row.truncate)); + //const rowHeaderHighlight = new Pane(newColumnLayout(), false); + const rowHighlight = new Highlight(rgb(1, 0, 0)); + const highlightInnerPane = new Pane(newRowLayout()); + highlightInnerPane.addPainter(rowHighlight.newPainter()); + const insets = newInsets(0, 0, 0, 6); + const width = 4; + const containerWidth = insets ? insets.left + insets.right + width : width; + const highlightPane = newInsetPane(highlightInnerPane, insets); + //rowHeaderHighlight.addPane(highlightPane, 0, { width: containerWidth, height: null }); + const rowLabelBackground = new Background(rowLabelColorBg); const rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true); rowHeaderPane.addPainter(rowLabelBackground.newPainter()); @@ -1355,8 +1365,9 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const rowInsetPane = rowBackgroundPanes.rowInsetPane; const rowPane = new Pane(newColumnLayout()); - rowPane.addPane(rowHeaderPane, 0, { width: options.rowLabelPaneWidth }); - rowPane.addPane(rowBackgroundPane, 1, { width: null }); + rowPane.addPane(highlightPane, 0, { width: containerWidth }); + rowPane.addPane(rowHeaderPane, 1, { width: options.rowLabelPaneWidth }); + rowPane.addPane(rowBackgroundPane, 2, { width: null }); // expose panes in api via TimelineRowUi rowUi.addPane(keyPrefix + '-background', rowBackgroundPane); From d61ec2bc081bd319c509d834337ad269897862e9 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Mon, 15 Jun 2020 13:35:13 -0700 Subject: [PATCH 42/69] [add-row-highlight] Implemented ability to add row highlights. --- src/webglimpse/timeline/timeline_model.ts | 62 ++++++++++++++++++++- src/webglimpse/timeline/timeline_pane.ts | 68 ++++++++++++++--------- 2 files changed, 104 insertions(+), 26 deletions(-) diff --git a/src/webglimpse/timeline/timeline_model.ts b/src/webglimpse/timeline/timeline_model.ts index 5b0706d..eff4ad5 100644 --- a/src/webglimpse/timeline/timeline_model.ts +++ b/src/webglimpse/timeline/timeline_model.ts @@ -162,6 +162,10 @@ export interface TimelineRow { bgLabelColor?: string; labelFont?: string; cursor?: string; + highlighted?: boolean; + highlightColor?: Color; + highlightWidth?: number; + highlightInsets?: Insets; } @@ -1101,6 +1105,10 @@ export class TimelineRowModel { private _dataAxis: Axis1D; private _bgColor: Color; private _cursor: string; + private _highlighted: boolean; + private _highlightColor: Color; + private _highlightWidth: number; + private _highlightInsets: Insets; constructor(row: TimelineRow) { this._rowGuid = row.rowGuid; @@ -1137,6 +1145,10 @@ export class TimelineRowModel { this._bgLabelColor = (hasval(row.bgLabelColor) ? parseCssColor(row.bgLabelColor) : null); this._labelFont = row.labelFont; this._cursor = row.cursor; + this._highlighted = hasval(row.highlighted) ? row.highlighted : false; + this._highlightColor = hasval(row.highlightColor) ? row.highlightColor : parseCssColor('white'); + this._highlightWidth = row.highlightWidth; + this._highlightInsets = row.highlightInsets; this._attrsChanged.fire(); } @@ -1264,6 +1276,50 @@ export class TimelineRowModel { } } + get highlighted(): boolean { + return this._highlighted; + } + + set highlighted(highlighted: boolean) { + if (highlighted !== this._highlighted) { + this._highlighted = highlighted; + this._attrsChanged.fire(); + } + } + + get highlightColor(): Color { + return this._highlightColor; + } + + set highlightColor(highlightColor: Color) { + if (highlightColor !== this._highlightColor) { + this._highlightColor = highlightColor; + this._attrsChanged.fire(); + } + } + + get highlightWidth(): number { + return this._highlightWidth; + } + + set highlightWidth(highlightWidth: number) { + if (highlightWidth !== this._highlightWidth) { + this._highlightWidth = highlightWidth; + this._attrsChanged.fire(); + } + } + + get highlightInsets(): Insets { + return this._highlightInsets; + } + + set highlightInsets(highlightInsets: Insets) { + if (highlightInsets !== this._highlightInsets) { + this._highlightInsets = highlightInsets; + this._attrsChanged.fire(); + } + } + get eventGuids(): OrderedStringSet { return this._eventGuids; } @@ -1292,7 +1348,11 @@ export class TimelineRowModel { bgLabelColor: (hasval(this._bgLabelColor) ? this._bgLabelColor.cssString : null), fgLabelColor: (hasval(this._fgLabelColor) ? this._fgLabelColor.cssString : null), labelFont: this._labelFont, - cursor: this._cursor + cursor: this._cursor, + highlighted: (hasval(this._highlighted) ? this._highlighted : false), + highlightColor: hasval(this.highlightColor) ? this.highlightColor : parseCssColor('white'), + highlightWidth: this._highlightWidth, + highlightInsets: this._highlightInsets }; } } diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index 36c6c77..b9e45ac 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -85,6 +85,7 @@ export interface TimelinePaneOptions { fgColor?: Color; rowLabelColor?: Color; rowLabelBgColor?: Color; + rowHighlightColor?: Color; groupLabelColor?: Color; groupHighlightColor?: Color; axisLabelColor?: Color; @@ -118,6 +119,8 @@ export interface TimelinePaneOptions { rowLabelInsets?: Insets; rowLabelPaneWidth?: number; rowSeparatorHeight?: number; + rowHighlightWidth?: number; + rowHighlightInsets?: Insets; scrollbarWidth?: number; axisPaneHeight?: number; draggableEdgeWidth?: number; @@ -157,6 +160,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: const bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : rgb(0.098, 0.165, 0.243)); const rowLabelColor = (hasval(options) && hasval(options.rowLabelColor) ? options.rowLabelColor : fgColor); const rowLabelBgColor = (hasval(options) && hasval(options.rowLabelBgColor) ? options.rowLabelBgColor : bgColor); + const rowHighlightColor = (hasval(options) && hasval(options.rowHighlightColor) ? options.rowHighlightColor : rgb(1, 0.623, 0)); const groupLabelColor = (hasval(options) && hasval(options.groupLabelColor) ? options.groupLabelColor : fgColor); const groupHighlightColor = (hasval(options) && hasval(options.groupHighlightColor) ? options.groupHighlightColor : rgb(0, 1, 1)); const axisLabelColor = (hasval(options) && hasval(options.axisLabelColor) ? options.axisLabelColor : fgColor); @@ -180,6 +184,8 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: const groupHighlightInsets = (hasval(options) && hasval(options.groupHighlightInsets) ? options.groupHighlightInsets : newInsets(6, 0, 2, 4)); const rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35)); const rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140); + const rowHighlightWidth = (hasval(options) && hasval(options.rowHighlightWidth) ? options.rowHighlightWidth : 2); + const rowHighlightInsets = (hasval(options) && hasval(options.rowHighlightInsets) ? options.rowHighlightInsets : newInsets(1, 0, 2, 8)); const rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2); let scrollbarWidth = (hasval(options) && hasval(options.scrollbarWidth) ? options.scrollbarWidth : 16); scrollbarWidth = showScrollbar ? scrollbarWidth : 0; // if the scrollbar is not showing, set its width to 0 @@ -241,7 +247,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: // Scroll Pane const tickTimeZone = (showTopAxis ? topTimeZone : bottomTimeZone); - const contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, groupHighlightWidth: groupHighlightWidth, groupHighlightInsets: groupHighlightInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; + const contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, rowHighlightColor: rowHighlightColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, groupHighlightWidth: groupHighlightWidth, groupHighlightInsets: groupHighlightInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowHighlightWidth: rowHighlightWidth, rowHighlightInsets: rowHighlightInsets, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener }; let contentPaneArgs; let contentPane: Pane = null; @@ -926,6 +932,9 @@ interface TimelineContentPaneOptions { fgColor: Color; rowLabelColor: Color; rowLabelBgColor: Color; + rowHighlightColor: Color; + rowHighlightWidth: number; + rowHighlightInsets: Insets; groupLabelColor: Color; groupHighlightColor: Color; groupHighlightWidth: number; @@ -1322,7 +1331,7 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const ui = args.ui; const options = args.options; - const rowPanes: StringMap = {}; + const rowContainerPanes: StringMap = {}; const addRow = function (rowGuid: string, rowIndex: number) { const row = model.row(rowGuid); @@ -1336,39 +1345,48 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false); rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5, undefined, row.truncate)); - //const rowHeaderHighlight = new Pane(newColumnLayout(), false); - const rowHighlight = new Highlight(rgb(1, 0, 0)); + const rowHeaderHighlight = new Pane(newColumnLayout(), false); + const rowHighlight = new Highlight(row.highlightColor || options.rowHighlightColor); const highlightInnerPane = new Pane(newRowLayout()); highlightInnerPane.addPainter(rowHighlight.newPainter()); - const insets = newInsets(0, 0, 0, 6); - const width = 4; + const insets = row.highlightInsets || options.rowHighlightInsets; + const width = row.highlightWidth || options.rowHighlightWidth; const containerWidth = insets ? insets.left + insets.right + width : width; const highlightPane = newInsetPane(highlightInnerPane, insets); - //rowHeaderHighlight.addPane(highlightPane, 0, { width: containerWidth, height: null }); + rowHeaderHighlight.addPane(highlightPane, 0, { width: containerWidth, height: null, hide: !row.highlighted }); const rowLabelBackground = new Background(rowLabelColorBg); const rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true); + rowHeaderPane.addPainter(rowLabelBackground.newPainter()); rowHeaderPane.addPane(rowLabelPane); + const rowBackgroundPanes = newRowBackgroundPanes(args, guidList, row); + const rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; + const rowInsetPane = rowBackgroundPanes.rowInsetPane; + + const rowPane = new Pane(newColumnLayout()); + rowPane.addPane(rowHeaderPane, 0, { width: options.rowLabelPaneWidth }); + rowPane.addPane(rowBackgroundPane, 1, { width: null }); + + const rowContainerOverlayPane = new Pane(newOverlayLayout()); + rowContainerOverlayPane.addPane(rowPane, true, { width: null, height: null }); + rowContainerOverlayPane.addPane(rowHeaderHighlight, false, { width: null, height: null }); + const rowAttrsChanged = function () { rowLabel.text = row.label; rowLabel.fgColor = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor; rowLabel.font = hasval(row.labelFont) ? row.labelFont : options.font; rowLabelBackground.color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.bgColor; + + const rowHighlightLayoutOpts = rowHeaderHighlight.layoutOptions(highlightPane); + rowHighlightLayoutOpts.hide = !row.highlighted; + rowHighlight.color = row.highlightColor; + drawable.redraw(); }; row.attrsChanged.on(rowAttrsChanged); - const rowBackgroundPanes = newRowBackgroundPanes(args, guidList, row); - const rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane; - const rowInsetPane = rowBackgroundPanes.rowInsetPane; - - const rowPane = new Pane(newColumnLayout()); - rowPane.addPane(highlightPane, 0, { width: containerWidth }); - rowPane.addPane(rowHeaderPane, 1, { width: options.rowLabelPaneWidth }); - rowPane.addPane(rowBackgroundPane, 2, { width: null }); - // expose panes in api via TimelineRowUi rowUi.addPane(keyPrefix + '-background', rowBackgroundPane); rowUi.addPane(keyPrefix + '-inset', rowInsetPane); @@ -1408,17 +1426,17 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const shift = (isNumber(layoutArg) && layoutArg >= rowIndex); return (shift ? layoutArg + 1 : layoutArg); }); - parentPane.addPane(rowPane, rowIndex); - rowPanes[rowGuid] = rowPane; + parentPane.addPane(rowContainerOverlayPane, rowIndex); + rowContainerPanes[rowGuid] = rowContainerOverlayPane; // Handle hidden property // - parentPane.layoutOptions(rowPane).hide = row.hidden; + parentPane.layoutOptions(rowContainerOverlayPane).hide = row.hidden; drawable.redraw(); - rowPane.dispose.on(function () { + rowContainerOverlayPane.dispose.on(function () { row.attrsChanged.off(rowAttrsChanged); rowUi.paneFactoryChanged.off(refreshRowContentPane); row.attrsChanged.off(refreshRowContentPane); @@ -1441,7 +1459,7 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const nMax = Math.max(rowOldIndex, rowNewIndex); for (let n = nMin; n <= nMax; n++) { const rowGuidTemp = guidList.valueAt(n); - parentPane.setLayoutArg(rowPanes[rowGuidTemp], n); + parentPane.setLayoutArg(rowContainerPanes[rowGuidTemp], n); } drawable.redraw(); @@ -1449,14 +1467,14 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P guidList.valueMoved.on(valueMoved); const removeRow = function (rowGuid: string, rowIndex: number) { - const pane: Pane = rowPanes[rowGuid]; + const pane: Pane = rowContainerPanes[rowGuid]; pane.dispose.fire(); parentPane.removePane(pane); parentPane.updateLayoutArgs(function (layoutArg: any): any { const shift = (isNumber(layoutArg) && layoutArg > rowIndex); return (shift ? layoutArg - 1 : layoutArg); }); - delete rowPanes[rowGuid]; + delete rowContainerPanes[rowGuid]; drawable.redraw(); }; @@ -1470,8 +1488,8 @@ function setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: P const attachAttrsChangedListener = function (rowGuid: string, rowIndex: number) { const row = model.row(rowGuid); const attrsChangedListener = function () { - if (hasval(row.hidden && hasval(rowPanes[rowGuid]))) { - parentPane.layoutOptions(rowPanes[rowGuid]).hide = row.hidden; + if (hasval(row.hidden && hasval(rowContainerPanes[rowGuid]))) { + parentPane.layoutOptions(rowContainerPanes[rowGuid]).hide = row.hidden; drawable.redraw(); } }; From 8d039796ef774db574098a0e314bf10459c671ce Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Wed, 17 Jun 2020 11:38:06 -0700 Subject: [PATCH 43/69] [add-row-highlight] Updated default insets for row highlight. --- src/webglimpse/timeline/timeline_pane.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index b9e45ac..a023c0d 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -185,7 +185,7 @@ export function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: const rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35)); const rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140); const rowHighlightWidth = (hasval(options) && hasval(options.rowHighlightWidth) ? options.rowHighlightWidth : 2); - const rowHighlightInsets = (hasval(options) && hasval(options.rowHighlightInsets) ? options.rowHighlightInsets : newInsets(1, 0, 2, 8)); + const rowHighlightInsets = (hasval(options) && hasval(options.rowHighlightInsets) ? options.rowHighlightInsets : newInsets(1, 0, 2, 10)); const rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2); let scrollbarWidth = (hasval(options) && hasval(options.scrollbarWidth) ? options.scrollbarWidth : 16); scrollbarWidth = showScrollbar ? scrollbarWidth : 0; // if the scrollbar is not showing, set its width to 0 From 0b3ab6d690e6af3c2ade2a4766e7b7167e1b7782 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Thu, 18 Jun 2020 16:51:27 -0700 Subject: [PATCH 44/69] selectedBorderColor will now default to borderColor instead of timelineFgColor if unset. --- src/webglimpse/timeline/timeline_events_row.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/webglimpse/timeline/timeline_events_row.ts b/src/webglimpse/timeline/timeline_events_row.ts index cfaf4ca..22eda56 100644 --- a/src/webglimpse/timeline/timeline_events_row.ts +++ b/src/webglimpse/timeline/timeline_events_row.ts @@ -988,7 +988,7 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); const defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); - const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); + const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : null); const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); const dashLength = (hasval(barOpts) && hasval(barOpts.dashLength) ? barOpts.dashLength : 5); const defaultSecondaryColor = new Color(0, 0, 0, 0); @@ -1165,7 +1165,7 @@ function eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions let borderColor = (event.borderColor || event.bgColor || defaultBorderColor); const borderSecondaryColor = (event.borderSecondaryColor || defaultSecondaryColor); if (selection.selectedEvents.hasValue(event)) { - borderColor = selectedBorderColor; + borderColor = (selectedBorderColor || borderColor); } if (borderColor) { let startIndex = 0; @@ -1758,7 +1758,7 @@ function eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawabl const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL); const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4)); const defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null); - const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : options.timelineFgColor); + const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : null); const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0); const selection = ui.selection; @@ -1856,7 +1856,7 @@ function eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawabl // Border let borderColor = (event.borderColor || (event.bgColor ? fillColor : null) || defaultBorderColor || fillColor); if (selection.selectedEvents.hasValue(event)) { - borderColor = selectedBorderColor; + borderColor = (selectedBorderColor || borderColor); } if (borderColor) { switch (cornerType) { From 6e939a8573e42e1a1ccb4f4756bd96f43f8fc93c Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Fri, 26 Jun 2020 13:49:06 -0700 Subject: [PATCH 45/69] [v2.x] Updated changelog, updated version to 2.4.0 --- CHANGELOG | 7 + package-lock.json | 6518 +++++++++++++++++++-------------------------- package.json | 2 +- 3 files changed, 2691 insertions(+), 3836 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 72206a9..62f6fb5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,10 @@ +Webglimpse 2.4.0 (release 2020-6-26) + +* Added ability to highlight a row, similar to group highlight. +* By default selecting an event no longer changes the border color unless + the `selectedBorderColor` property is set on the `newEventBarsPainterFactory` + style. + Webglimpse 2.3.0 (release 2019-11-8) * Added ability to disable picking of timeline annotations. Set `picking` to false. diff --git a/package-lock.json b/package-lock.json index 33df551..4beec1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "webglimpse", - "version": "2.3.0", + "version": "2.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.800.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.800.3.tgz", - "integrity": "sha512-SikMkzkBPtiRdaFIXB0+0NZUBI3bU7XfQRof/uHp9Xc+U1K3ORAtGGOIJtLdkk7RsWqePu5CiRX8XczgFKq5eA==", + "version": "0.803.28", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.28.tgz", + "integrity": "sha512-+2fMwMintkZ7e1Yu8UKVVL8I8pJoPuVjKf0bXxFDaWUMHmgLjYPKXg+QZKdPj5FF+TfmOc+q2LJxVlC4wPeUAg==", "dev": true, "requires": { - "@angular-devkit/core": "8.0.3", + "@angular-devkit/core": "8.3.28", "rxjs": "6.4.0" }, "dependencies": { @@ -26,27 +26,18 @@ } }, "@angular-devkit/core": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.0.3.tgz", - "integrity": "sha512-Q5+jw2JQ7xfrDbo1VYH2cr+NysGV+psZ1TtC9eoVJ44fp8pCQAnvGJkeT7eLVEgMrpoBorUy7nqebCOR3WnkXA==", + "version": "8.3.28", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.28.tgz", + "integrity": "sha512-tM0oPjzftJMdfuAuZF2EspVKtJyhtS2IQ02S7eKTZqkh5p/oVv710aND2D2IN5qdFrzpUSearx6D+Mr/Jo8jrA==", "dev": true, "requires": { - "ajv": "6.10.0", + "ajv": "6.10.2", "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.2", + "magic-string": "0.25.3", "rxjs": "6.4.0", "source-map": "0.7.3" }, "dependencies": { - "magic-string": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", - "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, "rxjs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", @@ -55,22 +46,16 @@ "requires": { "tslib": "^1.9.0" } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true } } }, "@angular-devkit/schematics": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.0.3.tgz", - "integrity": "sha512-Oj1VLsTEJhzAZjKWEjHXLMKD8B0Qp+3vaozYM22bNIfxP9B1XyUSPPv3UhhRhWusm4T6GRDvMVVLQ1k3mkusuA==", + "version": "8.3.28", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.28.tgz", + "integrity": "sha512-WFktBtTynViexVrgHiQV9rKfNS2YNONpi25A8+5tQR5kGKuQyHI3aEN0UMNA2sztWnPQ9AI8xz2uciQsHljgDw==", "dev": true, "requires": { - "@angular-devkit/core": "8.0.3", + "@angular-devkit/core": "8.3.28", "rxjs": "6.4.0" }, "dependencies": { @@ -86,228 +71,64 @@ } }, "@angular/animations": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.0.2.tgz", - "integrity": "sha512-6buaGp6sgyLWbjioGU0Wp/O9nFEQqD2L18uX5g5P5hdpq0bgopAbBee7AefJ8Kc/Kf79FlaKu9fKP5AEkeC8tA==", + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.14.tgz", + "integrity": "sha512-3Vc9TnNpKdtvKIXcWDFINSsnwgEMiDmLzjceWg1iYKwpeZGQahUXPoesLwQazBMmxJzQiA4HOMj0TTXKZ+Jzkg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/cli": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.0.3.tgz", - "integrity": "sha512-ZOrZHtDDWO1J7CLGeEUOI9YHjQHGqfUz/SUrNzzTfwctFq77QfXjnYtx+ejk/+h/dwSHQEOQ8aN5sVP6JvDGoA==", + "version": "8.3.28", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.28.tgz", + "integrity": "sha512-liP39zD3Y/uDbwOQoiryh8tkaJSlz05TG5HgFe7oWIeCSUQW7WBAULVY/ID+t7e4KX2opi0OKSH5R8+DP3VzcA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.800.3", - "@angular-devkit/core": "8.0.3", - "@angular-devkit/schematics": "8.0.3", - "@schematics/angular": "8.0.3", - "@schematics/update": "0.800.3", + "@angular-devkit/architect": "0.803.28", + "@angular-devkit/core": "8.3.28", + "@angular-devkit/schematics": "8.3.28", + "@schematics/angular": "8.3.28", + "@schematics/update": "0.803.28", "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", "debug": "^4.1.1", "ini": "1.3.5", - "inquirer": "6.3.1", + "inquirer": "6.5.1", "npm-package-arg": "6.1.0", - "open": "6.2.0", - "pacote": "9.5.0", - "read-package-tree": "5.2.2", - "semver": "6.0.0", + "npm-pick-manifest": "3.0.2", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "semver": "6.3.0", "symbol-observable": "1.2.0", "universal-analytics": "^0.4.20", "uuid": "^3.3.2" - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - }, - "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": { - "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" - } - } - } - }, - "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" - }, - "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 - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - } } }, "@angular/common": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.0.2.tgz", - "integrity": "sha512-9lwrKso0XjyS7wu+8dEWa5yN1kCTdbelP6JElFhh0kAt0TbPVHJ/dXEwvIFk9/2MjYv2PbooQo1zsc5kAB2Rlg==", + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.14.tgz", + "integrity": "sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.0.2.tgz", - "integrity": "sha512-ktobrxpWX1eCwbDKOIUm5GRj8WGlHW/8MAQvDDFUnsGqXBHfOGiaySiEYX/XjeN8qu34IfXs736QkdzpMM4+iw==", + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", + "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.0.2.tgz", - "integrity": "sha512-9jdpB8WC47oSgQ/jA+ExTYqbe4xw3ZCEhgLhPd8BQukBOHodaIHKnkinrVJAPZORpY1CKRaImoAHieSvRhiPjA==", + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", + "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -317,812 +138,202 @@ "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", - "shelljs": "^0.8.1", "source-map": "^0.6.1", "tslib": "^1.9.0", "yargs": "13.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 - }, - "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" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "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 - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + } + } + }, + "@angular/core": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", + "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.14.tgz", + "integrity": "sha512-zhyKL3CFIqcyHJ/TQF/h1OZztK611a6rxuPHCrt/5Sn1SuBTJJQ1pPTkOYIDy6IrCrtyANc8qB6P17Mao71DNQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/http": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", + "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/language-service": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.14.tgz", + "integrity": "sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA==", + "dev": true + }, + "@angular/platform-browser": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.14.tgz", + "integrity": "sha512-MtJptptyKzsE37JZ2VB/tI4cvMrdAH+cT9pMBYZd66YSZfKjIj5s+AZo7z8ncoskQSB1o3HMfDjSK7QXGx1mLQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.14.tgz", + "integrity": "sha512-mO2JPR5kLU/A3AQngy9+R/Q5gaF9csMStBQjwsCRI0wNtlItOIGL6+wTYpiTuh/ux+WVN1F2sLcEYU4Zf1ud9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.14.tgz", + "integrity": "sha512-DHA2BhODqV7F0g6ZKgFaZgbsqzHHWRcfWchCOrOVKu2rYiKUTwwHVLBgZAhrpNeinq2pWanVYSIhMr7wy+LfEA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.3" + } + }, + "@babel/generator": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "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" - } - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "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": { - "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" - } - } - } - }, - "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" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "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" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "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" - } - }, - "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" - } - } - } - }, - "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 - }, - "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" - } - }, - "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-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "magic-string": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", - "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "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 - }, - "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 - }, - "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 - }, - "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" - }, - "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 - }, - "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" - } - } - } - }, - "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" - } - }, - "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 - }, - "yargs": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", - "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, - "@angular/core": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.0.2.tgz", - "integrity": "sha512-g8BRvGZxTXb5GZ/xoC5Z94DGK3wMiD2jbmEQEbXGNM+c8E/Mo/W8GF44P7EU2d+V1oJoUh75SRK6U/StC+rLqA==", + "@babel/helper-function-name": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, - "@angular/forms": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.0.2.tgz", - "integrity": "sha512-LGu3b/wjNMCki5PnMUsfQlyaVZVOedNO+XccfluP4ZBQ5G/E2cz2tJ0UIHg3RhLbbpWntmqokpYLyd7leUPpIQ==", + "@babel/helper-get-function-arity": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/types": "^7.10.3" } }, - "@angular/http": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", - "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "dev": true, "requires": { - "tslib": "^1.7.1" + "@babel/types": "^7.10.1" } }, - "@angular/language-service": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.0.2.tgz", - "integrity": "sha512-oFB6KhHJVfVcLt4rmJHeZyPSnb+OdzN2CmmCxxnG7TXP73wvycnqVQ2pbcAsyRGj1759+DnY9X3VpJGhlc7H4Q==", + "@babel/helper-validator-identifier": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", "dev": true }, - "@angular/platform-browser": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.0.2.tgz", - "integrity": "sha512-iUoyhJ81jqvpmQI6Lu5NzRZR8azmnb2kX2FQ+LbwCvWQLfkLbTaa/Jl09/qN6KWpTsMogNQXVnjjgwoeaObvBw==", + "@babel/highlight": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/helper-validator-identifier": "^7.10.3", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "@angular/platform-browser-dynamic": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.0.2.tgz", - "integrity": "sha512-i9hBmcXauiQpvzRRNbBpMbQSsRh9YMv9phw9Ih54w2LdTUB64Vtrm3scQEWZ0sIONY3QbwEtu57k8euQPASErQ==", + "@babel/parser": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", + "dev": true + }, + "@babel/template": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "dev": true, "requires": { - "tslib": "^1.9.0" - } - }, - "@angular/router": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.0.2.tgz", - "integrity": "sha512-kgSqkvx3cgY0+ZTzkBVLa0sf0y0Fl7q3N+KX746pbCNjRRGa5gBkN7z+oyPDoG1l0fEiM6NLbFfcmuFwsdBO5w==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@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/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@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.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" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@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/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "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" - } - }, - "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 - } + "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", + "@babel/helper-validator-identifier": "^7.10.3", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -1174,6 +385,15 @@ "typescript": "^2.4.2" }, "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", @@ -1207,35 +427,29 @@ } } }, - "@ngtools/json-schema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", - "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", - "dev": true - }, "@schematics/angular": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.0.3.tgz", - "integrity": "sha512-pOy5hPxhyCQNaxkYMardnmwqMeT1rHX5JEl4QRaUHvfOmgLekthXyp31e2CkKfZOOhT6MUeK1GhVqMiZsMvS9A==", + "version": "8.3.28", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.28.tgz", + "integrity": "sha512-XS+eB/XwS+C97UW/WFQFvkrIzcPZF4qILOX3xZkJflJ3OtaM3q/WKoHxJVRDZWBJQlaNHv2X4UZZWN1LP3o7dw==", "dev": true, "requires": { - "@angular-devkit/core": "8.0.3", - "@angular-devkit/schematics": "8.0.3" + "@angular-devkit/core": "8.3.28", + "@angular-devkit/schematics": "8.3.28" } }, "@schematics/update": { - "version": "0.800.3", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.800.3.tgz", - "integrity": "sha512-8pPwtr6n23RTNBWp3fEMNvaEM7EN5OyNn8WL+hWkZNQWC3VuUw5b06EnayeS9/VfRI1LENAgfQXqQkdo6/MJyg==", + "version": "0.803.28", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.28.tgz", + "integrity": "sha512-CBSJXSVj3NkqmR7UaBiT5vY8s4tAvFm9IgoOU8DIgy3xGd56dAG49Oid2lJtOjwBvCgRLfGK1KcSOmWPJP2UVA==", "dev": true, "requires": { - "@angular-devkit/core": "8.0.3", - "@angular-devkit/schematics": "8.0.3", + "@angular-devkit/core": "8.3.28", + "@angular-devkit/schematics": "8.3.28", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", - "pacote": "9.5.0", + "pacote": "9.5.5", "rxjs": "6.4.0", - "semver": "6.0.0", + "semver": "6.3.0", "semver-intersect": "1.4.0" }, "dependencies": { @@ -1247,12 +461,6 @@ "requires": { "tslib": "^1.9.0" } - }, - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true } } }, @@ -1272,21 +480,21 @@ } }, "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", "dev": true }, "@types/jasmine": { - "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.13.tgz", - "integrity": "sha512-iczmLoIiVymaD1TIr2UctxjFkNEslVE/QtNAUmpDsD71cZfZBAsPCUv1Y+8AwsfA8bLx2ccr7d95T9w/UAirlQ==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", "dev": true }, "@types/jasminewd2": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", - "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", "dev": true, "requires": { "@types/jasmine": "*" @@ -1320,9 +528,9 @@ } }, "@types/selenium-webdriver": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", - "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, "@yarnpkg/lockfile": { @@ -1349,35 +557,18 @@ "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - } } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", "dev": true }, "adm-zip": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", - "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true }, "after": { @@ -1405,29 +596,15 @@ } }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "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" - }, - "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "ambi": { @@ -1438,14 +615,16 @@ "requires": { "editions": "^1.1.1", "typechecker": "^4.3.0" + }, + "dependencies": { + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + } } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", @@ -1455,10 +634,10 @@ "string-width": "^3.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==", + "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 }, "is-fullwidth-code-point": { @@ -1477,25 +656,22 @@ "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" - } } } }, "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "ansi-wrap": "^0.1.0" + "type-fest": "^0.11.0" } }, "ansi-gray": { @@ -1508,9 +684,9 @@ } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -1703,12 +879,12 @@ "dev": true }, "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" } }, "async-each": { @@ -1718,9 +894,9 @@ "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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -1736,18 +912,18 @@ "dev": true }, "autoprefixer": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", - "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "version": "9.8.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", + "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", "dev": true, "requires": { - "browserslist": "^4.6.1", - "caniuse-lite": "^1.0.30000971", - "chalk": "^2.4.2", + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001087", + "colorette": "^1.2.0", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.16", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" } }, "aws-sign2": { @@ -1757,9 +933,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, "axobject-query": { @@ -1835,18 +1011,6 @@ "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 } } }, @@ -1869,6 +1033,14 @@ "dev": true, "requires": { "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "batch": { @@ -1901,6 +1073,16 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -1914,20 +1096,12 @@ "dev": true, "requires": { "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 - } } }, "bluebird": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "body-parser": { @@ -1948,14 +1122,51 @@ "type-is": "~1.6.17" }, "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "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" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true } } }, @@ -1981,10 +1192,10 @@ "widest-line": "^2.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==", + "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 }, "is-fullwidth-code-point": { @@ -2004,15 +1215,6 @@ "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" - } - }, "type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", @@ -2061,20 +1263,21 @@ } }, "browserslist": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", - "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000975", - "electron-to-chromium": "^1.3.164", - "node-releases": "^1.1.23" + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" } }, "browserstack": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", - "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", "dev": true, "requires": { "https-proxy-agent": "^2.2.1" @@ -2127,9 +1330,9 @@ "dev": true }, "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -2137,6 +1340,7 @@ "figgy-pudding": "^3.5.1", "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", @@ -2148,40 +1352,14 @@ "y18n": "^4.0.0" }, "dependencies": { - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "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" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "yallist": "^3.0.2" + "glob": "^7.1.3" } - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true } } }, @@ -2200,14 +1378,6 @@ "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 - } } }, "cacheable-request": { @@ -2235,9 +1405,9 @@ } }, "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, "lowercase-keys": { @@ -2261,9 +1431,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30000975", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000975.tgz", - "integrity": "sha512-ZsXA9YWQX6ATu5MNg+Vx/cMQ+hM6vBBSqDeJs8ruk9z0ky4yIHML15MoxcFt088ST2uyjgqyUGRJButkptWf0w==", + "version": "1.0.30001088", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001088.tgz", + "integrity": "sha512-6eYUrlShRYveyqKG58HcyOfPgh3zb2xqs7NvT2VVtP3hEUeeWvc3lqhpeMTxYWBBeeaT9A4bKsrtjATm66BTHg==", "dev": true }, "canonical-path": { @@ -2289,6 +1459,12 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "cheerio": { "version": "1.0.0-rc.3", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", @@ -2304,9 +1480,9 @@ } }, "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -2324,9 +1500,9 @@ } }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "ci-info": { @@ -2355,19 +1531,13 @@ "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 } } }, "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -2388,62 +1558,114 @@ "dev": true }, "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=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "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 - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-block-writer": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.14.0.tgz", - "integrity": "sha1-AkXuMa680hqCMWziBh1fvpVQ3m8=", - "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=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, - "codelyzer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.0.tgz", - "integrity": "sha512-QiyY2/oDQnYx4mAVEDqr+z9MwrOto18tQFjExiuRChXCy0yvngS5fQpWIxvAGpbOmZFiR1PRTRLbEI71u10maA==", + "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": { - "app-root-path": "^2.2.1", - "aria-query": "^3.0.0", - "axobject-query": "^2.0.2", - "css-selector-tokenizer": "^0.7.1", + "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 + }, + "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 + }, + "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" + } + }, + "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": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-block-writer": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.14.0.tgz", + "integrity": "sha1-AkXuMa680hqCMWziBh1fvpVQ3m8=", + "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 + }, + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", "cssauron": "^1.4.0", "damerau-levenshtein": "^1.0.4", "semver-dsl": "^1.0.1", "source-map": "^0.5.7", "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "collection-visit": { @@ -2477,16 +1699,22 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colorette": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", + "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==", + "dev": true + }, "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -2499,9 +1727,9 @@ "dev": true }, "compare-versions": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", - "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, "component-bind": { @@ -2607,12 +1835,20 @@ "dev": true }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "cookie": { @@ -2633,6 +1869,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { @@ -2642,9 +1889,9 @@ "dev": true }, "core-js": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", - "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", "dev": true }, "core-util-is": { @@ -2664,14 +1911,24 @@ } }, "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=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "crypto-random-string": { @@ -2686,11 +1943,34 @@ "integrity": "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==", "dev": true }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } }, "css-select": { "version": "1.2.0", @@ -2705,14 +1985,14 @@ } }, "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", "dev": true, "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" } }, "css-what": { @@ -2731,9 +2011,9 @@ } }, "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, "cuint": { @@ -2749,15 +2029,15 @@ "dev": true }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "damerau-levenshtein": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", - "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", "dev": true }, "dashdash": { @@ -2767,29 +2047,21 @@ "dev": true, "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "date-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", - "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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.0.0" + "ms": "^2.1.1" } }, "debuglog": { @@ -2835,11 +2107,20 @@ } }, "defer-to-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", - "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2878,18 +2159,6 @@ "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 } } }, @@ -2921,6 +2190,15 @@ "pify": "^2.0.0", "pinkie-promise": "^2.0.0" } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -2931,9 +2209,9 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "dependency-graph": { @@ -3018,9 +2296,9 @@ } }, "dot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.2.tgz", - "integrity": "sha1-xzdwGfxOVQeYkosrmv62ar+h8vk=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz", + "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", "dev": true }, "dot-prop": { @@ -3057,13 +2335,13 @@ } }, "eachr": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz", - "integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.3.0.tgz", + "integrity": "sha512-yKWuGwOE283CTgbEuvqXXusLH4VBXnY2nZbDkeWev+cpAXY6zCIADSPLdvfkAROc0t8S4l07U1fateCdEDuuvg==", "dev": true, "requires": { - "editions": "^1.1.1", - "typechecker": "^4.3.0" + "editions": "^2.2.0", + "typechecker": "^4.9.0" } }, "ecc-jsbn": { @@ -3077,10 +2355,14 @@ } }, "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", + "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", + "dev": true, + "requires": { + "errlop": "^2.0.0", + "semver": "^6.3.0" + } }, "ee-first": { "version": "1.1.1", @@ -3089,15 +2371,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.165", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.165.tgz", - "integrity": "sha512-iIS8axR524EAnvUtWUNnREnYjQrS0zUvutIKYgTVuN3MzcjrV31EuJYKw7DGOtFO9DQw+JiXeaVDPQWMskG1wQ==", + "version": "1.3.483", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz", + "integrity": "sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg==", "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "encodeurl": { @@ -3116,9 +2398,9 @@ } }, "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==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -3146,6 +2428,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -3182,6 +2470,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -3217,25 +2511,10 @@ "dev": true }, "errlop": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz", - "integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==", - "dev": true, - "requires": { - "editions": "^2.1.2" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "dev": true, - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - } - } - } + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", + "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", + "dev": true }, "errno": { "version": "0.1.7", @@ -3256,6 +2535,42 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", @@ -3263,16 +2578,14 @@ "dev": true, "requires": { "es6-promise": "^4.0.3" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - } } }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3297,12 +2610,6 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -3325,19 +2632,19 @@ } }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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": "^5.0.1", - "get-stream": "^3.0.0", + "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", @@ -3361,1002 +2668,481 @@ "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" - } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extendr": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/extendr/-/extendr-3.4.1.tgz", - "integrity": "sha512-xcdwhNFctt6U7XVBYgB35YG/CZFOZUZw+OCNiMPsgbENLlajgrZLVV6bgS/9zLHnY7s5nW6nJZcNrBvq033l1w==", - "dev": true, - "requires": { - "editions": "^2.1.0", - "typechecker": "^4.7.0" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "dev": true, - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - } - } - } - }, - "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 - } - } - }, - "extract-opts": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-3.3.1.tgz", - "integrity": "sha1-WrvtyYwNUgLjJ4cn+Rktfghsa+E=", - "dev": true, - "requires": { - "eachr": "^3.2.0", - "editions": "^1.1.1", - "typechecker": "^4.3.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "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" - } - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" - } - }, - "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" - } - } - } - }, - "finalhandler": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", - "dev": true, - "requires": { - "debug": "~2.2.0", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, - "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" - } - }, - "findit2": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", - "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", - "dev": true - }, - "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.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "dev": true, - "requires": { - "debug": "^3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "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-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "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.8", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz", - "integrity": "sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==", - "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, - "optional": 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, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": 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, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": 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, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": 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, - "optional": 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, + "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, - "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" + "ms": "2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, + "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, - "optional": true, "requires": { - "wrappy": "1" + "is-descriptor": "^0.1.0" } }, - "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, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "is-extendable": "^0.1.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { + "ms": { "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, - "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 - } + "is-plain-object": "^2.0.4" } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, + } + } + }, + "extendr": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/extendr/-/extendr-3.5.0.tgz", + "integrity": "sha512-7zpVbnnZy91J4k916ZGwpys56DEgJc/prTXDiqCYe/Mud5pqdVsSc9mG/U6sz3lQEvHs81i8Zi7whsFwifhZyw==", + "dev": true, + "requires": { + "editions": "^2.2.0", + "typechecker": "^4.7.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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, - "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" + "is-descriptor": "^1.0.0" } }, - "rimraf": { - "version": "2.6.3", - "bundled": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true, "requires": { - "glob": "^7.1.3" + "is-extendable": "^0.1.0" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": 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, + "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, - "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "kind-of": "^6.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": 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, - "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "kind-of": "^6.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "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, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "strip-json-comments": { + } + } + }, + "extract-opts": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-3.4.0.tgz", + "integrity": "sha512-M7Y+1cJDkzOWqvGH5F/V2qgkD6+uitW3NV9rQGl+pLSVuXZ4IDDQgxxMeLPKcWUyfypBWczIILiroSuhXG7Ytg==", + "dev": true, + "requires": { + "eachr": "^3.2.0", + "editions": "^2.2.0", + "typechecker": "^4.9.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "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" + "is-extendable": "^0.1.0" } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, + } + } + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "dev": true, + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "ms": "0.7.1" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true } } }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "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" + } + }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "dev": true + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", + "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "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-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.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.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "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" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -4370,20 +3156,12 @@ "dev": true, "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4460,35 +3238,25 @@ "p-cancelable": "^1.0.0", "to-readable-stream": "^1.0.0", "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "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" - } - } } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { "source-map": { @@ -4515,6 +3283,15 @@ "har-schema": "^2.0.0" } }, + "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", @@ -4522,6 +3299,14 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-binary2": { @@ -4553,6 +3338,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -4562,46 +3353,18 @@ "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-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" - } - } - } - }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -4620,15 +3383,21 @@ "dev": true }, "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==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "htmlparser2": { @@ -4646,9 +3415,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -4667,6 +3436,14 @@ "apache-crypt": "1.1.2", "apache-md5": "1.0.6", "node-uuid": "^1.4.7" + }, + "dependencies": { + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + } } }, "http-cache-semantics": { @@ -4676,31 +3453,39 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "dev": true, "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", + "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + } } }, "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", "dev": true }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } @@ -4715,15 +3500,6 @@ "debug": "3.1.0" }, "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -4732,6 +3508,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -4747,12 +3529,12 @@ } }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" }, "dependencies": { @@ -4764,12 +3546,6 @@ "requires": { "ms": "^2.1.1" } - }, - "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 } } }, @@ -4783,9 +3559,9 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "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" @@ -4798,29 +3574,32 @@ "dev": true }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { "minimatch": "^3.0.4" } }, "ignorefs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", - "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.4.1.tgz", + "integrity": "sha512-1whgvOsPWFZRNA/5OFhIk56C9Y39+/CYaRVNvsZZkLymacOSqqdSU53xk8CP3G2u5gz2PX6RLxqKPcsIpDriog==", "dev": true, "requires": { - "editions": "^1.3.3", - "ignorepatterns": "^1.1.0" + "editions": "^2.2.0", + "ignorepatterns": "^1.4.0" } }, "ignorepatterns": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz", - "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=", - "dev": true + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.4.0.tgz", + "integrity": "sha512-YPBIFRB25iZD0WiLxmToe80+QU+mZI+bUlEh3Ze/4gbhlXHdQFk0SwAFQtPOiBAoDv3FvhtSTDUCD9DKFsHTRA==", + "dev": true, + "requires": { + "editions": "^2.2.0" + } }, "image-size": { "version": "0.5.5", @@ -4853,6 +3632,12 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4864,9 +3649,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { @@ -4876,15 +3661,36 @@ "dev": true }, "injection-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.1.tgz", - "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.3.0.tgz", + "integrity": "sha512-rhS6E5jv603kbaO72ylOt0hGF1LT03oqQ4GU5KOO0qSaRbIWmdUCHjXq+VT79jL6/NmXtw9ccfK6dh/CzjoYjA==", "dev": true }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "inquirer": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "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 }, "ip": { @@ -4900,6 +3706,17 @@ "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-arrayish": { @@ -4923,6 +3740,12 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -4939,8 +3762,25 @@ "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-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -4973,13 +3813,10 @@ "dev": true }, "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" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-glob": { "version": "4.0.1", @@ -5019,6 +3856,17 @@ "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-obj": { @@ -5058,29 +3906,32 @@ "dev": true, "requires": { "isobject": "^3.0.1" + } + }, + "is-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.0.tgz", + "integrity": "sha512-ZVxq+5TkOx6GQdnoMm2aRdCKADdcrOWXLGzGT+vIA8DMpqEJaRk5AL1bS80zJ2bjHunVmjdzfCt0e4BymIEqKQ==", + "dev": true, + "requires": { + "@types/estree": "0.0.44" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "@types/estree": { + "version": "0.0.44", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", + "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==", "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-reference": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.2.tgz", - "integrity": "sha512-Kn5g8c7XHKejFOpTf2QN9YjiHHKl5xRj+2uAZf9iM2//nkBNi/NNeB5JMoun28nEaUVHyPUzqzhfRlfAirEjXg==", + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "@types/estree": "0.0.39" + "has-symbols": "^1.0.1" } }, "is-stream": { @@ -5089,6 +3940,15 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5147,9 +4007,9 @@ "dev": true }, "istanbul-api": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", - "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", + "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", "dev": true, "requires": { "async": "^2.6.2", @@ -5160,7 +4020,7 @@ "istanbul-lib-instrument": "^3.3.0", "istanbul-lib-report": "^2.0.8", "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", + "istanbul-reports": "^2.2.5", "js-yaml": "^3.13.1", "make-dir": "^2.1.0", "minimatch": "^3.0.4", @@ -5195,14 +4055,6 @@ "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } } }, "istanbul-lib-report": { @@ -5240,21 +4092,15 @@ "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==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "ms": "^2.1.1" + "glob": "^7.1.3" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5264,12 +4110,12 @@ } }, "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==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0" } }, "jasmine": { @@ -5327,9 +4173,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5366,6 +4212,12 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5403,20 +4255,12 @@ "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "jszip": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", - "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", "dev": true, "requires": { "lie": "~3.3.0", @@ -5473,11 +4317,20 @@ } }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, + "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" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -5494,11 +4347,26 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5533,12 +4401,12 @@ } }, "karma-coverage-istanbul-reporter": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.5.tgz", - "integrity": "sha512-yPvAlKtY3y+rKKWbOo0CzBMVTvJEeMOgbMXuVv3yWvS8YtYKC98AU9vFF0mVBZ2RP1E9SgS90+PT6Kf14P3S4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", "dev": true, "requires": { - "istanbul-api": "^2.1.1", + "istanbul-api": "^2.1.6", "minimatch": "^3.0.4" } }, @@ -5552,9 +4420,9 @@ } }, "karma-jasmine-html-reporter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", - "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", "dev": true }, "keyv": { @@ -5567,13 +4435,10 @@ } }, "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" - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, "latest-version": { "version": "5.1.0", @@ -5584,21 +4449,31 @@ "package-json": "^6.3.0" } }, + "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" + } + }, "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz", + "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==", "dev": true, "requires": { "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", + "make-dir": "^2.1.0", "mime": "^1.4.1", - "mkdirp": "^0.5.0", "promise": "^7.1.1", "request": "^2.83.0", - "source-map": "~0.6.0" + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { "source-map": { @@ -5646,13 +4521,19 @@ "immediate": "~3.0.5" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "live-server": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", "dev": true, "requires": { - "colors": "^1.3.3", + "colors": "^1.4.0", "connect": "3.4.x", "cors": "^2.8.5", "event-stream": "^4.0.1", @@ -5668,9 +4549,9 @@ }, "dependencies": { "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true } } @@ -5686,39 +4567,22 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "log4js": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.3.1.tgz", - "integrity": "sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", "dev": true, "requires": { "date-format": "^2.0.0", "debug": "^4.1.1", "flatted": "^2.0.0", - "rfdc": "^1.1.2", - "streamroller": "^1.0.5" - }, - "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" - } - }, - "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 - } + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" } }, "lowercase-keys": { @@ -5728,13 +4592,12 @@ "dev": true }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "lunr": { @@ -5750,9 +4613,9 @@ "dev": true }, "magic-string": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", - "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" @@ -5773,62 +4636,32 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "make-fetch-happen": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", - "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", "dev": true, "requires": { "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", + "cacache": "^12.0.0", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", "socks-proxy-agent": "^4.0.0", "ssri": "^6.0.0" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.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 - } } }, "map-age-cleaner": { @@ -5882,14 +4715,6 @@ "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" - }, - "dependencies": { - "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 - } } }, "micromatch": { @@ -5911,14 +4736,6 @@ "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 - } } }, "mime": { @@ -5928,24 +4745,24 @@ "dev": true }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.44.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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "mimic-response": { @@ -5964,36 +4781,28 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mississippi": { @@ -6015,9 +4824,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "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", @@ -6036,30 +4845,47 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" }, "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dev": true, "requires": { - "basic-auth": "~2.0.0", + "basic-auth": "~2.0.1", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "on-headers": "~1.0.2" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "move-concurrently": { @@ -6074,12 +4900,23 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "multimatch": { @@ -6095,15 +4932,15 @@ } }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true, "optional": true }, @@ -6124,26 +4961,6 @@ "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 - } } }, "negotiator": { @@ -6159,18 +4976,18 @@ "dev": true }, "ng-packagr": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.3.0.tgz", - "integrity": "sha512-i+964lzZC7VVzatDCLDZndiXTog1XGozY7K1Bs78+uBF8O1YHNQP9wB9C5fR4uEaSKVhCWEBYekoS69flCugMA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.7.1.tgz", + "integrity": "sha512-NDAUcMtLyZnF3bP6JtC3ANpIQRclRDPilF7C0DsjQuIz1q0V3mT7f1PwV0jnRWy8iRpSZmJZr6AGl736gloHtQ==", "dev": true, "requires": { - "@ngtools/json-schema": "^1.1.0", + "ajv": "^6.10.2", "autoprefixer": "^9.6.0", "browserslist": "^4.0.0", "chalk": "^2.3.1", "chokidar": "^3.0.0", "clean-css": "^4.1.11", - "commander": "^2.12.0", + "commander": "^3.0.0", "fs-extra": "^8.0.0", "glob": "^7.1.2", "injection-js": "^2.2.1", @@ -6180,8 +4997,8 @@ "postcss": "^7.0.0", "postcss-url": "^8.0.0", "read-pkg-up": "^5.0.0", - "rimraf": "^2.6.1", - "rollup": "^1.12.1", + "rimraf": "^3.0.0", + "rollup": "1.25.2", "rollup-plugin-commonjs": "^10.0.0", "rollup-plugin-json": "^4.0.0", "rollup-plugin-node-resolve": "^5.0.0", @@ -6189,14 +5006,14 @@ "rxjs": "^6.0.0", "sass": "^1.17.3", "stylus": "^0.54.5", - "terser": "^4.0.0", + "terser": "^4.1.2", "update-notifier": "^3.0.0" }, "dependencies": { "anymatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.2.tgz", - "integrity": "sha512-rUe9SxpRQlVg4EM8It7JMNWWYHAirTPpbTuvaSKybb5IejNgWB3PGBBX9rrPKDx2pM/p3Wh+7+ASaWRyyAbxmQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -6219,22 +5036,27 @@ } }, "chokidar": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.1.tgz", - "integrity": "sha512-2ww34sJWehnbpV0Q4k4V5Hh7juo7po6z7LUWkcIQnSGN1lHOL8GGtLtfwabKvLFQw/hbSUQ0u6V7OgGYgBzlkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", "dev": true, "requires": { - "anymatch": "^3.0.1", - "async-each": "^1.0.3", - "braces": "^3.0.2", - "fsevents": "^2.0.6", - "glob-parent": "^5.0.0", - "is-binary-path": "^2.1.0", - "is-glob": "^4.0.1", - "normalize-path": "^3.0.0", - "readdirp": "^3.0.2" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" } }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6245,27 +5067,27 @@ } }, "fs-extra": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", - "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -6287,12 +5109,12 @@ "dev": true }, "readdirp": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.0.2.tgz", - "integrity": "sha512-LbyJYv48eywrhOlScq16H/VkCiGKGPC2TpOdZCJ7QXnYEjn3NN/Oblh8QEU3vqfSRBB7OGvh5x45NKiVeNujIQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, "requires": { - "picomatch": "^2.0.4" + "picomatch": "^2.2.1" } }, "to-regex-range": { @@ -6313,9 +5135,9 @@ "dev": true }, "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", "dev": true, "requires": { "encoding": "^0.1.11", @@ -6324,13 +5146,10 @@ } }, "node-releases": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz", - "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "dev": true }, "node-sass-tilde-importer": { "version": "1.0.2", @@ -6341,12 +5160,6 @@ "find-parent-dir": "^0.3.0" } }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6357,6 +5170,14 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "normalize-path": { @@ -6372,15 +5193,24 @@ "dev": true }, "normalize-url": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", - "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true }, "npm-package-arg": { @@ -6393,41 +5223,59 @@ "osenv": "^0.1.5", "semver": "^5.5.0", "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "npm-registry-fetch": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz", - "integrity": "sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz", + "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==", "dev": true, "requires": { "JSONStream": "^1.3.4", "bluebird": "^3.5.1", "figgy-pudding": "^3.4.1", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "npm-package-arg": "^6.1.0" + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" } }, "npm-run-path": { @@ -6503,9 +5351,30 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6513,14 +5382,28 @@ "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.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "object.pick": { @@ -6530,14 +5413,6 @@ "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 - } } }, "on-finished": { @@ -6565,18 +5440,18 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "open": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.2.0.tgz", - "integrity": "sha512-Vxf6HJkwrqmvh9UAID3MnMYXntbTxKLOSfOnO7LJdzPf3NE3KQYFNV0/Lcz2VAndbRFil58XVCyh8tiX11fiYw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -6599,6 +5474,20 @@ "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } } }, "os-homedir": { @@ -6607,6 +5496,17 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "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" + } + }, "os-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", @@ -6658,9 +5558,9 @@ "dev": true }, "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -6682,38 +5582,31 @@ "dev": true }, "package-json": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.4.0.tgz", - "integrity": "sha512-bd1T8OBG7hcvMd9c/udgv6u5v9wISP3Oyl9Cm7Weop8EFwrtcQDnS2sb6zhwqus2WslSr5wSTIPiTTpxxmPm7Q==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, "requires": { "got": "^9.6.0", - "registry-auth-token": "^3.4.0", + "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } + "semver": "^6.2.0" } }, "pacote": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.0.tgz", - "integrity": "sha512-aUplXozRbzhaJO48FaaeClmN+2Mwt741MC6M3bevIGZwdCaP7frXzbUOfOWa91FPHoLITzG0hYaKY363lxO3bg==", + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", "dev": true, "requires": { "bluebird": "^3.5.3", - "cacache": "^11.3.2", + "cacache": "^12.0.2", "figgy-pudding": "^3.5.1", "get-stream": "^4.1.0", "glob": "^7.1.3", + "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "make-fetch-happen": "^4.0.1", + "make-fetch-happen": "^5.0.0", "minimatch": "^3.0.4", "minipass": "^2.3.5", "mississippi": "^3.0.0", @@ -6722,7 +5615,7 @@ "npm-package-arg": "^6.1.0", "npm-packlist": "^1.1.12", "npm-pick-manifest": "^2.2.3", - "npm-registry-fetch": "^3.8.0", + "npm-registry-fetch": "^4.0.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", @@ -6736,72 +5629,61 @@ "which": "^1.3.1" }, "dependencies": { - "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" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", "dev": true, "requires": { - "yallist": "^3.0.2" + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } }, - "tar": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", - "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.5", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "glob": "^7.1.3" } }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, "parse-node-version": { @@ -6901,9 +5783,9 @@ "dev": true }, "picomatch": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pify": { @@ -6934,9 +5816,9 @@ "dev": true }, "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -6975,17 +5857,17 @@ }, "dependencies": { "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true } } }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, "prepend-http": { @@ -6995,9 +5877,9 @@ "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "promise": { @@ -7036,9 +5918,9 @@ } }, "protractor": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", - "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", "dev": true, "requires": { "@types/q": "^0.0.32", @@ -7049,15 +5931,21 @@ "glob": "^7.0.3", "jasmine": "2.8.0", "jasminewd2": "^2.1.0", - "optimist": "~0.6.0", "q": "1.4.1", "saucelabs": "^1.5.0", "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.0.6" + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -7077,10 +5965,43 @@ "supports-color": "^2.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "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 + }, + "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 + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-support": { @@ -7092,29 +6013,95 @@ "source-map": "^0.5.6" } }, + "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" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "webdriver-manager": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.5.tgz", - "integrity": "sha512-f1apDjMpZ8SHlXtXGzqBxOjV+WQcDRz5PN7pWScgjXS7vhUIFcM3V89Shetf4A04n8DDR2MxiVQq6JproFcRZw==", + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "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" + } + }, + "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": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -7139,9 +6126,9 @@ "dev": true }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -7196,9 +6183,9 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "range-parser": { @@ -7219,14 +6206,30 @@ "unpipe": "1.0.0" }, "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true } } }, @@ -7240,52 +6243,50 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "read-package-json": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", - "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", "dev": true, "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "npm-normalize-package-bin": "^1.0.0" } }, "read-package-tree": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.2.tgz", - "integrity": "sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", "dev": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" } }, "read-pkg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz", - "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", - "parse-json": "^4.0.0", - "type-fest": "^0.4.1" + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, "read-pkg-up": { @@ -7299,9 +6300,9 @@ } }, "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==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -7311,12 +6312,20 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "readdir-scoped-modules": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", - "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -7334,291 +6343,6 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" - }, - "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" - } - } - } - }, - "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-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" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" } }, "reflect-metadata": { @@ -7628,11 +6352,20 @@ "dev": true }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -7644,24 +6377,26 @@ } }, "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", "dev": true, "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "^1.2.8" } }, "registry-url": { @@ -7674,15 +6409,15 @@ } }, "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -7707,9 +6442,9 @@ "dev": true }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -7719,7 +6454,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -7729,17 +6464,9 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } } }, "require-directory": { @@ -7748,6 +6475,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "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 + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -7755,9 +6488,9 @@ "dev": true }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -7779,12 +6512,12 @@ } }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -7807,55 +6540,36 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", "dev": true, "requires": { "glob": "^7.1.3" } }, "rollup": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.15.6.tgz", - "integrity": "sha512-s3Vn3QJQ5YVFfIG4nXoG9VdL1I37IZsft+4ZyeBhxE0df1kCFz9e+4bEAbR4mKH3pvBO9e9xjdxWPhhIp0r9ow==", + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.25.2.tgz", + "integrity": "sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg==", "dev": true, "requires": { - "@types/estree": "0.0.39", - "@types/node": "^12.0.8", - "acorn": "^6.1.1" - }, - "dependencies": { - "@types/node": { - "version": "12.0.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.8.tgz", - "integrity": "sha512-b8bbUOTwzIY3V5vDTY1fIJ+ePKDUBqt2hC2woVGotdQQhG/2Sh62HOKHrT7ab+VerXAcPyAiTEipPu/FsreUtg==", - "dev": true - } + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" } }, "rollup-plugin-commonjs": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.0.tgz", - "integrity": "sha512-B8MoX5GRpj3kW4+YaFO/di2JsZkBxNjVmZ9LWjUoTAjq8N9wc7HObMXPsrvolVV9JXVtYSscflXM14A19dXPNQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", + "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", "dev": true, "requires": { - "estree-walker": "^0.6.0", + "estree-walker": "^0.6.1", "is-reference": "^1.1.2", "magic-string": "^0.25.2", - "resolve": "^1.10.1", - "rollup-pluginutils": "^2.7.0" - }, - "dependencies": { - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" } }, "rollup-plugin-json": { @@ -7868,27 +6582,16 @@ } }, "rollup-plugin-node-resolve": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.0.3.tgz", - "integrity": "sha512-Mhhmf0x493xgUPEsRELnU1VM+4+WO82knWkAbZ0d2DvZQZJMbhzyQK/hqtpVscoRru1EqlK3TM1kK9ro469wPw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", "dev": true, "requires": { "@types/resolve": "0.0.8", "builtin-modules": "^3.1.0", "is-module": "^1.0.0", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.0" - }, - "dependencies": { - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" } }, "rollup-plugin-sourcemaps": { @@ -7902,22 +6605,19 @@ } }, "rollup-pluginutils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", - "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "requires": { "estree-walker": "^0.6.1" } }, "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" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "run-queue": { "version": "1.0.3", @@ -7929,18 +6629,18 @@ } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "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==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safe-regex": { @@ -7953,13 +6653,34 @@ } }, "safefs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.1.0.tgz", - "integrity": "sha1-+CrrS9165R9lPrIPZyizBYyNZEU=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.2.0.tgz", + "integrity": "sha512-1amPBO92jw/hWS+gH/u7z7EL7YxaJ8WecBQl49tMQ6Y6EQfndxNNKwlPqDOcwpUetdmK6nKLoVdjybVScRwq5A==", "dev": true, "requires": { - "editions": "^1.1.1", - "graceful-fs": "^4.1.4" + "editions": "^2.2.0", + "graceful-fs": "^4.2.3" + } + }, + "safeps": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/safeps/-/safeps-7.0.1.tgz", + "integrity": "sha1-FXPMsJy/AeAckFIr68bIsicL8hk=", + "dev": true, + "requires": { + "editions": "^1.3.3", + "extract-opts": "^3.3.1", + "safefs": "^4.1.0", + "taskgroup": "^5.0.0", + "typechecker": "^4.3.0" + }, + "dependencies": { + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + } } }, "safer-buffer": { @@ -7969,12 +6690,12 @@ "dev": true }, "sass": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.21.0.tgz", - "integrity": "sha512-67hIIOZZtarbhI2aSgKBPDUgn+VqetduKoD+ZSYeIWg+ksNioTzeX+R2gUdebDoolvKNsQ/GY9NDxctbXluTNA==", + "version": "1.26.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", + "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", "dev": true, "requires": { - "chokidar": "^2.0.0" + "chokidar": ">=2.0.0 <4.0.0" } }, "saucelabs": { @@ -7987,9 +6708,9 @@ } }, "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "scandirectory": { @@ -8036,6 +6757,15 @@ "xml2js": "^0.4.17" }, "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -8048,9 +6778,9 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "semver-diff": { @@ -8060,6 +6790,14 @@ "dev": true, "requires": { "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "semver-dsl": { @@ -8069,6 +6807,14 @@ "dev": true, "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "semver-intersect": { @@ -8078,6 +6824,14 @@ "dev": true, "requires": { "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "send": { @@ -8101,6 +6855,29 @@ "statuses": "~1.5.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" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -8124,6 +6901,21 @@ "parseurl": "~1.3.2" }, "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" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -8136,6 +6928,18 @@ "statuses": ">= 1.4.0 < 2" } }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -8157,9 +6961,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "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", @@ -8200,33 +7004,16 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "dev": true }, "snapdragon": { @@ -8245,6 +7032,15 @@ "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", @@ -8262,6 +7058,18 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -8313,18 +7121,6 @@ "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 } } }, @@ -8335,6 +7131,17 @@ "dev": true, "requires": { "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "socket.io": { @@ -8359,13 +7166,19 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { @@ -8404,6 +7217,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -8438,17 +7257,23 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { @@ -8473,18 +7298,18 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, "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==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -8492,9 +7317,9 @@ } }, "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==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -8516,15 +7341,15 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", - "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -8532,15 +7357,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -8548,9 +7373,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "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": { @@ -8592,14 +7417,6 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "ssri": { @@ -8659,22 +7476,22 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "streamroller": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", - "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", "dev": true, "requires": { "async": "^2.6.2", "date-format": "^2.0.0", "debug": "^3.2.6", "fs-extra": "^7.0.1", - "lodash": "^4.17.11" + "lodash": "^4.17.14" }, "dependencies": { "debug": { @@ -8696,24 +7513,49 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.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 } } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -8723,15 +7565,31 @@ "dev": true, "requires": { "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": "^2.0.0" + "ansi-regex": "^4.1.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 + } } }, "strip-bom": { @@ -8753,41 +7611,35 @@ "dev": true }, "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", "dev": true, "requires": { - "css-parse": "1.7.x", - "debug": "*", - "glob": "7.0.x", - "mkdirp": "0.5.x", - "sax": "0.5.x", - "source-map": "0.1.x" + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" }, "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ms": "2.0.0" } }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -8800,17 +7652,39 @@ "has-flag": "^3.0.0" } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, "taskgroup": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-5.3.0.tgz", - "integrity": "sha512-++j3Yi3XZGYgAvmGzRtNa+BnDvkPbdroyMffCY+Gj9A4iH2IJ1S7/g6LewGVXQkVw/KOzlfE1TimARYXvOEsgQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-5.5.0.tgz", + "integrity": "sha512-YFkdc6HU+p3xO2lZ1MWdx7R7EbrLF/bpXv5k9635bTzdgOLNbmnsDg5alSpZost+PYMk40d6ZDAJHBHNHiiLvw==", "dev": true, "requires": { - "ambi": "^3.0.0", + "ambi": "3.2.0", "eachr": "^3.2.0", - "editions": "^1.3.4", - "extendr": "^3.2.2", - "unbounded": "^1.1.0" + "editions": "^2.2.0", + "extendr": "^3.5.0", + "safeps": "7.0.1", + "unbounded": "^1.2.0" }, "dependencies": { "ambi": { @@ -8821,18 +7695,6 @@ "requires": { "editions": "^2.1.0", "typechecker": "^4.3.0" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "dev": true, - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - } - } } } } @@ -8844,23 +7706,73 @@ "dev": true, "requires": { "execa": "^0.7.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" + } + }, + "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" + } + }, + "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 + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } } }, "terser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", - "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "source-map": { @@ -8921,6 +7833,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-readable-stream": { @@ -8945,21 +7868,10 @@ "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" - } - } + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toidentifier": { @@ -8969,21 +7881,13 @@ "dev": true }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "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 - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "traverse": { @@ -8992,12 +7896,6 @@ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "ts-simple-ast": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-6.12.0.tgz", @@ -9020,9 +7918,9 @@ } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tslint": { @@ -9051,6 +7949,12 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -9079,9 +7983,9 @@ "dev": true }, "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true }, "type-is": { @@ -9092,44 +7996,15 @@ "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - } } }, "typechecker": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz", - "integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.11.0.tgz", + "integrity": "sha512-lz39Mc/d1UBcF/uQFL5P8L+oWdIn/stvkUgHf0tPRW4aEwGGErewNXo2Nb6We2WslWifn00rhcHbbRWRcTGhuw==", "dev": true, "requires": { - "editions": "^2.1.0" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "dev": true, - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - } - } + "editions": "^2.2.0" } }, "typedarray": { @@ -9145,31 +8020,11 @@ "dev": true }, "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", + "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.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, - "optional": 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 - } - } + "optional": true }, "ultron": { "version": "1.1.1", @@ -9178,59 +8033,52 @@ "dev": true }, "unbounded": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unbounded/-/unbounded-1.2.0.tgz", - "integrity": "sha512-D/ENuBtxxwhxEiSXHgHwM/UXsDRuXz7JwqBQ54zrbaqmbmSWPvsGMzslr5mEftsDo1KOfl7vEIXGCamWBlAT6Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/unbounded/-/unbounded-1.3.0.tgz", + "integrity": "sha512-RWVCkvcoItljlNTz0iTdBQU6bDj+slVLNaWN7d6DXgH02FfYrz8ytcJ4OPW8b0HqmCehwufJHOIzjHWrQUXBvg==", "dev": true, "requires": { - "editions": "^2.1.3" - }, - "dependencies": { - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "dev": true, - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - } - } + "editions": "^2.2.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "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": "^0.4.3" - }, - "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" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-filename": { @@ -9271,18 +8119,6 @@ "uuid": "^3.0.0" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "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 - }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -9291,112 +8127,6 @@ "requires": { "ms": "^2.1.1" } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } } } }, @@ -9407,9 +8137,9 @@ "dev": true }, "unix-crypt-td-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", - "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", "dev": true }, "unpipe": { @@ -9455,25 +8185,19 @@ "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.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "update-notifier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.0.tgz", - "integrity": "sha512-6Xe3oF2bvuoj4YECUc52yxVs94yWrxwqHbzyveDktTS1WhnlTRpNcQMxUshcB7nRVGi1jEXiqL5cW1S5WSyzKg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", "dev": true, "requires": { "boxen": "^3.0.0", @@ -9528,6 +8252,24 @@ "requires": { "lru-cache": "4.1.x", "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } } }, "util-deprecate": { @@ -9536,6 +8278,15 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, "utils-merge": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", @@ -9543,9 +8294,9 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "validate-npm-package-license": { @@ -9582,14 +8333,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "viz.js": { @@ -9631,20 +8374,20 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", + "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "which": { @@ -9656,6 +8399,12 @@ "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 + }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", @@ -9705,12 +8454,20 @@ "dev": true, "requires": { "semver": "^5.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { @@ -9721,6 +8478,43 @@ "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "wrappy": { @@ -9749,6 +8543,14 @@ "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", "ultron": "~1.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "xdg-basedir": { @@ -9758,27 +8560,19 @@ "dev": true }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "dev": true, "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - }, - "dependencies": { - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, "xmlhttprequest-ssl": { @@ -9788,9 +8582,9 @@ "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "xxhashjs": { @@ -9809,11 +8603,65 @@ "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "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 + }, + "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 + }, + "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" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", diff --git a/package.json b/package.json index c85d5df..94f78a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.3.0", + "version": "2.4.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 8fbd64375e9dc3665b7d1434c36b439fefecea67 Mon Sep 17 00:00:00 2001 From: Kyle Sherman Date: Mon, 13 Jul 2020 18:10:01 -0700 Subject: [PATCH 46/69] [zoom-fix] mouseWheelListener argument applies to scrolling with cursor over the selector --- src/webglimpse/timeline/timeline_pane.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/webglimpse/timeline/timeline_pane.ts b/src/webglimpse/timeline/timeline_pane.ts index a023c0d..64c7765 100644 --- a/src/webglimpse/timeline/timeline_pane.ts +++ b/src/webglimpse/timeline/timeline_pane.ts @@ -528,7 +528,7 @@ function newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowMod if (selectedIntervalMode === 'single' || selectedIntervalMode === 'range') { const selection = ui.selection; const selectedIntervalPane = new Pane(null, true, newTimeIntervalMask(timeAxis, selection.selectedInterval, selectedIntervalMode)); - attachTimeSelectionMouseListeners(selectedIntervalPane, timeAxis, selection.selectedInterval, input, draggableEdgeWidth, selectedIntervalMode); + attachTimeSelectionMouseListeners(selectedIntervalPane, timeAxis, selection.selectedInterval, input, draggableEdgeWidth, selectedIntervalMode, args.options.mouseWheelListener); axisPane.addPane(selectedIntervalPane, false); selectedIntervalPane.mouseMove.on(onMouseMove); @@ -556,7 +556,8 @@ function attachTimeSelectionMouseListeners(pane: Pane, interval: TimeIntervalModel, input: TimelineInput, draggableEdgeWidth: number, - selectedIntervalMode: string) { + selectedIntervalMode: string, + mouseWheelListener: (PointerEvent: PointerEvent) => void) { if (selectedIntervalMode === 'single') { @@ -564,7 +565,7 @@ function attachTimeSelectionMouseListeners(pane: Pane, return 'center'; }; - attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode); + attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode, mouseWheelListener); } else if (selectedIntervalMode === 'range') { @@ -604,7 +605,7 @@ function attachTimeSelectionMouseListeners(pane: Pane, } }; - attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode); + attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode, mouseWheelListener); } } @@ -614,7 +615,8 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, input: TimelineInput, draggableEdgeWidth: number, selectedIntervalMode: string, - chooseDragMode: (ev: PointerEvent) => string) { + chooseDragMode: (ev: PointerEvent) => string, + mouseWheelListener: (PointerEvent: PointerEvent) => void) { // see comments in attachTimeSelectionMouseListeners( ... ) const minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth; @@ -622,12 +624,7 @@ function attachTimeIntervalSelectionMouseListeners(pane: Pane, // Hook up input notifications // - - pane.mouseWheel.on(function (ev: PointerEvent) { - const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps); - timeAxis.zoom(zoomFactor, timeAxis.vAtFrac(xFrac(ev))); - }); - + pane.mouseWheel.on(mouseWheelListener); pane.contextMenu.on(function (ev: PointerEvent) { input.contextMenu.fire(ev); }); From 6262d9a1e1791e3948e71edbf4880732936f47b9 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Mon, 20 Jul 2020 16:38:54 -0700 Subject: [PATCH 47/69] [v2.x] Updated version to 2.4.1 --- CHANGELOG | 5 +++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 62f6fb5..2585f07 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Webglimpse 2.4.1 (release 2020-7-20) + +* Fixed a bug when scrolling the mouse wheel over the time selector when using + a custom mouse wheel listener. + Webglimpse 2.4.0 (release 2020-6-26) * Added ability to highlight a row, similar to group highlight. diff --git a/package-lock.json b/package-lock.json index 4beec1f..cd7a587 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.4.0", + "version": "2.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 94f78a0..085ec99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.4.0", + "version": "2.4.1", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 73c17713bb6c1207ef80bb7060973d34c6cfb6ce Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Fri, 24 Jul 2020 06:27:21 -0700 Subject: [PATCH 48/69] [bugfix-orderedset-add] Fixed insertion index bug when adding a value to an OrderedSet that already exists and moveIfExists is set to true. --- src/webglimpse/util/ordered_set.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/webglimpse/util/ordered_set.ts b/src/webglimpse/util/ordered_set.ts index fdfccc1..4703247 100644 --- a/src/webglimpse/util/ordered_set.ts +++ b/src/webglimpse/util/ordered_set.ts @@ -239,7 +239,6 @@ export class OrderedSet { this._ids.splice(oldIndex, 1); this._valuesArray.splice(oldIndex, 1); if (newIndex > oldIndex) { - newIndex--; this._ids.splice(newIndex, 0, id); this._valuesArray.splice(newIndex, 0, value); for (let n = oldIndex; n <= newIndex; n++) { @@ -510,7 +509,6 @@ export class OrderedStringSet { else if (newIndex !== oldIndex && moveIfExists) { this._valuesArray.splice(oldIndex, 1); if (newIndex > oldIndex) { - newIndex--; this._valuesArray.splice(newIndex, 0, value); for (let n = oldIndex; n <= newIndex; n++) { this._indexes[this._valuesArray[n]] = n; From c0033cf54282d297a7616f2b16bcf1555074d6ca Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Mon, 27 Jul 2020 08:57:33 -0700 Subject: [PATCH 49/69] [v2.x] Updated version to 2.4.2 --- CHANGELOG | 4 ++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2585f07..cff890c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Webglimpse 2.4.2 (release 2020-7-27) +* Fixed a bug with the insertion index of an OrderedSet when moveIfExists is + set to true. + Webglimpse 2.4.1 (release 2020-7-20) * Fixed a bug when scrolling the mouse wheel over the time selector when using diff --git a/package-lock.json b/package-lock.json index cd7a587..c861ace 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.4.1", + "version": "2.4.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 085ec99..263637d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.4.1", + "version": "2.4.2", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 19c0162de388f7b437bb845cb0e68f4b2c65364e Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Fri, 13 Nov 2020 11:31:06 -0800 Subject: [PATCH 50/69] Angular upgrade --- package-lock.json | 969 +++++++++++++++++++++++++--------------------- 1 file changed, 523 insertions(+), 446 deletions(-) diff --git a/package-lock.json b/package-lock.json index c861ace..af264d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,13 +4,19 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@aduh95/viz.js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@aduh95/viz.js/-/viz.js-3.2.1.tgz", + "integrity": "sha512-5Hmejfgemk1qJw24M5I+NabADKmD5Io7LU2fxHw/E6Bo0ji9EdmHP16KrFnt6Sz0/w7VIzc1ZAasyLULaPLGJQ==", + "dev": true + }, "@angular-devkit/architect": { - "version": "0.803.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.28.tgz", - "integrity": "sha512-+2fMwMintkZ7e1Yu8UKVVL8I8pJoPuVjKf0bXxFDaWUMHmgLjYPKXg+QZKdPj5FF+TfmOc+q2LJxVlC4wPeUAg==", + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.29.tgz", + "integrity": "sha512-yHBud/fZHTelX24yjQg5lefZrfIebruoFTGeOwF0JdX8+KiHcTIxS4LOnUTYriasfHarcHRFXBAV/bRm+wv5ow==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.28", + "@angular-devkit/core": "8.3.29", "rxjs": "6.4.0" }, "dependencies": { @@ -26,12 +32,12 @@ } }, "@angular-devkit/core": { - "version": "8.3.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.28.tgz", - "integrity": "sha512-tM0oPjzftJMdfuAuZF2EspVKtJyhtS2IQ02S7eKTZqkh5p/oVv710aND2D2IN5qdFrzpUSearx6D+Mr/Jo8jrA==", + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", "dev": true, "requires": { - "ajv": "6.10.2", + "ajv": "6.12.3", "fast-json-stable-stringify": "2.0.0", "magic-string": "0.25.3", "rxjs": "6.4.0", @@ -50,12 +56,12 @@ } }, "@angular-devkit/schematics": { - "version": "8.3.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.28.tgz", - "integrity": "sha512-WFktBtTynViexVrgHiQV9rKfNS2YNONpi25A8+5tQR5kGKuQyHI3aEN0UMNA2sztWnPQ9AI8xz2uciQsHljgDw==", + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.28", + "@angular-devkit/core": "8.3.29", "rxjs": "6.4.0" }, "dependencies": { @@ -80,16 +86,16 @@ } }, "@angular/cli": { - "version": "8.3.28", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.28.tgz", - "integrity": "sha512-liP39zD3Y/uDbwOQoiryh8tkaJSlz05TG5HgFe7oWIeCSUQW7WBAULVY/ID+t7e4KX2opi0OKSH5R8+DP3VzcA==", + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.29.tgz", + "integrity": "sha512-pW+iU0eKHIae+A1b9W5g8DKefMQcehZ+drGKs4Hryh8G+XGFS00BIWkmh6c1mydWTEhdsFlhdjD/rXCem7MAQQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.28", - "@angular-devkit/core": "8.3.28", - "@angular-devkit/schematics": "8.3.28", - "@schematics/angular": "8.3.28", - "@schematics/update": "0.803.28", + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@schematics/angular": "8.3.29", + "@schematics/update": "0.803.29", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "^4.1.1", @@ -212,32 +218,25 @@ } }, "@babel/code-frame": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", - "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.3" + "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", - "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", "dev": true, "requires": { - "@babel/types": "^7.10.3", + "@babel/types": "^7.12.5", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -247,93 +246,93 @@ } }, "@babel/helper-function-name": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", - "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.3", - "@babel/template": "^7.10.3", - "@babel/types": "^7.10.3" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", - "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", "dev": true, "requires": { - "@babel/types": "^7.10.3" + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", - "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", - "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, "@babel/highlight": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", - "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.3", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", - "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", "dev": true }, "@babel/template": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", - "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", - "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.3", - "@babel/generator": "^7.10.3", - "@babel/helper-function-name": "^7.10.3", - "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.3", - "@babel/types": "^7.10.3", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.10.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", - "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.3", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, @@ -375,76 +374,68 @@ } }, "@compodoc/ngd-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.0.0.tgz", - "integrity": "sha512-6HpYvXRZBdIYFojWxW5EVNkhYPmblytCve62CNoYBSWfy++vTGH7Ypg2Bhjg2CsqeV8JOVxrPO7JM9M3MgWKEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.1.0.tgz", + "integrity": "sha512-nyBH7J7SJJ2AV6OeZhJ02kRtVB7ALnZJKgShjoL9CNmOFEj8AkdhP9qTBIgjaDrbsW5pF4nx32KQL2fT7RFnqw==", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "fancy-log": "^1.3.2", - "typescript": "^2.4.2" + "ansi-colors": "^4.1.1", + "fancy-log": "^1.3.3", + "typescript": "^4.0.3" }, "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true } } }, "@compodoc/ngd-transformer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0.tgz", - "integrity": "sha512-9J0KkmuuuvDHxH0oREgrgbqdEFqcltQXIBofeYdIyMKzI3A+pN1Ji4zfi7x1ql0Ax7qQKemp8XWP+cCpP0qY+w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.1.0.tgz", + "integrity": "sha512-Jo4VCMzIUtgIAdRmhHhOoRRE01gCjc5CyrUERRx0VgEzkkCm1Wmu/XHSsQP6tSpCYHBjERghqaDqH5DabkR2oQ==", "dev": true, "requires": { - "@compodoc/ngd-core": "~2.0.0", - "dot": "^1.1.1", - "fs-extra": "^4.0.1", - "viz.js": "^1.8.0" + "@aduh95/viz.js": "^3.1.0", + "@compodoc/ngd-core": "~2.1.0", + "dot": "^1.1.3", + "fs-extra": "^9.0.1" }, "dependencies": { "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } } } }, "@schematics/angular": { - "version": "8.3.28", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.28.tgz", - "integrity": "sha512-XS+eB/XwS+C97UW/WFQFvkrIzcPZF4qILOX3xZkJflJ3OtaM3q/WKoHxJVRDZWBJQlaNHv2X4UZZWN1LP3o7dw==", + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", + "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.28", - "@angular-devkit/schematics": "8.3.28" + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29" } }, "@schematics/update": { - "version": "0.803.28", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.28.tgz", - "integrity": "sha512-CBSJXSVj3NkqmR7UaBiT5vY8s4tAvFm9IgoOU8DIgy3xGd56dAG49Oid2lJtOjwBvCgRLfGK1KcSOmWPJP2UVA==", + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", + "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.28", - "@angular-devkit/schematics": "8.3.28", + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "pacote": "9.5.5", @@ -560,9 +551,9 @@ } }, "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "adm-zip": { @@ -596,12 +587,12 @@ } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -905,6 +896,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -912,14 +909,14 @@ "dev": true }, "autoprefixer": { - "version": "9.8.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", - "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001087", - "colorette": "^1.2.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.32", @@ -933,9 +930,9 @@ "dev": true }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "axobject-query": { @@ -1150,6 +1147,15 @@ "toidentifier": "1.0.0" } }, + "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" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -1263,15 +1269,16 @@ } }, "browserslist": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", - "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", + "version": "4.14.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz", + "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001088", - "electron-to-chromium": "^1.3.483", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001157", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.591", + "escalade": "^3.1.1", + "node-releases": "^1.1.66" } }, "browserstack": { @@ -1396,9 +1403,9 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -1418,6 +1425,16 @@ } } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", @@ -1431,9 +1448,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001088", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001088.tgz", - "integrity": "sha512-6eYUrlShRYveyqKG58HcyOfPgh3zb2xqs7NvT2VVtP3hEUeeWvc3lqhpeMTxYWBBeeaT9A4bKsrtjATm66BTHg==", + "version": "1.0.30001157", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001157.tgz", + "integrity": "sha512-gOerH9Wz2IRZ2ZPdMfBvyOi3cjaz4O4dgNwPGzx8EhqAs4+2IL/O+fJsbt+znSigujoZG8bVcIAUM/I/E5K3MA==", "dev": true }, "canonical-path": { @@ -1552,9 +1569,9 @@ } }, "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, "cli-cursor": { @@ -1616,12 +1633,6 @@ } } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -1700,9 +1711,9 @@ "dev": true }, "colorette": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", - "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, "colors": { @@ -1889,9 +1900,9 @@ "dev": true }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", + "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==", "dev": true }, "core-util-is": { @@ -1985,14 +1996,13 @@ } }, "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", "dev": true, "requires": { "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" + "fastparse": "^1.1.2" } }, "css-what": { @@ -2056,12 +2066,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "debuglog": { @@ -2302,18 +2312,18 @@ "dev": true }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dev": true, "requires": { "is-obj": "^1.0.0" } }, "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexer3": { @@ -2371,9 +2381,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.483", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz", - "integrity": "sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg==", + "version": "1.3.595", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.595.tgz", + "integrity": "sha512-JpaBIhdBkF9FLG7x06ONfe0f5bxPrxRcq0X+Sc8vsCt+OPWIzxOD+qM71NEHLGbDfN9Q6hbtHRv4/dnvcOxo6g==", "dev": true }, "emoji-regex": { @@ -2389,12 +2399,12 @@ "dev": true }, "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "^0.6.2" } }, "end-of-stream": { @@ -2536,20 +2546,20 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -2581,9 +2591,9 @@ } }, "escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { @@ -2632,9 +2642,9 @@ } }, "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "execa": { @@ -2754,6 +2764,17 @@ "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": { @@ -2851,9 +2872,9 @@ } }, "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=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { @@ -2999,9 +3020,9 @@ } }, "follow-redirects": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", - "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", "dev": true }, "for-in": { @@ -3076,6 +3097,23 @@ "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } } }, "fs-minipass": { @@ -3134,6 +3172,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -3274,12 +3323,12 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -3559,12 +3608,12 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "iferr": { @@ -3661,10 +3710,21 @@ "dev": true }, "injection-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.3.0.tgz", - "integrity": "sha512-rhS6E5jv603kbaO72ylOt0hGF1LT03oqQ4GU5KOO0qSaRbIWmdUCHjXq+VT79jL6/NmXtw9ccfK6dh/CzjoYjA==", - "dev": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", + "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "inquirer": { "version": "6.5.1", @@ -3741,9 +3801,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-ci": { @@ -3755,6 +3815,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3843,6 +3912,12 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-npm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", @@ -3909,26 +3984,18 @@ } }, "is-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.0.tgz", - "integrity": "sha512-ZVxq+5TkOx6GQdnoMm2aRdCKADdcrOWXLGzGT+vIA8DMpqEJaRk5AL1bS80zJ2bjHunVmjdzfCt0e4BymIEqKQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "requires": { - "@types/estree": "0.0.44" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.44", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", - "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==", - "dev": true - } + "@types/estree": "*" } }, "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { "has-symbols": "^1.0.1" @@ -4189,9 +4256,9 @@ "dev": true }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-buffer": { @@ -4206,6 +4273,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4231,12 +4304,21 @@ "dev": true }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, "jsonparse": { @@ -4459,19 +4541,17 @@ } }, "less": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz", - "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", "dev": true, "requires": { - "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "promise": "^7.1.1", - "request": "^2.83.0", + "native-request": "^1.0.5", "source-map": "~0.6.0", "tslib": "^1.10.0" }, @@ -4495,15 +4575,6 @@ "resolve": "~1.1.6" }, "dependencies": { - "promise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", - "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -4567,9 +4638,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "log4js": { @@ -4854,9 +4925,9 @@ } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "morgan": { "version": "1.10.0", @@ -4938,9 +5009,9 @@ "dev": true }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "dev": true, "optional": true }, @@ -4963,6 +5034,13 @@ "to-regex": "^3.0.1" } }, + "native-request": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", + "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", + "dev": true, + "optional": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -4970,9 +5048,9 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "ng-packagr": { @@ -5021,9 +5099,9 @@ } }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, "braces": { @@ -5036,9 +5114,9 @@ } }, "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -5048,7 +5126,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "commander": { @@ -5108,10 +5186,19 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -5125,6 +5212,12 @@ "requires": { "is-number": "^7.0.0" } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, @@ -5146,9 +5239,9 @@ } }, "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "version": "1.1.66", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.66.tgz", + "integrity": "sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg==", "dev": true }, "node-sass-tilde-importer": { @@ -5264,9 +5357,9 @@ } }, "npm-registry-fetch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz", - "integrity": "sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", "dev": true, "requires": { "JSONStream": "^1.3.4", @@ -5385,15 +5478,15 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { @@ -5440,9 +5533,9 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" @@ -5675,14 +5768,14 @@ } }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -5816,9 +5909,9 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -5883,11 +5976,10 @@ "dev": true }, "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", "dev": true, - "optional": true, "requires": { "asap": "~2.0.3" } @@ -6225,6 +6317,15 @@ "toidentifier": "1.0.0" } }, + "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" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -6246,14 +6347,13 @@ } }, "read-package-json": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", - "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", "dev": true, "requires": { "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "normalize-package-data": "^2.0.0", "npm-normalize-package-bin": "^1.0.0" } @@ -6351,21 +6451,6 @@ "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -6376,24 +6461,10 @@ "safe-regex": "^1.1.0" } }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" @@ -6408,21 +6479,6 @@ "rc": "^1.2.8" } }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -6488,11 +6544,12 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -6629,9 +6686,9 @@ } }, "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -6690,9 +6747,9 @@ "dev": true }, "sass": { - "version": "1.26.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", - "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.29.0.tgz", + "integrity": "sha512-ZpwAUFgnvAUCdkjwPREny+17BpUj8nh5Yr6zKPGtLNTLrmtoRYIjm7njP24COhjJldjwW1dcv52Lpf4tNZVVRA==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -7373,9 +7430,9 @@ } }, "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==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", "dev": true }, "split": { @@ -7513,6 +7570,21 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, @@ -7539,23 +7611,67 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string_decoder": { @@ -7611,18 +7727,18 @@ "dev": true }, "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "dev": true, "requires": { "css-parse": "~2.0.0", "debug": "~3.1.0", - "glob": "^7.1.3", - "mkdirp": "~0.5.x", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.0.0", + "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { @@ -7635,6 +7751,12 @@ "ms": "2.0.0" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7918,9 +8040,9 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tslint": { @@ -8020,9 +8142,9 @@ "dev": true }, "uglify-js": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", - "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "version": "3.11.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.5.tgz", + "integrity": "sha512-btvv/baMqe7HxP7zJSF7Uc16h1mSfuuSplT0/qdjxseesDU+yYzH33eHBH+eMdeRXwujXspaCTooWHQVVBh09w==", "dev": true, "optional": true }, @@ -8041,34 +8163,6 @@ "editions": "^2.2.0" } }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -8109,31 +8203,20 @@ } }, "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", "dev": true, "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", + "debug": "^4.1.1", + "request": "^2.88.2", "uuid": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "unix-crypt-td-js": { @@ -8215,9 +8298,9 @@ } }, "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==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -8335,12 +8418,6 @@ "extsprintf": "^1.2.0" } }, - "viz.js": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", - "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", - "dev": true - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", From f66f658fb58c98f24cbf590e91d66e8762de8e5c Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Fri, 13 Nov 2020 11:31:56 -0800 Subject: [PATCH 51/69] Angular CLI update for packages - @angular/core@9, @angular/cli@9 --- package-lock.json | 981 ++++++++++++++++++++++++++++++++++++---------- package.json | 26 +- 2 files changed, 789 insertions(+), 218 deletions(-) diff --git a/package-lock.json b/package-lock.json index af264d5..4ba9c3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,19 +11,19 @@ "dev": true }, "@angular-devkit/architect": { - "version": "0.803.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.29.tgz", - "integrity": "sha512-yHBud/fZHTelX24yjQg5lefZrfIebruoFTGeOwF0JdX8+KiHcTIxS4LOnUTYriasfHarcHRFXBAV/bRm+wv5ow==", + "version": "0.901.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.12.tgz", + "integrity": "sha512-gLlsxa+3JPV1m1gRvRMujOs4xKox6I5BkYmOD1zfu+dB6y3LuBAvHfXA6FaTDVOMBrmSlWnE4PmOmB6xd7wxMA==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.29", - "rxjs": "6.4.0" + "@angular-devkit/core": "9.1.12", + "rxjs": "6.5.4" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -32,22 +32,37 @@ } }, "@angular-devkit/core": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", - "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.12.tgz", + "integrity": "sha512-D/GnBeSlmdgGn7EhuE32HuPuRAjvUuxi7Q6WywBI8PSsXKAGnrypghBwMATNnOA24//CgbW2533Y9VWHaeXdeA==", "dev": true, "requires": { "ajv": "6.12.3", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.4", "source-map": "0.7.3" }, "dependencies": { + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -56,19 +71,20 @@ } }, "@angular-devkit/schematics": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", - "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.12.tgz", + "integrity": "sha512-+GYnUzmIy1/QpYitCC8mI7jcrViGHTtOKvvDPEFjU2nggjNEQaMmsHcdIsjrqggEc23ZZyebNAIewT8CMkJyrQ==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.29", - "rxjs": "6.4.0" + "@angular-devkit/core": "9.1.12", + "ora": "4.0.3", + "rxjs": "6.5.4" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -77,103 +93,247 @@ } }, "@angular/animations": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.14.tgz", - "integrity": "sha512-3Vc9TnNpKdtvKIXcWDFINSsnwgEMiDmLzjceWg1iYKwpeZGQahUXPoesLwQazBMmxJzQiA4HOMj0TTXKZ+Jzkg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.12.tgz", + "integrity": "sha512-tphpf9QHnOPoL2Jl7KpR+R5aHNW3oifLEmRUTajJYJGvo1uzdUDE82+V9OGOinxJsYseCth9gYJhN24aYTB9NA==", + "dev": true }, "@angular/cli": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.29.tgz", - "integrity": "sha512-pW+iU0eKHIae+A1b9W5g8DKefMQcehZ+drGKs4Hryh8G+XGFS00BIWkmh6c1mydWTEhdsFlhdjD/rXCem7MAQQ==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.12.tgz", + "integrity": "sha512-B0yOab5WbD84bIRRUKOPAJnpka8Qj+CRt61wJfjsqpd/Rj7pD/3ubmdCNoBH7Xa6UlOb0tdYqRPsqfK7uEL0sw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.803.29", - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29", - "@schematics/angular": "8.3.29", - "@schematics/update": "0.803.29", + "@angular-devkit/architect": "0.901.12", + "@angular-devkit/core": "9.1.12", + "@angular-devkit/schematics": "9.1.12", + "@schematics/angular": "9.1.12", + "@schematics/update": "0.901.12", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "^4.1.1", + "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "6.5.1", - "npm-package-arg": "6.1.0", - "npm-pick-manifest": "3.0.2", - "open": "6.4.0", - "pacote": "9.5.5", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.0.0", + "open": "7.0.3", + "pacote": "9.5.12", "read-package-tree": "5.3.1", - "rimraf": "3.0.0", - "semver": "6.3.0", + "rimraf": "3.0.2", + "semver": "7.1.3", "symbol-observable": "1.2.0", - "universal-analytics": "^0.4.20", - "uuid": "^3.3.2" + "universal-analytics": "0.4.20", + "uuid": "7.0.2" + }, + "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" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "uuid": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", + "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==", + "dev": true + } } }, "@angular/common": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.14.tgz", - "integrity": "sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.12.tgz", + "integrity": "sha512-XSIqkbM6VV1yixF9zuzeE5eqN1VsiXS517K2VU0XgCRSAzhVhLOeKsdYjeLf7PdSu/HgW/Tr81H+isi9A9I0YA==", + "dev": true }, "@angular/compiler": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", - "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.12.tgz", + "integrity": "sha512-suefk0OFkaJpUUKnV+phbL4T8fmVGHvzkereY5eqybQlumOez8NPL1PJcygAylh/E6OIAYm8SWookYwM6ZY9dg==", + "dev": true }, "@angular/compiler-cli": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", - "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.12.tgz", + "integrity": "sha512-bbqJ+fbY+aQejSYuHUjE1qYJCXkZBM5Hru9eN7m/j376u83MQ5jWdC290uYx+ipsXcPTa/YRZ44jpL+5cCzIrg==", "dev": true, "requires": { "canonical-path": "1.0.0", - "chokidar": "^2.1.1", + "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", "source-map": "^0.6.1", - "tslib": "^1.9.0", - "yargs": "13.1.0" + "sourcemap-codec": "^1.4.8", + "yargs": "15.3.0" }, "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "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 + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, "@angular/core": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", - "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.12.tgz", + "integrity": "sha512-WVA/eh3fzjx0apOzkKot4YRRUsGkHj50zFQWrAOMgivGaj1YVrvhf+m3hpglj5fn/BkLiFDl8RT0wAE8z9X+gQ==", + "dev": true }, "@angular/forms": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.14.tgz", - "integrity": "sha512-zhyKL3CFIqcyHJ/TQF/h1OZztK611a6rxuPHCrt/5Sn1SuBTJJQ1pPTkOYIDy6IrCrtyANc8qB6P17Mao71DNQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.12.tgz", + "integrity": "sha512-LhjnZlC4WEsEsAJfOZLte+Lks3WBAFVeRv2lzoQNFVr/IMzBNDVfjEaaSqKF1cei3cjY39Df2nYDMJM7HfqbJA==", + "dev": true }, "@angular/http": { "version": "5.2.11", @@ -185,37 +345,28 @@ } }, "@angular/language-service": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.14.tgz", - "integrity": "sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.12.tgz", + "integrity": "sha512-0qfIAn5fP5lD+JW6il5HBHGS89rv+idRv5aooDkHqBhuBo4V2VuB1wNy5eP49GZbHKMW1xPAzv1MqeMdk+zwQA==", "dev": true }, "@angular/platform-browser": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.14.tgz", - "integrity": "sha512-MtJptptyKzsE37JZ2VB/tI4cvMrdAH+cT9pMBYZd66YSZfKjIj5s+AZo7z8ncoskQSB1o3HMfDjSK7QXGx1mLQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.12.tgz", + "integrity": "sha512-rPa/hJcLfdId6bYB0b6pFUo3QIgjZlvUlmtKMGdrLNLYR8XQxPa2Y/UdN/5YeZ12htGw6GXrX9U8U7nTbUSpkw==", + "dev": true }, "@angular/platform-browser-dynamic": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.14.tgz", - "integrity": "sha512-mO2JPR5kLU/A3AQngy9+R/Q5gaF9csMStBQjwsCRI0wNtlItOIGL6+wTYpiTuh/ux+WVN1F2sLcEYU4Zf1ud9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.12.tgz", + "integrity": "sha512-NmwUZaQeMnA6f+vP9Fp9P+qjL72H8dKlxLS76ujlKHVf75pP5oahWS8wfl7KXel1tKW3FQWMMffmKf5/NHRiSw==", + "dev": true }, "@angular/router": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.14.tgz", - "integrity": "sha512-DHA2BhODqV7F0g6ZKgFaZgbsqzHHWRcfWchCOrOVKu2rYiKUTwwHVLBgZAhrpNeinq2pWanVYSIhMr7wy+LfEA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.12.tgz", + "integrity": "sha512-+qCaXa9y0nsRhzjAYBqmGoQ2YkrdXgftZwuFDf6t4qEi30EXa0oS97KrlFq0M5GKdLIDGrbUm9PcdHSTOI+ZhA==", + "dev": true }, "@babel/code-frame": { "version": "7.10.4", @@ -419,39 +570,46 @@ } }, "@schematics/angular": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", - "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.12.tgz", + "integrity": "sha512-r4+aPAGhstsKFMwW/kOen1ACnzuLpz+vMxEpndXOqqVXLkAMsuAbQUFYjIlMy6fH4zdhpI90EJZ1PbOrAXvKxA==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29" + "@angular-devkit/core": "9.1.12", + "@angular-devkit/schematics": "9.1.12" } }, "@schematics/update": { - "version": "0.803.29", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", - "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", + "version": "0.901.12", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.12.tgz", + "integrity": "sha512-SxGVYLTHhBC0rSF0OWSWPuJUB1Jhfqkl3o5bBgCC9//DutWiN6WoCCBTrCxR7F5vR2iiD7WqOe9CuvWYfvV8oQ==", "dev": true, "requires": { - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29", + "@angular-devkit/core": "9.1.12", + "@angular-devkit/schematics": "9.1.12", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", - "pacote": "9.5.5", - "rxjs": "6.4.0", - "semver": "6.3.0", + "npm-package-arg": "^8.0.0", + "pacote": "9.5.12", + "rxjs": "6.5.4", + "semver": "7.1.3", "semver-intersect": "1.4.0" }, "dependencies": { "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true } } }, @@ -1359,6 +1517,15 @@ "y18n": "^4.0.0" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -1367,6 +1534,12 @@ "requires": { "glob": "^7.1.3" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -1583,6 +1756,12 @@ "restore-cursor": "^3.1.0" } }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true + }, "cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", @@ -1633,6 +1812,12 @@ } } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -2116,6 +2301,15 @@ "strip-bom": "^3.0.0" } }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -3727,24 +3921,84 @@ } }, "inquirer": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", - "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "invert-kv": { @@ -3869,6 +4123,12 @@ } } }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -3906,6 +4166,12 @@ "is-path-inside": "^1.0.0" } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -4643,6 +4909,15 @@ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, "log4js": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", @@ -4663,12 +4938,12 @@ "dev": true }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "lunr": { @@ -4733,6 +5008,23 @@ "promise-retry": "^1.1.1", "socks-proxy-agent": "^4.0.0", "ssri": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "map-age-cleaner": { @@ -4865,6 +5157,14 @@ "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "minizlib": { @@ -5300,6 +5600,23 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, "npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", @@ -5307,21 +5624,29 @@ "dev": true }, "npm-package-arg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", "dev": true, "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" }, "dependencies": { + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -5338,20 +5663,20 @@ } }, "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", + "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -5369,6 +5694,41 @@ "make-fetch-happen": "^5.0.0", "npm-package-arg": "^6.1.0", "safe-buffer": "^5.2.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "npm-run-path": { @@ -5542,12 +5902,24 @@ } }, "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + } } }, "opn": { @@ -5583,6 +5955,82 @@ } } }, + "ora": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -5687,13 +6135,14 @@ } }, "pacote": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", - "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", "dev": true, "requires": { "bluebird": "^3.5.3", "cacache": "^12.0.2", + "chownr": "^1.1.2", "figgy-pudding": "^3.5.1", "get-stream": "^4.1.0", "glob": "^7.1.3", @@ -5705,9 +6154,10 @@ "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", "npm-package-arg": "^6.1.0", "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", + "npm-pick-manifest": "^3.0.0", "npm-registry-fetch": "^4.0.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", @@ -5717,15 +6167,36 @@ "safe-buffer": "^5.1.2", "semver": "^5.6.0", "ssri": "^6.0.1", - "tar": "^4.4.8", + "tar": "^4.4.10", "unique-filename": "^1.1.1", "which": "^1.3.1" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", @@ -5747,6 +6218,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -7793,6 +8270,14 @@ "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.3" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "taskgroup": { @@ -8136,9 +8621,9 @@ "dev": true }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "uglify-js": { @@ -8203,14 +8688,25 @@ } }, "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", "dev": true, "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", + "debug": "^3.0.0", + "request": "^2.88.0", "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "universalify": { @@ -8440,6 +8936,15 @@ "typechecker": "^4.3.0" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", @@ -8680,59 +9185,125 @@ "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", - "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^18.1.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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=", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "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==", + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -8746,9 +9317,9 @@ "dev": true }, "zone.js": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", - "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", "dev": true } } diff --git a/package.json b/package.json index 263637d..a7c42cb 100644 --- a/package.json +++ b/package.json @@ -28,18 +28,18 @@ "moment": "^2.24.0" }, "devDependencies": { - "@angular/animations": "^8.0.2", - "@angular/cli": "^8.0.3", - "@angular/common": "^8.0.2", - "@angular/compiler": "^8.0.2", - "@angular/compiler-cli": "^8.0.2", - "@angular/core": "^8.0.2", - "@angular/forms": "^8.0.2", + "@angular/animations": "^9.1.12", + "@angular/cli": "^9.1.12", + "@angular/common": "^9.1.12", + "@angular/compiler": "^9.1.12", + "@angular/compiler-cli": "^9.1.12", + "@angular/core": "^9.1.12", + "@angular/forms": "^9.1.12", "@angular/http": "^5.2.0", - "@angular/language-service": "^8.0.2", - "@angular/platform-browser": "^8.0.2", - "@angular/platform-browser-dynamic": "^8.0.2", - "@angular/router": "^8.0.2", + "@angular/language-service": "^9.1.12", + "@angular/platform-browser": "^9.1.12", + "@angular/platform-browser-dynamic": "^9.1.12", + "@angular/router": "^9.1.12", "@compodoc/compodoc": "~1.0.8", "@types/jasmine": "~3.3.13", "@types/jasminewd2": "~2.0.6", @@ -58,7 +58,7 @@ "protractor": "~5.4.2", "rxjs": "^6.5.2", "tslint": "~5.17.0", - "typescript": "~3.4.5", - "zone.js": "^0.9.1" + "typescript": "~3.8.3", + "zone.js": "^0.10.3" } } From c4cea4a7f92c5cc73bd0ef3a3e8972e56843cde8 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Fri, 13 Nov 2020 11:32:44 -0800 Subject: [PATCH 52/69] Angular CLI update for packages - @angular/core@10, @angular/cli@10 --- package-lock.json | 460 ++++++++++++++++++++++++++++++---------------- package.json | 24 +-- 2 files changed, 314 insertions(+), 170 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ba9c3f..6f5b868 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,19 +11,19 @@ "dev": true }, "@angular-devkit/architect": { - "version": "0.901.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.12.tgz", - "integrity": "sha512-gLlsxa+3JPV1m1gRvRMujOs4xKox6I5BkYmOD1zfu+dB6y3LuBAvHfXA6FaTDVOMBrmSlWnE4PmOmB6xd7wxMA==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.12", - "rxjs": "6.5.4" + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -32,18 +32,30 @@ } }, "@angular-devkit/core": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.12.tgz", - "integrity": "sha512-D/GnBeSlmdgGn7EhuE32HuPuRAjvUuxi7Q6WywBI8PSsXKAGnrypghBwMATNnOA24//CgbW2533Y9VWHaeXdeA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", "dev": true, "requires": { - "ajv": "6.12.3", + "ajv": "6.12.4", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", - "rxjs": "6.5.4", + "rxjs": "6.6.2", "source-map": "0.7.3" }, "dependencies": { + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -60,9 +72,9 @@ } }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -71,20 +83,20 @@ } }, "@angular-devkit/schematics": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.12.tgz", - "integrity": "sha512-+GYnUzmIy1/QpYitCC8mI7jcrViGHTtOKvvDPEFjU2nggjNEQaMmsHcdIsjrqggEc23ZZyebNAIewT8CMkJyrQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz", + "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.12", - "ora": "4.0.3", - "rxjs": "6.5.4" + "@angular-devkit/core": "10.2.0", + "ora": "5.0.0", + "rxjs": "6.6.2" }, "dependencies": { "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -93,37 +105,48 @@ } }, "@angular/animations": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.12.tgz", - "integrity": "sha512-tphpf9QHnOPoL2Jl7KpR+R5aHNW3oifLEmRUTajJYJGvo1uzdUDE82+V9OGOinxJsYseCth9gYJhN24aYTB9NA==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.2.3.tgz", + "integrity": "sha512-UP3aynCSkFqEJfZ9bQMyBIVo4mm5EuIHL6NfMqhqLQankKKnc25Pi3a7heq0xzV1EoAxGSd3UBn36Y8Jjav2fg==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/cli": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.12.tgz", - "integrity": "sha512-B0yOab5WbD84bIRRUKOPAJnpka8Qj+CRt61wJfjsqpd/Rj7pD/3ubmdCNoBH7Xa6UlOb0tdYqRPsqfK7uEL0sw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.0.tgz", + "integrity": "sha512-YBzwkFBmG6CdUJk8onsPXxHX/ByU5MERBQgYhLC873e2nZlXMUu+Ttq2Wai6apyskGvsXKxZNPOQSFZTGKXzXg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.901.12", - "@angular-devkit/core": "9.1.12", - "@angular-devkit/schematics": "9.1.12", - "@schematics/angular": "9.1.12", - "@schematics/update": "0.901.12", + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "@schematics/angular": "10.2.0", + "@schematics/update": "0.1002.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "7.1.0", + "inquirer": "7.3.3", "npm-package-arg": "8.0.1", - "npm-pick-manifest": "6.0.0", - "open": "7.0.3", + "npm-pick-manifest": "6.1.0", + "open": "7.2.0", "pacote": "9.5.12", "read-package-tree": "5.3.1", "rimraf": "3.0.2", - "semver": "7.1.3", + "semver": "7.3.2", "symbol-observable": "1.2.0", - "universal-analytics": "0.4.20", - "uuid": "7.0.2" + "universal-analytics": "0.4.23", + "uuid": "8.3.0" }, "dependencies": { "debug": { @@ -145,35 +168,57 @@ } }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "uuid": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", - "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", "dev": true } } }, "@angular/common": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.12.tgz", - "integrity": "sha512-XSIqkbM6VV1yixF9zuzeE5eqN1VsiXS517K2VU0XgCRSAzhVhLOeKsdYjeLf7PdSu/HgW/Tr81H+isi9A9I0YA==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.3.tgz", + "integrity": "sha512-xKKN8bgdudktVC/gwUtdeS2khYqSENWQe1CS8nE0V88qKCftwPhCD5Ovp6+6LflqvQhJWb0guf7HXjq9oBqO2w==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/compiler": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.12.tgz", - "integrity": "sha512-suefk0OFkaJpUUKnV+phbL4T8fmVGHvzkereY5eqybQlumOez8NPL1PJcygAylh/E6OIAYm8SWookYwM6ZY9dg==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.3.tgz", + "integrity": "sha512-Bg+QbyvJVlfGQpJCagEMkkqoRi2LMQc8iuu+cVYVqQOETLO0LxmkPpMQ/7pRLTNWl36PoYEB7IjUkp+qng8xKg==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/compiler-cli": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.12.tgz", - "integrity": "sha512-bbqJ+fbY+aQejSYuHUjE1qYJCXkZBM5Hru9eN7m/j376u83MQ5jWdC290uYx+ipsXcPTa/YRZ44jpL+5cCzIrg==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.3.tgz", + "integrity": "sha512-29RL/lIbHpjoWMUz23cyRcyG50PXqvxlLk0IpyCUWDVtPp6Hc8S/JayxeSwxNST79miDobGaeiGmS0JHuCouVQ==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -187,6 +232,7 @@ "semver": "^6.3.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", "yargs": "15.3.0" }, "dependencies": { @@ -315,6 +361,12 @@ "is-number": "^7.0.0" } }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -324,16 +376,38 @@ } }, "@angular/core": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.12.tgz", - "integrity": "sha512-WVA/eh3fzjx0apOzkKot4YRRUsGkHj50zFQWrAOMgivGaj1YVrvhf+m3hpglj5fn/BkLiFDl8RT0wAE8z9X+gQ==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.3.tgz", + "integrity": "sha512-mE6nLpul/IJllk0VYrlrP69n0P7JPz+BHYAVobwO5+0EGO65ieTD18DxzfEt4eQgthnM3VQwSZxjW4n9Y1p/dQ==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/forms": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.12.tgz", - "integrity": "sha512-LhjnZlC4WEsEsAJfOZLte+Lks3WBAFVeRv2lzoQNFVr/IMzBNDVfjEaaSqKF1cei3cjY39Df2nYDMJM7HfqbJA==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.2.3.tgz", + "integrity": "sha512-IcQ0xK+f84khGAs6cd0BUJIebFV3KQsVF9kbAX10bpPmleI62xI074mIefAiu3ZLEOm3OnhYDDZwrrk7UIrmow==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/http": { "version": "5.2.11", @@ -345,28 +419,61 @@ } }, "@angular/language-service": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.12.tgz", - "integrity": "sha512-0qfIAn5fP5lD+JW6il5HBHGS89rv+idRv5aooDkHqBhuBo4V2VuB1wNy5eP49GZbHKMW1xPAzv1MqeMdk+zwQA==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.2.3.tgz", + "integrity": "sha512-8rtNG3HjBdUMlKcakh6gDfFvYSS5X16ymbVR0i2L/Nc4d9HuqgKrIrsNY4We/jSBoAjo/CGS8AvbscMa8oW4Eg==", "dev": true }, "@angular/platform-browser": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.12.tgz", - "integrity": "sha512-rPa/hJcLfdId6bYB0b6pFUo3QIgjZlvUlmtKMGdrLNLYR8XQxPa2Y/UdN/5YeZ12htGw6GXrX9U8U7nTbUSpkw==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.2.3.tgz", + "integrity": "sha512-ElTuRF4SWhYxJypDlaa/n49DrqrWV2tYU5kkgF+VNbVbvzKHnVEZe4x1KSWrEzIyewcjxwwE6ZF0oXMdd4AZQQ==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/platform-browser-dynamic": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.12.tgz", - "integrity": "sha512-NmwUZaQeMnA6f+vP9Fp9P+qjL72H8dKlxLS76ujlKHVf75pP5oahWS8wfl7KXel1tKW3FQWMMffmKf5/NHRiSw==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.2.3.tgz", + "integrity": "sha512-ujwcGzlWQ6S83iHIF3ArfDn8ik8YETZcuSMCTxjaNv8kwEqiRzchZDkheJpoH9HyddnM6UVGL6D/5k11TMWTew==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@angular/router": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.12.tgz", - "integrity": "sha512-+qCaXa9y0nsRhzjAYBqmGoQ2YkrdXgftZwuFDf6t4qEi30EXa0oS97KrlFq0M5GKdLIDGrbUm9PcdHSTOI+ZhA==", - "dev": true + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.2.3.tgz", + "integrity": "sha512-QUVqEOai3hASeMgTXIVo9Ql6EGJ+v0QHs/O+5pFplXGAzMQDpCnrpOuB4FExWxdafiiYfKfLlNvxj0tEJ2gU0w==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "dev": true + } + } }, "@babel/code-frame": { "version": "7.10.4", @@ -570,45 +677,36 @@ } }, "@schematics/angular": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.12.tgz", - "integrity": "sha512-r4+aPAGhstsKFMwW/kOen1ACnzuLpz+vMxEpndXOqqVXLkAMsuAbQUFYjIlMy6fH4zdhpI90EJZ1PbOrAXvKxA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.0.tgz", + "integrity": "sha512-rJRTTTL8CMMFb3ebCvAVHKHxuNzRqy/HtbXhJ82l5Xo/jXcm74eV2Q0RBUrNo1yBKWFIR+FIwiXLJaGcC/R9Pw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.12", - "@angular-devkit/schematics": "9.1.12" + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "jsonc-parser": "2.3.0" } }, "@schematics/update": { - "version": "0.901.12", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.12.tgz", - "integrity": "sha512-SxGVYLTHhBC0rSF0OWSWPuJUB1Jhfqkl3o5bBgCC9//DutWiN6WoCCBTrCxR7F5vR2iiD7WqOe9CuvWYfvV8oQ==", + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.0.tgz", + "integrity": "sha512-g2bfJSAj3x/YL0GNhnHsDSQmO6DoxSnLxoFLqNN5+ukxK5jq7OZNDwMJGxZ3X6RcSMWKEkIKL/wlq9yhj2T/kw==", "dev": true, "requires": { - "@angular-devkit/core": "9.1.12", - "@angular-devkit/schematics": "9.1.12", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", "npm-package-arg": "^8.0.0", "pacote": "9.5.12", - "rxjs": "6.5.4", - "semver": "7.1.3", + "semver": "7.3.2", "semver-intersect": "1.4.0" }, "dependencies": { - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true } } @@ -1763,9 +1861,9 @@ "dev": true }, "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, "cliui": { @@ -3921,21 +4019,21 @@ } }, "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", - "rxjs": "^6.5.3", + "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -3951,9 +4049,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4569,6 +4667,12 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsonc-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz", + "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==", + "dev": true + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -4910,12 +5014,63 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "log4js": { @@ -5663,9 +5818,9 @@ } }, "npm-pick-manifest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", - "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", "dev": true, "requires": { "npm-install-checks": "^4.0.0", @@ -5902,9 +6057,9 @@ } }, "open": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", - "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", + "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -5956,16 +6111,16 @@ } }, "ora": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", - "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", "dev": true, "requires": { - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", + "cli-spinners": "^2.4.0", "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", + "log-symbols": "^4.0.0", "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" @@ -5981,9 +6136,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -8621,9 +8776,9 @@ "dev": true }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, "uglify-js": { @@ -8688,25 +8843,14 @@ } }, "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", "dev": true, "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", + "debug": "^4.1.1", + "request": "^2.88.2", "uuid": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "universalify": { diff --git a/package.json b/package.json index a7c42cb..dda6ef7 100644 --- a/package.json +++ b/package.json @@ -28,18 +28,18 @@ "moment": "^2.24.0" }, "devDependencies": { - "@angular/animations": "^9.1.12", - "@angular/cli": "^9.1.12", - "@angular/common": "^9.1.12", - "@angular/compiler": "^9.1.12", - "@angular/compiler-cli": "^9.1.12", - "@angular/core": "^9.1.12", - "@angular/forms": "^9.1.12", + "@angular/animations": "^10.2.3", + "@angular/cli": "^10.2.0", + "@angular/common": "^10.2.3", + "@angular/compiler": "^10.2.3", + "@angular/compiler-cli": "^10.2.3", + "@angular/core": "^10.2.3", + "@angular/forms": "^10.2.3", "@angular/http": "^5.2.0", - "@angular/language-service": "^9.1.12", - "@angular/platform-browser": "^9.1.12", - "@angular/platform-browser-dynamic": "^9.1.12", - "@angular/router": "^9.1.12", + "@angular/language-service": "^10.2.3", + "@angular/platform-browser": "^10.2.3", + "@angular/platform-browser-dynamic": "^10.2.3", + "@angular/router": "^10.2.3", "@compodoc/compodoc": "~1.0.8", "@types/jasmine": "~3.3.13", "@types/jasminewd2": "~2.0.6", @@ -58,7 +58,7 @@ "protractor": "~5.4.2", "rxjs": "^6.5.2", "tslint": "~5.17.0", - "typescript": "~3.8.3", + "typescript": "~4.0.5", "zone.js": "^0.10.3" } } From df7d8a0f834277699c600cb0a22c774c7ce4d7cd Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Fri, 13 Nov 2020 11:32:45 -0800 Subject: [PATCH 53/69] @angular/cli migration - tslint-version-6 Update tslint to version 6 and adjust rules to maintain existing behavior. --- package.json | 2 +- tslint.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index dda6ef7..ed5a468 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "ng-packagr": "^5.3.0", "protractor": "~5.4.2", "rxjs": "^6.5.2", - "tslint": "~5.17.0", + "tslint": "~6.1.0", "typescript": "~4.0.5", "zone.js": "^0.10.3" } diff --git a/tslint.json b/tslint.json index a98c5eb..01536fd 100644 --- a/tslint.json +++ b/tslint.json @@ -73,7 +73,6 @@ "no-trailing-whitespace": true, "no-unnecessary-initializer": true, "no-unused-expression": true, - "no-use-before-declare": true, "no-var-keyword": true, "object-literal-sort-keys": false, "one-line": [ From e8ca4340c27a27940ec07dcbae05435875b7abb7 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Tue, 17 Nov 2020 11:51:24 -0800 Subject: [PATCH 54/69] [feature/add-text-annotation-background] Added background to annotation text with ability to style color, padding, and rounding of corners. --- package-lock.json | 18 +-- src/webglimpse/core.ts | 4 +- src/webglimpse/text.ts | 130 +++++++++++++----- .../timeline/timeline_annotation_painter.ts | 17 ++- .../timeline/timeline_annotation_style.ts | 25 +++- src/webglimpse/util/multikey_cache.ts | 26 ++++ 6 files changed, 167 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f5b868..8496a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2545,9 +2545,9 @@ "dev": true }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "dom-serialize": { @@ -8686,23 +8686,23 @@ "dev": true }, "tslint": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.17.0.tgz", - "integrity": "sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "dependencies": { diff --git a/src/webglimpse/core.ts b/src/webglimpse/core.ts index d1d432e..6ff1c6c 100644 --- a/src/webglimpse/core.ts +++ b/src/webglimpse/core.ts @@ -379,7 +379,7 @@ export function requireGL(canvasElement: HTMLCanvasElement): WebGLRenderingConte catch (e) { } try { - const glB = canvasElement.getContext('experimental-webgl'); + const glB = canvasElement.getContext('experimental-webgl') as WebGLRenderingContext; if (glB) { return glB; } @@ -655,7 +655,7 @@ function attachEventListeners(element: HTMLElement, contentPane: Pane) { while (w.parent !== w) { try { w.parent.addEventListener('mousemove', handleMissedMouseUp); - w = w.parent; + w = w.parent as Window & typeof globalThis; } catch (e) { // Cross-origin security may prevent us from adding a listener to a window other than our own -- in that case, diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index cad9d08..9207a01 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -30,7 +30,7 @@ import { Cache } from './util/cache'; import { Texture2D, ImageDrawer } from './texture'; import { Color, black, parseRgba } from './color'; -import { TwoKeyCache, ThreeKeyCache } from './util/multikey_cache'; +import { TwoKeyCache, ThreeKeyCache, SixKeyCache } from './util/multikey_cache'; import { GL, concatLines, hasval } from './util/util'; import { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './shader'; import { Buffer, newStaticBuffer } from './buffer'; @@ -221,17 +221,45 @@ export function newTextTextureCache3(): ThreeKeyCache { }); } +export function newTextTextureCache6(): SixKeyCache { + return new SixKeyCache({ + create: function (font: string, rgbaString: string, text: string, rgbaBgString: string, bgPadding: string, lineWidth: string): TextTexture2D { + const createTextTexture = createTextTextureFactory(font); + const color = parseRgba(rgbaString); + const bgColor = parseRgba(rgbaBgString); + const lineWidthNumber = parseInt(lineWidth, 10); + const paddingNumber = parseInt(bgPadding, 10); + return createTextTexture(color, text, bgColor, paddingNumber, lineWidthNumber); + }, + dispose: function (texture: Texture2D) { + texture.dispose(); + } + }); +} + -export type TextTextureFactory = (color: Color, text: string) => TextTexture2D; +export type TextTextureFactory = ( + color: Color, + text: string, + bgColor?: Color, + bgPadding?: number, + bgBorderRadius?: number +) => TextTexture2D; export function createTextTextureFactory(font: string): TextTextureFactory { const rawFontMetrics = getRawFontMetrics(font); - const jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; - const h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; - - return function (color: Color, text: string): TextTexture2D { - const w = getTextWidth(font, text); + let jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop; + let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; + + return function (color: Color, text: string, bgColor: Color, bgPadding = 0, bgBorderRadius = 0): TextTexture2D { + let w = getTextWidth(font, text); + if (bgColor && bgColor.a !== 0) { + const addedPadding = bgPadding * 2; + w = w + addedPadding + 4; + h = h + addedPadding; + jBaseline = jBaseline + addedPadding; + } return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent @@ -242,38 +270,66 @@ export function createTextTextureFactory(font: string): TextTextureFactory { // de-hinting it. // - g.fillStyle = 'black'; - g.fillRect(0, 0, w, h); - - g.font = font; - g.textAlign = 'left'; - g.textBaseline = 'top'; - g.fillStyle = 'white'; - - g.save(); - g.translate(0, -rawFontMetrics.jTop); - g.fillText(text, 0, 0); - g.restore(); - - const r255 = 255 * color.r; - const g255 = 255 * color.g; - const b255 = 255 * color.b; - const aFactor = color.a / 3; - - const pixels = g.getImageData(0, 0, w, h); - for (let j = 0; j < pixels.height; j++) { - for (let i = 0; i < pixels.width; i++) { - const pixelOffset = (j * pixels.width + i) * 4; - const a255 = aFactor * (pixels.data[pixelOffset + 0] + pixels.data[pixelOffset + 1] + pixels.data[pixelOffset + 2]); - - pixels.data[pixelOffset + 0] = r255; - pixels.data[pixelOffset + 1] = g255; - pixels.data[pixelOffset + 2] = b255; - pixels.data[pixelOffset + 3] = a255; + // If background color not transparent show background color, else follow comment above. + if (bgColor && bgColor.a !== 0) { + // Round corners of text background + if (bgBorderRadius) { + g.beginPath(); + g.moveTo(0 + bgBorderRadius, 0); + g.lineTo(0 + w - bgBorderRadius, 0); + g.quadraticCurveTo(0 + w, 0, 0 + w, 0 + bgBorderRadius); + g.lineTo(0 + w, 0 + h - bgBorderRadius); + g.quadraticCurveTo(0 + w, 0 + h, 0 + w - bgBorderRadius, 0 + h); + g.lineTo(0 + bgBorderRadius, 0 + h); + g.quadraticCurveTo(0, 0 + h, 0, 0 + h - bgBorderRadius); + g.lineTo(0, 0 + bgBorderRadius); + g.quadraticCurveTo(0, 0, 0 + bgBorderRadius, 0); + g.closePath(); + g.strokeStyle = bgColor.cssString; + g.stroke(); + } + g.fillStyle = bgColor.cssString; + g.fill(); + + g.font = font; + g.textAlign = 'center'; + g.textBaseline = 'middle'; + g.fillStyle = color.cssString; + g.fillText(text, w / 2, h / 2); + } else { + g.fillStyle = 'black'; + g.fillRect(0, 0, w, h); + + g.font = font; + g.textAlign = 'left'; + g.textBaseline = 'top'; + g.fillStyle = 'white'; + + g.save(); + g.translate(0, -rawFontMetrics.jTop); + g.fillText(text, 0, 0); + g.restore(); + + const r255 = 255 * color.r; + const g255 = 255 * color.g; + const b255 = 255 * color.b; + const aFactor = color.a / 3; + + const pixels = g.getImageData(0, 0, w, h); + for (let j = 0; j < pixels.height; j++) { + for (let i = 0; i < pixels.width; i++) { + const pixelOffset = (j * pixels.width + i) * 4; + const a255 = aFactor * (pixels.data[pixelOffset + 0] + pixels.data[pixelOffset + 1] + pixels.data[pixelOffset + 2]); + + pixels.data[pixelOffset + 0] = r255; + pixels.data[pixelOffset + 1] = g255; + pixels.data[pixelOffset + 2] = b255; + pixels.data[pixelOffset + 3] = a255; + } } - } - g.putImageData(pixels, 0, 0); + g.putImageData(pixels, 0, 0); + } }); }; } diff --git a/src/webglimpse/timeline/timeline_annotation_painter.ts b/src/webglimpse/timeline/timeline_annotation_painter.ts index 3bca07a..3bb1cae 100644 --- a/src/webglimpse/timeline/timeline_annotation_painter.ts +++ b/src/webglimpse/timeline/timeline_annotation_painter.ts @@ -33,7 +33,7 @@ import { TimeAxis1D } from './time_axis'; import { Axis1D } from '../plot/axis'; import { TimelineModel, TimelineRowModel, TimelineAnnotationModel } from './timeline_model'; import { TimelineUi } from './timeline_ui'; -import { newTextTextureCache3 } from '../text'; +import { newTextTextureCache6 } from '../text'; import { TextureRenderer } from '../texture'; import { Program, UniformColor, Attribute } from '../shader'; import { xyFrac_VERTSHADER, solid_FRAGSHADER } from '../misc'; @@ -47,7 +47,7 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint // Painter Factory return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter { - const textTextures = newTextTextureCache3(); + const textTextures = newTextTextureCache6(); const textureRenderer = new TextureRenderer(); const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER); @@ -75,6 +75,9 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint const font = hasval(annotationStyle.font) ? annotationStyle.font : '11px verdana,sans-serif'; const color = hasval(annotationStyle.color) ? annotationStyle.color : white; + const bgColorString = hasval(annotationStyle.bgColor) ? annotationStyle.bgColor.rgbaString : '#ffffff00'; + const bgPadding = hasval(annotationStyle.bgPadding) ? annotationStyle.bgPadding : 0; + const bgBorderRadius = hasval(annotationStyle.bgBorderRadius) ? annotationStyle.bgBorderRadius : 0; const hTextOffset = hasval(annotationStyle.hTextOffset) ? annotationStyle.hTextOffset : 0; const vTextOffset = hasval(annotationStyle.vTextOffset) ? annotationStyle.vTextOffset : 0; @@ -142,8 +145,14 @@ export function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPaint // draw text label if (hasval(annotation.label)) { - - const textTexture = textTextures.value(font, color.rgbaString, annotation.label); + const textTexture = textTextures.value( + font, + color.rgbaString, + annotation.label, + bgColorString, + bgPadding.toString(), + bgBorderRadius.toString() + ); const xFracOffset = xFrac + hTextOffset / viewport.w; const yFracOffset = yFrac + vTextOffset / viewport.h; diff --git a/src/webglimpse/timeline/timeline_annotation_style.ts b/src/webglimpse/timeline/timeline_annotation_style.ts index fbce806..6d2cf8d 100644 --- a/src/webglimpse/timeline/timeline_annotation_style.ts +++ b/src/webglimpse/timeline/timeline_annotation_style.ts @@ -52,6 +52,9 @@ export interface TimelineAnnotationStyle { // annotation line (0 = bottom/left, 1=top/right) uiHint?: string; // one of: point, horizontal-line, vertical-line icons?: TimelineAnnotationIcon[]; + bgColor?: string; + bgPadding?: number; + bgBorderRadius?: number; } export class TimelineAnnotationIconUi { @@ -111,6 +114,9 @@ export class TimelineAnnotationStyleUi { private _align: number; private _uiHint: string; private _icons: TimelineAnnotationIconUi[]; + private _bgColor?: Color; + private _bgPadding?: number; + private _bgBorderRadius?: number; constructor(style: TimelineAnnotationStyle) { this._styleGuid = style.styleGuid; @@ -131,6 +137,9 @@ export class TimelineAnnotationStyleUi { this._align = style.align; this._uiHint = style.uiHint; this._icons = hasval(style.color) ? style.icons.map((icon) => new TimelineAnnotationIconUi(icon)) : []; + this._bgColor = hasval(style.bgColor) ? parseCssColor(style.bgColor) : undefined; + this._bgPadding = style.bgPadding; + this._bgBorderRadius = style.bgBorderRadius; } get numIcons(): number { @@ -173,6 +182,17 @@ export class TimelineAnnotationStyleUi { return this._uiHint; } + get bgColor(): Color { + return this._bgColor; + } + + get bgPadding(): number { + return this._bgPadding; + } + get bgBorderRadius(): number { + return this._bgBorderRadius; + } + snapshot(): TimelineAnnotationStyle { return { styleGuid: this._styleGuid, @@ -184,7 +204,10 @@ export class TimelineAnnotationStyleUi { hTextAlign: this._vTextAlign, align: this._align, uiHint: this._uiHint, - icons: this._icons.map((ui) => ui.snapshot()) + icons: this._icons.map((ui) => ui.snapshot()), + bgColor: this._bgColor.cssString, + bgPadding: this._bgPadding, + bgBorderRadius: this._bgBorderRadius }; } } diff --git a/src/webglimpse/util/multikey_cache.ts b/src/webglimpse/util/multikey_cache.ts index 9a4caf2..c5acb0e 100644 --- a/src/webglimpse/util/multikey_cache.ts +++ b/src/webglimpse/util/multikey_cache.ts @@ -199,4 +199,30 @@ export class ThreeKeyCache { clear() { this.cache.clear(); } } +export interface SixKeyCacheHelper { + create(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string): V; + dispose(value: V, keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string): void; +} +export class SixKeyCache { + private cache: MultiKeyCache; + + constructor(helper: SixKeyCacheHelper) { + this.cache = new MultiKeyCache({ + create: function (keyParts: string[]): V { + return helper.create(keyParts[0], keyParts[1], keyParts[2], keyParts[3], keyParts[4], keyParts[5]); + }, + dispose: function (value: V, keyParts: string[]) { + helper.dispose(value, keyParts[0], keyParts[1], keyParts[2], keyParts[3], keyParts[4], keyParts[5]); + } + }); + } + + value(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string): V { return this.cache.value(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); } + remove(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string) { this.cache.remove(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); } + retain(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string) { this.cache.retain(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); } + resetTouches() { this.cache.resetTouches(); } + retainTouched() { this.cache.retainTouched(); } + clear() { this.cache.clear(); } +} + From 1fc4f9c17b98d57eec50347caa0a04aa261987fd Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Tue, 17 Nov 2020 13:51:57 -0800 Subject: [PATCH 55/69] [feature/add-text-annotation-background] Added optional alphaOverride parameter on `parseCssColor`. --- src/webglimpse/color.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/webglimpse/color.ts b/src/webglimpse/color.ts index e2aa3d3..4cada9f 100644 --- a/src/webglimpse/color.ts +++ b/src/webglimpse/color.ts @@ -99,9 +99,10 @@ export function parseRgba(rgbaString: string): Color { * - rgb/rgba * - hsl/hsla * - named colors - * * Behavior is undefined for strings that are not in one of the listed notations. * + * Optional alphaOverride provided for forcing value of rbga alpha. + * * Note that different browsers may use different color values for the named colors. * */ @@ -110,7 +111,7 @@ export let parseCssColor = (function () { canvas.width = 1; canvas.height = 1; const g = canvas.getContext('2d'); - return function (cssColorString: string): Color { + return function (cssColorString: string, alphaOverride?: number): Color { g.clearRect(0, 0, 1, 1); g.fillStyle = cssColorString; g.fillRect(0, 0, 1, 1); @@ -119,7 +120,7 @@ export let parseCssColor = (function () { const R = rgbaData[0] / 255; const G = rgbaData[1] / 255; const B = rgbaData[2] / 255; - const A = rgbaData[3] / 255; + const A = hasval(alphaOverride) ? alphaOverride : rgbaData[3] / 255; return rgba(R, G, B, A); }; })(); From 70bcffab52cd46835ad2ef28031a00d7f72dacc4 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Tue, 17 Nov 2020 15:32:45 -0800 Subject: [PATCH 56/69] [add-text-annotation-background] Updated changelog and package files. --- CHANGELOG | 3 +++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index cff890c..93c812a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +Webglimpse 2.4.2 (release 2020-7-27) +* Added annotation label backgrounds. + Webglimpse 2.4.2 (release 2020-7-27) * Fixed a bug with the insertion index of an OrderedSet when moveIfExists is set to true. diff --git a/package-lock.json b/package-lock.json index 8496a45..ffae221 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.4.2", + "version": "2.5.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ed5a468..e18c961 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.4.2", + "version": "2.5.0-rc.1", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 166c96ea1bf21641e7ccc1f05ea87891ae36cd5c Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Wed, 18 Nov 2020 08:19:08 -0800 Subject: [PATCH 57/69] [add-text-annotation-background] Fixed bugs where curved background borders would look distorted, cleaned up code. --- src/webglimpse/text.ts | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index 9207a01..2dec133 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -161,12 +161,15 @@ export const getTextWidth = (function () { export class TextTexture2D extends Texture2D { private _jBaseline: number; + private _bgPadding?: number; get jBaseline(): number { return this._jBaseline; } + get bgPadding(): number { return this._bgPadding; } - constructor(w: number, h: number, jBaseline: number, minFilter: number, magFilter: number, draw: ImageDrawer) { + constructor(w: number, h: number, jBaseline: number, minFilter: number, magFilter: number, bgPadding = 0, draw: ImageDrawer) { super(w, h, minFilter, magFilter, draw); this._jBaseline = jBaseline; + this._bgPadding = bgPadding; } yAnchor(textFrac: number) { @@ -261,7 +264,7 @@ export function createTextTextureFactory(font: string): TextTextureFactory { jBaseline = jBaseline + addedPadding; } - return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { + return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, bgPadding, function (g: CanvasRenderingContext2D) { // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent // background -- so we draw white text onto a black background, then infer alpha from // the pixel color (black = transparent, white = opaque). @@ -272,24 +275,25 @@ export function createTextTextureFactory(font: string): TextTextureFactory { // If background color not transparent show background color, else follow comment above. if (bgColor && bgColor.a !== 0) { + g.fillStyle = bgColor.cssString; // Round corners of text background if (bgBorderRadius) { + bgBorderRadius = Math.min(bgBorderRadius, bgPadding); g.beginPath(); - g.moveTo(0 + bgBorderRadius, 0); - g.lineTo(0 + w - bgBorderRadius, 0); - g.quadraticCurveTo(0 + w, 0, 0 + w, 0 + bgBorderRadius); - g.lineTo(0 + w, 0 + h - bgBorderRadius); - g.quadraticCurveTo(0 + w, 0 + h, 0 + w - bgBorderRadius, 0 + h); - g.lineTo(0 + bgBorderRadius, 0 + h); - g.quadraticCurveTo(0, 0 + h, 0, 0 + h - bgBorderRadius); - g.lineTo(0, 0 + bgBorderRadius); - g.quadraticCurveTo(0, 0, 0 + bgBorderRadius, 0); + g.moveTo(bgBorderRadius, 0); + g.lineTo(w - bgBorderRadius, 0); + g.quadraticCurveTo(w, 0, w, bgBorderRadius); + g.lineTo(w, h - bgBorderRadius); + g.quadraticCurveTo(w, h, w - bgBorderRadius, h); + g.lineTo(bgBorderRadius, h); + g.quadraticCurveTo(0, h, 0, h - bgBorderRadius); + g.lineTo(0, bgBorderRadius); + g.quadraticCurveTo(0, 0, bgBorderRadius, 0); g.closePath(); - g.strokeStyle = bgColor.cssString; - g.stroke(); + g.fill(); + } else { + g.fillRect(0, 0, w, h); } - g.fillStyle = bgColor.cssString; - g.fill(); g.font = font; g.textAlign = 'center'; From 09f3b0bf4dec84a54e92bd029cf9a454a260f067 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Wed, 18 Nov 2020 09:18:45 -0800 Subject: [PATCH 58/69] [add-text-annotation-background] Fixed bug where right side of canvas would get cut off, border radius size is no longer based off padding, but rather height/width. --- src/webglimpse/text.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index 2dec133..a40b3f5 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -256,7 +256,7 @@ export function createTextTextureFactory(font: string): TextTextureFactory { let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1; return function (color: Color, text: string, bgColor: Color, bgPadding = 0, bgBorderRadius = 0): TextTexture2D { - let w = getTextWidth(font, text); + let w = Math.ceil(getTextWidth(font, text)); if (bgColor && bgColor.a !== 0) { const addedPadding = bgPadding * 2; w = w + addedPadding + 4; @@ -278,7 +278,7 @@ export function createTextTextureFactory(font: string): TextTextureFactory { g.fillStyle = bgColor.cssString; // Round corners of text background if (bgBorderRadius) { - bgBorderRadius = Math.min(bgBorderRadius, bgPadding); + bgBorderRadius = Math.min(bgBorderRadius, h / 2, w / 2); g.beginPath(); g.moveTo(bgBorderRadius, 0); g.lineTo(w - bgBorderRadius, 0); From 1c2de1d2c225c57c45a3f9420c5caab8445aebf1 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Wed, 18 Nov 2020 09:29:12 -0800 Subject: [PATCH 59/69] 2.5.0-rc.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ffae221..4343304 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0-rc.1", + "version": "2.5.0-rc.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e18c961..08cd09e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0-rc.1", + "version": "2.5.0-rc.2", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From e43bdcc7fe0ba46c758dad2385fdab61d9e7d914 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 18 Nov 2020 09:31:31 -0800 Subject: [PATCH 60/69] [add-text-annotation-background] Updated version to rc.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ffae221..4343304 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0-rc.1", + "version": "2.5.0-rc.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e18c961..08cd09e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0-rc.1", + "version": "2.5.0-rc.2", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From f40d9012c597cf46fc2cf608a0486291b3200195 Mon Sep 17 00:00:00 2001 From: Vaso Vasich Date: Wed, 18 Nov 2020 13:22:21 -0800 Subject: [PATCH 61/69] [add-text-annotation-background] Code cleanup. --- src/webglimpse/text.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index a40b3f5..3550cef 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -161,15 +161,12 @@ export const getTextWidth = (function () { export class TextTexture2D extends Texture2D { private _jBaseline: number; - private _bgPadding?: number; get jBaseline(): number { return this._jBaseline; } - get bgPadding(): number { return this._bgPadding; } - constructor(w: number, h: number, jBaseline: number, minFilter: number, magFilter: number, bgPadding = 0, draw: ImageDrawer) { + constructor(w: number, h: number, jBaseline: number, minFilter: number, magFilter: number, draw: ImageDrawer) { super(w, h, minFilter, magFilter, draw); this._jBaseline = jBaseline; - this._bgPadding = bgPadding; } yAnchor(textFrac: number) { @@ -226,13 +223,13 @@ export function newTextTextureCache3(): ThreeKeyCache { export function newTextTextureCache6(): SixKeyCache { return new SixKeyCache({ - create: function (font: string, rgbaString: string, text: string, rgbaBgString: string, bgPadding: string, lineWidth: string): TextTexture2D { + create: function (font: string, rgbaString: string, text: string, rgbaBgString: string, bgPadding: string, bgBorderRadius: string): TextTexture2D { const createTextTexture = createTextTextureFactory(font); const color = parseRgba(rgbaString); const bgColor = parseRgba(rgbaBgString); - const lineWidthNumber = parseInt(lineWidth, 10); + const bgBorderRadiusNumber = parseInt(bgBorderRadius, 10); const paddingNumber = parseInt(bgPadding, 10); - return createTextTexture(color, text, bgColor, paddingNumber, lineWidthNumber); + return createTextTexture(color, text, bgColor, paddingNumber, bgBorderRadiusNumber); }, dispose: function (texture: Texture2D) { texture.dispose(); @@ -264,7 +261,7 @@ export function createTextTextureFactory(font: string): TextTextureFactory { jBaseline = jBaseline + addedPadding; } - return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, bgPadding, function (g: CanvasRenderingContext2D) { + return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) { // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent // background -- so we draw white text onto a black background, then infer alpha from // the pixel color (black = transparent, white = opaque). From f14168199dc30389a79b022082ba988e4f0dcf2f Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 18 Nov 2020 16:07:20 -0800 Subject: [PATCH 62/69] [add-text-annotation-background] Fixed changelog. --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 93c812a..606b02c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -Webglimpse 2.4.2 (release 2020-7-27) +Webglimpse 2.5.0 (release 2020-11-18) * Added annotation label backgrounds. Webglimpse 2.4.2 (release 2020-7-27) From ab35a5fc643c7b0539975b8887b2cb82885e0f36 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 18 Nov 2020 16:13:40 -0800 Subject: [PATCH 63/69] [v2.x] Updated version to 2.5.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4343304..b17a66b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0-rc.2", + "version": "2.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 08cd09e..991e2bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0-rc.2", + "version": "2.5.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", From 9985e0dbe83153eafda58af3e63f3d02ce4c3ba1 Mon Sep 17 00:00:00 2001 From: Kyle Sherman Date: Wed, 16 Nov 2022 13:21:13 -0800 Subject: [PATCH 64/69] Added min/max limits to Axis1D and TimeAxis1D --- src/webglimpse/plot/axis.ts | 57 +++++++++++++++++++++++----- src/webglimpse/timeline/time_axis.ts | 12 +++++- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/webglimpse/plot/axis.ts b/src/webglimpse/plot/axis.ts index 70d0382..a1176ea 100644 --- a/src/webglimpse/plot/axis.ts +++ b/src/webglimpse/plot/axis.ts @@ -35,11 +35,15 @@ import { xFrac, yFrac, Pane, PointerEvent, isLeftMouseDown } from '../core'; export class Axis1D { private _vMin: number; private _vMax: number; + private _vMinLimit: number; + private _vMaxLimit: number; private _limitsChanged = new Notification(); - constructor(vMin: number, vMax: number) { - this._vMin = vMin; - this._vMax = vMax; + constructor(vMin: number, vMax: number, vMinLimit = -Infinity, vMaxLimit = Infinity) { + this._vMin = Math.max(vMin, vMinLimit); + this._vMax = Math.min(vMax, vMaxLimit); + this._vMinLimit = vMinLimit; + this._vMaxLimit = vMaxLimit; } get vMin(): number { @@ -50,23 +54,45 @@ export class Axis1D { return this._vMax; } + get vMinLimit(): number { + return this._vMinLimit; + } + + get vMaxLimit(): number { + return this._vMaxLimit; + } + get limitsChanged(): Notification { return this._limitsChanged; } set vMin(vMin: number) { - this._vMin = vMin; + this._vMin = Math.max(vMin, this._vMinLimit); this._limitsChanged.fire(); } set vMax(vMax: number) { - this._vMax = vMax; + this._vMax = Math.min(vMax, this._vMaxLimit); + this._limitsChanged.fire(); + } + + set vMinLimit(vMinLimit: number) { + this._vMinLimit = vMinLimit; + this._vMin = Math.max(this._vMin, vMinLimit); + this._vMax = Math.max(this._vMax, vMinLimit); + this._limitsChanged.fire(); + } + + set vMaxLimit(vMaxLimit: number) { + this._vMaxLimit = vMaxLimit; + this._vMin = Math.min(this._vMin, vMaxLimit); + this._vMax = Math.min(this._vMax, vMaxLimit); this._limitsChanged.fire(); } setVRange(vMin: number, vMax: number) { - this._vMin = vMin; - this._vMax = vMax; + this._vMin = Math.max(vMin, this._vMinLimit); + this._vMax = Math.min(vMax, this._vMaxLimit); this._limitsChanged.fire(); } @@ -83,14 +109,27 @@ export class Axis1D { } pan(vAmount: number) { + if (vAmount + this._vMin < this._vMinLimit) { + this._vMax = this._vMinLimit + this.vSize; + this._vMin = this._vMinLimit; + this._limitsChanged.fire(); + return; + } else if (vAmount + this._vMax > this._vMaxLimit) { + this._vMin = this._vMaxLimit - this.vSize; + this._vMax = this._vMaxLimit; + this._limitsChanged.fire(); + return; + } this._vMin += vAmount; this._vMax += vAmount; this._limitsChanged.fire(); } zoom(factor: number, vAnchor: number) { - this._vMin = vAnchor - factor * (vAnchor - this._vMin); - this._vMax = vAnchor + factor * (this._vMax - vAnchor); + const newVMin = vAnchor - factor * (vAnchor - this._vMin); + const newVMax = vAnchor + factor * (this._vMax - vAnchor); + this._vMin = Math.max(newVMin, this._vMinLimit); + this._vMax = Math.min(newVMax, this._vMaxLimit); this._limitsChanged.fire(); } } diff --git a/src/webglimpse/timeline/time_axis.ts b/src/webglimpse/timeline/time_axis.ts index b57f2a4..d1bc211 100644 --- a/src/webglimpse/timeline/time_axis.ts +++ b/src/webglimpse/timeline/time_axis.ts @@ -34,9 +34,9 @@ export class TimeAxis1D extends Axis1D { private _epoch_PMILLIS: number; - constructor(tMin_PMILLIS: number, tMax_PMILLIS: number) { + constructor(tMin_PMILLIS: number, tMax_PMILLIS: number, tMinLimit_PMILLIS = 0, tMaxLimit_PMILLIS = 253402329599000) { const epoch_PMILLIS = 0.5 * (tMin_PMILLIS + tMax_PMILLIS); - super(tMin_PMILLIS - epoch_PMILLIS, tMax_PMILLIS - epoch_PMILLIS); + super(tMin_PMILLIS - epoch_PMILLIS, tMax_PMILLIS - epoch_PMILLIS, tMinLimit_PMILLIS - epoch_PMILLIS, tMaxLimit_PMILLIS - epoch_PMILLIS); this._epoch_PMILLIS = epoch_PMILLIS; } @@ -48,6 +48,14 @@ export class TimeAxis1D extends Axis1D { return (this._epoch_PMILLIS + this.vMax); } + get tMinLimit_PMILLIS(): number { + return (this._epoch_PMILLIS + this.vMinLimit); + } + + get tMaxLimit_PMILLIS(): number { + return (this._epoch_PMILLIS + this.vMaxLimit); + } + set tMin_PMILLIS(tMin_PMILLIS: number) { this.vMin = (tMin_PMILLIS - this._epoch_PMILLIS); } From 7328b867372c252f359f689e0a1ef43076fae6f9 Mon Sep 17 00:00:00 2001 From: kyle-sherman <68256353+kyle-sherman@users.noreply.github.com> Date: Tue, 6 Dec 2022 09:00:47 -0800 Subject: [PATCH 65/69] Removed duplicate code in pan() Co-authored-by: Scott Przybylski --- src/webglimpse/plot/axis.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/webglimpse/plot/axis.ts b/src/webglimpse/plot/axis.ts index a1176ea..0472792 100644 --- a/src/webglimpse/plot/axis.ts +++ b/src/webglimpse/plot/axis.ts @@ -112,16 +112,13 @@ export class Axis1D { if (vAmount + this._vMin < this._vMinLimit) { this._vMax = this._vMinLimit + this.vSize; this._vMin = this._vMinLimit; - this._limitsChanged.fire(); - return; } else if (vAmount + this._vMax > this._vMaxLimit) { this._vMin = this._vMaxLimit - this.vSize; this._vMax = this._vMaxLimit; - this._limitsChanged.fire(); - return; + } else { + this._vMin += vAmount; + this._vMax += vAmount; } - this._vMin += vAmount; - this._vMax += vAmount; this._limitsChanged.fire(); } From 9dd9b7c6e88ae89e198bbf8aa6aadebd36e177d6 Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 7 Dec 2022 09:50:46 -0800 Subject: [PATCH 66/69] Updated changelog, version, fixed willReadFrequently warning. --- CHANGELOG | 5 + package-lock.json | 4861 +++++++++++++++++++++------------------ package.json | 4 +- src/webglimpse/color.ts | 2 +- src/webglimpse/text.ts | 2 +- 5 files changed, 2568 insertions(+), 2306 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 606b02c..9e804bd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Webglimpse 2.6.0 (release 2022-12-7) +* Added ability to specify min/max limits on TimeAxis1D / Axis1D. +* Fix warnings about adding `willReadFrequently` option to canvas context that + calls `getImageData` a lot. + Webglimpse 2.5.0 (release 2020-11-18) * Added annotation label backgrounds. diff --git a/package-lock.json b/package-lock.json index b17a66b..a624cf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "webglimpse", - "version": "2.5.0", + "version": "2.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@aduh95/viz.js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@aduh95/viz.js/-/viz.js-3.2.1.tgz", - "integrity": "sha512-5Hmejfgemk1qJw24M5I+NabADKmD5Io7LU2fxHw/E6Bo0ji9EdmHP16KrFnt6Sz0/w7VIzc1ZAasyLULaPLGJQ==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@aduh95/viz.js/-/viz.js-3.7.0.tgz", + "integrity": "sha512-20Pk2Z98fbPLkECcrZSJszKos/OgtvJJR3NcbVfgCJ6EQjDNzW2P1BKqImOz3tJ952dvO2DWEhcLhQ1Wz1e9ng==", "dev": true }, "@angular-devkit/architect": { - "version": "0.1002.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", - "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", + "version": "0.1002.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.4.tgz", + "integrity": "sha512-Vrb2XSnvqj4RByqSWPeG/o9BSNX2DL3pxwQgLMrxofG8/+1VHQ2MsN/KTxBnEZtqeW4/l2QWTsQyzY5frJI69A==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.0", + "@angular-devkit/core": "10.2.4", "rxjs": "6.6.2" }, "dependencies": { @@ -28,13 +28,19 @@ "requires": { "tslib": "^1.9.0" } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, "@angular-devkit/core": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", - "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.4.tgz", + "integrity": "sha512-gnm/+Iyaa6Jt3E803bpTjkwDAIb0AhP9badaGwbx44+bhbNSE2WzOBmdsQrsxJXHAMEG9CGeBzeRd8XZtLACWg==", "dev": true, "requires": { "ajv": "6.12.4", @@ -44,33 +50,6 @@ "source-map": "0.7.3" }, "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, "rxjs": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", @@ -79,16 +58,22 @@ "requires": { "tslib": "^1.9.0" } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, "@angular-devkit/schematics": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz", - "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.4.tgz", + "integrity": "sha512-poBGWRwMgnnnmoZfwyOBcQMJm7U5y5XxnxvMsBJEyAQRxfQa+KLvcCfGWXqskNTyBdQFpy4kxmtCzRClkoEiKQ==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.0", + "@angular-devkit/core": "10.2.4", "ora": "5.0.0", "rxjs": "6.6.2" }, @@ -101,41 +86,39 @@ "requires": { "tslib": "^1.9.0" } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, "@angular/animations": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.2.3.tgz", - "integrity": "sha512-UP3aynCSkFqEJfZ9bQMyBIVo4mm5EuIHL6NfMqhqLQankKKnc25Pi3a7heq0xzV1EoAxGSd3UBn36Y8Jjav2fg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.2.5.tgz", + "integrity": "sha512-lIMwjY1pAqpCM4Ayndf2RsvOWRUc5QV7W82XNou6pIBv2T1i1XV6H72I5Sk9Z4sxxBYCWncEaEub+C6NcS8QRg==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/cli": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.0.tgz", - "integrity": "sha512-YBzwkFBmG6CdUJk8onsPXxHX/ByU5MERBQgYhLC873e2nZlXMUu+Ttq2Wai6apyskGvsXKxZNPOQSFZTGKXzXg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.4.tgz", + "integrity": "sha512-S8xAJemX3zE/I/xi81DT6NuzfDwEAEtEeITHxrAH0AHE4kaUBy2O9bAopvYqMNzxs/XGqyxMv8vwYYpGax7EEQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1002.0", - "@angular-devkit/core": "10.2.0", - "@angular-devkit/schematics": "10.2.0", - "@schematics/angular": "10.2.0", - "@schematics/update": "0.1002.0", + "@angular-devkit/architect": "0.1002.4", + "@angular-devkit/core": "10.2.4", + "@angular-devkit/schematics": "10.2.4", + "@schematics/angular": "10.2.4", + "@schematics/update": "0.1002.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.1.1", - "ini": "1.3.5", + "ini": "1.3.6", "inquirer": "7.3.3", "npm-package-arg": "8.0.1", "npm-pick-manifest": "6.1.0", @@ -147,78 +130,30 @@ "symbol-observable": "1.2.0", "universal-analytics": "0.4.23", "uuid": "8.3.0" - }, - "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" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", - "dev": true - } } }, "@angular/common": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.3.tgz", - "integrity": "sha512-xKKN8bgdudktVC/gwUtdeS2khYqSENWQe1CS8nE0V88qKCftwPhCD5Ovp6+6LflqvQhJWb0guf7HXjq9oBqO2w==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.5.tgz", + "integrity": "sha512-553yf6ZUHNqT4XpOqbW7EKKMfX56u/8DkwYXuSv8MAKdl4/AW6gliFOEJGYo04JcKF7Knq3VPvGSCO9kupf0hg==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/compiler": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.3.tgz", - "integrity": "sha512-Bg+QbyvJVlfGQpJCagEMkkqoRi2LMQc8iuu+cVYVqQOETLO0LxmkPpMQ/7pRLTNWl36PoYEB7IjUkp+qng8xKg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.5.tgz", + "integrity": "sha512-ddJiTPCoVBIGjFDYoYWDpmq3Zs8UKoWpzaeW4u+p17gWW54HwyT5XTxrgtbeUmaxIuRdL4/KT1lGHs9/9bwbCA==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/compiler-cli": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.3.tgz", - "integrity": "sha512-29RL/lIbHpjoWMUz23cyRcyG50PXqvxlLk0IpyCUWDVtPp6Hc8S/JayxeSwxNST79miDobGaeiGmS0JHuCouVQ==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.5.tgz", + "integrity": "sha512-xddSpKudoPidEebIW3x1CvQdx69WEmnFg4DneeQi/tit7mtAKYTJemzYZmP6abdSYhtxovL0bPX5LxYlrtuxIw==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -233,180 +168,39 @@ "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", "tslib": "^2.0.0", - "yargs": "15.3.0" + "yargs": "^16.1.1" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, "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 - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true } } }, "@angular/core": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.3.tgz", - "integrity": "sha512-mE6nLpul/IJllk0VYrlrP69n0P7JPz+BHYAVobwO5+0EGO65ieTD18DxzfEt4eQgthnM3VQwSZxjW4n9Y1p/dQ==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.5.tgz", + "integrity": "sha512-krhOKNTj5XE92Rk9ASX5KmgTF72j7qT2PLVxrGEVjuUKjBY2XaK3TV0Kotq9zI3qa9WgeCrP/Njn6jlKQCCAEQ==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/forms": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.2.3.tgz", - "integrity": "sha512-IcQ0xK+f84khGAs6cd0BUJIebFV3KQsVF9kbAX10bpPmleI62xI074mIefAiu3ZLEOm3OnhYDDZwrrk7UIrmow==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.2.5.tgz", + "integrity": "sha512-EnycBx8q+DGmPaX4oSjPejJxx9u0TLb5+tpGxYitdOq/eBpQAAYyWKQGKXb1JB46rPVwJr34MmTltHgAN0zUSQ==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/http": { @@ -416,181 +210,221 @@ "dev": true, "requires": { "tslib": "^1.7.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular/language-service": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.2.3.tgz", - "integrity": "sha512-8rtNG3HjBdUMlKcakh6gDfFvYSS5X16ymbVR0i2L/Nc4d9HuqgKrIrsNY4We/jSBoAjo/CGS8AvbscMa8oW4Eg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.2.5.tgz", + "integrity": "sha512-e9ug9TJG31SeSWl65TglXKWOIATGu/P0jVSGKxGF22vQYlAahdRoFXP56+B9P9k+6cDuYljkjH1rdyCaU3iOPg==", "dev": true }, "@angular/platform-browser": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.2.3.tgz", - "integrity": "sha512-ElTuRF4SWhYxJypDlaa/n49DrqrWV2tYU5kkgF+VNbVbvzKHnVEZe4x1KSWrEzIyewcjxwwE6ZF0oXMdd4AZQQ==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.2.5.tgz", + "integrity": "sha512-3JDFRGNxr0IUkjSdGK2Q1BvqnSDpy9YWo0DJP+TEpgW578R84m4X7/wI3jJmFSC2yyouMWrHsot2vcBPAQj89g==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/platform-browser-dynamic": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.2.3.tgz", - "integrity": "sha512-ujwcGzlWQ6S83iHIF3ArfDn8ik8YETZcuSMCTxjaNv8kwEqiRzchZDkheJpoH9HyddnM6UVGL6D/5k11TMWTew==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.2.5.tgz", + "integrity": "sha512-7z443I80K2CeqzczlSJ8BlABj0uRgnHUrABE8yLlU2BgifJrriBawzSXEV7UMEN7k7ezbc6NhpOn6Q6BrCKEOA==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@angular/router": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.2.3.tgz", - "integrity": "sha512-QUVqEOai3hASeMgTXIVo9Ql6EGJ+v0QHs/O+5pFplXGAzMQDpCnrpOuB4FExWxdafiiYfKfLlNvxj0tEJ2gU0w==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.2.5.tgz", + "integrity": "sha512-AtSMB/d4V+pw/FL4G/mWWoiJJtZ/075TqsGW7uEFKgxS6Gh2kalv6BTMlXVG5GO+2oU0lsuDvguq5E7Atbak3Q==", "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.18.6" } }, "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", "dev": true, "requires": { - "@babel/types": "^7.12.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "dev": true }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -623,10 +457,233 @@ "typescript": "2.4.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" + } + }, + "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" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "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": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "typescript": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "integrity": "sha512-a6qhFjx88CqXM92QX6e5zwbYavxaknEdFhh/ZrBmuHEP+r2ye102uvhCkWdian4u5Ee17W+8fAN7xtdM8KeQ7A==", "dev": true } } @@ -640,14 +697,6 @@ "ansi-colors": "^4.1.1", "fancy-log": "^1.3.3", "typescript": "^4.0.3" - }, - "dependencies": { - "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", - "dev": true - } } }, "@compodoc/ngd-transformer": { @@ -663,52 +712,99 @@ }, "dependencies": { "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "@schematics/angular": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.0.tgz", - "integrity": "sha512-rJRTTTL8CMMFb3ebCvAVHKHxuNzRqy/HtbXhJ82l5Xo/jXcm74eV2Q0RBUrNo1yBKWFIR+FIwiXLJaGcC/R9Pw==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.4.tgz", + "integrity": "sha512-irU3cnamfd5Hgy1B6oY7oweApJHhVaD2oYPq0NfI+F14JalERO+DGO0Tq3MWmEGn32tLQPv9fwM5O8EElEp9pA==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.0", - "@angular-devkit/schematics": "10.2.0", + "@angular-devkit/core": "10.2.4", + "@angular-devkit/schematics": "10.2.4", "jsonc-parser": "2.3.0" } }, "@schematics/update": { - "version": "0.1002.0", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.0.tgz", - "integrity": "sha512-g2bfJSAj3x/YL0GNhnHsDSQmO6DoxSnLxoFLqNN5+ukxK5jq7OZNDwMJGxZ3X6RcSMWKEkIKL/wlq9yhj2T/kw==", + "version": "0.1002.4", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.4.tgz", + "integrity": "sha512-qnDn3SSMmolfzWpj8CTAoC/TSPe43azKPYLR5r76GkRvuUbwr/dQEj92wu59twjGcsmjF54qcG4fGaxMndUn3Q==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.0", - "@angular-devkit/schematics": "10.2.0", + "@angular-devkit/core": "10.2.4", + "@angular-devkit/schematics": "10.2.4", "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", + "ini": "1.3.6", "npm-package-arg": "^8.0.0", "pacote": "9.5.12", "semver": "7.3.2", "semver-intersect": "1.4.0" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } } }, "@sindresorhus/is": { @@ -727,9 +823,9 @@ } }, "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "dev": true }, "@types/jasmine": { @@ -739,9 +835,9 @@ "dev": true }, "@types/jasminewd2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", - "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", "dev": true, "requires": { "@types/jasmine": "*" @@ -754,15 +850,15 @@ "dev": true }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/q": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", "dev": true }, "@types/resolve": { @@ -775,9 +871,9 @@ } }, "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.20.tgz", + "integrity": "sha512-6d8Q5fqS9DWOXEhMDiF6/2FjyHdmP/jSTAUyeQR7QwrFeNmYyzmvGxD5aLIHL445HjWgibs0eAig+KPnbaesXA==", "dev": true }, "@yarnpkg/lockfile": { @@ -797,13 +893,13 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { @@ -821,7 +917,7 @@ "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", "dev": true }, "agent-base": { @@ -843,9 +939,9 @@ } }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -857,7 +953,7 @@ "ambi": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", - "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=", + "integrity": "sha512-5nS0gYMPNgZz/UALDHMStcwO42youpIWBQVbI92vV5j0+2bMxv/iVqearrLu3/f0XaU6xVIbf3RRtDxOcHxSkw==", "dev": true, "requires": { "editions": "^1.1.1", @@ -873,37 +969,12 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "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 - }, - "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 - }, - "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" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -913,69 +984,58 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", "dev": true, "requires": { "ansi-wrap": "0.1.0" } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", "dev": true }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "apache-crypt": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.1.2.tgz", - "integrity": "sha1-ggeCozu2pf0nEggvDtOiTjybAhQ=", + "integrity": "sha512-7wzsZjtf2f7/2yXpjnvRhdI/88/gEG0exlJ9IudSoFJDkJQ/QH7h89K656P0v5DqOJtsdYVVuaN9EElWezlsSQ==", "dev": true, "requires": { "unix-crypt-td-js": "^1.0.0" @@ -984,7 +1044,7 @@ "apache-md5": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.0.6.tgz", - "integrity": "sha1-RwI51AxU58Mt2dbrEbw1eOzJA8I=", + "integrity": "sha512-6Nvd712sWdd9jgMZQBYpSPXh/rR/hIwkEtb49lZs0Eva/Ig7pEOWgzRO0HJUU2rqJJv6bYRkKH22cuDloDONaA==", "dev": true }, "app-root-path": { @@ -1020,7 +1080,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true } } @@ -1028,7 +1088,7 @@ "aria-query": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==", "dev": true, "requires": { "ast-types-flow": "0.0.7", @@ -1038,7 +1098,7 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true }, "arr-flatten": { @@ -1050,19 +1110,19 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", "dev": true }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "requires": { "array-uniq": "^1.0.1" @@ -1071,15 +1131,28 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "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=", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true }, + "array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -1089,19 +1162,19 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -1110,25 +1183,25 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -1149,7 +1222,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "at-least-node": { @@ -1165,16 +1238,16 @@ "dev": true }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", "dev": true, "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" } @@ -1182,7 +1255,7 @@ "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=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { @@ -1203,13 +1276,13 @@ "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base": { @@ -1230,7 +1303,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -1270,13 +1343,13 @@ "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", "dev": true }, "base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "integrity": "sha512-rz8L+d/xByiB/vLVftPkyY215fqNrmasrcJsYkVcm4TgJNz+YXKrFaFAWibSaHkiKoSgMDCb+lipOIRQNGYesw==", "dev": true }, "basic-auth": { @@ -1299,13 +1372,13 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "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=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -1314,28 +1387,18 @@ "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", "dev": true, "requires": { "callsite": "1.0.0" } }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -1358,21 +1421,23 @@ "dev": true }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -1384,25 +1449,6 @@ "ms": "2.0.0" } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1412,30 +1458,36 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } } } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "boxen": { @@ -1454,16 +1506,63 @@ "widest-line": "^2.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "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 }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "string-width": { @@ -1477,6 +1576,24 @@ "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" + } + }, + "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" + } + }, "type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", @@ -1496,51 +1613,30 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "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" - } - } + "fill-range": "^7.0.1" } }, "browserslist": { - "version": "4.14.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz", - "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001157", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.591", - "escalade": "^3.1.1", - "node-releases": "^1.1.66" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" } }, "browserstack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", - "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", "dev": true, "requires": { "https-proxy-agent": "^2.2.1" @@ -1565,31 +1661,31 @@ "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "cacache": { @@ -1697,19 +1793,19 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", "dev": true }, "camelcase": { @@ -1719,9 +1815,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001157", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001157.tgz", - "integrity": "sha512-gOerH9Wz2IRZ2ZPdMfBvyOi3cjaz4O4dgNwPGzx8EhqAs4+2IL/O+fJsbt+znSigujoZG8bVcIAUM/I/E5K3MA==", + "version": "1.0.30001436", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz", + "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==", "dev": true }, "canonical-path": { @@ -1733,18 +1829,17 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "chardet": { @@ -1754,37 +1849,48 @@ "dev": true }, "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==", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "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" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" } }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" } }, "chownr": { @@ -1814,7 +1920,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -1823,9 +1929,9 @@ } }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -1855,9 +1961,9 @@ } }, "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", "dev": true }, "cli-width": { @@ -1867,59 +1973,26 @@ "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==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "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 - }, - "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 - }, - "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" - } - }, - "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": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -1928,13 +2001,13 @@ "code-block-writer": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.14.0.tgz", - "integrity": "sha1-AkXuMa680hqCMWziBh1fvpVQ3m8=", + "integrity": "sha512-2pAehvRrEUCHRt4cGuHAyVRadS/vQ37VO+LvJcn4xeUUXAh8/5dpq4VYpsbOhu2h4bEgdCTCZ3RgIMdlq0B6Cg==", "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=", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true }, "codelyzer": { @@ -1957,7 +2030,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true } } @@ -1965,7 +2038,7 @@ "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, "requires": { "map-visit": "^1.0.0", @@ -1973,18 +2046,18 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "color-support": { @@ -1993,12 +2066,6 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -2029,7 +2096,7 @@ "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==", "dev": true }, "component-emitter": { @@ -2041,13 +2108,13 @@ "component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "concat-stream": { @@ -2088,7 +2155,7 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true } } @@ -2096,7 +2163,7 @@ "connect": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", - "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "integrity": "sha512-lRub47ccjmmdQoA1d+rwRcWsHoKsRyKtZ3z/IMg7/xMS5sWBBuOdAqoKm1xEsxTSWLcBjj8zdcbM6dwwOhgQZA==", "dev": true, "requires": { "debug": "~2.2.0", @@ -2108,7 +2175,7 @@ "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", "dev": true, "requires": { "ms": "0.7.1" @@ -2117,7 +2184,7 @@ "ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", "dev": true } } @@ -2129,28 +2196,26 @@ "dev": true }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", "dev": true }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -2179,19 +2244,19 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true }, "core-js": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", - "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==", + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz", + "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==", "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=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "cors": { @@ -2205,22 +2270,30 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", + "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true } } @@ -2228,7 +2301,7 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", "dev": true }, "csextends": { @@ -2260,22 +2333,23 @@ "css-parse": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", "dev": true, "requires": { "css": "^2.0.0" } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" } }, "css-selector-tokenizer": { @@ -2289,15 +2363,15 @@ } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssauron": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==", "dev": true, "requires": { "through": "X.X.X" @@ -2312,31 +2386,31 @@ "cuint": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", "dev": true }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", "dev": true }, "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -2349,36 +2423,36 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "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.2" + "ms": "^2.1.1" } }, "debuglog": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", "dev": true }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "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=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -2393,16 +2467,16 @@ "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==", "dev": true, "requires": { "strip-bom": "^3.0.0" } }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" @@ -2415,12 +2489,13 @@ "dev": true }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "define-property": { @@ -2467,7 +2542,7 @@ "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", "dev": true, "requires": { "globby": "^5.0.0", @@ -2482,7 +2557,7 @@ "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", "dev": true, "requires": { "array-union": "^1.0.1", @@ -2507,7 +2582,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "depd": { @@ -2523,15 +2598,15 @@ "dev": true }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "requires": { "asap": "^2.0.0", @@ -2541,7 +2616,7 @@ "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, "diff": { @@ -2553,7 +2628,7 @@ "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "requires": { "custom-event": "~1.0.0", @@ -2563,38 +2638,40 @@ } }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, "dot": { @@ -2619,9 +2696,9 @@ "dev": true }, "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, "duplexify": { @@ -2649,7 +2726,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -2664,18 +2741,26 @@ "requires": { "errlop": "^2.0.0", "semver": "^6.3.0" + }, + "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 + } } }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, "electron-to-chromium": { - "version": "1.3.595", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.595.tgz", - "integrity": "sha512-JpaBIhdBkF9FLG7x06ONfe0f5bxPrxRcq0X+Sc8vsCt+OPWIzxOD+qM71NEHLGbDfN9Q6hbtHRv4/dnvcOxo6g==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "emoji-regex": { @@ -2687,7 +2772,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, "encoding": { @@ -2734,7 +2819,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -2761,7 +2846,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", "dev": true }, "debug": { @@ -2776,7 +2861,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -2797,19 +2882,19 @@ "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", "dev": true }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, "err-code": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "integrity": "sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==", "dev": true }, "errlop": { @@ -2819,9 +2904,9 @@ "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "optional": true, "requires": { @@ -2838,24 +2923,43 @@ } }, "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -2876,7 +2980,7 @@ "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "dev": true, "requires": { "es6-promise": "^4.0.3" @@ -2891,13 +2995,13 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "esprima": { @@ -2915,7 +3019,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "event-stream": { @@ -2940,30 +3044,38 @@ "dev": true }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", + "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": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + } } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "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=", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, "requires": { "debug": "^2.3.3", @@ -2987,7 +3099,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -2996,7 +3108,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3005,7 +3117,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -3019,7 +3131,7 @@ "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "requires": { "assign-symbols": "^1.0.0", @@ -3088,7 +3200,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -3097,7 +3209,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -3148,7 +3260,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fancy-log": { @@ -3170,9 +3282,9 @@ "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fastparse": { @@ -3182,9 +3294,9 @@ "dev": true }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -3205,17 +3317,10 @@ "escape-string-regexp": "^1.0.5" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "integrity": "sha512-UxowFKnAFIwtmSxgKjWAVgjE3Fk7MQJT0ZIyl0NwIFZTrx4913rLaonGJ84V+x/2+w/pe4ULHRns+GZPs1TVuw==", "dev": true, "requires": { "glob": "^7.0.3", @@ -3223,32 +3328,18 @@ } }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "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" - } - } + "to-regex-range": "^5.0.1" } }, "finalhandler": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "integrity": "sha512-+AkanbaabSCYrDcrU+TcA/8SEyMDAN7mjE6GC71GAlvYDXM4wzUsRqLLS2qPtWecIlkX5+MMZGd2RyxO3yBOfg==", "dev": true, "requires": { "debug": "~2.2.0", @@ -3260,7 +3351,7 @@ "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", "dev": true, "requires": { "ms": "0.7.1" @@ -3269,15 +3360,15 @@ "ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", "dev": true } } }, "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz", + "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==", "dev": true }, "find-up": { @@ -3292,7 +3383,7 @@ "findit2": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", - "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "integrity": "sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog==", "dev": true }, "flatted": { @@ -3312,21 +3403,21 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -3343,7 +3434,7 @@ "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, "requires": { "map-cache": "^0.2.2" @@ -3352,19 +3443,19 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "dev": true }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -3374,38 +3465,21 @@ "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "integrity": "sha512-05cXDIwNbFaoFWaz5gNHlUTbH5whiss/hr/ibzPd4MH3cR4w0ZKeIPiVdbyJurg3O5r/Bjpvn9KOb1/rPMf3nA==", "dev": true, "requires": { "null-check": "^1.0.0" } }, "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha512-wYid1zXctNLgas1pZ8q8ChdsnGg4DHZVqMzJ7pOE85q5BppAEXgQGSoOjVgrcw5yI7pzz49p9AfMhM7z5PRuaw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } } }, "fs-minipass": { @@ -3420,7 +3494,7 @@ "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=", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -3432,19 +3506,15 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -3452,6 +3522,24 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", @@ -3465,14 +3553,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-stream": { @@ -3484,60 +3572,58 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "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-glob": "^4.0.1" } }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "requires": { "ini": "^1.3.4" @@ -3552,7 +3638,7 @@ "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, "requires": { "array-union": "^1.0.1", @@ -3582,15 +3668,15 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -3611,7 +3697,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true }, "har-validator": { @@ -3636,7 +3722,7 @@ "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -3645,11 +3731,17 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true } } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -3662,7 +3754,7 @@ "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", "dev": true } } @@ -3670,25 +3762,43 @@ "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, "requires": { "get-value": "^2.0.6", @@ -3699,17 +3809,37 @@ "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=", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "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=", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -3724,15 +3854,18 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "html-escaper": { @@ -3742,36 +3875,21 @@ "dev": true }, "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": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "http-auth": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-2.4.11.tgz", - "integrity": "sha1-YfAkpuDnxIk0lEiVyHoTlVCcYZs=", + "integrity": "sha512-WaunN0NDebrCeKKnH1mHoFTJ1nBBufx1UsGj9XU3Na3djUuV8WEBVN6RdDXsSejDJ/Pn8KjfXlGs0ZBElawPrw==", "dev": true, "requires": { "apache-crypt": "1.1.2", @@ -3782,7 +3900,7 @@ "node-uuid": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", "dev": true } } @@ -3794,30 +3912,22 @@ "dev": true }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - } + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", - "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "http-proxy": { @@ -3853,7 +3963,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -3861,7 +3971,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -3880,9 +3990,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -3893,16 +4003,16 @@ "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" } }, "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -3911,13 +4021,13 @@ "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", "dev": true }, "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -3945,32 +4055,38 @@ "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "optional": true }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", "dev": true }, "infer-owner": { @@ -3982,7 +4098,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -3996,9 +4112,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.6.tgz", + "integrity": "sha512-IZUoxEjNjubzrmvzZU4lKP7OnYmX72XRl3sqkfJhBKweKi5rnGi5+IUdlj/H1M+Ip5JQ1WzaDMOBRY90Ajc5jg==", "dev": true }, "injection-js": { @@ -4008,14 +4124,6 @@ "dev": true, "requires": { "tslib": "^2.0.0" - }, - "dependencies": { - "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", - "dev": true - } } }, "inquirer": { @@ -4037,66 +4145,17 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, "invert-kv": { @@ -4108,13 +4167,13 @@ "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==", "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=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -4123,7 +4182,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -4134,16 +4193,35 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "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=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-buffer": { @@ -4153,9 +4231,9 @@ "dev": true }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -4168,9 +4246,9 @@ } }, "is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -4179,7 +4257,7 @@ "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=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -4188,7 +4266,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -4197,10 +4275,13 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-descriptor": { "version": "0.1.6", @@ -4222,21 +4303,21 @@ } }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "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=", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "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=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { @@ -4246,9 +4327,9 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -4257,7 +4338,7 @@ "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", "dev": true, "requires": { "global-dirs": "^0.1.0", @@ -4273,13 +4354,13 @@ "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-npm": { @@ -4289,35 +4370,30 @@ "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "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" - } - } + "has-tostringtag": "^1.0.0" } }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", "dev": true }, "is-path-in-cwd": { @@ -4332,7 +4408,7 @@ "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", "dev": true, "requires": { "path-is-inside": "^1.0.1" @@ -4357,33 +4433,73 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, "is-windows": { @@ -4393,10 +4509,13 @@ "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 + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "is-yarn-global": { "version": "0.3.0", @@ -4407,7 +4526,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isbinaryfile": { @@ -4422,19 +4541,19 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "istanbul-api": { @@ -4486,6 +4605,14 @@ "@babel/types": "^7.4.0", "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" + }, + "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 + } } }, "istanbul-lib-report": { @@ -4499,6 +4626,12 @@ "supports-color": "^6.1.0" }, "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -4552,7 +4685,7 @@ "jasmine": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", "dev": true, "requires": { "exit": "^0.1.2", @@ -4563,7 +4696,7 @@ "jasmine-core": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", "dev": true } } @@ -4586,7 +4719,7 @@ "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "dev": true } } @@ -4594,7 +4727,7 @@ "jasminewd2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", "dev": true }, "js-tokens": { @@ -4604,9 +4737,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4616,7 +4749,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "jsesc": { @@ -4628,7 +4761,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "dev": true }, "json-parse-better-errors": { @@ -4644,9 +4777,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -4658,13 +4791,13 @@ "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=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", "dev": true }, "jsonc-parser": { @@ -4674,51 +4807,42 @@ "dev": true }, "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } + "graceful-fs": "^4.1.6" } }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" + "setimmediate": "^1.0.5" } }, "karma": { @@ -4756,6 +4880,71 @@ "useragent": "2.3.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" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -4769,9 +4958,9 @@ } }, "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true }, "debug": { @@ -4783,6 +4972,27 @@ "ms": "2.0.0" } }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "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": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -4798,37 +5008,119 @@ "unpipe": "~1.0.0" } }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^7.1.3" + } + }, + "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 + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, - "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 - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true } } @@ -4846,7 +5138,7 @@ "karma-cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "integrity": "sha512-A/KNa3Is0F7Vv5SIeq0Wj6yGvAIUkrmSU03Wcles4wIkU5MORUTxzwbYT4Tz0qOofx4upfFQU/uIYfGYtADTaA==", "dev": true, "requires": { "resolve": "^1.1.6" @@ -4872,9 +5164,9 @@ } }, "karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", "dev": true }, "keyv": { @@ -4911,11 +5203,12 @@ } }, "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", + "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", "dev": true, "requires": { + "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", @@ -4932,13 +5225,19 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, "less-plugin-npm-import": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", - "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "integrity": "sha512-f7pVkEooRq2/jge/M/Y+spoPXj5rRIY30q1as+3kZsDG8Rs+loNJUCVQjzXB9Ao/9FeIJULiq2zrXymv+OMTbw==", "dev": true, "requires": { "promise": "~7.0.1", @@ -4948,7 +5247,7 @@ "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true } } @@ -4963,15 +5262,15 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "live-server": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", - "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", + "integrity": "sha512-UQcAx+ju1/hRW6eVl3uEEj6sczJ9zfOS2V42qNX6Bi+7zrrGap+PlSb4KUIBrIfaevG8VfsML9HFVya8FLiWog==", "dev": true, "requires": { "colors": "^1.4.0", @@ -4984,7 +5283,7 @@ "object-assign": "^4.1.1", "opn": "^6.0.0", "proxy-middleware": "^0.15.0", - "send": "^0.17.1", + "send": "^0.18.0", "serve-index": "^1.7.2", "watchr": "2.6.x" }, @@ -5008,69 +5307,19 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, "log4js": { @@ -5114,9 +5363,9 @@ "dev": true }, "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" @@ -5194,19 +5443,19 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true }, "map-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", "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=", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, "requires": { "object-visit": "^1.0.0" @@ -5221,7 +5470,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "mem": { @@ -5254,6 +5503,90 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "dependencies": { + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "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": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "mime": { @@ -5263,18 +5596,18 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -5290,18 +5623,18 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "minipass": { @@ -5371,18 +5704,18 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "morgan": { "version": "1.10.0", @@ -5409,7 +5742,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -5417,7 +5750,7 @@ "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", "dev": true, "requires": { "aproba": "^1.1.1", @@ -5440,15 +5773,15 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "integrity": "sha512-0mzK8ymiWdehTBiJh0vClAzGyQbdtyWqzSVx//EK4N/D+599RFlGfTAsKw2zMSABtDG9C6Ul2+t8f2Lbdjf5mA==", "dev": true, "requires": { "array-differ": "^1.0.0", @@ -5463,13 +5796,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5490,16 +5816,16 @@ } }, "native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", + "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", "dev": true, "optional": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -5543,62 +5869,47 @@ "update-notifier": "^3.0.0" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "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": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "color-convert": "^1.9.0" } }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "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": { - "fill-range": "^7.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "color-name": "1.1.3" } }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "commander": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -5610,69 +5921,20 @@ "universalify": "^0.1.0" } }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "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": { - "is-number": "^7.0.0" + "has-flag": "^3.0.0" } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true } } }, @@ -5694,9 +5956,9 @@ } }, "node-releases": { - "version": "1.1.66", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.66.tgz", - "integrity": "sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "node-sass-tilde-importer": { @@ -5720,6 +5982,12 @@ "validate-npm-package-license": "^3.0.1" }, "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5737,19 +6005,19 @@ "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -5762,14 +6030,6 @@ "dev": true, "requires": { "semver": "^7.1.1" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } } }, "npm-normalize-package-bin": { @@ -5787,23 +6047,6 @@ "hosted-git-info": "^3.0.2", "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } } }, "npm-packlist": { @@ -5826,14 +6069,6 @@ "npm-install-checks": "^4.0.0", "npm-package-arg": "^8.0.0", "semver": "^7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } } }, "npm-registry-fetch": { @@ -5851,6 +6086,12 @@ "safe-buffer": "^5.2.0" }, "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5889,37 +6130,37 @@ "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=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "requires": { "path-key": "^2.0.0" } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, "null-check": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "integrity": "sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==", "dev": true }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", "dev": true }, "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=", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true }, "oauth-sign": { @@ -5931,19 +6172,19 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, "object-component": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==", "dev": true }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "requires": { "copy-descriptor": "^0.1.0", @@ -5954,7 +6195,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -5963,7 +6204,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -5972,9 +6213,9 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "object-keys": { @@ -5986,38 +6227,40 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "requires": { "isobject": "^3.0.0" } }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -6026,7 +6269,7 @@ "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -6041,7 +6284,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -6064,17 +6307,6 @@ "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } } }, "opn": { @@ -6084,12 +6316,20 @@ "dev": true, "requires": { "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + } } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", "dev": true, "requires": { "minimist": "~0.0.1", @@ -6099,97 +6339,37 @@ "minimist": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "ora": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", - "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", "dev": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true } } }, + "ora": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true }, "os-locale": { @@ -6201,12 +6381,48 @@ "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "os-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", - "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "integrity": "sha512-zzMwE/HWRISM52Q966yHosPJ1alrm5Cpw/C9ZhSid50RsMpLtOwc1rtmWxKn7TggPM+GVLUC3RxgWmklOiUgOQ==", "dev": true, "requires": { "macos-release": "^1.0.0", @@ -6216,7 +6432,7 @@ "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=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "osenv": { @@ -6238,13 +6454,13 @@ "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, "p-is-promise": { @@ -6287,6 +6503,14 @@ "registry-auth-token": "^4.0.0", "registry-url": "^5.0.0", "semver": "^6.2.0" + }, + "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 + } } }, "pacote": { @@ -6327,6 +6551,12 @@ "which": "^1.3.1" }, "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6400,9 +6630,9 @@ } }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -6418,18 +6648,28 @@ "dev": true }, "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "requires": { - "@types/node": "*" + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" } }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "integrity": "sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==", "dev": true, "requires": { "better-assert": "~1.0.0" @@ -6438,7 +6678,7 @@ "parseuri": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "integrity": "sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==", "dev": true, "requires": { "better-assert": "~1.0.0" @@ -6453,49 +6693,49 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "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=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "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=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "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=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, "requires": { "through": "~2.3" @@ -6504,31 +6744,37 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "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=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { "pinkie": "^2.0.0" @@ -6537,18 +6783,17 @@ "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=", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "dependencies": { "source-map": { @@ -6556,15 +6801,6 @@ "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" - } } } }, @@ -6582,23 +6818,23 @@ }, "dependencies": { "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true } } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true }, "process-nextick-args": { @@ -6610,7 +6846,7 @@ "promise": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", - "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "integrity": "sha512-8z1gTSL9cMgqCx8zvMYhzT0eQURAQNSQqR8B2hGfCYkAzt1vjReVdKBv4YwGw3OXAPaxfm4aR0gLoBUon4VmmA==", "dev": true, "requires": { "asap": "~2.0.3" @@ -6619,13 +6855,13 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "promise-retry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "integrity": "sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==", "dev": true, "requires": { "err-code": "^1.0.0", @@ -6667,19 +6903,19 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -6689,6 +6925,34 @@ "supports-color": "^2.0.0" } }, + "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.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -6698,13 +6962,7 @@ "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 - }, - "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=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "rimraf": { @@ -6725,7 +6983,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true }, "source-map-support": { @@ -6748,15 +7006,15 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -6767,7 +7025,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -6776,13 +7034,13 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true }, "webdriver-manager": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", - "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", "dev": true, "requires": { "adm-zip": "^0.4.9", @@ -6798,6 +7056,38 @@ "xml2js": "^0.4.17" } }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "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": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "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": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -6833,26 +7123,26 @@ "proxy-middleware": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", - "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", "dev": true }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "optional": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "pump": { @@ -6897,7 +7187,7 @@ "q": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", "dev": true }, "qjobs": { @@ -6907,9 +7197,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "range-parser": { @@ -6919,36 +7209,17 @@ "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6957,12 +7228,6 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3" } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true } } }, @@ -7067,14 +7332,12 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "reflect-metadata": { @@ -7093,13 +7356,24 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "dev": true, "requires": { - "rc": "^1.2.8" + "rc": "1.2.8" } }, "registry-url": { @@ -7114,19 +7388,19 @@ "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=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "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=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true }, "request": { @@ -7155,46 +7429,55 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", "dev": true }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "dev": true }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dev": true, "requires": { "lowercase-keys": "^1.0.0" @@ -7219,19 +7502,19 @@ "retry": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "integrity": "sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==", "dev": true }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -7286,7 +7569,7 @@ "rollup-plugin-sourcemaps": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", - "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "integrity": "sha512-pHUvzofmQx/C3zCkX14h9J9MbRfMjaARED8j8qOY+au4prtk2d567GD29WAHQTeGsDAVeStms3cPnRboC41YzA==", "dev": true, "requires": { "rollup-pluginutils": "^2.0.1", @@ -7311,19 +7594,27 @@ "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "dev": true, "requires": { "aproba": "^1.1.1" } }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "safe-buffer": { @@ -7335,12 +7626,23 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, "requires": { "ret": "~0.1.10" } }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safefs": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.2.0.tgz", @@ -7354,7 +7656,7 @@ "safeps": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/safeps/-/safeps-7.0.1.tgz", - "integrity": "sha1-FXPMsJy/AeAckFIr68bIsicL8hk=", + "integrity": "sha512-aFREKZzceHZH3KZTwjhDI1oOOcyAEBcQHjImJS/Mmx+KC31EQCgwiPKfwhJLBX7R4Y5ioI2D/VEcQ6U6ya2MJw==", "dev": true, "requires": { "editions": "^1.3.3", @@ -7379,12 +7681,14 @@ "dev": true }, "sass": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.29.0.tgz", - "integrity": "sha512-ZpwAUFgnvAUCdkjwPREny+17BpUj8nh5Yr6zKPGtLNTLrmtoRYIjm7njP24COhjJldjwW1dcv52Lpf4tNZVVRA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", + "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", "dev": true, "requires": { - "chokidar": ">=2.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "saucelabs": { @@ -7405,7 +7709,7 @@ "scandirectory": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", - "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=", + "integrity": "sha512-uT0CW8Z3YyoIQs2gXIZgR5miLkN/UNl+5IptQIq1YfD2NhFldikYlC3dkOE6MvF15OZMOxjg8yOjx5J/vIIPUA==", "dev": true, "requires": { "ignorefs": "^1.0.0", @@ -7416,7 +7720,7 @@ "safefs": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", - "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=", + "integrity": "sha512-qqvuS8qslGUSgUKQbdsYIK8Qg0EAkykxlsdfy3jpBSnhtyPsee/8y4RLc5+3CD6TgazBmtT0ekoGicUTPzICdg==", "dev": true, "requires": { "graceful-fs": "*" @@ -7425,7 +7729,7 @@ "taskgroup": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", - "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=", + "integrity": "sha512-PD97E2OfwFH7SgeVRvR6K2c+NkKXZSwMMTdcM1t/3P+f70DUWbR81Qx7TF7dJj8dV631u4dhdBmhfDQjIZvGsg==", "dev": true, "requires": { "ambi": "^2.2.0", @@ -7458,7 +7762,7 @@ "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", "dev": true, "requires": { "os-tmpdir": "~1.0.1" @@ -7467,15 +7771,15 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", "dev": true, "requires": { "semver": "^5.0.3" @@ -7492,7 +7796,7 @@ "semver-dsl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==", "dev": true, "requires": { "semver": "^5.3.0" @@ -7524,24 +7828,24 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -7556,29 +7860,26 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "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 + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } } } }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -7602,13 +7903,13 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -7620,13 +7921,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -7634,19 +7935,19 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "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=", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "set-value": { @@ -7664,7 +7965,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -7672,16 +7973,22 @@ } } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -7690,19 +7997,30 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, "snapdragon": { @@ -7733,7 +8051,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -7742,7 +8060,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, "requires": { "is-extendable": "^0.1.0" @@ -7751,13 +8069,13 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true } } @@ -7776,7 +8094,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, "requires": { "is-descriptor": "^1.0.0" @@ -7825,7 +8143,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -7859,7 +8177,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -7895,7 +8213,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", "dev": true }, "debug": { @@ -7910,7 +8228,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -7929,7 +8247,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", "dev": true }, "debug": { @@ -7944,13 +8262,13 @@ "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -7992,6 +8310,12 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -8006,9 +8330,9 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -8024,9 +8348,9 @@ } }, "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=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "sourcemap-codec": { @@ -8062,9 +8386,9 @@ } }, "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "split": { @@ -8092,9 +8416,9 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -8109,9 +8433,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -8120,7 +8444,7 @@ "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, "requires": { "define-property": "^0.2.5", @@ -8130,7 +8454,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, "requires": { "is-descriptor": "^0.1.0" @@ -8139,15 +8463,15 @@ } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, "stream-combiner": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "dev": true, "requires": { "duplexer": "~0.1.1", @@ -8184,9 +8508,9 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -8202,108 +8526,40 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true } } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "strip-ansi": "^6.0.1" } }, "string.prototype.trimend": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", - "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", - "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string_decoder": { @@ -8324,38 +8580,30 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.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-regex": "^5.0.1" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "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=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "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=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true }, "stylus": { @@ -8392,20 +8640,32 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -8413,18 +8673,18 @@ "dev": true }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" }, "dependencies": { "yallist": { @@ -8464,66 +8724,16 @@ "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", "dev": true, "requires": { "execa": "^0.7.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" - } - }, - "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" - } - }, - "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 - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } } }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dev": true, "requires": { "commander": "^2.20.0", @@ -8548,7 +8758,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "through2": { @@ -8564,7 +8774,7 @@ "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", "dev": true }, "tmp": { @@ -8579,19 +8789,19 @@ "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "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=", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -8600,7 +8810,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -8627,19 +8837,18 @@ } }, "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=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "tough-cookie": { @@ -8653,15 +8862,15 @@ } }, "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", "dev": true }, "ts-simple-ast": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ts-simple-ast/-/ts-simple-ast-6.12.0.tgz", - "integrity": "sha1-vSMtf8fj8f8SEYJVTeHkIW+SWC4=", + "integrity": "sha512-0uoRxAxrDLn26DYSHrXLTrj/PiMBnSsxEyeqGfiC1FWCY3LwzXT4mzEhEqIHSizIPfRooPGF5yKByY6y+t48YQ==", "dev": true, "requires": { "code-block-writer": "^6.2.0", @@ -8680,9 +8889,9 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "tslint": { @@ -8706,10 +8915,51 @@ "tsutils": "^2.29.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" + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "semver": { @@ -8717,6 +8967,21 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "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" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, @@ -8727,12 +8992,20 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -8741,13 +9014,13 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "type-is": { @@ -8772,19 +9045,19 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.8.tgz", + "integrity": "sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg==", "dev": true }, "uglify-js": { - "version": "3.11.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.5.tgz", - "integrity": "sha512-btvv/baMqe7HxP7zJSF7Uc16h1mSfuuSplT0/qdjxseesDU+yYzH33eHBH+eMdeRXwujXspaCTooWHQVVBh09w==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, @@ -8803,6 +9076,18 @@ "editions": "^2.2.0" } }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -8836,7 +9121,7 @@ "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", "dev": true, "requires": { "crypto-random-string": "^1.0.0" @@ -8851,12 +9136,20 @@ "debug": "^4.1.1", "request": "^2.88.2", "uuid": "^3.0.0" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unix-crypt-td-js": { @@ -8868,13 +9161,13 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, "requires": { "has-value": "^0.3.1", @@ -8884,7 +9177,7 @@ "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, "requires": { "get-value": "^2.0.3", @@ -8895,7 +9188,7 @@ "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "requires": { "isarray": "1.0.0" @@ -8906,7 +9199,7 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true } } @@ -8917,6 +9210,24 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, "update-notifier": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", @@ -8935,12 +9246,64 @@ "latest-version": "^5.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^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.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" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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" + } + } } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -8949,13 +9312,13 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "dev": true }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, "requires": { "prepend-http": "^2.0.0" @@ -8990,7 +9353,7 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true } } @@ -8998,13 +9361,13 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "util-promisify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3" @@ -9013,13 +9376,13 @@ "utils-merge": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==", "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", "dev": true }, "validate-npm-package-license": { @@ -9035,7 +9398,7 @@ "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" @@ -9044,30 +9407,38 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } } }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true }, "watchr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.6.0.tgz", - "integrity": "sha1-51xCOxC+eSZ6DD73bi6hBP4CZ6U=", + "integrity": "sha512-eHqnPA71jn+lLf/c49mjXqQzzwKLmDdLZXiB53PtgBY8X75zqUWL2PmJWjJ45Bcy8PHOMDdVUCLEud36Lk5QZQ==", "dev": true, "requires": { "eachr": "^3.2.0", @@ -9083,7 +9454,7 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" @@ -9125,10 +9496,23 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, "widest-line": { @@ -9141,15 +9525,15 @@ }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "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=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true }, "string-width": { @@ -9165,7 +9549,7 @@ "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -9176,7 +9560,7 @@ "win-release": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", - "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", "dev": true, "requires": { "semver": "^5.0.1" @@ -9193,60 +9577,24 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "write-file-atomic": { @@ -9282,7 +9630,7 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", "dev": true }, "xml2js": { @@ -9304,7 +9652,7 @@ "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "integrity": "sha512-/bFPLUgJrfGUL10AIv4Y7/CUt6so9CLtB/oFxQSHseSDNNCdC6vwwKEqwLN6wNPBg9YWXAiMu8jkf6RPRS/75Q==", "dev": true }, "xtend": { @@ -9323,9 +9671,9 @@ } }, "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { @@ -9335,129 +9683,38 @@ "dev": true }, "yargs": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", - "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.0" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } } } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", "dev": true }, "zone.js": { diff --git a/package.json b/package.json index 991e2bc..0b983a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webglimpse", - "version": "2.5.0", + "version": "2.6.0", "description": "Webglimpse is a data visualization library for the web.", "repository": { "type": "git", @@ -25,7 +25,7 @@ "serve-docs": "node_modules/.bin/compodoc -s -d docs" }, "dependencies": { - "moment": "^2.24.0" + "moment": "^2.29.4" }, "devDependencies": { "@angular/animations": "^10.2.3", diff --git a/src/webglimpse/color.ts b/src/webglimpse/color.ts index 4cada9f..ffeefc8 100644 --- a/src/webglimpse/color.ts +++ b/src/webglimpse/color.ts @@ -110,7 +110,7 @@ export let parseCssColor = (function () { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; - const g = canvas.getContext('2d'); + const g = canvas.getContext('2d', { willReadFrequently: true}); return function (cssColorString: string, alphaOverride?: number): Color { g.clearRect(0, 0, 1, 1); g.fillStyle = cssColorString; diff --git a/src/webglimpse/text.ts b/src/webglimpse/text.ts index 3550cef..d4ebeb8 100644 --- a/src/webglimpse/text.ts +++ b/src/webglimpse/text.ts @@ -85,7 +85,7 @@ function newFontMetricsCache(): Cache { const canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; - const g = canvas.getContext('2d'); + const g = canvas.getContext('2d', { willReadFrequently: true}); g.font = font; g.textAlign = 'left'; From e908c92cc99d34776ed41f9b14664d9833c5437b Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 7 Dec 2022 10:00:41 -0800 Subject: [PATCH 67/69] Updated angular / ng-packagr versions. --- ng-package.json | 9 +- package-lock.json | 4575 +++++++++++++++++++-------------------------- package.json | 26 +- tsconfig.json | 1 + 4 files changed, 1976 insertions(+), 2635 deletions(-) diff --git a/ng-package.json b/ng-package.json index 25733ab..7604aa6 100644 --- a/ng-package.json +++ b/ng-package.json @@ -1,12 +1,9 @@ { - "$schema": "./node_modules/ng-packagr/package.schema.json", + "$schema": "./node_modules/ng-packagr/ng-package.schema.json", "lib": { - "entryFile": "src/public_api.ts", - "umdModuleIds": { - "moment": "moment" - } + "entryFile": "src/public_api.ts" }, - "whitelistedNonPeerDependencies": [ + "allowedNonPeerDependencies": [ "moment" ] } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a624cf9..030c338 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,249 +10,232 @@ "integrity": "sha512-20Pk2Z98fbPLkECcrZSJszKos/OgtvJJR3NcbVfgCJ6EQjDNzW2P1BKqImOz3tJ952dvO2DWEhcLhQ1Wz1e9ng==", "dev": true }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@angular-devkit/architect": { - "version": "0.1002.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.4.tgz", - "integrity": "sha512-Vrb2XSnvqj4RByqSWPeG/o9BSNX2DL3pxwQgLMrxofG8/+1VHQ2MsN/KTxBnEZtqeW4/l2QWTsQyzY5frJI69A==", + "version": "0.1500.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1500.2.tgz", + "integrity": "sha512-gprTEy6vD57yJCd6JqRaFZ/pfmXuEDHlH7mOVBcBdTGuuE1VJkiNJ69E9gw552L7wwVEsF0D6lVYTFHVDkMDmA==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.4", - "rxjs": "6.6.2" + "@angular-devkit/core": "15.0.2", + "rxjs": "6.6.7" }, "dependencies": { "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, "@angular-devkit/core": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.4.tgz", - "integrity": "sha512-gnm/+Iyaa6Jt3E803bpTjkwDAIb0AhP9badaGwbx44+bhbNSE2WzOBmdsQrsxJXHAMEG9CGeBzeRd8XZtLACWg==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.0.2.tgz", + "integrity": "sha512-XkdNKyeYvnCq0zWuEda163muUV38ifNyK6EjrbhI5pQWNg7myxtDmLenjtpXLGLZwjxqsart2l/uoYsk1xQCmQ==", "dev": true, "requires": { - "ajv": "6.12.4", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.2", - "source-map": "0.7.3" + "ajv": "8.11.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" }, "dependencies": { - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "tslib": "^1.9.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } } } }, "@angular-devkit/schematics": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.4.tgz", - "integrity": "sha512-poBGWRwMgnnnmoZfwyOBcQMJm7U5y5XxnxvMsBJEyAQRxfQa+KLvcCfGWXqskNTyBdQFpy4kxmtCzRClkoEiKQ==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.0.2.tgz", + "integrity": "sha512-FqimOzQCwRGmz/NPPiK6QpAxI+qpy8rYQRlWRWSOfQgjb+cl4rD2isllalYvzO+5mmb88fwJ7bj9cP2X5khpcg==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.4", - "ora": "5.0.0", - "rxjs": "6.6.2" + "@angular-devkit/core": "15.0.2", + "jsonc-parser": "3.2.0", + "magic-string": "0.26.7", + "ora": "5.4.1", + "rxjs": "6.6.7" }, "dependencies": { "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, - "@angular/animations": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.2.5.tgz", - "integrity": "sha512-lIMwjY1pAqpCM4Ayndf2RsvOWRUc5QV7W82XNou6pIBv2T1i1XV6H72I5Sk9Z4sxxBYCWncEaEub+C6NcS8QRg==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, "@angular/cli": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.4.tgz", - "integrity": "sha512-S8xAJemX3zE/I/xi81DT6NuzfDwEAEtEeITHxrAH0AHE4kaUBy2O9bAopvYqMNzxs/XGqyxMv8vwYYpGax7EEQ==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.0.2.tgz", + "integrity": "sha512-SRPCYiK5A+U0V173EUZNYHtOvFtxefH9hfie2+XcJX9B/7VxqIkyRYXOUUyWtC7yzbxWNJ1+WG5X4S5C2LrTEw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1002.4", - "@angular-devkit/core": "10.2.4", - "@angular-devkit/schematics": "10.2.4", - "@schematics/angular": "10.2.4", - "@schematics/update": "0.1002.4", + "@angular-devkit/architect": "0.1500.2", + "@angular-devkit/core": "15.0.2", + "@angular-devkit/schematics": "15.0.2", + "@schematics/angular": "15.0.2", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.1.1", - "ini": "1.3.6", - "inquirer": "7.3.3", - "npm-package-arg": "8.0.1", - "npm-pick-manifest": "6.1.0", - "open": "7.2.0", - "pacote": "9.5.12", - "read-package-tree": "5.3.1", - "rimraf": "3.0.2", - "semver": "7.3.2", - "symbol-observable": "1.2.0", - "universal-analytics": "0.4.23", - "uuid": "8.3.0" + "ansi-colors": "4.1.3", + "ini": "3.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "9.1.2", + "npm-pick-manifest": "8.0.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "15.0.6", + "resolve": "1.22.1", + "semver": "7.3.8", + "symbol-observable": "4.0.0", + "yargs": "17.6.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true + } } }, "@angular/common": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.5.tgz", - "integrity": "sha512-553yf6ZUHNqT4XpOqbW7EKKMfX56u/8DkwYXuSv8MAKdl4/AW6gliFOEJGYo04JcKF7Knq3VPvGSCO9kupf0hg==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.0.2.tgz", + "integrity": "sha512-BZkaUdFv6A0a8m3R/HEYmwZrULMHwRWQh+ukSQEz9reVNUiH0/mNvj9I4iYYCfYXHPiyMIRfAeu/fqdl14DBFg==", "dev": true, "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } } }, "@angular/compiler": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.5.tgz", - "integrity": "sha512-ddJiTPCoVBIGjFDYoYWDpmq3Zs8UKoWpzaeW4u+p17gWW54HwyT5XTxrgtbeUmaxIuRdL4/KT1lGHs9/9bwbCA==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.0.2.tgz", + "integrity": "sha512-dD1Vv2txp09V7RaJK2tvGRWpM2RsDARVAGL65hfJY2txeEFRyajcle6jOI11NfGpgsZvptN7o5oc8ozQI1hgTA==", "dev": true, "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } } }, "@angular/compiler-cli": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.5.tgz", - "integrity": "sha512-xddSpKudoPidEebIW3x1CvQdx69WEmnFg4DneeQi/tit7mtAKYTJemzYZmP6abdSYhtxovL0bPX5LxYlrtuxIw==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.0.2.tgz", + "integrity": "sha512-WZCULskbuoMA0iQ36H2nGgKj017JENR+wDnwuQ+/1ECtBN2PpjJiws/m5bntBzQe96w2fue6tOLh09WESQgRHw==", "dev": true, "requires": { - "canonical-path": "1.0.0", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", + "dependency-graph": "^0.11.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", + "semver": "^7.0.0", "sourcemap-codec": "^1.4.8", - "tslib": "^2.0.0", - "yargs": "^16.1.1" + "tslib": "^2.3.0", + "yargs": "^17.2.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 - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, "@angular/core": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.5.tgz", - "integrity": "sha512-krhOKNTj5XE92Rk9ASX5KmgTF72j7qT2PLVxrGEVjuUKjBY2XaK3TV0Kotq9zI3qa9WgeCrP/Njn6jlKQCCAEQ==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "@angular/forms": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.2.5.tgz", - "integrity": "sha512-EnycBx8q+DGmPaX4oSjPejJxx9u0TLb5+tpGxYitdOq/eBpQAAYyWKQGKXb1JB46rPVwJr34MmTltHgAN0zUSQ==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "@angular/http": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", - "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.0.2.tgz", + "integrity": "sha512-qM0T4r3Z3Qfk+5+M5JRB1qr3AUKgabbC0kARY+R+QvwbQBE6UoeWw5eRuUbTGDP70Ikeeg0xZebpkr7Oghp9/A==", "dev": true, "requires": { - "tslib": "^1.7.1" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } }, - "@angular/language-service": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.2.5.tgz", - "integrity": "sha512-e9ug9TJG31SeSWl65TglXKWOIATGu/P0jVSGKxGF22vQYlAahdRoFXP56+B9P9k+6cDuYljkjH1rdyCaU3iOPg==", - "dev": true - }, - "@angular/platform-browser": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.2.5.tgz", - "integrity": "sha512-3JDFRGNxr0IUkjSdGK2Q1BvqnSDpy9YWo0DJP+TEpgW578R84m4X7/wI3jJmFSC2yyouMWrHsot2vcBPAQj89g==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.2.5.tgz", - "integrity": "sha512-7z443I80K2CeqzczlSJ8BlABj0uRgnHUrABE8yLlU2BgifJrriBawzSXEV7UMEN7k7ezbc6NhpOn6Q6BrCKEOA==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "@angular/router": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.2.5.tgz", - "integrity": "sha512-AtSMB/d4V+pw/FL4G/mWWoiJJtZ/075TqsGW7uEFKgxS6Gh2kalv6BTMlXVG5GO+2oU0lsuDvguq5E7Atbak3Q==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -262,6 +245,49 @@ "@babel/highlight": "^7.18.6" } }, + "@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true + }, + "@babel/core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.5", + "@babel/parser": "^7.20.5", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "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 + } + } + }, "@babel/generator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", @@ -273,6 +299,26 @@ "jsesc": "^2.5.1" } }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "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 + } + } + }, "@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -298,6 +344,40 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, "@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", @@ -319,6 +399,23 @@ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + } + }, "@babel/highlight": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", @@ -741,6 +838,26 @@ } } }, + "@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "dev": true, + "optional": true + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", @@ -780,48 +897,171 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "@schematics/angular": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.4.tgz", - "integrity": "sha512-irU3cnamfd5Hgy1B6oY7oweApJHhVaD2oYPq0NfI+F14JalERO+DGO0Tq3MWmEGn32tLQPv9fwM5O8EElEp9pA==", + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.4", - "@angular-devkit/schematics": "10.2.4", - "jsonc-parser": "2.3.0" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" } }, - "@schematics/update": { - "version": "0.1002.4", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.4.tgz", - "integrity": "sha512-qnDn3SSMmolfzWpj8CTAoC/TSPe43azKPYLR5r76GkRvuUbwr/dQEj92wu59twjGcsmjF54qcG4fGaxMndUn3Q==", + "@npmcli/git": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz", + "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==", "dev": true, "requires": { - "@angular-devkit/core": "10.2.4", - "@angular-devkit/schematics": "10.2.4", - "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.6", - "npm-package-arg": "^8.0.0", - "pacote": "9.5.12", - "semver": "7.3.2", - "semver-intersect": "1.4.0" + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "dependencies": { + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true + }, + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.1.tgz", + "integrity": "sha512-GIykAFdOVK31Q1/zAtT5MbxqQL2vyl9mvFJv+OGu01zxbhL3p0xc8gJjdNGX1mWmUT43aEKVO2L6V/2j4TOsAA==", + "dev": true, + "requires": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "@npmcli/promise-spawn": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.1.tgz", + "integrity": "sha512-+hcUpxgx0vEpDJI9Cn+lkTdKLoqKBXFCVps5H7FujEU2vLOp6KwqjLlxbnz8Wzgm8oEqW/u5FeNAXSFjLdCD0A==", + "dev": true, + "requires": { + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/run-script": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", + "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@rollup/plugin-json": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-5.0.2.tgz", + "integrity": "sha512-D1CoOT2wPvadWLhVcmpkDnesTzjhNIQRWLsc3fA49IFOP2Y84cFOOJ+nKGYedvXHKUsPeq07HR4hXpBBr+CHlA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1" + } + }, + "@rollup/plugin-node-resolve": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.0", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "requires": { - "defer-to-connect": "^1.0.1" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" } }, + "@schematics/angular": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.0.2.tgz", + "integrity": "sha512-h5vTcOkJD0s+BMHRI87fVyKB+A/YqFolR7fhmhETTq2NwRg2oR0HTf7DbjVxPBwhvI5XzUV1MBPb30xXR2UG0w==", + "dev": true, + "requires": { + "@angular-devkit/core": "15.0.2", + "@angular-devkit/schematics": "15.0.2", + "jsonc-parser": "3.2.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, "@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", @@ -849,12 +1089,6 @@ "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==", "dev": true }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, "@types/q": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", @@ -862,13 +1096,10 @@ "dev": true }, "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "dev": true, - "requires": { - "@types/node": "*" - } + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true }, "@types/selenium-webdriver": { "version": "3.0.20", @@ -882,15 +1113,11 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "accepts": { "version": "1.3.8", @@ -902,12 +1129,6 @@ "negotiator": "0.6.3" } }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, "adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", @@ -930,12 +1151,32 @@ } }, "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + } + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, "ajv": { @@ -950,6 +1191,35 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ambi": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", @@ -968,15 +1238,6 @@ } } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1063,11 +1324,34 @@ } }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1140,19 +1424,6 @@ "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true }, - "array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -1165,12 +1436,6 @@ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -1238,18 +1503,17 @@ "dev": true }, "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" } }, "aws-sign2": { @@ -1346,6 +1610,12 @@ "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", @@ -1399,6 +1669,30 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -1490,118 +1784,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "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" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "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 - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "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" - } - }, - "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" - } - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1642,6 +1824,16 @@ "https-proxy-agent": "^2.2.1" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -1664,12 +1856,6 @@ "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -1677,10 +1863,13 @@ "dev": true }, "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + } }, "bytes": { "version": "3.1.2", @@ -1689,51 +1878,83 @@ "dev": true }, "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.2.tgz", + "integrity": "sha512-rYUs2x4OjSgCQND7nTrh21AHIBFgd7s/ctAYvU3a8u+nK+R5YaX/SFPDYz4Azz7SGL6+6L9ZZWI4Kawpb7grzQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "dependencies": { - "lru-cache": { + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { - "yallist": "^3.0.2" + "brace-expansion": "^2.0.1" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "requires": { - "glob": "^7.1.3" + "unique-slug": "^4.0.0" } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } } } }, @@ -1754,44 +1975,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1820,12 +2003,6 @@ "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==", "dev": true }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1894,15 +2071,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "class-utils": { @@ -1928,27 +2099,10 @@ } } }, - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cli-cursor": { @@ -1973,13 +2127,13 @@ "dev": true }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -1989,15 +2143,6 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "code-block-writer": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-6.14.0.tgz", @@ -2087,6 +2232,12 @@ "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, "compare-versions": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", @@ -2117,53 +2268,10 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "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" - } - }, - "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "connect": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", - "integrity": "sha512-lRub47ccjmmdQoA1d+rwRcWsHoKsRyKtZ3z/IMg7/xMS5sWBBuOdAqoKm1xEsxTSWLcBjj8zdcbM6dwwOhgQZA==", + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha512-lRub47ccjmmdQoA1d+rwRcWsHoKsRyKtZ3z/IMg7/xMS5sWBBuOdAqoKm1xEsxTSWLcBjj8zdcbM6dwwOhgQZA==", "dev": true, "requires": { "debug": "~2.2.0", @@ -2189,6 +2297,12 @@ } } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -2216,31 +2330,6 @@ "is-what": "^3.14.1" } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2269,76 +2358,12 @@ "vary": "^1" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", - "dev": true - }, "csextends": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz", "integrity": "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==", "dev": true }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", - "dev": true, - "requires": { - "css": "^2.0.0" - } - }, "css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -2395,12 +2420,6 @@ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", - "dev": true - }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -2431,12 +2450,6 @@ "ms": "^2.1.1" } }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "dev": true - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -2449,19 +2462,10 @@ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, "default-require-extensions": { @@ -2482,22 +2486,12 @@ "clone": "^1.0.2" } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2585,6 +2579,12 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2592,9 +2592,9 @@ "dev": true }, "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, "destroy": { @@ -2603,28 +2603,12 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, - "dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -2680,39 +2664,12 @@ "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", "dev": true }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "eachr": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.3.0.tgz", @@ -2780,8 +2737,21 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, "requires": { "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } } }, "end-of-stream": { @@ -2891,10 +2861,16 @@ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, "errlop": { @@ -2913,64 +2889,6 @@ "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.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -2986,6 +2904,152 @@ "es6-promise": "^4.0.3" } }, + "esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.18.tgz", + "integrity": "sha512-Bw80Siy8XJi6UIR9f0T5SkMIkiVgvFZgHaOZAQCDcZct6Lj5kBZtpACpDhqfdTUzoDyk7pBn4xEft/T5+0tlXw==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3011,9 +3075,9 @@ "dev": true }, "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "etag": { @@ -3043,29 +3107,6 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", - "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": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true - } - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -3168,17 +3209,6 @@ "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": { @@ -3302,12 +3332,6 @@ "websocket-driver": ">=0.5.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -3365,24 +3389,46 @@ } } }, - "find-parent-dir": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz", - "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { - "locate-path": "^3.0.0" - } - }, - "findit2": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "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" + } + }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", "integrity": "sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog==", "dev": true }, @@ -3392,16 +3438,6 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -3431,6 +3467,12 @@ "mime-types": "^2.1.12" } }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -3452,16 +3494,6 @@ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -3471,36 +3503,13 @@ "null-check": "^1.0.0" } }, - "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha512-wYid1zXctNLgas1pZ8q8ChdsnGg4DHZVqMzJ7pOE85q5BppAEXgQGSoOjVgrcw5yI7pzz49p9AfMhM7z5PRuaw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.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": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "minipass": "^3.0.0" } }, "fs.realpath": { @@ -3522,28 +3531,26 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" } }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -3572,16 +3579,6 @@ "pump": "^3.0.0" } }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3620,15 +3617,6 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3648,25 +3636,6 @@ "pinkie-promise": "^2.0.0" } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -3736,12 +3705,6 @@ } } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -3771,29 +3734,17 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "has-value": { "version": "1.0.0", @@ -3847,19 +3798,13 @@ } } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" } }, "html-entities": { @@ -3906,9 +3851,9 @@ } }, "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, "http-errors": { @@ -3942,29 +3887,24 @@ } }, "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "debug": "4" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true } } }, @@ -4010,27 +3950,47 @@ } }, "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "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.0.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.0.tgz", + "integrity": "sha512-bTf9UWe/UP1yxG3QUrj/KOvEhTAUWPcv+WvbFZ28LcqznXabp7Xu6o9y1JEC18+oqODuS7VhTpekV5XvFwsxJg==", "dev": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "ignorefs": { @@ -4071,18 +4031,18 @@ "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", "dev": true }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -4124,38 +4084,54 @@ "dev": true, "requires": { "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } } }, "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "rxjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", + "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } } }, "invert-kv": { @@ -4165,9 +4141,9 @@ "dev": true }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "is-accessor-descriptor": { @@ -4190,21 +4166,6 @@ } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4214,35 +4175,19 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.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-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "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==", + "is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "builtin-modules": "^3.3.0" } }, "is-core-module": { @@ -4274,15 +4219,6 @@ } } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -4335,61 +4271,30 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-npm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", - "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4423,58 +4328,12 @@ "isobject": "^3.0.1" } }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -4487,15 +4346,6 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, "is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -4517,12 +4367,6 @@ "is-docker": "^2.0.0" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4758,22 +4602,10 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "dev": true }, "json-schema": { @@ -4801,9 +4633,9 @@ "dev": true }, "jsonc-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz", - "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "jsonfile": { @@ -5169,30 +5001,12 @@ "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", "dev": true }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -5203,9 +5017,9 @@ } }, "less": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", - "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "requires": { "copy-anything": "^2.0.1", @@ -5214,9 +5028,10 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "native-request": "^1.0.5", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", "source-map": "~0.6.0", - "tslib": "^1.10.0" + "tslib": "^2.3.0" }, "dependencies": { "source-map": { @@ -5227,27 +5042,9 @@ "optional": true }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "less-plugin-npm-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", - "integrity": "sha512-f7pVkEooRq2/jge/M/Y+spoPXj5rRIY30q1as+3kZsDG8Rs+loNJUCVQjzXB9Ao/9FeIJULiq2zrXymv+OMTbw==", - "dev": true, - "requires": { - "promise": "~7.0.1", - "resolve": "~1.1.6" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true } } @@ -5261,12 +5058,6 @@ "immediate": "~3.0.5" } }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "live-server": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.1.0.tgz", @@ -5335,20 +5126,11 @@ "streamroller": "^1.0.6" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true }, "lunr": { "version": "2.1.6", @@ -5363,12 +5145,12 @@ "dev": true }, "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "sourcemap-codec": "^1.4.8" } }, "make-dir": { @@ -5396,38 +5178,113 @@ } }, "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "dependencies": { - "lru-cache": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "minimatch": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { - "yallist": "^3.0.2" + "brace-expansion": "^2.0.1" } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } } } }, @@ -5616,12 +5473,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5638,48 +5489,80 @@ "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "yallist": "^4.0.0" } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0" } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, "mixin-deep": { @@ -5704,13 +5587,10 @@ } }, "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "moment": { "version": "2.29.4", @@ -5747,31 +5627,6 @@ } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "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" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5796,6 +5651,12 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5815,12 +5676,39 @@ "to-regex": "^3.0.1" } }, - "native-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", - "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } }, "negotiator": { "version": "0.6.3", @@ -5835,106 +5723,143 @@ "dev": true }, "ng-packagr": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.7.1.tgz", - "integrity": "sha512-NDAUcMtLyZnF3bP6JtC3ANpIQRclRDPilF7C0DsjQuIz1q0V3mT7f1PwV0jnRWy8iRpSZmJZr6AGl736gloHtQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "autoprefixer": "^9.6.0", - "browserslist": "^4.0.0", - "chalk": "^2.3.1", - "chokidar": "^3.0.0", - "clean-css": "^4.1.11", - "commander": "^3.0.0", - "fs-extra": "^8.0.0", - "glob": "^7.1.2", - "injection-js": "^2.2.1", - "less": "^3.8.0", - "less-plugin-npm-import": "^2.1.0", - "node-sass-tilde-importer": "^1.0.0", - "postcss": "^7.0.0", - "postcss-url": "^8.0.0", - "read-pkg-up": "^5.0.0", - "rimraf": "^3.0.0", - "rollup": "1.25.2", - "rollup-plugin-commonjs": "^10.0.0", - "rollup-plugin-json": "^4.0.0", - "rollup-plugin-node-resolve": "^5.0.0", - "rollup-plugin-sourcemaps": "^0.4.2", - "rxjs": "^6.0.0", - "sass": "^1.17.3", - "stylus": "^0.54.5", - "terser": "^4.1.2", - "update-notifier": "^3.0.0" + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-15.0.1.tgz", + "integrity": "sha512-O0e0mf88XVyWAt69YJivjzC5jJVurwLHHpNxdZNZDvqt05N7SfCJI1HAbRbGBvpWmSYTgAnmdjF3XEpPgAd0EA==", + "dev": true, + "requires": { + "@rollup/plugin-json": "^5.0.0", + "@rollup/plugin-node-resolve": "^15.0.0", + "ajv": "^8.11.0", + "ansi-colors": "^4.1.3", + "autoprefixer": "^10.4.12", + "browserslist": "^4.21.4", + "cacache": "^17.0.0", + "chokidar": "^3.5.3", + "commander": "^9.4.0", + "dependency-graph": "^0.11.0", + "esbuild": "^0.15.9", + "esbuild-wasm": "^0.15.9", + "find-cache-dir": "^3.3.2", + "glob": "^8.0.3", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.2.0", + "less": "^4.1.3", + "ora": "^5.1.0", + "postcss": "^8.4.16", + "postcss-url": "^10.1.3", + "rollup": "^3.0.0", + "rollup-plugin-sourcemaps": "^0.6.3", + "rxjs": "^7.5.6", + "sass": "^1.55.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==", + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "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" - } + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "color-name": "1.1.3" + "balanced-match": "^1.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true + }, + "esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "optional": true, + "requires": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "minimatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "brace-expansion": "^2.0.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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==", + "rxjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", + "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "tslib": "^2.1.0" } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true } } }, @@ -5944,15 +5869,33 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "node-gyp": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", + "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", "dev": true, "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "node-releases": { @@ -5961,38 +5904,35 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "node-sass-tilde-importer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", - "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "requires": { - "find-parent-dir": "^0.3.0" + "abbrev": "^1.0.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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "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" + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "dependencies": { "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } } } }, @@ -6008,124 +5948,208 @@ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "dev": true, "requires": { - "npm-normalize-package-bin": "^1.0.1" + "npm-normalize-package-bin": "^3.0.0" } }, "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.0.0.tgz", + "integrity": "sha512-SBU9oFglRVZnfElwAtF14NivyulDqF1VKqqwNsFW9HDcbHMAPHpRSsVFgKuwFGq/hVvWZExz62Th0kvxn/XE7Q==", "dev": true, "requires": { "semver": "^7.1.1" } }, "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", + "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", "dev": true }, "npm-package-arg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", - "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { - "hosted-git-info": "^3.0.2", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" } }, "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.3.tgz", + "integrity": "sha512-a/TxELNw489Y7ZzXe7lRoXhKErNNgguYgBdW8nPXLcPMnMOCANiEjCwC1XDH6/5K6hkjuTrEkwtoT9C/zX3jRg==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" + "ignore-walk": "^6.0.0" } }, "npm-pick-manifest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", - "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.0.0", - "semver": "^7.0.0" - } - }, - "npm-registry-fetch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", - "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" }, "dependencies": { "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "requires": { - "yallist": "^3.0.2" + "lru-cache": "^7.5.1" } }, "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } + }, + "npm-registry-fetch": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.2.tgz", + "integrity": "sha512-TMenrMagFA9KF81E2bkS5XRyzERK4KXu70vgXt5+i8FcrFeLNgNsc6e5hekTqjDwPDkL3HGn/holWcXDMfnFgw==", + "dev": true, + "requires": { + "make-fetch-happen": "^11.0.0", + "minipass": "^3.1.6", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "requires": { + "lru-cache": "^7.5.1" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "make-fetch-happen": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.1.tgz", + "integrity": "sha512-clv3IblugXn2CDUmqFhNzii3rjKa46u5wNeivc+QlLXkGI5FjLX3rGboo+y2kwf1pd8W0iDiC384cemeDtw9kw==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.0.tgz", + "integrity": "sha512-NSx3k5gR4Q5Ts2poCM/19d45VwhVLBtJZ6ypYcthj2BwmDx/e7lW8Aadnyt3edd2W0ecb+b0o7FYLRYE2AGcQg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "requires": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + } + }, + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true + }, + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "requires": { + "builtins": "^5.0.0" + } + } + } }, "npm-run-path": { "version": "2.0.2", @@ -6136,6 +6160,18 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -6151,12 +6187,6 @@ "integrity": "sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==", "dev": true }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6218,12 +6248,6 @@ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6233,30 +6257,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -6300,13 +6300,14 @@ } }, "open": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", - "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "opn": { @@ -6351,27 +6352,22 @@ } }, "ora": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", - "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "requires": { + "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", + "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true - }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -6435,22 +6431,6 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -6487,128 +6467,81 @@ "p-limit": "^2.0.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.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 }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "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 - } - } - }, "pacote": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", - "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.0.6.tgz", + "integrity": "sha512-dQwcz/sME7QIL+cdrw/jftQfMMXxSo17i2kJ/gnhBhUvvBAsxoBu1lw9B5IzCH/Ce8CvEkG/QYZ6txzKfn0bTw==", + "dev": true, + "requires": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^2.1.0", + "minipass": "^3.1.6", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" }, "dependencies": { "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "requires": { - "yallist": "^3.0.2" + "lru-cache": "^7.5.1" } }, "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" } }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } + "proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "builtins": "^5.0.0" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -6618,29 +6551,6 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", @@ -6748,9 +6658,9 @@ "dev": true }, "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -6780,6 +6690,51 @@ "pinkie": "^2.0.0" } }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -6787,40 +6742,56 @@ "dev": true }, "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", "dev": true, "requires": { - "picocolors": "^0.2.1", - "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 - } + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "postcss-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", - "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", + "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, "requires": { - "mime": "^2.3.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.0", - "postcss": "^7.0.2", - "xxhashjs": "^0.2.1" + "make-dir": "~3.1.0", + "mime": "~2.5.2", + "minimatch": "~3.0.4", + "xxhashjs": "~0.2.2" }, "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -6831,10 +6802,10 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "proc-log": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true }, "process-nextick-args": { @@ -6843,15 +6814,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "promise": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", - "integrity": "sha512-8z1gTSL9cMgqCx8zvMYhzT0eQURAQNSQqR8B2hGfCYkAzt1vjReVdKBv4YwGw3OXAPaxfm4aR0gLoBUon4VmmA==", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -6859,22 +6821,13 @@ "dev": true }, "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw==", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "requires": { - "genfun": "^5.0.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" } }, "protractor": { @@ -7155,29 +7108,6 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -7231,69 +7161,59 @@ } } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "read-package-json": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "dev": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-tree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", - "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.0.tgz", + "integrity": "sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "glob": "^8.0.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } } } }, - "read-pkg-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", - "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "read-package-json-fast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.1.tgz", + "integrity": "sha512-8+HW7Yo+cjfF+md8DqsZHgats2mxf7gGYow/+2JjxrftoHFZz9v4dzd0EubzYbkNaLxrTVcnllHwklXN2+7aTQ==", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^5.0.0" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" } }, "readable-stream": { @@ -7319,22 +7239,10 @@ } } }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -7356,35 +7264,6 @@ "safe-regex": "^1.1.0" } }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -7445,6 +7324,12 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -7474,15 +7359,6 @@ "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -7500,9 +7376,9 @@ "dev": true }, "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true }, "rfdc": { @@ -7521,68 +7397,57 @@ } }, "rollup": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.25.2.tgz", - "integrity": "sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - } - }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", - "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", - "dev": true, - "requires": { - "rollup-pluginutils": "^2.5.0" - } - }, - "rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.6.0.tgz", + "integrity": "sha512-qCgiBeSu2/AIOKWGFMiRkjPlGlcVwxAjwpGKQZOQYng+83Hip4PjrWHm7EQX1wnrvRqfTytEihRRfLHdX+hR4g==", "dev": true, "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" + "fsevents": "~2.3.2" } }, "rollup-plugin-sourcemaps": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", - "integrity": "sha512-pHUvzofmQx/C3zCkX14h9J9MbRfMjaARED8j8qOY+au4prtk2d567GD29WAHQTeGsDAVeStms3cPnRboC41YzA==", - "dev": true, - "requires": { - "rollup-pluginutils": "^2.0.1", - "source-map-resolve": "^0.5.0" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", + "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", "dev": true, "requires": { - "estree-walker": "^0.6.1" + "@rollup/pluginutils": "^3.0.9", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + } } }, "run-async": { @@ -7591,30 +7456,13 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "safe-buffer": { @@ -7632,17 +7480,6 @@ "ret": "~0.1.10" } }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, "safefs": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.2.0.tgz", @@ -7771,25 +7608,22 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { - "semver": "^5.0.3" + "lru-cache": "^6.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } } } }, @@ -7810,23 +7644,6 @@ } } }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -8274,40 +8091,56 @@ } }, "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "dependencies": { "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "ms": "2.1.2" } + }, + "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 } } }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true }, "source-map-js": { @@ -8329,24 +8162,6 @@ "urix": "^0.1.0" } }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", @@ -8433,12 +8248,12 @@ } }, "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.0.tgz", + "integrity": "sha512-64ghGOpqW0k+jh7m5jndBGdVEoPikWwGQmBNN5ks6jyUSMymzHDTlnNHOvzp+6MmHOljr2MokUzvRksnTwG0Iw==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "minipass": "^3.1.1" } }, "static-extend": { @@ -8478,22 +8293,6 @@ "through": "~2.3.4" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "streamroller": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", @@ -8540,28 +8339,6 @@ "strip-ansi": "^6.0.1" } }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8600,57 +8377,6 @@ "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "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": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", - "dev": true, - "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.3.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "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": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8667,32 +8393,23 @@ "dev": true }, "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" } }, "taskgroup": { @@ -8721,56 +8438,12 @@ } } }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", - "dev": true, - "requires": { - "execa": "^0.7.0" - } - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", @@ -8818,12 +8491,6 @@ } } }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -8889,119 +8556,11 @@ } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.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" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "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" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -9042,16 +8601,10 @@ "editions": "^2.2.0" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, "typescript": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.8.tgz", - "integrity": "sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "uglify-js": { @@ -9076,18 +8629,6 @@ "editions": "^2.2.0" } }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -9101,51 +8642,23 @@ } }, "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "^3.0.0" } }, "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -9218,86 +8731,6 @@ "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" - }, - "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - } - } - }, - "update-notifier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", - "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", - "dev": true, - "requires": { - "boxen": "^3.0.0", - "chalk": "^2.0.1", - "configstore": "^4.0.0", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.1.0", - "is-npm": "^3.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^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.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" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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" - } - } } }, "uri-js": { @@ -9315,15 +8748,6 @@ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "dev": true }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -9364,27 +8788,12 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, "utils-merge": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==", "dev": true }, - "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", - "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", @@ -9396,12 +8805,12 @@ } }, "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "requires": { - "builtins": "^1.0.3" + "builtins": "^5.0.0" } }, "vary": { @@ -9496,65 +8905,19 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", "dev": true }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "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" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "win-release": { @@ -9597,17 +8960,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", @@ -9627,12 +8979,6 @@ } } }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", - "dev": true - }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -9655,12 +9001,6 @@ "integrity": "sha512-/bFPLUgJrfGUL10AIv4Y7/CUt6so9CLtB/oFxQSHseSDNNCdC6vwwKEqwLN6wNPBg9YWXAiMu8jkf6RPRS/75Q==", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", @@ -9683,18 +9023,18 @@ "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "dependencies": { "y18n": { @@ -9706,9 +9046,9 @@ } }, "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yeast": { @@ -9718,10 +9058,21 @@ "dev": true }, "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", + "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", + "dev": true, + "requires": { + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } } } } diff --git a/package.json b/package.json index 0b983a0..feeef26 100644 --- a/package.json +++ b/package.json @@ -28,18 +28,11 @@ "moment": "^2.29.4" }, "devDependencies": { - "@angular/animations": "^10.2.3", - "@angular/cli": "^10.2.0", - "@angular/common": "^10.2.3", - "@angular/compiler": "^10.2.3", - "@angular/compiler-cli": "^10.2.3", - "@angular/core": "^10.2.3", - "@angular/forms": "^10.2.3", - "@angular/http": "^5.2.0", - "@angular/language-service": "^10.2.3", - "@angular/platform-browser": "^10.2.3", - "@angular/platform-browser-dynamic": "^10.2.3", - "@angular/router": "^10.2.3", + "@angular/cli": "^15.0.1", + "@angular/common": "^15.0.1", + "@angular/compiler": "^15.0.1", + "@angular/compiler-cli": "^15.0.1", + "@angular/core": "^15.0.1", "@compodoc/compodoc": "~1.0.8", "@types/jasmine": "~3.3.13", "@types/jasminewd2": "~2.0.6", @@ -54,11 +47,10 @@ "karma-coverage-istanbul-reporter": "^2.0.5", "karma-jasmine": "~2.0.1", "karma-jasmine-html-reporter": "^1.4.2", - "ng-packagr": "^5.3.0", + "ng-packagr": "^15.0.1", "protractor": "~5.4.2", - "rxjs": "^6.5.2", - "tslint": "~6.1.0", - "typescript": "~4.0.5", - "zone.js": "^0.10.3" + "rxjs": "~6.5.2", + "typescript": "~4.8.4", + "zone.js": "~0.11.4" } } diff --git a/tsconfig.json b/tsconfig.json index 6f300c5..f731f01 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, "target": "es2015", "typeRoots": [ "node_modules/@types" From ddeee36b36de37e53d414f0143fd65f4c0f6710e Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 7 Dec 2022 10:28:13 -0800 Subject: [PATCH 68/69] Fixed how moment was being imported. --- package-lock.json | 6 ++--- package.json | 4 ++-- src/webglimpse/timeline/time_axis_painter.ts | 23 ++++++++++---------- src/webglimpse/util/util.ts | 3 +-- tsconfig.json | 15 ++++++++----- 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 030c338..d78054c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1084,9 +1084,9 @@ } }, "@types/node": { - "version": "6.0.118", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz", - "integrity": "sha512-N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==", + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true }, "@types/q": { diff --git a/package.json b/package.json index feeef26..01018ee 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", - "build": "ng-packagr -p ng-package.json", + "build": "ng-packagr -p ng-package.json --config tsconfig.json", "docs": "node_modules/.bin/compodoc -p tsconfig.json -d docs --theme readthedocs", "serve-docs": "node_modules/.bin/compodoc -s -d docs" }, @@ -36,7 +36,7 @@ "@compodoc/compodoc": "~1.0.8", "@types/jasmine": "~3.3.13", "@types/jasminewd2": "~2.0.6", - "@types/node": "~6.0.60", + "@types/node": "^12.11.1", "codelyzer": "^5.1.0", "core-js": "^3.1.4", "jasmine-core": "~3.4.0", diff --git a/src/webglimpse/timeline/time_axis_painter.ts b/src/webglimpse/timeline/time_axis_painter.ts index 915ecdf..e94f936 100644 --- a/src/webglimpse/timeline/time_axis_painter.ts +++ b/src/webglimpse/timeline/time_axis_painter.ts @@ -41,8 +41,7 @@ import { BoundsUnmodifiable } from '../bounds'; import { ensureCapacityFloat32, GL, hasval, parseTime_PMILLIS, clamp } from '../util/util'; import { minutesToMillis, millisToDays, hoursToMillis, daysToMillis, millisToHours, secondsToMillis } from '../time'; import { Axis1D, getTickInterval, getTickCount, getTickPositions } from '../plot/axis'; -import * as momentNs from 'moment'; -const moment = momentNs; +import moment, { Moment } from 'moment'; // XXX: Much of this is duplicated from edge_axis_painter @@ -427,16 +426,16 @@ class TimeStruct { public viewEnd_PMILLIS: number; public textCenter_PMILLIS: number; - setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + setTime(time_PMILLIS: number, timeZone: string): Moment { return moment(time_PMILLIS).zone(timeZone); } - incrementTime(m: momentNs.Moment) { + incrementTime(m: Moment) { } } class YearStruct extends TimeStruct { - setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + setTime(time_PMILLIS: number, timeZone: string): Moment { const m = moment(time_PMILLIS).zone(timeZone); m.month(0); m.date(0); @@ -446,14 +445,14 @@ class YearStruct extends TimeStruct { return m; } - incrementTime(m: momentNs.Moment) { + incrementTime(m: Moment) { m.add('years', 1); } } class MonthStruct extends TimeStruct { - setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + setTime(time_PMILLIS: number, timeZone: string): Moment { const m = moment(time_PMILLIS).zone(timeZone); m.date(0); m.hours(0); @@ -462,14 +461,14 @@ class MonthStruct extends TimeStruct { return m; } - incrementTime(m: momentNs.Moment) { + incrementTime(m: Moment) { m.add('months', 1); } } class DayStruct extends TimeStruct { - setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + setTime(time_PMILLIS: number, timeZone: string): Moment { const m = moment(time_PMILLIS).zone(timeZone); m.hours(0); m.minutes(0); @@ -477,21 +476,21 @@ class DayStruct extends TimeStruct { return m; } - incrementTime(m: momentNs.Moment) { + incrementTime(m: Moment) { m.add('days', 1); } } class HourStruct extends TimeStruct { - setTime(time_PMILLIS: number, timeZone: string): momentNs.Moment { + setTime(time_PMILLIS: number, timeZone: string): Moment { const m = moment(time_PMILLIS).zone(timeZone); m.minutes(0); m.seconds(0); return m; } - incrementTime(m: momentNs.Moment) { + incrementTime(m: Moment) { m.add('hours', 1); } } diff --git a/src/webglimpse/util/util.ts b/src/webglimpse/util/util.ts index 8093ac0..7ea043e 100644 --- a/src/webglimpse/util/util.ts +++ b/src/webglimpse/util/util.ts @@ -173,8 +173,7 @@ export function concatLines(...lines: string[]) { * places. * */ -import * as momentNs from 'moment'; -const moment = momentNs; +import moment from 'moment'; export function parseTime_PMILLIS(time_ISO8601: string): number { diff --git a/tsconfig.json b/tsconfig.json index f731f01..29eac12 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,25 @@ { "compileOnSave": false, "compilerOptions": { + "importHelpers": true, "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, "moduleResolution": "node", - "emitDecoratorMetadata": true, "experimentalDecorators": true, + "emitDecoratorMetadata": true, "allowSyntheticDefaultImports": true, - "target": "es2015", + "esModuleInterop": true, + "target": "ES2022", "typeRoots": [ "node_modules/@types" ], "lib": [ - "es2017", + "es2020", "dom" - ] + ], + "module": "es2020", + "baseUrl": "./", + "useDefineForClassFields": false } -} +} \ No newline at end of file From e937945971a96bdf7a1911430f112337ed8247ef Mon Sep 17 00:00:00 2001 From: Scott Przybylski Date: Wed, 7 Dec 2022 10:34:08 -0800 Subject: [PATCH 69/69] Add ng-packagr config to build in partial mode. --- package.json | 2 +- tsconfig.ng-packagr.json | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tsconfig.ng-packagr.json diff --git a/package.json b/package.json index 01018ee..4bdb62d 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", - "build": "ng-packagr -p ng-package.json --config tsconfig.json", + "build": "ng-packagr -p ng-package.json --config tsconfig.ng-packagr.json", "docs": "node_modules/.bin/compodoc -p tsconfig.json -d docs --theme readthedocs", "serve-docs": "node_modules/.bin/compodoc -s -d docs" }, diff --git a/tsconfig.ng-packagr.json b/tsconfig.ng-packagr.json new file mode 100644 index 0000000..4c49010 --- /dev/null +++ b/tsconfig.ng-packagr.json @@ -0,0 +1,30 @@ +{ + "compileOnSave": false, + "angularCompilerOptions": { + "compilationMode": "partial", + "strictTemplates": true, + "enableResourceInlining": true + }, + "compilerOptions": { + "importHelpers": true, + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "target": "ES2022", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2020", + "dom" + ], + "module": "es2020", + "baseUrl": "./", + "useDefineForClassFields": false + } +} \ No newline at end of file

    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/aLr{ZZ7+IpcvRSn(=sm$YLke!CX9c% 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�jghq6Wr*r2toLbn}BUIdxY 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/aLr{ZZ7+IpcvRSn(=sm$YLke!CX9c% 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�jghq6Wr*r2toLbn}BUIdxY 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