| | |
| | | Changelog |
| | | ========= |
| | | ## 2.7.0 |
| | | * `isValidDate` now supports months and years. |
| | | * `utc` prop was added, by setting it to `true` input time values will be interpreted as UTC (Zulu time). |
| | | * Bug fix: The input value now updates when `dateFormat` changes. |
| | | * Removed the source-map file because the commit it was introduced in was causing the minified file to be bigger than the non-minified. |
| | | |
| | | ## 2.6.2 |
| | | * Update file references in `package.json` |
| | | |
| | |
| | | /* |
| | | react-datetime v2.6.2 |
| | | react-datetime v2.7.0 |
| | | https://github.com/arqex/react-datetime |
| | | MIT: https://github.com/arqex/react-datetime/raw/master/LICENSE |
| | | */ |
| | |
| | | /* 0 */ |
| | | /***/ function(module, exports, __webpack_require__) { |
| | | |
| | | 'use strict'; |
| | | |
| | | var assign = __webpack_require__(1), |
| | | React = __webpack_require__(2), |
| | | DaysView = __webpack_require__(3), |
| | | MonthsView = __webpack_require__(5), |
| | | YearsView = __webpack_require__(6), |
| | | TimeView = __webpack_require__(7), |
| | | moment = __webpack_require__(4) |
| | | ; |
| | | |
| | | var TYPES = React.PropTypes; |
| | | var Datetime = React.createClass({ |
| | | mixins: [ |
| | | __webpack_require__(8) |
| | | ], |
| | | viewComponents: { |
| | | days: DaysView, |
| | | months: MonthsView, |
| | | years: YearsView, |
| | | time: TimeView |
| | | }, |
| | | propTypes: { |
| | | // value: TYPES.object | TYPES.string, |
| | | // defaultValue: TYPES.object | TYPES.string, |
| | | onFocus: TYPES.func, |
| | | onBlur: TYPES.func, |
| | | onChange: TYPES.func, |
| | | locale: TYPES.string, |
| | | input: TYPES.bool, |
| | | // dateFormat: TYPES.string | TYPES.bool, |
| | | // timeFormat: TYPES.string | TYPES.bool, |
| | | inputProps: TYPES.object, |
| | | timeConstraints: TYPES.object, |
| | | viewMode: TYPES.oneOf(['years', 'months', 'days', 'time']), |
| | | isValidDate: TYPES.func, |
| | | open: TYPES.bool, |
| | | strictParsing: TYPES.bool, |
| | | closeOnSelect: TYPES.bool, |
| | | closeOnTab: TYPES.bool |
| | | }, |
| | | |
| | | getDefaultProps: function() { |
| | | var nof = function(){}; |
| | | return { |
| | | className: '', |
| | | defaultValue: '', |
| | | inputProps: {}, |
| | | input: true, |
| | | onFocus: nof, |
| | | onBlur: nof, |
| | | onChange: nof, |
| | | timeFormat: true, |
| | | timeConstraints: {}, |
| | | dateFormat: true, |
| | | strictParsing: true, |
| | | closeOnSelect: false, |
| | | closeOnTab: true |
| | | }; |
| | | }, |
| | | |
| | | getInitialState: function() { |
| | | var state = this.getStateFromProps( this.props ); |
| | | |
| | | if ( state.open === undefined ) |
| | | state.open = !this.props.input; |
| | | |
| | | state.currentView = this.props.dateFormat ? (this.props.viewMode || state.updateOn || 'days') : 'time'; |
| | | |
| | | return state; |
| | | }, |
| | | |
| | | getStateFromProps: function( props ){ |
| | | var formats = this.getFormats( props ), |
| | | date = props.value || props.defaultValue, |
| | | selectedDate, viewDate, updateOn, inputValue |
| | | ; |
| | | |
| | | if ( date && typeof date === 'string' ) |
| | | selectedDate = this.localMoment( date, formats.datetime ); |
| | | else if ( date ) |
| | | selectedDate = this.localMoment( date ); |
| | | |
| | | if ( selectedDate && !selectedDate.isValid() ) |
| | | selectedDate = null; |
| | | |
| | | viewDate = selectedDate ? |
| | | selectedDate.clone().startOf('month') : |
| | | this.localMoment().startOf('month') |
| | | ; |
| | | |
| | | updateOn = this.getUpdateOn(formats); |
| | | |
| | | if ( selectedDate ) |
| | | inputValue = selectedDate.format(formats.datetime); |
| | | else if ( date.isValid && !date.isValid() ) |
| | | inputValue = ''; |
| | | else |
| | | inputValue = date || ''; |
| | | |
| | | return { |
| | | updateOn: updateOn, |
| | | inputFormat: formats.datetime, |
| | | viewDate: viewDate, |
| | | selectedDate: selectedDate, |
| | | inputValue: inputValue, |
| | | open: props.open |
| | | }; |
| | | }, |
| | | |
| | | getUpdateOn: function(formats){ |
| | | if ( formats.date.match(/[lLD]/) ){ |
| | | return 'days'; |
| | | } |
| | | else if ( formats.date.indexOf('M') !== -1 ){ |
| | | return 'months'; |
| | | } |
| | | else if ( formats.date.indexOf('Y') !== -1 ){ |
| | | return 'years'; |
| | | } |
| | | |
| | | return 'days'; |
| | | }, |
| | | |
| | | getFormats: function( props ){ |
| | | var formats = { |
| | | date: props.dateFormat || '', |
| | | time: props.timeFormat || '' |
| | | }, |
| | | locale = this.localMoment( props.date ).localeData() |
| | | ; |
| | | |
| | | if ( formats.date === true ){ |
| | | formats.date = locale.longDateFormat('L'); |
| | | } |
| | | else if ( this.getUpdateOn(formats) !== 'days' ){ |
| | | formats.time = ''; |
| | | } |
| | | |
| | | if ( formats.time === true ){ |
| | | formats.time = locale.longDateFormat('LT'); |
| | | } |
| | | |
| | | formats.datetime = formats.date && formats.time ? |
| | | formats.date + ' ' + formats.time : |
| | | formats.date || formats.time |
| | | ; |
| | | |
| | | return formats; |
| | | }, |
| | | |
| | | componentWillReceiveProps: function(nextProps) { |
| | | var formats = this.getFormats( nextProps ), |
| | | update = {} |
| | | ; |
| | | |
| | | if ( nextProps.value !== this.props.value ){ |
| | | update = this.getStateFromProps( nextProps ); |
| | | } |
| | | if ( formats.datetime !== this.getFormats( this.props ).datetime ) { |
| | | update.inputFormat = formats.datetime; |
| | | } |
| | | |
| | | if ( update.open === undefined ){ |
| | | if ( this.props.closeOnSelect && this.state.currentView !== 'time' ){ |
| | | update.open = false; |
| | | } |
| | | else { |
| | | update.open = this.state.open; |
| | | } |
| | | } |
| | | |
| | | this.setState( update ); |
| | | }, |
| | | |
| | | onInputChange: function( e ) { |
| | | var value = e.target === null ? e : e.target.value, |
| | | localMoment = this.localMoment( value, this.state.inputFormat ), |
| | | update = { inputValue: value } |
| | | ; |
| | | |
| | | if ( localMoment.isValid() && !this.props.value ) { |
| | | update.selectedDate = localMoment; |
| | | update.viewDate = localMoment.clone().startOf('month'); |
| | | } |
| | | else { |
| | | update.selectedDate = null; |
| | | } |
| | | |
| | | return this.setState( update, function() { |
| | | return this.props.onChange( localMoment.isValid() ? localMoment : this.state.inputValue ); |
| | | }); |
| | | }, |
| | | |
| | | onInputKey: function( e ){ |
| | | if ( e.which === 9 && this.props.closeOnTab ){ |
| | | this.closeCalendar(); |
| | | } |
| | | }, |
| | | |
| | | showView: function( view ){ |
| | | var me = this; |
| | | return function(){ |
| | | me.setState({ currentView: view }); |
| | | }; |
| | | }, |
| | | |
| | | setDate: function( type ){ |
| | | var me = this, |
| | | nextViews = { |
| | | month: 'days', |
| | | year: 'months' |
| | | } |
| | | ; |
| | | return function( e ){ |
| | | me.setState({ |
| | | viewDate: me.state.viewDate.clone()[ type ]( parseInt(e.target.getAttribute('data-value'), 10) ).startOf( type ), |
| | | currentView: nextViews[ type ] |
| | | }); |
| | | }; |
| | | }, |
| | | |
| | | addTime: function( amount, type, toSelected ){ |
| | | return this.updateTime( 'add', amount, type, toSelected ); |
| | | }, |
| | | |
| | | subtractTime: function( amount, type, toSelected ){ |
| | | return this.updateTime( 'subtract', amount, type, toSelected ); |
| | | }, |
| | | |
| | | updateTime: function( op, amount, type, toSelected ){ |
| | | var me = this; |
| | | |
| | | return function(){ |
| | | var update = {}, |
| | | date = toSelected ? 'selectedDate' : 'viewDate' |
| | | ; |
| | | |
| | | update[ date ] = me.state[ date ].clone()[ op ]( amount, type ); |
| | | |
| | | me.setState( update ); |
| | | }; |
| | | }, |
| | | |
| | | allowedSetTime: ['hours', 'minutes', 'seconds', 'milliseconds'], |
| | | setTime: function( type, value ){ |
| | | var index = this.allowedSetTime.indexOf( type ) + 1, |
| | | state = this.state, |
| | | date = (state.selectedDate || state.viewDate).clone(), |
| | | nextType |
| | | ; |
| | | |
| | | // It is needed to set all the time properties |
| | | // to not to reset the time |
| | | date[ type ]( value ); |
| | | for (; index < this.allowedSetTime.length; index++) { |
| | | nextType = this.allowedSetTime[index]; |
| | | date[ nextType ]( date[nextType]() ); |
| | | } |
| | | |
| | | if ( !this.props.value ){ |
| | | this.setState({ |
| | | selectedDate: date, |
| | | inputValue: date.format( state.inputFormat ) |
| | | }); |
| | | } |
| | | this.props.onChange( date ); |
| | | }, |
| | | |
| | | updateSelectedDate: function( e, close ) { |
| | | var target = e.target, |
| | | modifier = 0, |
| | | viewDate = this.state.viewDate, |
| | | currentDate = this.state.selectedDate || viewDate, |
| | | date |
| | | ; |
| | | |
| | | if (target.className.indexOf('rdtDay') !== -1){ |
| | | if (target.className.indexOf('rdtNew') !== -1) |
| | | modifier = 1; |
| | | else if (target.className.indexOf('rdtOld') !== -1) |
| | | modifier = -1; |
| | | |
| | | date = viewDate.clone() |
| | | .month( viewDate.month() + modifier ) |
| | | .date( parseInt( target.getAttribute('data-value'), 10 ) ); |
| | | } else if (target.className.indexOf('rdtMonth') !== -1){ |
| | | date = viewDate.clone() |
| | | .month( parseInt( target.getAttribute('data-value'), 10 ) ) |
| | | .date( currentDate.date() ); |
| | | } else if (target.className.indexOf('rdtYear') !== -1){ |
| | | date = viewDate.clone() |
| | | .month( currentDate.month() ) |
| | | .date( currentDate.date() ) |
| | | .year( parseInt( target.getAttribute('data-value'), 10 ) ); |
| | | } |
| | | |
| | | date.hours( currentDate.hours() ) |
| | | .minutes( currentDate.minutes() ) |
| | | .seconds( currentDate.seconds() ) |
| | | .milliseconds( currentDate.milliseconds() ); |
| | | |
| | | if ( !this.props.value ){ |
| | | this.setState({ |
| | | selectedDate: date, |
| | | viewDate: date.clone().startOf('month'), |
| | | inputValue: date.format( this.state.inputFormat ), |
| | | open: !(this.props.closeOnSelect && close ) |
| | | }); |
| | | } else { |
| | | if (this.props.closeOnSelect && close) { |
| | | this.closeCalendar(); |
| | | } |
| | | } |
| | | |
| | | this.props.onChange( date ); |
| | | }, |
| | | |
| | | openCalendar: function() { |
| | | if (!this.state.open) { |
| | | this.props.onFocus(); |
| | | this.setState({ open: true }); |
| | | } |
| | | }, |
| | | |
| | | closeCalendar: function() { |
| | | this.setState({ open: false }); |
| | | this.props.onBlur( this.state.selectedDate || this.state.inputValue ); |
| | | }, |
| | | |
| | | handleClickOutside: function(){ |
| | | if ( this.props.input && this.state.open && !this.props.open ){ |
| | | this.setState({ open: false }); |
| | | this.props.onBlur( this.state.selectedDate || this.state.inputValue ); |
| | | } |
| | | }, |
| | | |
| | | localMoment: function( date, format ){ |
| | | var m = moment( date, format, this.props.strictParsing ); |
| | | if ( this.props.locale ) |
| | | m.locale( this.props.locale ); |
| | | return m; |
| | | }, |
| | | |
| | | componentProps: { |
| | | fromProps: ['value', 'isValidDate', 'renderDay', 'renderMonth', 'renderYear', 'timeConstraints'], |
| | | fromState: ['viewDate', 'selectedDate', 'updateOn'], |
| | | fromThis: ['setDate', 'setTime', 'showView', 'addTime', 'subtractTime', 'updateSelectedDate', 'localMoment'] |
| | | }, |
| | | |
| | | getComponentProps: function(){ |
| | | var me = this, |
| | | formats = this.getFormats( this.props ), |
| | | props = {dateFormat: formats.date, timeFormat: formats.time} |
| | | ; |
| | | |
| | | this.componentProps.fromProps.forEach( function( name ){ |
| | | props[ name ] = me.props[ name ]; |
| | | }); |
| | | this.componentProps.fromState.forEach( function( name ){ |
| | | props[ name ] = me.state[ name ]; |
| | | }); |
| | | this.componentProps.fromThis.forEach( function( name ){ |
| | | props[ name ] = me[ name ]; |
| | | }); |
| | | |
| | | return props; |
| | | }, |
| | | |
| | | render: function() { |
| | | var Component = this.viewComponents[ this.state.currentView ], |
| | | DOM = React.DOM, |
| | | className = 'rdt' + (this.props.className ? |
| | | ( Array.isArray( this.props.className ) ? |
| | | ' ' + this.props.className.join( ' ' ) : ' ' + this.props.className) : ''), |
| | | children = [] |
| | | ; |
| | | |
| | | if ( this.props.input ){ |
| | | children = [ DOM.input( assign({ |
| | | key: 'i', |
| | | type:'text', |
| | | className: 'form-control', |
| | | onFocus: this.openCalendar, |
| | | onChange: this.onInputChange, |
| | | onKeyDown: this.onInputKey, |
| | | value: this.state.inputValue |
| | | }, this.props.inputProps ))]; |
| | | } else { |
| | | className += ' rdtStatic'; |
| | | } |
| | | |
| | | if ( this.state.open ) |
| | | className += ' rdtOpen'; |
| | | |
| | | return DOM.div({className: className}, children.concat( |
| | | DOM.div( |
| | | { key: 'dt', className: 'rdtPicker' }, |
| | | React.createElement( Component, this.getComponentProps()) |
| | | ) |
| | | )); |
| | | } |
| | | }); |
| | | |
| | | // Make moment accessible through the Datetime class |
| | | Datetime.moment = moment; |
| | | |
| | | module.exports = Datetime; |
| | | |
| | | eval("'use strict';\n\nvar assign = __webpack_require__(1),\n\tReact = __webpack_require__(2),\n\tDaysView = __webpack_require__(3),\n\tMonthsView = __webpack_require__(5),\n\tYearsView = __webpack_require__(6),\n\tTimeView = __webpack_require__(7),\n\tmoment = __webpack_require__(4)\n;\n\nvar TYPES = React.PropTypes;\nvar Datetime = React.createClass({\n\tmixins: [\n\t\t__webpack_require__(8)\n\t],\n\tviewComponents: {\n\t\tdays: DaysView,\n\t\tmonths: MonthsView,\n\t\tyears: YearsView,\n\t\ttime: TimeView\n\t},\n\tpropTypes: {\n\t\t// value: TYPES.object | TYPES.string,\n\t\t// defaultValue: TYPES.object | TYPES.string,\n\t\tonFocus: TYPES.func,\n\t\tonBlur: TYPES.func,\n\t\tonChange: TYPES.func,\n\t\tlocale: TYPES.string,\n\t\tutc: TYPES.bool,\n\t\tinput: TYPES.bool,\n\t\t// dateFormat: TYPES.string | TYPES.bool,\n\t\t// timeFormat: TYPES.string | TYPES.bool,\n\t\tinputProps: TYPES.object,\n\t\ttimeConstraints: TYPES.object,\n\t\tviewMode: TYPES.oneOf(['years', 'months', 'days', 'time']),\n\t\tisValidDate: TYPES.func,\n\t\topen: TYPES.bool,\n\t\tstrictParsing: TYPES.bool,\n\t\tcloseOnSelect: TYPES.bool,\n\t\tcloseOnTab: TYPES.bool\n\t},\n\n\tgetDefaultProps: function() {\n\t\tvar nof = function(){};\n\t\treturn {\n\t\t\tclassName: '',\n\t\t\tdefaultValue: '',\n\t\t\tinputProps: {},\n\t\t\tinput: true,\n\t\t\tonFocus: nof,\n\t\t\tonBlur: nof,\n\t\t\tonChange: nof,\n\t\t\ttimeFormat: true,\n\t\t\ttimeConstraints: {},\n\t\t\tdateFormat: true,\n\t\t\tstrictParsing: true,\n\t\t\tcloseOnSelect: false,\n\t\t\tcloseOnTab: true,\n\t\t\tutc: false\n\t\t};\n\t},\n\n\tgetInitialState: function() {\n\t\tvar state = this.getStateFromProps( this.props );\n\n\t\tif ( state.open === undefined )\n\t\t\tstate.open = !this.props.input;\n\n\t\tstate.currentView = this.props.dateFormat ? (this.props.viewMode || state.updateOn || 'days') : 'time';\n\n\t\treturn state;\n\t},\n\n\tgetStateFromProps: function( props ){\n\t\tvar formats = this.getFormats( props ),\n\t\t\tdate = props.value || props.defaultValue,\n\t\t\tselectedDate, viewDate, updateOn, inputValue\n\t\t;\n\n\t\tif ( date && typeof date === 'string' )\n\t\t\tselectedDate = this.localMoment( date, formats.datetime );\n\t\telse if ( date )\n\t\t\tselectedDate = this.localMoment( date );\n\n\t\tif ( selectedDate && !selectedDate.isValid() )\n\t\t\tselectedDate = null;\n\n\t\tviewDate = selectedDate ?\n\t\t\tselectedDate.clone().startOf('month') :\n\t\t\tthis.localMoment().startOf('month')\n\t\t;\n\n\t\tupdateOn = this.getUpdateOn(formats);\n\n\t\tif ( selectedDate )\n\t\t\tinputValue = selectedDate.format(formats.datetime);\n\t\telse if ( date.isValid && !date.isValid() )\n\t\t\tinputValue = '';\n\t\telse\n\t\t\tinputValue = date || '';\n\n\t\treturn {\n\t\t\tupdateOn: updateOn,\n\t\t\tinputFormat: formats.datetime,\n\t\t\tviewDate: viewDate,\n\t\t\tselectedDate: selectedDate,\n\t\t\tinputValue: inputValue,\n\t\t\topen: props.open\n\t\t};\n\t},\n\n\tgetUpdateOn: function(formats){\n\t\tif ( formats.date.match(/[lLD]/) ){\n\t\t\treturn 'days';\n\t\t}\n\t\telse if ( formats.date.indexOf('M') !== -1 ){\n\t\t\treturn 'months';\n\t\t}\n\t\telse if ( formats.date.indexOf('Y') !== -1 ){\n\t\t\treturn 'years';\n\t\t}\n\n\t\treturn 'days';\n\t},\n\n\tgetFormats: function( props ){\n\t\tvar formats = {\n\t\t\t\tdate: props.dateFormat || '',\n\t\t\t\ttime: props.timeFormat || ''\n\t\t\t},\n\t\t\tlocale = this.localMoment( props.date ).localeData()\n\t\t;\n\n\t\tif ( formats.date === true ){\n\t\t\tformats.date = locale.longDateFormat('L');\n\t\t}\n\t\telse if ( this.getUpdateOn(formats) !== 'days' ){\n\t\t\tformats.time = '';\n\t\t}\n\n\t\tif ( formats.time === true ){\n\t\t\tformats.time = locale.longDateFormat('LT');\n\t\t}\n\n\t\tformats.datetime = formats.date && formats.time ?\n\t\t\tformats.date + ' ' + formats.time :\n\t\t\tformats.date || formats.time\n\t\t;\n\n\t\treturn formats;\n\t},\n\n\tcomponentWillReceiveProps: function(nextProps) {\n\t\tvar formats = this.getFormats( nextProps ),\n\t\t\tupdate = {}\n\t\t;\n\n\t\tif ( nextProps.value !== this.props.value ||\n formats.datetime !== this.getFormats( this.props ).datetime ){\n update = this.getStateFromProps( nextProps );\n\t\t}\n\n\t\tif ( update.open === undefined ){\n\t\t\tif ( this.props.closeOnSelect && this.state.currentView !== 'time' ){\n\t\t\t\tupdate.open = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tupdate.open = this.state.open;\n\t\t\t}\n\t\t}\n\n\t\tthis.setState( update );\n\t},\n\n\tonInputChange: function( e ) {\n\t\tvar value = e.target === null ? e : e.target.value,\n\t\t\tlocalMoment = this.localMoment( value, this.state.inputFormat ),\n\t\t\tupdate = { inputValue: value }\n\t\t;\n\n\t\tif ( localMoment.isValid() && !this.props.value ) {\n\t\t\tupdate.selectedDate = localMoment;\n\t\t\tupdate.viewDate = localMoment.clone().startOf('month');\n\t\t}\n\t\telse {\n\t\t\tupdate.selectedDate = null;\n\t\t}\n\n\t\treturn this.setState( update, function() {\n\t\t\treturn this.props.onChange( localMoment.isValid() ? localMoment : this.state.inputValue );\n\t\t});\n\t},\n\n\tonInputKey: function( e ){\n\t\tif ( e.which === 9 && this.props.closeOnTab ){\n\t\t\tthis.closeCalendar();\n\t\t}\n\t},\n\n\tshowView: function( view ){\n\t\tvar me = this;\n\t\treturn function(){\n\t\t\tme.setState({ currentView: view });\n\t\t};\n\t},\n\n\tsetDate: function( type ){\n\t\tvar me = this,\n\t\t\tnextViews = {\n\t\t\t\tmonth: 'days',\n\t\t\t\tyear: 'months'\n\t\t\t}\n\t\t;\n\t\treturn function( e ){\n\t\t\tme.setState({\n\t\t\t\tviewDate: me.state.viewDate.clone()[ type ]( parseInt(e.target.getAttribute('data-value'), 10) ).startOf( type ),\n\t\t\t\tcurrentView: nextViews[ type ]\n\t\t\t});\n\t\t};\n\t},\n\n\taddTime: function( amount, type, toSelected ){\n\t\treturn this.updateTime( 'add', amount, type, toSelected );\n\t},\n\n\tsubtractTime: function( amount, type, toSelected ){\n\t\treturn this.updateTime( 'subtract', amount, type, toSelected );\n\t},\n\n\tupdateTime: function( op, amount, type, toSelected ){\n\t\tvar me = this;\n\n\t\treturn function(){\n\t\t\tvar update = {},\n\t\t\t\tdate = toSelected ? 'selectedDate' : 'viewDate'\n\t\t\t;\n\n\t\t\tupdate[ date ] = me.state[ date ].clone()[ op ]( amount, type );\n\n\t\t\tme.setState( update );\n\t\t};\n\t},\n\n\tallowedSetTime: ['hours', 'minutes', 'seconds', 'milliseconds'],\n\tsetTime: function( type, value ){\n\t\tvar index = this.allowedSetTime.indexOf( type ) + 1,\n\t\t\tstate = this.state,\n\t\t\tdate = (state.selectedDate || state.viewDate).clone(),\n\t\t\tnextType\n\t\t;\n\n\t\t// It is needed to set all the time properties\n\t\t// to not to reset the time\n\t\tdate[ type ]( value );\n\t\tfor (; index < this.allowedSetTime.length; index++) {\n\t\t\tnextType = this.allowedSetTime[index];\n\t\t\tdate[ nextType ]( date[nextType]() );\n\t\t}\n\n\t\tif ( !this.props.value ){\n\t\t\tthis.setState({\n\t\t\t\tselectedDate: date,\n\t\t\t\tinputValue: date.format( state.inputFormat )\n\t\t\t});\n\t\t}\n\t\tthis.props.onChange( date );\n\t},\n\n\tupdateSelectedDate: function( e, close ) {\n\t\tvar target = e.target,\n\t\t\tmodifier = 0,\n\t\t\tviewDate = this.state.viewDate,\n\t\t\tcurrentDate = this.state.selectedDate || viewDate,\n\t\t\tdate\n ;\n\n\t\tif (target.className.indexOf('rdtDay') !== -1){\n\t\t\tif (target.className.indexOf('rdtNew') !== -1)\n\t\t\t\tmodifier = 1;\n\t\t\telse if (target.className.indexOf('rdtOld') !== -1)\n\t\t\t\tmodifier = -1;\n\n\t\t\tdate = viewDate.clone()\n\t\t\t\t.month( viewDate.month() + modifier )\n\t\t\t\t.date( parseInt( target.getAttribute('data-value'), 10 ) );\n\t\t} else if (target.className.indexOf('rdtMonth') !== -1){\n\t\t\tdate = viewDate.clone()\n\t\t\t\t.month( parseInt( target.getAttribute('data-value'), 10 ) )\n\t\t\t\t.date( currentDate.date() );\n\t\t} else if (target.className.indexOf('rdtYear') !== -1){\n\t\t\tdate = viewDate.clone()\n\t\t\t\t.month( currentDate.month() )\n\t\t\t\t.date( currentDate.date() )\n\t\t\t\t.year( parseInt( target.getAttribute('data-value'), 10 ) );\n\t\t}\n\n\t\tdate.hours( currentDate.hours() )\n\t\t\t.minutes( currentDate.minutes() )\n\t\t\t.seconds( currentDate.seconds() )\n\t\t\t.milliseconds( currentDate.milliseconds() );\n\n\t\tif ( !this.props.value ){\n\t\t\tthis.setState({\n\t\t\t\tselectedDate: date,\n\t\t\t\tviewDate: date.clone().startOf('month'),\n\t\t\t\tinputValue: date.format( this.state.inputFormat ),\n\t\t\t\topen: !(this.props.closeOnSelect && close )\n\t\t\t});\n\t\t} else {\n\t\t\tif (this.props.closeOnSelect && close) {\n\t\t\t\tthis.closeCalendar();\n\t\t\t}\n\t\t}\n\n\t\tthis.props.onChange( date );\n\t},\n\n\topenCalendar: function() {\n\t\tif (!this.state.open) {\n\t\t\tthis.props.onFocus();\n\t\t\tthis.setState({ open: true });\n\t\t}\n\t},\n\n\tcloseCalendar: function() {\n\t\tthis.setState({ open: false });\n\t\tthis.props.onBlur( this.state.selectedDate || this.state.inputValue );\n\t},\n\n\thandleClickOutside: function(){\n\t\tif ( this.props.input && this.state.open && !this.props.open ){\n\t\t\tthis.setState({ open: false });\n\t\t\tthis.props.onBlur( this.state.selectedDate || this.state.inputValue );\n\t\t}\n\t},\n\n\tlocalMoment: function( date, format ){\n\t\tvar momentFn = this.props.utc ? moment.utc : moment;\n\t\tvar m = momentFn( date, format, this.props.strictParsing );\n\t\tif ( this.props.locale )\n\t\t\tm.locale( this.props.locale );\n\t\treturn m;\n\t},\n\n\tcomponentProps: {\n\t\tfromProps: ['value', 'isValidDate', 'renderDay', 'renderMonth', 'renderYear', 'timeConstraints'],\n\t\tfromState: ['viewDate', 'selectedDate', 'updateOn'],\n\t\tfromThis: ['setDate', 'setTime', 'showView', 'addTime', 'subtractTime', 'updateSelectedDate', 'localMoment']\n\t},\n\n\tgetComponentProps: function(){\n\t\tvar me = this,\n\t\t\tformats = this.getFormats( this.props ),\n\t\t\tprops = {dateFormat: formats.date, timeFormat: formats.time}\n\t\t;\n\n\t\tthis.componentProps.fromProps.forEach( function( name ){\n\t\t\tprops[ name ] = me.props[ name ];\n\t\t});\n\t\tthis.componentProps.fromState.forEach( function( name ){\n\t\t\tprops[ name ] = me.state[ name ];\n\t\t});\n\t\tthis.componentProps.fromThis.forEach( function( name ){\n\t\t\tprops[ name ] = me[ name ];\n\t\t});\n\n\t\treturn props;\n\t},\n\n\trender: function() {\n\t\tvar Component = this.viewComponents[ this.state.currentView ],\n\t\t\tDOM = React.DOM,\n\t\t\tclassName = 'rdt' + (this.props.className ?\n ( Array.isArray( this.props.className ) ?\n ' ' + this.props.className.join( ' ' ) : ' ' + this.props.className) : ''),\n\t\t\tchildren = []\n\t\t;\n\n\t\tif ( this.props.input ){\n\t\t\tchildren = [ DOM.input( assign({\n\t\t\t\tkey: 'i',\n\t\t\t\ttype:'text',\n\t\t\t\tclassName: 'form-control',\n\t\t\t\tonFocus: this.openCalendar,\n\t\t\t\tonChange: this.onInputChange,\n\t\t\t\tonKeyDown: this.onInputKey,\n\t\t\t\tvalue: this.state.inputValue\n\t\t\t}, this.props.inputProps ))];\n\t\t} else {\n\t\t\tclassName += ' rdtStatic';\n\t\t}\n\n\t\tif ( this.state.open )\n\t\t\tclassName += ' rdtOpen';\n\n\t\treturn DOM.div({className: className}, children.concat(\n\t\t\tDOM.div(\n\t\t\t\t{ key: 'dt', className: 'rdtPicker' },\n\t\t\t\tReact.createElement( Component, this.getComponentProps())\n\t\t\t)\n\t\t));\n\t}\n});\n\n// Make moment accessible through the Datetime class\nDatetime.moment = moment;\n\nmodule.exports = Datetime;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./Datetime.js\n// module id = 0\n// module chunks = 0\n//# sourceURL=webpack:///./Datetime.js?"); |
| | | |
| | | /***/ }, |
| | | /* 1 */ |
| | | /***/ function(module, exports) { |
| | | |
| | | 'use strict'; |
| | | var propIsEnumerable = Object.prototype.propertyIsEnumerable; |
| | | |
| | | function ToObject(val) { |
| | | if (val == null) { |
| | | throw new TypeError('Object.assign cannot be called with null or undefined'); |
| | | } |
| | | |
| | | return Object(val); |
| | | } |
| | | |
| | | function ownEnumerableKeys(obj) { |
| | | var keys = Object.getOwnPropertyNames(obj); |
| | | |
| | | if (Object.getOwnPropertySymbols) { |
| | | keys = keys.concat(Object.getOwnPropertySymbols(obj)); |
| | | } |
| | | |
| | | return keys.filter(function (key) { |
| | | return propIsEnumerable.call(obj, key); |
| | | }); |
| | | } |
| | | |
| | | module.exports = Object.assign || function (target, source) { |
| | | var from; |
| | | var keys; |
| | | var to = ToObject(target); |
| | | |
| | | for (var s = 1; s < arguments.length; s++) { |
| | | from = arguments[s]; |
| | | keys = ownEnumerableKeys(Object(from)); |
| | | |
| | | for (var i = 0; i < keys.length; i++) { |
| | | to[keys[i]] = from[keys[i]]; |
| | | } |
| | | } |
| | | |
| | | return to; |
| | | }; |
| | | |
| | | eval("'use strict';\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction ToObject(val) {\n\tif (val == null) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction ownEnumerableKeys(obj) {\n\tvar keys = Object.getOwnPropertyNames(obj);\n\n\tif (Object.getOwnPropertySymbols) {\n\t\tkeys = keys.concat(Object.getOwnPropertySymbols(obj));\n\t}\n\n\treturn keys.filter(function (key) {\n\t\treturn propIsEnumerable.call(obj, key);\n\t});\n}\n\nmodule.exports = Object.assign || function (target, source) {\n\tvar from;\n\tvar keys;\n\tvar to = ToObject(target);\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = arguments[s];\n\t\tkeys = ownEnumerableKeys(Object(from));\n\n\t\tfor (var i = 0; i < keys.length; i++) {\n\t\t\tto[keys[i]] = from[keys[i]];\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/object-assign/index.js\n// module id = 1\n// module chunks = 0\n//# sourceURL=webpack:///./~/object-assign/index.js?"); |
| | | |
| | | /***/ }, |
| | | /* 2 */ |
| | | /***/ function(module, exports) { |
| | | |
| | | module.exports = __WEBPACK_EXTERNAL_MODULE_2__; |
| | | eval("module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n//////////////////\n// WEBPACK FOOTER\n// external \"React\"\n// module id = 2\n// module chunks = 0\n//# sourceURL=webpack:///external_%22React%22?"); |
| | | |
| | | /***/ }, |
| | | /* 3 */ |
| | | /***/ function(module, exports, __webpack_require__) { |
| | | |
| | | 'use strict'; |
| | | |
| | | var React = __webpack_require__(2), |
| | | moment = __webpack_require__(4) |
| | | ; |
| | | |
| | | var DOM = React.DOM; |
| | | var DateTimePickerDays = React.createClass({ |
| | | |
| | | render: function() { |
| | | var footer = this.renderFooter(), |
| | | date = this.props.viewDate, |
| | | locale = date.localeData(), |
| | | tableChildren |
| | | ; |
| | | |
| | | tableChildren = [ |
| | | DOM.thead({ key: 'th'}, [ |
| | | DOM.tr({ key: 'h'}, [ |
| | | DOM.th({ key: 'p', className: 'rdtPrev' }, DOM.span({onClick: this.props.subtractTime(1, 'months')}, '‹')), |
| | | DOM.th({ key: 's', className: 'rdtSwitch', onClick: this.props.showView('months'), colSpan: 5, 'data-value': this.props.viewDate.month() }, locale.months( date ) + ' ' + date.year() ), |
| | | DOM.th({ key: 'n', className: 'rdtNext' }, DOM.span({onClick: this.props.addTime(1, 'months')}, '›')) |
| | | ]), |
| | | DOM.tr({ key: 'd'}, this.getDaysOfWeek( locale ).map( function( day, index ){ return DOM.th({ key: day + index, className: 'dow'}, day ); }) ) |
| | | ]), |
| | | DOM.tbody({key: 'tb'}, this.renderDays()) |
| | | ]; |
| | | |
| | | if ( footer ) |
| | | tableChildren.push( footer ); |
| | | |
| | | return DOM.div({ className: 'rdtDays' }, |
| | | DOM.table({}, tableChildren ) |
| | | ); |
| | | }, |
| | | |
| | | /** |
| | | * Get a list of the days of the week |
| | | * depending on the current locale |
| | | * @return {array} A list with the shortname of the days |
| | | */ |
| | | getDaysOfWeek: function( locale ){ |
| | | var days = locale._weekdaysMin, |
| | | first = locale.firstDayOfWeek(), |
| | | dow = [], |
| | | i = 0 |
| | | ; |
| | | |
| | | days.forEach( function( day ){ |
| | | dow[ (7 + (i++) - first) % 7 ] = day; |
| | | }); |
| | | |
| | | return dow; |
| | | }, |
| | | |
| | | renderDays: function() { |
| | | var date = this.props.viewDate, |
| | | selected = this.props.selectedDate && this.props.selectedDate.clone(), |
| | | prevMonth = date.clone().subtract( 1, 'months' ), |
| | | currentYear = date.year(), |
| | | currentMonth = date.month(), |
| | | weeks = [], |
| | | days = [], |
| | | renderer = this.props.renderDay || this.renderDay, |
| | | isValid = this.props.isValidDate || this.isValidDate, |
| | | classes, disabled, dayProps, currentDate |
| | | ; |
| | | |
| | | // Go to the last week of the previous month |
| | | prevMonth.date( prevMonth.daysInMonth() ).startOf('week'); |
| | | var lastDay = prevMonth.clone().add(42, 'd'); |
| | | |
| | | while ( prevMonth.isBefore( lastDay ) ){ |
| | | classes = 'rdtDay'; |
| | | currentDate = prevMonth.clone(); |
| | | |
| | | if ( ( prevMonth.year() === currentYear && prevMonth.month() < currentMonth ) || ( prevMonth.year() < currentYear ) ) |
| | | classes += ' rdtOld'; |
| | | else if ( ( prevMonth.year() === currentYear && prevMonth.month() > currentMonth ) || ( prevMonth.year() > currentYear ) ) |
| | | classes += ' rdtNew'; |
| | | |
| | | if ( selected && prevMonth.isSame(selected, 'day') ) |
| | | classes += ' rdtActive'; |
| | | |
| | | if (prevMonth.isSame(moment(), 'day') ) |
| | | classes += ' rdtToday'; |
| | | |
| | | disabled = !isValid( currentDate, selected ); |
| | | if ( disabled ) |
| | | classes += ' rdtDisabled'; |
| | | |
| | | dayProps = { |
| | | key: prevMonth.format('M_D'), |
| | | 'data-value': prevMonth.date(), |
| | | className: classes |
| | | }; |
| | | if ( !disabled ) |
| | | dayProps.onClick = this.updateSelectedDate; |
| | | |
| | | days.push( renderer( dayProps, currentDate, selected ) ); |
| | | |
| | | if ( days.length === 7 ){ |
| | | weeks.push( DOM.tr( {key: prevMonth.format('M_D')}, days ) ); |
| | | days = []; |
| | | } |
| | | |
| | | prevMonth.add( 1, 'd' ); |
| | | } |
| | | |
| | | return weeks; |
| | | }, |
| | | |
| | | updateSelectedDate: function( event ) { |
| | | this.props.updateSelectedDate(event, true); |
| | | }, |
| | | |
| | | renderDay: function( props, currentDate ){ |
| | | return DOM.td( props, currentDate.date() ); |
| | | }, |
| | | |
| | | renderFooter: function(){ |
| | | if ( !this.props.timeFormat ) |
| | | return ''; |
| | | |
| | | var date = this.props.selectedDate || this.props.viewDate; |
| | | |
| | | return DOM.tfoot({ key: 'tf'}, |
| | | DOM.tr({}, |
| | | DOM.td({ onClick: this.props.showView('time'), colSpan: 7, className: 'rdtTimeToggle'}, date.format( this.props.timeFormat )) |
| | | ) |
| | | ); |
| | | }, |
| | | isValidDate: function(){ return 1; } |
| | | }); |
| | | |
| | | module.exports = DateTimePickerDays; |
| | | |
| | | eval("'use strict';\n\nvar React = __webpack_require__(2),\n\tmoment = __webpack_require__(4)\n;\n\nvar DOM = React.DOM;\nvar DateTimePickerDays = React.createClass({\n\n\trender: function() {\n\t\tvar footer = this.renderFooter(),\n\t\t\tdate = this.props.viewDate,\n\t\t\tlocale = date.localeData(),\n\t\t\ttableChildren\n\t\t;\n\n\t\ttableChildren = [\n\t\t\tDOM.thead({ key: 'th'}, [\n\t\t\t\tDOM.tr({ key: 'h'}, [\n\t\t\t\t\tDOM.th({ key: 'p', className: 'rdtPrev' }, DOM.span({onClick: this.props.subtractTime(1, 'months')}, '‹')),\n\t\t\t\t\tDOM.th({ key: 's', className: 'rdtSwitch', onClick: this.props.showView('months'), colSpan: 5, 'data-value': this.props.viewDate.month() }, locale.months( date ) + ' ' + date.year() ),\n\t\t\t\t\tDOM.th({ key: 'n', className: 'rdtNext' }, DOM.span({onClick: this.props.addTime(1, 'months')}, '›'))\n\t\t\t\t]),\n\t\t\t\tDOM.tr({ key: 'd'}, this.getDaysOfWeek( locale ).map( function( day, index ){ return DOM.th({ key: day + index, className: 'dow'}, day ); }) )\n\t\t\t]),\n\t\t\tDOM.tbody({key: 'tb'}, this.renderDays())\n\t\t];\n\n\t\tif ( footer )\n\t\t\ttableChildren.push( footer );\n\n\t\treturn DOM.div({ className: 'rdtDays' },\n\t\t\tDOM.table({}, tableChildren )\n\t\t);\n\t},\n\n\t/**\n\t * Get a list of the days of the week\n\t * depending on the current locale\n\t * @return {array} A list with the shortname of the days\n\t */\n\tgetDaysOfWeek: function( locale ){\n\t\tvar days = locale._weekdaysMin,\n\t\t\tfirst = locale.firstDayOfWeek(),\n\t\t\tdow = [],\n\t\t\ti = 0\n\t\t;\n\n\t\tdays.forEach( function( day ){\n\t\t\tdow[ (7 + (i++) - first) % 7 ] = day;\n\t\t});\n\n\t\treturn dow;\n\t},\n\n\trenderDays: function() {\n\t\tvar date = this.props.viewDate,\n\t\t\tselected = this.props.selectedDate && this.props.selectedDate.clone(),\n\t\t\tprevMonth = date.clone().subtract( 1, 'months' ),\n\t\t\tcurrentYear = date.year(),\n\t\t\tcurrentMonth = date.month(),\n\t\t\tweeks = [],\n\t\t\tdays = [],\n\t\t\trenderer = this.props.renderDay || this.renderDay,\n\t\t\tisValid = this.props.isValidDate || this.isValidDate,\n\t\t\tclasses, disabled, dayProps, currentDate\n\t\t;\n\n\t\t// Go to the last week of the previous month\n\t\tprevMonth.date( prevMonth.daysInMonth() ).startOf('week');\n\t\tvar lastDay = prevMonth.clone().add(42, 'd');\n\n\t\twhile ( prevMonth.isBefore( lastDay ) ){\n\t\t\tclasses = 'rdtDay';\n\t\t\tcurrentDate = prevMonth.clone();\n\n\t\t\tif ( ( prevMonth.year() === currentYear && prevMonth.month() < currentMonth ) || ( prevMonth.year() < currentYear ) )\n\t\t\t\tclasses += ' rdtOld';\n\t\t\telse if ( ( prevMonth.year() === currentYear && prevMonth.month() > currentMonth ) || ( prevMonth.year() > currentYear ) )\n\t\t\t\tclasses += ' rdtNew';\n\n\t\t\tif ( selected && prevMonth.isSame(selected, 'day') )\n\t\t\t\tclasses += ' rdtActive';\n\n\t\t\tif (prevMonth.isSame(moment(), 'day') )\n\t\t\t\tclasses += ' rdtToday';\n\n\t\t\tdisabled = !isValid( currentDate, selected );\n\t\t\tif ( disabled )\n\t\t\t\tclasses += ' rdtDisabled';\n\n\t\t\tdayProps = {\n\t\t\t\tkey: prevMonth.format('M_D'),\n\t\t\t\t'data-value': prevMonth.date(),\n\t\t\t\tclassName: classes\n\t\t\t};\n\t\t\tif ( !disabled )\n\t\t\t\tdayProps.onClick = this.updateSelectedDate;\n\n\t\t\tdays.push( renderer( dayProps, currentDate, selected ) );\n\n\t\t\tif ( days.length === 7 ){\n\t\t\t\tweeks.push( DOM.tr( {key: prevMonth.format('M_D')}, days ) );\n\t\t\t\tdays = [];\n\t\t\t}\n\n\t\t\tprevMonth.add( 1, 'd' );\n\t\t}\n\n\t\treturn weeks;\n\t},\n\n\tupdateSelectedDate: function( event ) {\n\t\tthis.props.updateSelectedDate(event, true);\n\t},\n\n\trenderDay: function( props, currentDate ){\n\t\treturn DOM.td( props, currentDate.date() );\n\t},\n\n\trenderFooter: function(){\n\t\tif ( !this.props.timeFormat )\n\t\t\treturn '';\n\n\t\tvar date = this.props.selectedDate || this.props.viewDate;\n\n\t\treturn DOM.tfoot({ key: 'tf'},\n\t\t\tDOM.tr({},\n\t\t\t\tDOM.td({ onClick: this.props.showView('time'), colSpan: 7, className: 'rdtTimeToggle'}, date.format( this.props.timeFormat ))\n\t\t\t)\n\t\t);\n\t},\n\tisValidDate: function(){ return 1; }\n});\n\nmodule.exports = DateTimePickerDays;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/DaysView.js\n// module id = 3\n// module chunks = 0\n//# sourceURL=webpack:///./src/DaysView.js?"); |
| | | |
| | | /***/ }, |
| | | /* 4 */ |
| | | /***/ function(module, exports) { |
| | | |
| | | module.exports = __WEBPACK_EXTERNAL_MODULE_4__; |
| | | eval("module.exports = __WEBPACK_EXTERNAL_MODULE_4__;\n\n//////////////////\n// WEBPACK FOOTER\n// external \"moment\"\n// module id = 4\n// module chunks = 0\n//# sourceURL=webpack:///external_%22moment%22?"); |
| | | |
| | | /***/ }, |
| | | /* 5 */ |
| | | /***/ function(module, exports, __webpack_require__) { |
| | | |
| | | 'use strict'; |
| | | |
| | | var React = __webpack_require__(2); |
| | | |
| | | var DOM = React.DOM; |
| | | var DateTimePickerMonths = React.createClass({ |
| | | render: function() { |
| | | return DOM.div({ className: 'rdtMonths' }, [ |
| | | DOM.table({ key: 'a'}, DOM.thead({}, DOM.tr({}, [ |
| | | DOM.th({ key: 'prev', className: 'rdtPrev' }, DOM.span({onClick: this.props.subtractTime(1, 'years')}, '‹')), |
| | | DOM.th({ key: 'year', className: 'rdtSwitch', onClick: this.props.showView('years'), colSpan: 2, 'data-value': this.props.viewDate.year()}, this.props.viewDate.year() ), |
| | | DOM.th({ key: 'next', className: 'rdtNext' }, DOM.span({onClick: this.props.addTime(1, 'years')}, '›')) |
| | | ]))), |
| | | DOM.table({ key: 'months'}, DOM.tbody({ key: 'b'}, this.renderMonths())) |
| | | ]); |
| | | }, |
| | | |
| | | renderMonths: function() { |
| | | var date = this.props.selectedDate, |
| | | month = this.props.viewDate.month(), |
| | | year = this.props.viewDate.year(), |
| | | rows = [], |
| | | i = 0, |
| | | months = [], |
| | | renderer = this.props.renderMonth || this.renderMonth, |
| | | classes, props |
| | | ; |
| | | |
| | | while (i < 12) { |
| | | classes = 'rdtMonth'; |
| | | if ( date && i === month && year === date.year() ) |
| | | classes += ' rdtActive'; |
| | | |
| | | props = { |
| | | key: i, |
| | | 'data-value': i, |
| | | className: classes, |
| | | onClick: this.props.updateOn === 'months'? this.updateSelectedMonth : this.props.setDate('month') |
| | | }; |
| | | |
| | | months.push( renderer( props, i, year, date && date.clone() )); |
| | | |
| | | if ( months.length === 4 ){ |
| | | rows.push( DOM.tr({ key: month + '_' + rows.length }, months) ); |
| | | months = []; |
| | | } |
| | | |
| | | i++; |
| | | } |
| | | |
| | | return rows; |
| | | }, |
| | | |
| | | updateSelectedMonth: function( event ) { |
| | | this.props.updateSelectedDate(event, true); |
| | | }, |
| | | |
| | | renderMonth: function( props, month ) { |
| | | var monthsShort = this.props.viewDate.localeData()._monthsShort; |
| | | return DOM.td( props, monthsShort.standalone |
| | | ? capitalize( monthsShort.standalone[ month ] ) |
| | | : monthsShort[ month ] |
| | | ); |
| | | } |
| | | }); |
| | | |
| | | function capitalize(str) { |
| | | return str.charAt(0).toUpperCase() + str.slice(1); |
| | | } |
| | | |
| | | module.exports = DateTimePickerMonths; |
| | | |
| | | eval("'use strict';\n\nvar React = __webpack_require__(2);\n\nvar DOM = React.DOM;\nvar DateTimePickerMonths = React.createClass({\n\trender: function() {\n\t\treturn DOM.div({ className: 'rdtMonths' }, [\n\t\t\tDOM.table({ key: 'a'}, DOM.thead({}, DOM.tr({}, [\n\t\t\t\tDOM.th({ key: 'prev', className: 'rdtPrev' }, DOM.span({onClick: this.props.subtractTime(1, 'years')}, '‹')),\n\t\t\t\tDOM.th({ key: 'year', className: 'rdtSwitch', onClick: this.props.showView('years'), colSpan: 2, 'data-value': this.props.viewDate.year()}, this.props.viewDate.year() ),\n\t\t\t\tDOM.th({ key: 'next', className: 'rdtNext' }, DOM.span({onClick: this.props.addTime(1, 'years')}, '›'))\n\t\t\t]))),\n\t\t\tDOM.table({ key: 'months'}, DOM.tbody({ key: 'b'}, this.renderMonths()))\n\t\t]);\n\t},\n\n\trenderMonths: function() {\n\t\tvar date = this.props.selectedDate,\n\t\t\tmonth = this.props.viewDate.month(),\n\t\t\tyear = this.props.viewDate.year(),\n\t\t\trows = [],\n\t\t\ti = 0,\n\t\t\tmonths = [],\n\t\t\trenderer = this.props.renderMonth || this.renderMonth,\n\t\t\tisValid = this.props.isValidDate || this.isValidDate,\n\t\t\tclasses, props\n\t\t;\n\n var currentMonth, disabled,\n // Date is irrelevant because we're really only interested in month\n irrelevantDate = 1;\n\t\twhile (i < 12) {\n\t\t\tclasses = 'rdtMonth';\n\t\t\tcurrentMonth =\n this.props.viewDate.clone().set({ year: year, month: i, date: irrelevantDate });\n\t\t\tdisabled = !isValid(currentMonth);\n\n\t\t\tif ( disabled )\n\t\t\t\tclasses += ' rdtDisabled';\n\n\t\t\tif ( date && i === month && year === date.year() )\n\t\t\t\tclasses += ' rdtActive';\n\n\t\t\tprops = {\n\t\t\t\tkey: i,\n\t\t\t\t'data-value': i,\n\t\t\t\tclassName: classes\n\t\t\t};\n\n\t\t\tif ( !disabled )\n\t\t\t\tprops.onClick = (this.props.updateOn === 'months' ?\n this.updateSelectedMonth : this.props.setDate('month'));\n\n\t\t\tmonths.push( renderer( props, i, year, date && date.clone() ));\n\n\t\t\tif ( months.length === 4 ){\n\t\t\t\trows.push( DOM.tr({ key: month + '_' + rows.length }, months) );\n\t\t\t\tmonths = [];\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\treturn rows;\n\t},\n\n\tupdateSelectedMonth: function( event ) {\n\t\tthis.props.updateSelectedDate(event, true);\n\t},\n\n\trenderMonth: function( props, month ) {\n\t\tvar monthsShort = this.props.viewDate.localeData()._monthsShort;\n\t\treturn DOM.td( props, monthsShort.standalone\n\t\t\t? capitalize( monthsShort.standalone[ month ] )\n\t\t\t: monthsShort[ month ]\n\t\t);\n\t},\n\n\tisValidDate: function(){\n\t\treturn 1;\n\t}\n});\n\nfunction capitalize(str) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nmodule.exports = DateTimePickerMonths;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/MonthsView.js\n// module id = 5\n// module chunks = 0\n//# sourceURL=webpack:///./src/MonthsView.js?"); |
| | | |
| | | /***/ }, |
| | | /* 6 */ |
| | | /***/ function(module, exports, __webpack_require__) { |
| | | |
| | | 'use strict'; |
| | | |
| | | var React = __webpack_require__(2); |
| | | |
| | | var DOM = React.DOM; |
| | | var DateTimePickerYears = React.createClass({ |
| | | render: function() { |
| | | var year = parseInt(this.props.viewDate.year() / 10, 10) * 10; |
| | | |
| | | return DOM.div({ className: 'rdtYears' }, [ |
| | | DOM.table({ key: 'a'}, DOM.thead({}, DOM.tr({}, [ |
| | | DOM.th({ key: 'prev', className: 'rdtPrev' }, DOM.span({onClick: this.props.subtractTime(10, 'years')}, '‹')), |
| | | DOM.th({ key: 'year', className: 'rdtSwitch', onClick: this.props.showView('years'), colSpan: 2 }, year + '-' + (year + 9) ), |
| | | DOM.th({ key: 'next', className: 'rdtNext'}, DOM.span({onClick: this.props.addTime(10, 'years')}, '›')) |
| | | ]))), |
| | | DOM.table({ key: 'years'}, DOM.tbody({}, this.renderYears( year ))) |
| | | ]); |
| | | }, |
| | | |
| | | renderYears: function( year ) { |
| | | var years = [], |
| | | i = -1, |
| | | rows = [], |
| | | renderer = this.props.renderYear || this.renderYear, |
| | | selectedDate = this.props.selectedDate, |
| | | classes, props |
| | | ; |
| | | |
| | | year--; |
| | | while (i < 11) { |
| | | classes = 'rdtYear'; |
| | | if ( i === -1 | i === 10 ) |
| | | classes += ' rdtOld'; |
| | | if ( selectedDate && selectedDate.year() === year ) |
| | | classes += ' rdtActive'; |
| | | |
| | | props = { |
| | | key: year, |
| | | 'data-value': year, |
| | | className: classes, |
| | | onClick: this.props.updateOn === 'years' ? this.updateSelectedYear : this.props.setDate('year') |
| | | }; |
| | | |
| | | years.push( renderer( props, year, selectedDate && selectedDate.clone() )); |
| | | |
| | | if ( years.length === 4 ){ |
| | | rows.push( DOM.tr({ key: i }, years ) ); |
| | | years = []; |
| | | } |
| | | |
| | | year++; |
| | | i++; |
| | | } |
| | | |
| | | return rows; |
| | | }, |
| | | |
| | | updateSelectedYear: function( event ) { |
| | | this.props.updateSelectedDate(event, true); |
| | | }, |
| | | |
| | | renderYear: function( props, year ){ |
| | | return DOM.td( props, year ); |
| | | } |
| | | }); |
| | | |
| | | module.exports = DateTimePickerYears; |
| | | |
| | | eval("'use strict';\n\nvar React = __webpack_require__(2);\n\nvar DOM = React.DOM;\nvar DateTimePickerYears = React.createClass({\n\trender: function() {\n\t\tvar year = parseInt(this.props.viewDate.year() / 10, 10) * 10;\n\n\t\treturn DOM.div({ className: 'rdtYears' }, [\n\t\t\tDOM.table({ key: 'a'}, DOM.thead({}, DOM.tr({}, [\n\t\t\t\tDOM.th({ key: 'prev', className: 'rdtPrev' }, DOM.span({onClick: this.props.subtractTime(10, 'years')}, '‹')),\n\t\t\t\tDOM.th({ key: 'year', className: 'rdtSwitch', onClick: this.props.showView('years'), colSpan: 2 }, year + '-' + (year + 9) ),\n\t\t\t\tDOM.th({ key: 'next', className: 'rdtNext'}, DOM.span({onClick: this.props.addTime(10, 'years')}, '›'))\n\t\t\t\t]))),\n\t\t\tDOM.table({ key: 'years'}, DOM.tbody({}, this.renderYears( year )))\n\t\t]);\n\t},\n\n\trenderYears: function( year ) {\n\t\tvar years = [],\n\t\t\ti = -1,\n\t\t\trows = [],\n\t\t\trenderer = this.props.renderYear || this.renderYear,\n\t\t\tselectedDate = this.props.selectedDate,\n\t\t\tisValid = this.props.isValidDate || this.isValidDate,\n\t\t\tclasses, props\n\t\t;\n\n\t\tyear--;\n var currentYear, disabled,\n // Month and date are irrelevant here because\n // we're only really interested in the year\n irrelevantMonth = 1,\n irrelevantDate = 1;\n\t\twhile (i < 11) {\n\t\t\tclasses = 'rdtYear';\n\t\t\tcurrentYear = this.props.viewDate.clone().set(\n\t\t\t\t{ year: year, month: irrelevantMonth, date: irrelevantDate });\n\t\t\tif ( i === -1 | i === 10 )\n\t\t\t\tclasses += ' rdtOld';\n\n\t\t\tdisabled = !isValid(currentYear);\n\t\t\tif ( disabled )\n\t\t\t\tclasses += ' rdtDisabled';\n\n\t\t\tif ( selectedDate && selectedDate.year() === year )\n\t\t\t\tclasses += ' rdtActive';\n\n\t\t\tprops = {\n\t\t\t\tkey: year,\n\t\t\t\t'data-value': year,\n\t\t\t\tclassName: classes\n\t\t\t};\n\n\t\t\tif ( !disabled )\n\t\t\t\tprops.onClick = this.props.updateOn === 'years' ? this.updateSelectedYear : this.props.setDate('year');\n\n\t\t\tyears.push( renderer( props, year, selectedDate && selectedDate.clone() ));\n\n\t\t\tif ( years.length === 4 ){\n\t\t\t\trows.push( DOM.tr({ key: i }, years ) );\n\t\t\t\tyears = [];\n\t\t\t}\n\n\t\t\tyear++;\n\t\t\ti++;\n\t\t}\n\n\t\treturn rows;\n\t},\n\n\tupdateSelectedYear: function( event ) {\n\t\tthis.props.updateSelectedDate(event, true);\n\t},\n\n\trenderYear: function( props, year ){\n\t\treturn DOM.td( props, year );\n\t},\n\n\tisValidDate: function(){\n\t\treturn 1;\n\t}\n});\n\nmodule.exports = DateTimePickerYears;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/YearsView.js\n// module id = 6\n// module chunks = 0\n//# sourceURL=webpack:///./src/YearsView.js?"); |
| | | |
| | | /***/ }, |
| | | /* 7 */ |
| | | /***/ function(module, exports, __webpack_require__) { |
| | | |
| | | 'use strict'; |
| | | |
| | | var React = __webpack_require__(2), |
| | | assign = __webpack_require__(1); |
| | | |
| | | var DOM = React.DOM; |
| | | var DateTimePickerTime = React.createClass({ |
| | | getInitialState: function(){ |
| | | return this.calculateState( this.props ); |
| | | }, |
| | | calculateState: function( props ){ |
| | | var date = props.selectedDate || props.viewDate, |
| | | format = props.timeFormat, |
| | | counters = [] |
| | | ; |
| | | |
| | | if ( format.indexOf('H') !== -1 || format.indexOf('h') !== -1 ){ |
| | | counters.push('hours'); |
| | | if ( format.indexOf('m') !== -1 ){ |
| | | counters.push('minutes'); |
| | | if ( format.indexOf('s') !== -1 ){ |
| | | counters.push('seconds'); |
| | | } |
| | | } |
| | | } |
| | | |
| | | var daypart = false; |
| | | if ( this.props.timeFormat.indexOf(' A') !== -1 && this.state !== null ){ |
| | | daypart = ( this.state.hours >= 12 ) ? 'PM' : 'AM'; |
| | | } |
| | | |
| | | return { |
| | | hours: date.format('H'), |
| | | minutes: date.format('mm'), |
| | | seconds: date.format('ss'), |
| | | milliseconds: date.format('SSS'), |
| | | daypart: daypart, |
| | | counters: counters |
| | | }; |
| | | }, |
| | | renderCounter: function( type ){ |
| | | if (type !== 'daypart') { |
| | | var value = this.state[ type ]; |
| | | if (type === 'hours' && this.props.timeFormat.indexOf(' A') !== -1) { |
| | | value = (value - 1) % 12 + 1; |
| | | |
| | | if (value === 0) { |
| | | value = 12; |
| | | } |
| | | } |
| | | return DOM.div({ key: type, className: 'rdtCounter'}, [ |
| | | DOM.span({ key:'up', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'increase', type ) }, '▲' ), |
| | | DOM.div({ key:'c', className: 'rdtCount' }, value ), |
| | | DOM.span({ key:'do', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'decrease', type ) }, '▼' ) |
| | | ]); |
| | | } |
| | | return ''; |
| | | }, |
| | | renderDayPart: function() { |
| | | return DOM.div({ className: 'rdtCounter', key: 'dayPart'}, [ |
| | | DOM.span({ key:'up', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'toggleDayPart', 'hours') }, '▲' ), |
| | | DOM.div({ key: this.state.daypart, className: 'rdtCount'}, this.state.daypart ), |
| | | DOM.span({ key:'do', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'toggleDayPart', 'hours') }, '▼' ) |
| | | ]); |
| | | }, |
| | | render: function() { |
| | | var me = this, |
| | | counters = [] |
| | | ; |
| | | |
| | | this.state.counters.forEach( function(c){ |
| | | if ( counters.length ) |
| | | counters.push( DOM.div( {key: 'sep' + counters.length, className: 'rdtCounterSeparator' }, ':' )); |
| | | counters.push( me.renderCounter( c ) ); |
| | | }); |
| | | |
| | | if (this.state.daypart !== false) { |
| | | counters.push( me.renderDayPart() ); |
| | | } |
| | | |
| | | if ( this.state.counters.length === 3 && this.props.timeFormat.indexOf('S') !== -1 ){ |
| | | counters.push( DOM.div( {className: 'rdtCounterSeparator', key: 'sep5' }, ':' )); |
| | | counters.push( |
| | | DOM.div( {className: 'rdtCounter rdtMilli', key:'m'}, |
| | | DOM.input({ value: this.state.milliseconds, type: 'text', onChange: this.updateMilli }) |
| | | ) |
| | | ); |
| | | } |
| | | |
| | | return DOM.div( {className: 'rdtTime'}, |
| | | DOM.table( {}, [ |
| | | this.renderHeader(), |
| | | DOM.tbody({key: 'b'}, DOM.tr({}, DOM.td({}, |
| | | DOM.div({ className: 'rdtCounters' }, counters ) |
| | | ))) |
| | | ]) |
| | | ); |
| | | }, |
| | | componentWillMount: function() { |
| | | var me = this; |
| | | me.timeConstraints = { |
| | | hours: { |
| | | min: 0, |
| | | max: 23, |
| | | step: 1 |
| | | }, |
| | | minutes: { |
| | | min: 0, |
| | | max: 59, |
| | | step: 1 |
| | | }, |
| | | seconds: { |
| | | min: 0, |
| | | max: 59, |
| | | step: 1, |
| | | }, |
| | | milliseconds: { |
| | | min: 0, |
| | | max: 999, |
| | | step: 1 |
| | | } |
| | | }; |
| | | ['hours', 'minutes', 'seconds', 'milliseconds'].forEach(function(type) { |
| | | assign(me.timeConstraints[type], me.props.timeConstraints[type]); |
| | | }); |
| | | this.setState( this.calculateState( this.props ) ); |
| | | }, |
| | | componentWillReceiveProps: function( nextProps ){ |
| | | this.setState( this.calculateState( nextProps ) ); |
| | | }, |
| | | updateMilli: function( e ){ |
| | | var milli = parseInt( e.target.value, 10 ); |
| | | if ( milli === e.target.value && milli >= 0 && milli < 1000 ){ |
| | | this.props.setTime( 'milliseconds', milli ); |
| | | this.setState({ milliseconds: milli }); |
| | | } |
| | | }, |
| | | renderHeader: function(){ |
| | | if ( !this.props.dateFormat ) |
| | | return null; |
| | | |
| | | var date = this.props.selectedDate || this.props.viewDate; |
| | | return DOM.thead({ key: 'h'}, DOM.tr({}, |
| | | DOM.th( {className: 'rdtSwitch', colSpan: 4, onClick: this.props.showView('days')}, date.format( this.props.dateFormat ) ) |
| | | )); |
| | | }, |
| | | onStartClicking: function( action, type ){ |
| | | var me = this; |
| | | |
| | | return function(){ |
| | | var update = {}; |
| | | update[ type ] = me[ action ]( type ); |
| | | me.setState( update ); |
| | | |
| | | me.timer = setTimeout( function(){ |
| | | me.increaseTimer = setInterval( function(){ |
| | | update[ type ] = me[ action ]( type ); |
| | | me.setState( update ); |
| | | }, 70); |
| | | }, 500); |
| | | |
| | | me.mouseUpListener = function(){ |
| | | clearTimeout( me.timer ); |
| | | clearInterval( me.increaseTimer ); |
| | | me.props.setTime( type, me.state[ type ] ); |
| | | document.body.removeEventListener('mouseup', me.mouseUpListener); |
| | | }; |
| | | |
| | | document.body.addEventListener('mouseup', me.mouseUpListener); |
| | | }; |
| | | }, |
| | | padValues: { |
| | | hours: 1, |
| | | minutes: 2, |
| | | seconds: 2, |
| | | milliseconds: 3 |
| | | }, |
| | | toggleDayPart: function( type ){ // type is always 'hours' |
| | | var value = parseInt(this.state[ type ], 10) + 12; |
| | | if ( value > this.timeConstraints[ type ].max ) |
| | | value = this.timeConstraints[ type ].min + (value - (this.timeConstraints[ type ].max + 1)); |
| | | return this.pad( type, value ); |
| | | }, |
| | | increase: function( type ){ |
| | | var value = parseInt(this.state[ type ], 10) + this.timeConstraints[ type ].step; |
| | | if ( value > this.timeConstraints[ type ].max ) |
| | | value = this.timeConstraints[ type ].min + ( value - ( this.timeConstraints[ type ].max + 1) ); |
| | | return this.pad( type, value ); |
| | | }, |
| | | decrease: function( type ){ |
| | | var value = parseInt(this.state[ type ], 10) - this.timeConstraints[ type ].step; |
| | | if ( value < this.timeConstraints[ type ].min ) |
| | | value = this.timeConstraints[ type ].max + 1 - ( this.timeConstraints[ type ].min - value ); |
| | | return this.pad( type, value ); |
| | | }, |
| | | pad: function( type, value ){ |
| | | var str = value + ''; |
| | | while ( str.length < this.padValues[ type ] ) |
| | | str = '0' + str; |
| | | return str; |
| | | } |
| | | }); |
| | | |
| | | module.exports = DateTimePickerTime; |
| | | |
| | | eval("'use strict';\n\nvar React = __webpack_require__(2),\n\tassign = __webpack_require__(1);\n\nvar DOM = React.DOM;\nvar DateTimePickerTime = React.createClass({\n\tgetInitialState: function(){\n\t\treturn this.calculateState( this.props );\n\t},\n\tcalculateState: function( props ){\n\t\tvar date = props.selectedDate || props.viewDate,\n\t\t\tformat = props.timeFormat,\n\t\t\tcounters = []\n\t\t;\n\n\t\tif ( format.indexOf('H') !== -1 || format.indexOf('h') !== -1 ){\n\t\t\tcounters.push('hours');\n\t\t\tif ( format.indexOf('m') !== -1 ){\n\t\t\t\tcounters.push('minutes');\n\t\t\t\tif ( format.indexOf('s') !== -1 ){\n\t\t\t\t\tcounters.push('seconds');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar daypart = false;\n\t\tif ( this.props.timeFormat.indexOf(' A') !== -1 && this.state !== null ){\n\t\t\tdaypart = ( this.state.hours >= 12 ) ? 'PM' : 'AM';\n\t\t}\n\n\t\treturn {\n\t\t\thours: date.format('H'),\n\t\t\tminutes: date.format('mm'),\n\t\t\tseconds: date.format('ss'),\n\t\t\tmilliseconds: date.format('SSS'),\n\t\t\tdaypart: daypart,\n\t\t\tcounters: counters\n\t\t};\n\t},\n\trenderCounter: function( type ){\n\t\tif (type !== 'daypart') {\n\t\t\tvar value = this.state[ type ];\n\t\t\tif (type === 'hours' && this.props.timeFormat.indexOf(' A') !== -1) {\n\t\t\t\tvalue = (value - 1) % 12 + 1;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\tvalue = 12;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn DOM.div({ key: type, className: 'rdtCounter'}, [\n\t\t\t\tDOM.span({ key:'up', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'increase', type ) }, '▲' ),\n\t\t\t\tDOM.div({ key:'c', className: 'rdtCount' }, value ),\n\t\t\t\tDOM.span({ key:'do', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'decrease', type ) }, '▼' )\n\t\t\t]);\n\t\t}\n\t\treturn '';\n\t},\n\trenderDayPart: function() {\n\t\treturn DOM.div({ className: 'rdtCounter', key: 'dayPart'}, [\n\t\t\tDOM.span({ key:'up', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'toggleDayPart', 'hours') }, '▲' ),\n\t\t\tDOM.div({ key: this.state.daypart, className: 'rdtCount'}, this.state.daypart ),\n\t\t\tDOM.span({ key:'do', className: 'rdtBtn', onMouseDown: this.onStartClicking( 'toggleDayPart', 'hours') }, '▼' )\n\t\t]);\n\t},\n\trender: function() {\n\t\tvar me = this,\n\t\t\tcounters = []\n\t\t;\n\n\t\tthis.state.counters.forEach( function(c){\n\t\t\tif ( counters.length )\n\t\t\t\tcounters.push( DOM.div( {key: 'sep' + counters.length, className: 'rdtCounterSeparator' }, ':' ));\n\t\t\tcounters.push( me.renderCounter( c ) );\n\t\t});\n\n\t\tif (this.state.daypart !== false) {\n\t\t\tcounters.push( me.renderDayPart() );\n\t\t}\n\n\t\tif ( this.state.counters.length === 3 && this.props.timeFormat.indexOf('S') !== -1 ){\n\t\t\tcounters.push( DOM.div( {className: 'rdtCounterSeparator', key: 'sep5' }, ':' ));\n\t\t\tcounters.push(\n\t\t\t\tDOM.div( {className: 'rdtCounter rdtMilli', key:'m'},\n\t\t\t\t\tDOM.input({ value: this.state.milliseconds, type: 'text', onChange: this.updateMilli })\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t}\n\n\t\treturn DOM.div( {className: 'rdtTime'},\n\t\t\tDOM.table( {}, [\n\t\t\t\tthis.renderHeader(),\n\t\t\t\tDOM.tbody({key: 'b'}, DOM.tr({}, DOM.td({},\n\t\t\t\t\tDOM.div({ className: 'rdtCounters' }, counters )\n\t\t\t\t)))\n\t\t\t])\n\t\t);\n\t},\n\tcomponentWillMount: function() {\n\t\tvar me = this;\n\t\tme.timeConstraints = {\n\t\t\thours: {\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 23,\n\t\t\t\tstep: 1\n\t\t\t},\n\t\t\tminutes: {\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 59,\n\t\t\t\tstep: 1\n\t\t\t},\n\t\t\tseconds: {\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 59,\n\t\t\t\tstep: 1,\n\t\t\t},\n\t\t\tmilliseconds: {\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 999,\n\t\t\t\tstep: 1\n\t\t\t}\n\t\t};\n\t\t['hours', 'minutes', 'seconds', 'milliseconds'].forEach(function(type) {\n\t\t\tassign(me.timeConstraints[type], me.props.timeConstraints[type]);\n\t\t});\n\t\tthis.setState( this.calculateState( this.props ) );\n\t},\n\tcomponentWillReceiveProps: function( nextProps ){\n\t\tthis.setState( this.calculateState( nextProps ) );\n\t},\n\tupdateMilli: function( e ){\n\t\tvar milli = parseInt( e.target.value, 10 );\n\t\tif ( milli === e.target.value && milli >= 0 && milli < 1000 ){\n\t\t\tthis.props.setTime( 'milliseconds', milli );\n\t\t\tthis.setState({ milliseconds: milli });\n\t\t}\n\t},\n\trenderHeader: function(){\n\t\tif ( !this.props.dateFormat )\n\t\t\treturn null;\n\n\t\tvar date = this.props.selectedDate || this.props.viewDate;\n\t\treturn DOM.thead({ key: 'h'}, DOM.tr({},\n\t\t\tDOM.th( {className: 'rdtSwitch', colSpan: 4, onClick: this.props.showView('days')}, date.format( this.props.dateFormat ) )\n\t\t));\n\t},\n\tonStartClicking: function( action, type ){\n\t\tvar me = this;\n\n\t\treturn function(){\n\t\t\tvar update = {};\n\t\t\tupdate[ type ] = me[ action ]( type );\n\t\t\tme.setState( update );\n\n\t\t\tme.timer = setTimeout( function(){\n\t\t\t\tme.increaseTimer = setInterval( function(){\n\t\t\t\t\tupdate[ type ] = me[ action ]( type );\n\t\t\t\t\tme.setState( update );\n\t\t\t\t}, 70);\n\t\t\t}, 500);\n\n\t\t\tme.mouseUpListener = function(){\n\t\t\t\tclearTimeout( me.timer );\n\t\t\t\tclearInterval( me.increaseTimer );\n\t\t\t\tme.props.setTime( type, me.state[ type ] );\n\t\t\t\tdocument.body.removeEventListener('mouseup', me.mouseUpListener);\n\t\t\t};\n\n\t\t\tdocument.body.addEventListener('mouseup', me.mouseUpListener);\n\t\t};\n\t},\n\tpadValues: {\n\t\thours: 1,\n\t\tminutes: 2,\n\t\tseconds: 2,\n\t\tmilliseconds: 3\n\t},\n\ttoggleDayPart: function( type ){ // type is always 'hours'\n\t\tvar value = parseInt(this.state[ type ], 10) + 12;\n\t\tif ( value > this.timeConstraints[ type ].max )\n\t\t\tvalue = this.timeConstraints[ type ].min + (value - (this.timeConstraints[ type ].max + 1));\n\t\treturn this.pad( type, value );\n\t},\n\tincrease: function( type ){\n\t\tvar value = parseInt(this.state[ type ], 10) + this.timeConstraints[ type ].step;\n\t\tif ( value > this.timeConstraints[ type ].max )\n\t\t\tvalue = this.timeConstraints[ type ].min + ( value - ( this.timeConstraints[ type ].max + 1) );\n\t\treturn this.pad( type, value );\n\t},\n\tdecrease: function( type ){\n\t\tvar value = parseInt(this.state[ type ], 10) - this.timeConstraints[ type ].step;\n\t\tif ( value < this.timeConstraints[ type ].min )\n\t\t\tvalue = this.timeConstraints[ type ].max + 1 - ( this.timeConstraints[ type ].min - value );\n\t\treturn this.pad( type, value );\n\t},\n\tpad: function( type, value ){\n\t\tvar str = value + '';\n\t\twhile ( str.length < this.padValues[ type ] )\n\t\t\tstr = '0' + str;\n\t\treturn str;\n\t}\n});\n\nmodule.exports = DateTimePickerTime;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/TimeView.js\n// module id = 7\n// module chunks = 0\n//# sourceURL=webpack:///./src/TimeView.js?"); |
| | | |
| | | /***/ }, |
| | | /* 8 */ |
| | | /***/ function(module, exports, __webpack_require__) { |
| | | |
| | | 'use strict'; |
| | | |
| | | // This is extracted from https://github.com/Pomax/react-onclickoutside |
| | | // And modified to support react 0.13 and react 0.14 |
| | | |
| | | var React = __webpack_require__(2), |
| | | version = React.version && React.version.split('.') |
| | | ; |
| | | |
| | | if ( version && ( version[0] > 0 || version[1] > 13 ) ) |
| | | React = __webpack_require__(9); |
| | | |
| | | // Use a parallel array because we can't use |
| | | // objects as keys, they get toString-coerced |
| | | var registeredComponents = []; |
| | | var handlers = []; |
| | | |
| | | var IGNORE_CLASS = 'ignore-react-onclickoutside'; |
| | | |
| | | var isSourceFound = function(source, localNode) { |
| | | if (source === localNode) { |
| | | return true; |
| | | } |
| | | // SVG <use/> elements do not technically reside in the rendered DOM, so |
| | | // they do not have classList directly, but they offer a link to their |
| | | // corresponding element, which can have classList. This extra check is for |
| | | // that case. |
| | | // See: http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGUseElement |
| | | // Discussion: https://github.com/Pomax/react-onclickoutside/pull/17 |
| | | if (source.correspondingElement) { |
| | | return source.correspondingElement.classList.contains(IGNORE_CLASS); |
| | | } |
| | | return source.classList.contains(IGNORE_CLASS); |
| | | }; |
| | | |
| | | module.exports = { |
| | | componentDidMount: function() { |
| | | if (typeof this.handleClickOutside !== 'function') |
| | | throw new Error('Component lacks a handleClickOutside(event) function for processing outside click events.'); |
| | | |
| | | var fn = this.__outsideClickHandler = (function(localNode, eventHandler) { |
| | | return function(evt) { |
| | | evt.stopPropagation(); |
| | | var source = evt.target; |
| | | var found = false; |
| | | // If source=local then this event came from "somewhere" |
| | | // inside and should be ignored. We could handle this with |
| | | // a layered approach, too, but that requires going back to |
| | | // thinking in terms of Dom node nesting, running counter |
| | | // to React's "you shouldn't care about the DOM" philosophy. |
| | | while (source.parentNode) { |
| | | found = isSourceFound(source, localNode); |
| | | if (found) return; |
| | | source = source.parentNode; |
| | | } |
| | | eventHandler(evt); |
| | | }; |
| | | }(React.findDOMNode(this), this.handleClickOutside)); |
| | | |
| | | var pos = registeredComponents.length; |
| | | registeredComponents.push(this); |
| | | handlers[pos] = fn; |
| | | |
| | | // If there is a truthy disableOnClickOutside property for this |
| | | // component, don't immediately start listening for outside events. |
| | | if (!this.props.disableOnClickOutside) { |
| | | this.enableOnClickOutside(); |
| | | } |
| | | }, |
| | | |
| | | componentWillUnmount: function() { |
| | | this.disableOnClickOutside(); |
| | | this.__outsideClickHandler = false; |
| | | var pos = registeredComponents.indexOf(this); |
| | | if ( pos>-1) { |
| | | if (handlers[pos]) { |
| | | // clean up so we don't leak memory |
| | | handlers.splice(pos, 1); |
| | | registeredComponents.splice(pos, 1); |
| | | } |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * Can be called to explicitly enable event listening |
| | | * for clicks and touches outside of this element. |
| | | */ |
| | | enableOnClickOutside: function() { |
| | | var fn = this.__outsideClickHandler; |
| | | document.addEventListener('mousedown', fn); |
| | | document.addEventListener('touchstart', fn); |
| | | }, |
| | | |
| | | /** |
| | | * Can be called to explicitly disable event listening |
| | | * for clicks and touches outside of this element. |
| | | */ |
| | | disableOnClickOutside: function() { |
| | | var fn = this.__outsideClickHandler; |
| | | document.removeEventListener('mousedown', fn); |
| | | document.removeEventListener('touchstart', fn); |
| | | } |
| | | }; |
| | | |
| | | eval("'use strict';\n\n// This is extracted from https://github.com/Pomax/react-onclickoutside\n// And modified to support react 0.13 and react 0.14\n\nvar React = __webpack_require__(2),\n\tversion = React.version && React.version.split('.')\n;\n\nif ( version && ( version[0] > 0 || version[1] > 13 ) )\n\tReact = __webpack_require__(9);\n\n// Use a parallel array because we can't use\n// objects as keys, they get toString-coerced\nvar registeredComponents = [];\nvar handlers = [];\n\nvar IGNORE_CLASS = 'ignore-react-onclickoutside';\n\nvar isSourceFound = function(source, localNode) {\n if (source === localNode) {\n return true;\n }\n // SVG <use/> elements do not technically reside in the rendered DOM, so\n // they do not have classList directly, but they offer a link to their\n // corresponding element, which can have classList. This extra check is for\n // that case.\n // See: http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGUseElement\n // Discussion: https://github.com/Pomax/react-onclickoutside/pull/17\n if (source.correspondingElement) {\n return source.correspondingElement.classList.contains(IGNORE_CLASS);\n }\n return source.classList.contains(IGNORE_CLASS);\n};\n\nmodule.exports = {\n componentDidMount: function() {\n if (typeof this.handleClickOutside !== 'function')\n throw new Error('Component lacks a handleClickOutside(event) function for processing outside click events.');\n\n var fn = this.__outsideClickHandler = (function(localNode, eventHandler) {\n return function(evt) {\n evt.stopPropagation();\n var source = evt.target;\n var found = false;\n // If source=local then this event came from \"somewhere\"\n // inside and should be ignored. We could handle this with\n // a layered approach, too, but that requires going back to\n // thinking in terms of Dom node nesting, running counter\n // to React's \"you shouldn't care about the DOM\" philosophy.\n while (source.parentNode) {\n found = isSourceFound(source, localNode);\n if (found) return;\n source = source.parentNode;\n }\n eventHandler(evt);\n };\n }(React.findDOMNode(this), this.handleClickOutside));\n\n var pos = registeredComponents.length;\n registeredComponents.push(this);\n handlers[pos] = fn;\n\n // If there is a truthy disableOnClickOutside property for this\n // component, don't immediately start listening for outside events.\n if (!this.props.disableOnClickOutside) {\n this.enableOnClickOutside();\n }\n },\n\n componentWillUnmount: function() {\n this.disableOnClickOutside();\n this.__outsideClickHandler = false;\n var pos = registeredComponents.indexOf(this);\n if ( pos>-1) {\n if (handlers[pos]) {\n // clean up so we don't leak memory\n handlers.splice(pos, 1);\n registeredComponents.splice(pos, 1);\n }\n }\n },\n\n /**\n * Can be called to explicitly enable event listening\n * for clicks and touches outside of this element.\n */\n enableOnClickOutside: function() {\n var fn = this.__outsideClickHandler;\n document.addEventListener('mousedown', fn);\n document.addEventListener('touchstart', fn);\n },\n\n /**\n * Can be called to explicitly disable event listening\n * for clicks and touches outside of this element.\n */\n disableOnClickOutside: function() {\n var fn = this.__outsideClickHandler;\n document.removeEventListener('mousedown', fn);\n document.removeEventListener('touchstart', fn);\n }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/onClickOutside.js\n// module id = 8\n// module chunks = 0\n//# sourceURL=webpack:///./src/onClickOutside.js?"); |
| | | |
| | | /***/ }, |
| | | /* 9 */ |
| | | /***/ function(module, exports) { |
| | | |
| | | module.exports = __WEBPACK_EXTERNAL_MODULE_9__; |
| | | eval("module.exports = __WEBPACK_EXTERNAL_MODULE_9__;\n\n//////////////////\n// WEBPACK FOOTER\n// external \"ReactDOM\"\n// module id = 9\n// module chunks = 0\n//# sourceURL=webpack:///external_%22ReactDOM%22?"); |
| | | |
| | | /***/ } |
| | | /******/ ]) |
| | | }); |
| | | ; |
| | | //# sourceMappingURL=react-datetime.js.map |
| | | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJyZWFjdC1kYXRldGltZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJSZWFjdFwiKSwgcmVxdWlyZShcIm1vbWVudFwiKSwgcmVxdWlyZShcIlJlYWN0RE9NXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcIlJlYWN0XCIsIFwibW9tZW50XCIsIFwiUmVhY3RET01cIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiRGF0ZXRpbWVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJSZWFjdFwiKSwgcmVxdWlyZShcIm1vbWVudFwiKSwgcmVxdWlyZShcIlJlYWN0RE9NXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJEYXRldGltZVwiXSA9IGZhY3Rvcnkocm9vdFtcIlJlYWN0XCJdLCByb290W1wibW9tZW50XCJdLCByb290W1wiUmVhY3RET01cIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8yX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzlfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG5cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG5cblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMSksXG5cdFx0UmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLFxuXHRcdERheXNWaWV3ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKSxcblx0XHRNb250aHNWaWV3ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KSxcblx0XHRZZWFyc1ZpZXcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLFxuXHRcdFRpbWVWaWV3ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KSxcblx0XHRtb21lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpXG5cdDtcblxuXHR2YXIgVFlQRVMgPSBSZWFjdC5Qcm9wVHlwZXM7XG5cdHZhciBEYXRldGltZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0XHRtaXhpbnM6IFtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18oOClcblx0XHRdLFxuXHRcdHZpZXdDb21wb25lbnRzOiB7XG5cdFx0XHRkYXlzOiBEYXlzVmlldyxcblx0XHRcdG1vbnRoczogTW9udGhzVmlldyxcblx0XHRcdHllYXJzOiBZZWFyc1ZpZXcsXG5cdFx0XHR0aW1lOiBUaW1lVmlld1xuXHRcdH0sXG5cdFx0cHJvcFR5cGVzOiB7XG5cdFx0XHQvLyB2YWx1ZTogVFlQRVMub2JqZWN0IHwgVFlQRVMuc3RyaW5nLFxuXHRcdFx0Ly8gZGVmYXVsdFZhbHVlOiBUWVBFUy5vYmplY3QgfCBUWVBFUy5zdHJpbmcsXG5cdFx0XHRvbkZvY3VzOiBUWVBFUy5mdW5jLFxuXHRcdFx0b25CbHVyOiBUWVBFUy5mdW5jLFxuXHRcdFx0b25DaGFuZ2U6IFRZUEVTLmZ1bmMsXG5cdFx0XHRsb2NhbGU6IFRZUEVTLnN0cmluZyxcblx0XHRcdGlucHV0OiBUWVBFUy5ib29sLFxuXHRcdFx0Ly8gZGF0ZUZvcm1hdDogVFlQRVMuc3RyaW5nIHwgVFlQRVMuYm9vbCxcblx0XHRcdC8vIHRpbWVGb3JtYXQ6IFRZUEVTLnN0cmluZyB8IFRZUEVTLmJvb2wsXG5cdFx0XHRpbnB1dFByb3BzOiBUWVBFUy5vYmplY3QsXG5cdFx0XHR0aW1lQ29uc3RyYWludHM6IFRZUEVTLm9iamVjdCxcblx0XHRcdHZpZXdNb2RlOiBUWVBFUy5vbmVPZihbJ3llYXJzJywgJ21vbnRocycsICdkYXlzJywgJ3RpbWUnXSksXG5cdFx0XHRpc1ZhbGlkRGF0ZTogVFlQRVMuZnVuYyxcblx0XHRcdG9wZW46IFRZUEVTLmJvb2wsXG5cdFx0XHRzdHJpY3RQYXJzaW5nOiBUWVBFUy5ib29sLFxuXHRcdFx0Y2xvc2VPblNlbGVjdDogVFlQRVMuYm9vbCxcblx0XHRcdGNsb3NlT25UYWI6IFRZUEVTLmJvb2xcblx0XHR9LFxuXG5cdFx0Z2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBub2YgPSBmdW5jdGlvbigpe307XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjbGFzc05hbWU6ICcnLFxuXHRcdFx0XHRkZWZhdWx0VmFsdWU6ICcnLFxuXHRcdFx0XHRpbnB1dFByb3BzOiB7fSxcblx0XHRcdFx0aW5wdXQ6IHRydWUsXG5cdFx0XHRcdG9uRm9jdXM6IG5vZixcblx0XHRcdFx0b25CbHVyOiBub2YsXG5cdFx0XHRcdG9uQ2hhbmdlOiBub2YsXG5cdFx0XHRcdHRpbWVGb3JtYXQ6IHRydWUsXG5cdFx0XHRcdHRpbWVDb25zdHJhaW50czoge30sXG5cdFx0XHRcdGRhdGVGb3JtYXQ6IHRydWUsXG5cdFx0XHRcdHN0cmljdFBhcnNpbmc6IHRydWUsXG5cdFx0XHRcdGNsb3NlT25TZWxlY3Q6IGZhbHNlLFxuXHRcdFx0XHRjbG9zZU9uVGFiOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXG5cdFx0XHRpZiAoIHN0YXRlLm9wZW4gPT09IHVuZGVmaW5lZCApXG5cdFx0XHRcdHN0YXRlLm9wZW4gPSAhdGhpcy5wcm9wcy5pbnB1dDtcblxuXHRcdFx0c3RhdGUuY3VycmVudFZpZXcgPSB0aGlzLnByb3BzLmRhdGVGb3JtYXQgPyAodGhpcy5wcm9wcy52aWV3TW9kZSB8fCBzdGF0ZS51cGRhdGVPbiB8fCAnZGF5cycpIDogJ3RpbWUnO1xuXG5cdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0fSxcblxuXHRcdGdldFN0YXRlRnJvbVByb3BzOiBmdW5jdGlvbiggcHJvcHMgKXtcblx0XHRcdHZhciBmb3JtYXRzID0gdGhpcy5nZXRGb3JtYXRzKCBwcm9wcyApLFxuXHRcdFx0XHRkYXRlID0gcHJvcHMudmFsdWUgfHwgcHJvcHMuZGVmYXVsdFZhbHVlLFxuXHRcdFx0XHRzZWxlY3RlZERhdGUsIHZpZXdEYXRlLCB1cGRhdGVPbiwgaW5wdXRWYWx1ZVxuXHRcdFx0O1xuXG5cdFx0XHRpZiAoIGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnIClcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5sb2NhbE1vbWVudCggZGF0ZSwgZm9ybWF0cy5kYXRldGltZSApO1xuXHRcdFx0ZWxzZSBpZiAoIGRhdGUgKVxuXHRcdFx0XHRzZWxlY3RlZERhdGUgPSB0aGlzLmxvY2FsTW9tZW50KCBkYXRlICk7XG5cblx0XHRcdGlmICggc2VsZWN0ZWREYXRlICYmICFzZWxlY3RlZERhdGUuaXNWYWxpZCgpIClcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gbnVsbDtcblxuXHRcdFx0dmlld0RhdGUgPSBzZWxlY3RlZERhdGUgP1xuXHRcdFx0XHRzZWxlY3RlZERhdGUuY2xvbmUoKS5zdGFydE9mKCdtb250aCcpIDpcblx0XHRcdFx0dGhpcy5sb2NhbE1vbWVudCgpLnN0YXJ0T2YoJ21vbnRoJylcblx0XHRcdDtcblxuXHRcdFx0dXBkYXRlT24gPSB0aGlzLmdldFVwZGF0ZU9uKGZvcm1hdHMpO1xuXG5cdFx0XHRpZiAoIHNlbGVjdGVkRGF0ZSApXG5cdFx0XHRcdGlucHV0VmFsdWUgPSBzZWxlY3RlZERhdGUuZm9ybWF0KGZvcm1hdHMuZGF0ZXRpbWUpO1xuXHRcdFx0ZWxzZSBpZiAoIGRhdGUuaXNWYWxpZCAmJiAhZGF0ZS5pc1ZhbGlkKCkgKVxuXHRcdFx0XHRpbnB1dFZhbHVlID0gJyc7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlucHV0VmFsdWUgPSBkYXRlIHx8ICcnO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR1cGRhdGVPbjogdXBkYXRlT24sXG5cdFx0XHRcdGlucHV0Rm9ybWF0OiBmb3JtYXRzLmRhdGV0aW1lLFxuXHRcdFx0XHR2aWV3RGF0ZTogdmlld0RhdGUsXG5cdFx0XHRcdHNlbGVjdGVkRGF0ZTogc2VsZWN0ZWREYXRlLFxuXHRcdFx0XHRpbnB1dFZhbHVlOiBpbnB1dFZhbHVlLFxuXHRcdFx0XHRvcGVuOiBwcm9wcy5vcGVuXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRnZXRVcGRhdGVPbjogZnVuY3Rpb24oZm9ybWF0cyl7XG5cdFx0XHRpZiAoIGZvcm1hdHMuZGF0ZS5tYXRjaCgvW2xMRF0vKSApe1xuXHRcdFx0XHRyZXR1cm4gJ2RheXMnO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIGZvcm1hdHMuZGF0ZS5pbmRleE9mKCdNJykgIT09IC0xICl7XG5cdFx0XHRcdHJldHVybiAnbW9udGhzJztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKCBmb3JtYXRzLmRhdGUuaW5kZXhPZignWScpICE9PSAtMSApe1xuXHRcdFx0XHRyZXR1cm4gJ3llYXJzJztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICdkYXlzJztcblx0XHR9LFxuXG5cdFx0Z2V0Rm9ybWF0czogZnVuY3Rpb24oIHByb3BzICl7XG5cdFx0XHR2YXIgZm9ybWF0cyA9IHtcblx0XHRcdFx0XHRkYXRlOiBwcm9wcy5kYXRlRm9ybWF0IHx8ICcnLFxuXHRcdFx0XHRcdHRpbWU6IHByb3BzLnRpbWVGb3JtYXQgfHwgJydcblx0XHRcdFx0fSxcblx0XHRcdFx0bG9jYWxlID0gdGhpcy5sb2NhbE1vbWVudCggcHJvcHMuZGF0ZSApLmxvY2FsZURhdGEoKVxuXHRcdFx0O1xuXG5cdFx0XHRpZiAoIGZvcm1hdHMuZGF0ZSA9PT0gdHJ1ZSApe1xuXHRcdFx0XHRmb3JtYXRzLmRhdGUgPSBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoJ0wnKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKCB0aGlzLmdldFVwZGF0ZU9uKGZvcm1hdHMpICE9PSAnZGF5cycgKXtcblx0XHRcdFx0Zm9ybWF0cy50aW1lID0gJyc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZm9ybWF0cy50aW1lID09PSB0cnVlICl7XG5cdFx0XHRcdGZvcm1hdHMudGltZSA9IGxvY2FsZS5sb25nRGF0ZUZvcm1hdCgnTFQnKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9ybWF0cy5kYXRldGltZSA9IGZvcm1hdHMuZGF0ZSAmJiBmb3JtYXRzLnRpbWUgP1xuXHRcdFx0XHRmb3JtYXRzLmRhdGUgKyAnICcgKyBmb3JtYXRzLnRpbWUgOlxuXHRcdFx0XHRmb3JtYXRzLmRhdGUgfHwgZm9ybWF0cy50aW1lXG5cdFx0XHQ7XG5cblx0XHRcdHJldHVybiBmb3JtYXRzO1xuXHRcdH0sXG5cblx0XHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbihuZXh0UHJvcHMpIHtcblx0XHRcdHZhciBmb3JtYXRzID0gdGhpcy5nZXRGb3JtYXRzKCBuZXh0UHJvcHMgKSxcblx0XHRcdFx0dXBkYXRlID0ge31cblx0XHRcdDtcblxuXHRcdFx0aWYgKCBuZXh0UHJvcHMudmFsdWUgIT09IHRoaXMucHJvcHMudmFsdWUgKXtcblx0XHRcdFx0dXBkYXRlID0gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggbmV4dFByb3BzICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGZvcm1hdHMuZGF0ZXRpbWUgIT09IHRoaXMuZ2V0Rm9ybWF0cyggdGhpcy5wcm9wcyApLmRhdGV0aW1lICkge1xuXHRcdFx0XHR1cGRhdGUuaW5wdXRGb3JtYXQgPSBmb3JtYXRzLmRhdGV0aW1lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHVwZGF0ZS5vcGVuID09PSB1bmRlZmluZWQgKXtcblx0XHRcdFx0aWYgKCB0aGlzLnByb3BzLmNsb3NlT25TZWxlY3QgJiYgdGhpcy5zdGF0ZS5jdXJyZW50VmlldyAhPT0gJ3RpbWUnICl7XG5cdFx0XHRcdFx0dXBkYXRlLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR1cGRhdGUub3BlbiA9IHRoaXMuc3RhdGUub3Blbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldFN0YXRlKCB1cGRhdGUgKTtcblx0XHR9LFxuXG5cdFx0b25JbnB1dENoYW5nZTogZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSBlLnRhcmdldCA9PT0gbnVsbCA/IGUgOiBlLnRhcmdldC52YWx1ZSxcblx0XHRcdFx0bG9jYWxNb21lbnQgPSB0aGlzLmxvY2FsTW9tZW50KCB2YWx1ZSwgdGhpcy5zdGF0ZS5pbnB1dEZvcm1hdCApLFxuXHRcdFx0XHR1cGRhdGUgPSB7IGlucHV0VmFsdWU6IHZhbHVlIH1cblx0XHRcdDtcblxuXHRcdFx0aWYgKCBsb2NhbE1vbWVudC5pc1ZhbGlkKCkgJiYgIXRoaXMucHJvcHMudmFsdWUgKSB7XG5cdFx0XHRcdHVwZGF0ZS5zZWxlY3RlZERhdGUgPSBsb2NhbE1vbWVudDtcblx0XHRcdFx0dXBkYXRlLnZpZXdEYXRlID0gbG9jYWxNb21lbnQuY2xvbmUoKS5zdGFydE9mKCdtb250aCcpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHVwZGF0ZS5zZWxlY3RlZERhdGUgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRTdGF0ZSggdXBkYXRlLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvcHMub25DaGFuZ2UoIGxvY2FsTW9tZW50LmlzVmFsaWQoKSA/IGxvY2FsTW9tZW50IDogdGhpcy5zdGF0ZS5pbnB1dFZhbHVlICk7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0b25JbnB1dEtleTogZnVuY3Rpb24oIGUgKXtcblx0XHRcdGlmICggZS53aGljaCA9PT0gOSAmJiB0aGlzLnByb3BzLmNsb3NlT25UYWIgKXtcblx0XHRcdFx0dGhpcy5jbG9zZUNhbGVuZGFyKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNob3dWaWV3OiBmdW5jdGlvbiggdmlldyApe1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHJldHVybiBmdW5jdGlvbigpe1xuXHRcdFx0XHRtZS5zZXRTdGF0ZSh7IGN1cnJlbnRWaWV3OiB2aWV3IH0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0c2V0RGF0ZTogZnVuY3Rpb24oIHR5cGUgKXtcblx0XHRcdHZhciBtZSA9IHRoaXMsXG5cdFx0XHRcdG5leHRWaWV3cyA9IHtcblx0XHRcdFx0XHRtb250aDogJ2RheXMnLFxuXHRcdFx0XHRcdHllYXI6ICdtb250aHMnXG5cdFx0XHRcdH1cblx0XHRcdDtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZSApe1xuXHRcdFx0XHRtZS5zZXRTdGF0ZSh7XG5cdFx0XHRcdFx0dmlld0RhdGU6IG1lLnN0YXRlLnZpZXdEYXRlLmNsb25lKClbIHR5cGUgXSggcGFyc2VJbnQoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyksIDEwKSApLnN0YXJ0T2YoIHR5cGUgKSxcblx0XHRcdFx0XHRjdXJyZW50VmlldzogbmV4dFZpZXdzWyB0eXBlIF1cblx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRhZGRUaW1lOiBmdW5jdGlvbiggYW1vdW50LCB0eXBlLCB0b1NlbGVjdGVkICl7XG5cdFx0XHRyZXR1cm4gdGhpcy51cGRhdGVUaW1lKCAnYWRkJywgYW1vdW50LCB0eXBlLCB0b1NlbGVjdGVkICk7XG5cdFx0fSxcblxuXHRcdHN1YnRyYWN0VGltZTogZnVuY3Rpb24oIGFtb3VudCwgdHlwZSwgdG9TZWxlY3RlZCApe1xuXHRcdFx0cmV0dXJuIHRoaXMudXBkYXRlVGltZSggJ3N1YnRyYWN0JywgYW1vdW50LCB0eXBlLCB0b1NlbGVjdGVkICk7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZVRpbWU6IGZ1bmN0aW9uKCBvcCwgYW1vdW50LCB0eXBlLCB0b1NlbGVjdGVkICl7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKXtcblx0XHRcdFx0dmFyIHVwZGF0ZSA9IHt9LFxuXHRcdFx0XHRcdGRhdGUgPSB0b1NlbGVjdGVkID8gJ3NlbGVjdGVkRGF0ZScgOiAndmlld0RhdGUnXG5cdFx0XHRcdDtcblxuXHRcdFx0XHR1cGRhdGVbIGRhdGUgXSA9IG1lLnN0YXRlWyBkYXRlIF0uY2xvbmUoKVsgb3AgXSggYW1vdW50LCB0eXBlICk7XG5cblx0XHRcdFx0bWUuc2V0U3RhdGUoIHVwZGF0ZSApO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0YWxsb3dlZFNldFRpbWU6IFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddLFxuXHRcdHNldFRpbWU6IGZ1bmN0aW9uKCB0eXBlLCB2YWx1ZSApe1xuXHRcdFx0dmFyIGluZGV4ID0gdGhpcy5hbGxvd2VkU2V0VGltZS5pbmRleE9mKCB0eXBlICkgKyAxLFxuXHRcdFx0XHRzdGF0ZSA9IHRoaXMuc3RhdGUsXG5cdFx0XHRcdGRhdGUgPSAoc3RhdGUuc2VsZWN0ZWREYXRlIHx8IHN0YXRlLnZpZXdEYXRlKS5jbG9uZSgpLFxuXHRcdFx0XHRuZXh0VHlwZVxuXHRcdFx0O1xuXG5cdFx0XHQvLyBJdCBpcyBuZWVkZWQgdG8gc2V0IGFsbCB0aGUgdGltZSBwcm9wZXJ0aWVzXG5cdFx0XHQvLyB0byBub3QgdG8gcmVzZXQgdGhlIHRpbWVcblx0XHRcdGRhdGVbIHR5cGUgXSggdmFsdWUgKTtcblx0XHRcdGZvciAoOyBpbmRleCA8IHRoaXMuYWxsb3dlZFNldFRpbWUubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRcdG5leHRUeXBlID0gdGhpcy5hbGxvd2VkU2V0VGltZVtpbmRleF07XG5cdFx0XHRcdGRhdGVbIG5leHRUeXBlIF0oIGRhdGVbbmV4dFR5cGVdKCkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhdGhpcy5wcm9wcy52YWx1ZSApe1xuXHRcdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0XHRzZWxlY3RlZERhdGU6IGRhdGUsXG5cdFx0XHRcdFx0aW5wdXRWYWx1ZTogZGF0ZS5mb3JtYXQoIHN0YXRlLmlucHV0Rm9ybWF0IClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnByb3BzLm9uQ2hhbmdlKCBkYXRlICk7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZVNlbGVjdGVkRGF0ZTogZnVuY3Rpb24oIGUsIGNsb3NlICkge1xuXHRcdFx0dmFyIHRhcmdldCA9IGUudGFyZ2V0LFxuXHRcdFx0XHRtb2RpZmllciA9IDAsXG5cdFx0XHRcdHZpZXdEYXRlID0gdGhpcy5zdGF0ZS52aWV3RGF0ZSxcblx0XHRcdFx0Y3VycmVudERhdGUgPSB0aGlzLnN0YXRlLnNlbGVjdGVkRGF0ZSB8fCB2aWV3RGF0ZSxcblx0XHRcdFx0ZGF0ZVxuXHQgICAgO1xuXG5cdFx0XHRpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdyZHREYXknKSAhPT0gLTEpe1xuXHRcdFx0XHRpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdyZHROZXcnKSAhPT0gLTEpXG5cdFx0XHRcdFx0bW9kaWZpZXIgPSAxO1xuXHRcdFx0XHRlbHNlIGlmICh0YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3JkdE9sZCcpICE9PSAtMSlcblx0XHRcdFx0XHRtb2RpZmllciA9IC0xO1xuXG5cdFx0XHRcdGRhdGUgPSB2aWV3RGF0ZS5jbG9uZSgpXG5cdFx0XHRcdFx0Lm1vbnRoKCB2aWV3RGF0ZS5tb250aCgpICsgbW9kaWZpZXIgKVxuXHRcdFx0XHRcdC5kYXRlKCBwYXJzZUludCggdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLCAxMCApICk7XG5cdFx0XHR9IGVsc2UgaWYgKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigncmR0TW9udGgnKSAhPT0gLTEpe1xuXHRcdFx0XHRkYXRlID0gdmlld0RhdGUuY2xvbmUoKVxuXHRcdFx0XHRcdC5tb250aCggcGFyc2VJbnQoIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSwgMTAgKSApXG5cdFx0XHRcdFx0LmRhdGUoIGN1cnJlbnREYXRlLmRhdGUoKSApO1xuXHRcdFx0fSBlbHNlIGlmICh0YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3JkdFllYXInKSAhPT0gLTEpe1xuXHRcdFx0XHRkYXRlID0gdmlld0RhdGUuY2xvbmUoKVxuXHRcdFx0XHRcdC5tb250aCggY3VycmVudERhdGUubW9udGgoKSApXG5cdFx0XHRcdFx0LmRhdGUoIGN1cnJlbnREYXRlLmRhdGUoKSApXG5cdFx0XHRcdFx0LnllYXIoIHBhcnNlSW50KCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyksIDEwICkgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGF0ZS5ob3VycyggY3VycmVudERhdGUuaG91cnMoKSApXG5cdFx0XHRcdC5taW51dGVzKCBjdXJyZW50RGF0ZS5taW51dGVzKCkgKVxuXHRcdFx0XHQuc2Vjb25kcyggY3VycmVudERhdGUuc2Vjb25kcygpIClcblx0XHRcdFx0Lm1pbGxpc2Vjb25kcyggY3VycmVudERhdGUubWlsbGlzZWNvbmRzKCkgKTtcblxuXHRcdFx0aWYgKCAhdGhpcy5wcm9wcy52YWx1ZSApe1xuXHRcdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0XHRzZWxlY3RlZERhdGU6IGRhdGUsXG5cdFx0XHRcdFx0dmlld0RhdGU6IGRhdGUuY2xvbmUoKS5zdGFydE9mKCdtb250aCcpLFxuXHRcdFx0XHRcdGlucHV0VmFsdWU6IGRhdGUuZm9ybWF0KCB0aGlzLnN0YXRlLmlucHV0Rm9ybWF0ICksXG5cdFx0XHRcdFx0b3BlbjogISh0aGlzLnByb3BzLmNsb3NlT25TZWxlY3QgJiYgY2xvc2UgKVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh0aGlzLnByb3BzLmNsb3NlT25TZWxlY3QgJiYgY2xvc2UpIHtcblx0XHRcdFx0XHR0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb3BzLm9uQ2hhbmdlKCBkYXRlICk7XG5cdFx0fSxcblxuXHRcdG9wZW5DYWxlbmRhcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIXRoaXMuc3RhdGUub3Blbikge1xuXHRcdFx0XHR0aGlzLnByb3BzLm9uRm9jdXMoKTtcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7IG9wZW46IHRydWUgfSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGNsb3NlQ2FsZW5kYXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IG9wZW46IGZhbHNlIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5vbkJsdXIoIHRoaXMuc3RhdGUuc2VsZWN0ZWREYXRlIHx8IHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSApO1xuXHRcdH0sXG5cblx0XHRoYW5kbGVDbGlja091dHNpZGU6IGZ1bmN0aW9uKCl7XG5cdFx0XHRpZiAoIHRoaXMucHJvcHMuaW5wdXQgJiYgdGhpcy5zdGF0ZS5vcGVuICYmICF0aGlzLnByb3BzLm9wZW4gKXtcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7IG9wZW46IGZhbHNlIH0pO1xuXHRcdFx0XHR0aGlzLnByb3BzLm9uQmx1ciggdGhpcy5zdGF0ZS5zZWxlY3RlZERhdGUgfHwgdGhpcy5zdGF0ZS5pbnB1dFZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGxvY2FsTW9tZW50OiBmdW5jdGlvbiggZGF0ZSwgZm9ybWF0ICl7XG5cdFx0XHR2YXIgbSA9IG1vbWVudCggZGF0ZSwgZm9ybWF0LCB0aGlzLnByb3BzLnN0cmljdFBhcnNpbmcgKTtcblx0XHRcdGlmICggdGhpcy5wcm9wcy5sb2NhbGUgKVxuXHRcdFx0XHRtLmxvY2FsZSggdGhpcy5wcm9wcy5sb2NhbGUgKTtcblx0XHRcdHJldHVybiBtO1xuXHRcdH0sXG5cblx0XHRjb21wb25lbnRQcm9wczoge1xuXHRcdFx0ZnJvbVByb3BzOiBbJ3ZhbHVlJywgJ2lzVmFsaWREYXRlJywgJ3JlbmRlckRheScsICdyZW5kZXJNb250aCcsICdyZW5kZXJZZWFyJywgJ3RpbWVDb25zdHJhaW50cyddLFxuXHRcdFx0ZnJvbVN0YXRlOiBbJ3ZpZXdEYXRlJywgJ3NlbGVjdGVkRGF0ZScsICd1cGRhdGVPbiddLFxuXHRcdFx0ZnJvbVRoaXM6IFsnc2V0RGF0ZScsICdzZXRUaW1lJywgJ3Nob3dWaWV3JywgJ2FkZFRpbWUnLCAnc3VidHJhY3RUaW1lJywgJ3VwZGF0ZVNlbGVjdGVkRGF0ZScsICdsb2NhbE1vbWVudCddXG5cdFx0fSxcblxuXHRcdGdldENvbXBvbmVudFByb3BzOiBmdW5jdGlvbigpe1xuXHRcdFx0dmFyIG1lID0gdGhpcyxcblx0XHRcdFx0Zm9ybWF0cyA9IHRoaXMuZ2V0Rm9ybWF0cyggdGhpcy5wcm9wcyApLFxuXHRcdFx0XHRwcm9wcyA9IHtkYXRlRm9ybWF0OiBmb3JtYXRzLmRhdGUsIHRpbWVGb3JtYXQ6IGZvcm1hdHMudGltZX1cblx0XHRcdDtcblxuXHRcdFx0dGhpcy5jb21wb25lbnRQcm9wcy5mcm9tUHJvcHMuZm9yRWFjaCggZnVuY3Rpb24oIG5hbWUgKXtcblx0XHRcdFx0cHJvcHNbIG5hbWUgXSA9IG1lLnByb3BzWyBuYW1lIF07XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuY29tcG9uZW50UHJvcHMuZnJvbVN0YXRlLmZvckVhY2goIGZ1bmN0aW9uKCBuYW1lICl7XG5cdFx0XHRcdHByb3BzWyBuYW1lIF0gPSBtZS5zdGF0ZVsgbmFtZSBdO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmNvbXBvbmVudFByb3BzLmZyb21UaGlzLmZvckVhY2goIGZ1bmN0aW9uKCBuYW1lICl7XG5cdFx0XHRcdHByb3BzWyBuYW1lIF0gPSBtZVsgbmFtZSBdO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBwcm9wcztcblx0XHR9LFxuXG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBDb21wb25lbnQgPSB0aGlzLnZpZXdDb21wb25lbnRzWyB0aGlzLnN0YXRlLmN1cnJlbnRWaWV3IF0sXG5cdFx0XHRcdERPTSA9IFJlYWN0LkRPTSxcblx0XHRcdFx0Y2xhc3NOYW1lID0gJ3JkdCcgKyAodGhpcy5wcm9wcy5jbGFzc05hbWUgP1xuXHQgICAgICAgICAgICAgICAgICAoIEFycmF5LmlzQXJyYXkoIHRoaXMucHJvcHMuY2xhc3NOYW1lICkgP1xuXHQgICAgICAgICAgICAgICAgICAnICcgKyB0aGlzLnByb3BzLmNsYXNzTmFtZS5qb2luKCAnICcgKSA6ICcgJyArIHRoaXMucHJvcHMuY2xhc3NOYW1lKSA6ICcnKSxcblx0XHRcdFx0Y2hpbGRyZW4gPSBbXVxuXHRcdFx0O1xuXG5cdFx0XHRpZiAoIHRoaXMucHJvcHMuaW5wdXQgKXtcblx0XHRcdFx0Y2hpbGRyZW4gPSBbIERPTS5pbnB1dCggYXNzaWduKHtcblx0XHRcdFx0XHRrZXk6ICdpJyxcblx0XHRcdFx0XHR0eXBlOid0ZXh0Jyxcblx0XHRcdFx0XHRjbGFzc05hbWU6ICdmb3JtLWNvbnRyb2wnLFxuXHRcdFx0XHRcdG9uRm9jdXM6IHRoaXMub3BlbkNhbGVuZGFyLFxuXHRcdFx0XHRcdG9uQ2hhbmdlOiB0aGlzLm9uSW5wdXRDaGFuZ2UsXG5cdFx0XHRcdFx0b25LZXlEb3duOiB0aGlzLm9uSW5wdXRLZXksXG5cdFx0XHRcdFx0dmFsdWU6IHRoaXMuc3RhdGUuaW5wdXRWYWx1ZVxuXHRcdFx0XHR9LCB0aGlzLnByb3BzLmlucHV0UHJvcHMgKSldO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xhc3NOYW1lICs9ICcgcmR0U3RhdGljJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLnN0YXRlLm9wZW4gKVxuXHRcdFx0XHRjbGFzc05hbWUgKz0gJyByZHRPcGVuJztcblxuXHRcdFx0cmV0dXJuIERPTS5kaXYoe2NsYXNzTmFtZTogY2xhc3NOYW1lfSwgY2hpbGRyZW4uY29uY2F0KFxuXHRcdFx0XHRET00uZGl2KFxuXHRcdFx0XHRcdHsga2V5OiAnZHQnLCBjbGFzc05hbWU6ICdyZHRQaWNrZXInIH0sXG5cdFx0XHRcdFx0UmVhY3QuY3JlYXRlRWxlbWVudCggQ29tcG9uZW50LCB0aGlzLmdldENvbXBvbmVudFByb3BzKCkpXG5cdFx0XHRcdClcblx0XHRcdCkpO1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gTWFrZSBtb21lbnQgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBEYXRldGltZSBjbGFzc1xuXHREYXRldGltZS5tb21lbnQgPSBtb21lbnQ7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBEYXRldGltZTtcblxuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cblx0ZnVuY3Rpb24gVG9PYmplY3QodmFsKSB7XG5cdFx0aWYgKHZhbCA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBPYmplY3QodmFsKTtcblx0fVxuXG5cdGZ1bmN0aW9uIG93bkVudW1lcmFibGVLZXlzKG9iaikge1xuXHRcdHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKTtcblxuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ga2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIHByb3BJc0VudW1lcmFibGUuY2FsbChvYmosIGtleSk7XG5cdFx0fSk7XG5cdH1cblxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdFx0dmFyIGZyb207XG5cdFx0dmFyIGtleXM7XG5cdFx0dmFyIHRvID0gVG9PYmplY3QodGFyZ2V0KTtcblxuXHRcdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0XHRmcm9tID0gYXJndW1lbnRzW3NdO1xuXHRcdFx0a2V5cyA9IG93bkVudW1lcmFibGVLZXlzKE9iamVjdChmcm9tKSk7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR0b1trZXlzW2ldXSA9IGZyb21ba2V5c1tpXV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRvO1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMl9fO1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMiksXG5cdFx0bW9tZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxuXHQ7XG5cblx0dmFyIERPTSA9IFJlYWN0LkRPTTtcblx0dmFyIERhdGVUaW1lUGlja2VyRGF5cyA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuXHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZm9vdGVyID0gdGhpcy5yZW5kZXJGb290ZXIoKSxcblx0XHRcdFx0ZGF0ZSA9IHRoaXMucHJvcHMudmlld0RhdGUsXG5cdFx0XHRcdGxvY2FsZSA9IGRhdGUubG9jYWxlRGF0YSgpLFxuXHRcdFx0XHR0YWJsZUNoaWxkcmVuXG5cdFx0XHQ7XG5cblx0XHRcdHRhYmxlQ2hpbGRyZW4gPSBbXG5cdFx0XHRcdERPTS50aGVhZCh7IGtleTogJ3RoJ30sIFtcblx0XHRcdFx0XHRET00udHIoeyBrZXk6ICdoJ30sIFtcblx0XHRcdFx0XHRcdERPTS50aCh7IGtleTogJ3AnLCBjbGFzc05hbWU6ICdyZHRQcmV2JyB9LCBET00uc3Bhbih7b25DbGljazogdGhpcy5wcm9wcy5zdWJ0cmFjdFRpbWUoMSwgJ21vbnRocycpfSwgJ+KAuScpKSxcblx0XHRcdFx0XHRcdERPTS50aCh7IGtleTogJ3MnLCBjbGFzc05hbWU6ICdyZHRTd2l0Y2gnLCBvbkNsaWNrOiB0aGlzLnByb3BzLnNob3dWaWV3KCdtb250aHMnKSwgY29sU3BhbjogNSwgJ2RhdGEtdmFsdWUnOiB0aGlzLnByb3BzLnZpZXdEYXRlLm1vbnRoKCkgfSwgbG9jYWxlLm1vbnRocyggZGF0ZSApICsgJyAnICsgZGF0ZS55ZWFyKCkgKSxcblx0XHRcdFx0XHRcdERPTS50aCh7IGtleTogJ24nLCBjbGFzc05hbWU6ICdyZHROZXh0JyB9LCBET00uc3Bhbih7b25DbGljazogdGhpcy5wcm9wcy5hZGRUaW1lKDEsICdtb250aHMnKX0sICfigLonKSlcblx0XHRcdFx0XHRdKSxcblx0XHRcdFx0XHRET00udHIoeyBrZXk6ICdkJ30sIHRoaXMuZ2V0RGF5c09mV2VlayggbG9jYWxlICkubWFwKCBmdW5jdGlvbiggZGF5LCBpbmRleCApeyByZXR1cm4gRE9NLnRoKHsga2V5OiBkYXkgKyBpbmRleCwgY2xhc3NOYW1lOiAnZG93J30sIGRheSApOyB9KSApXG5cdFx0XHRcdF0pLFxuXHRcdFx0XHRET00udGJvZHkoe2tleTogJ3RiJ30sIHRoaXMucmVuZGVyRGF5cygpKVxuXHRcdFx0XTtcblxuXHRcdFx0aWYgKCBmb290ZXIgKVxuXHRcdFx0XHR0YWJsZUNoaWxkcmVuLnB1c2goIGZvb3RlciApO1xuXG5cdFx0XHRyZXR1cm4gRE9NLmRpdih7IGNsYXNzTmFtZTogJ3JkdERheXMnIH0sXG5cdFx0XHRcdERPTS50YWJsZSh7fSwgdGFibGVDaGlsZHJlbiApXG5cdFx0XHQpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBHZXQgYSBsaXN0IG9mIHRoZSBkYXlzIG9mIHRoZSB3ZWVrXG5cdFx0ICogZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGxvY2FsZVxuXHRcdCAqIEByZXR1cm4ge2FycmF5fSBBIGxpc3Qgd2l0aCB0aGUgc2hvcnRuYW1lIG9mIHRoZSBkYXlzXG5cdFx0ICovXG5cdFx0Z2V0RGF5c09mV2VlazogZnVuY3Rpb24oIGxvY2FsZSApe1xuXHRcdFx0dmFyIGRheXMgPSBsb2NhbGUuX3dlZWtkYXlzTWluLFxuXHRcdFx0XHRmaXJzdCA9IGxvY2FsZS5maXJzdERheU9mV2VlaygpLFxuXHRcdFx0XHRkb3cgPSBbXSxcblx0XHRcdFx0aSA9IDBcblx0XHRcdDtcblxuXHRcdFx0ZGF5cy5mb3JFYWNoKCBmdW5jdGlvbiggZGF5ICl7XG5cdFx0XHRcdGRvd1sgKDcgKyAoaSsrKSAtIGZpcnN0KSAlIDcgXSA9IGRheTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gZG93O1xuXHRcdH0sXG5cblx0XHRyZW5kZXJEYXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkYXRlID0gdGhpcy5wcm9wcy52aWV3RGF0ZSxcblx0XHRcdFx0c2VsZWN0ZWQgPSB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZSAmJiB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZS5jbG9uZSgpLFxuXHRcdFx0XHRwcmV2TW9udGggPSBkYXRlLmNsb25lKCkuc3VidHJhY3QoIDEsICdtb250aHMnICksXG5cdFx0XHRcdGN1cnJlbnRZZWFyID0gZGF0ZS55ZWFyKCksXG5cdFx0XHRcdGN1cnJlbnRNb250aCA9IGRhdGUubW9udGgoKSxcblx0XHRcdFx0d2Vla3MgPSBbXSxcblx0XHRcdFx0ZGF5cyA9IFtdLFxuXHRcdFx0XHRyZW5kZXJlciA9IHRoaXMucHJvcHMucmVuZGVyRGF5IHx8IHRoaXMucmVuZGVyRGF5LFxuXHRcdFx0XHRpc1ZhbGlkID0gdGhpcy5wcm9wcy5pc1ZhbGlkRGF0ZSB8fCB0aGlzLmlzVmFsaWREYXRlLFxuXHRcdFx0XHRjbGFzc2VzLCBkaXNhYmxlZCwgZGF5UHJvcHMsIGN1cnJlbnREYXRlXG5cdFx0XHQ7XG5cblx0XHRcdC8vIEdvIHRvIHRoZSBsYXN0IHdlZWsgb2YgdGhlIHByZXZpb3VzIG1vbnRoXG5cdFx0XHRwcmV2TW9udGguZGF0ZSggcHJldk1vbnRoLmRheXNJbk1vbnRoKCkgKS5zdGFydE9mKCd3ZWVrJyk7XG5cdFx0XHR2YXIgbGFzdERheSA9IHByZXZNb250aC5jbG9uZSgpLmFkZCg0MiwgJ2QnKTtcblxuXHRcdFx0d2hpbGUgKCBwcmV2TW9udGguaXNCZWZvcmUoIGxhc3REYXkgKSApe1xuXHRcdFx0XHRjbGFzc2VzID0gJ3JkdERheSc7XG5cdFx0XHRcdGN1cnJlbnREYXRlID0gcHJldk1vbnRoLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCAoIHByZXZNb250aC55ZWFyKCkgPT09IGN1cnJlbnRZZWFyICYmIHByZXZNb250aC5tb250aCgpIDwgY3VycmVudE1vbnRoICkgfHwgKCBwcmV2TW9udGgueWVhcigpIDwgY3VycmVudFllYXIgKSApXG5cdFx0XHRcdFx0Y2xhc3NlcyArPSAnIHJkdE9sZCc7XG5cdFx0XHRcdGVsc2UgaWYgKCAoIHByZXZNb250aC55ZWFyKCkgPT09IGN1cnJlbnRZZWFyICYmIHByZXZNb250aC5tb250aCgpID4gY3VycmVudE1vbnRoICkgfHwgKCBwcmV2TW9udGgueWVhcigpID4gY3VycmVudFllYXIgKSApXG5cdFx0XHRcdFx0Y2xhc3NlcyArPSAnIHJkdE5ldyc7XG5cblx0XHRcdFx0aWYgKCBzZWxlY3RlZCAmJiBwcmV2TW9udGguaXNTYW1lKHNlbGVjdGVkLCAnZGF5JykgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHRBY3RpdmUnO1xuXG5cdFx0XHRcdGlmIChwcmV2TW9udGguaXNTYW1lKG1vbWVudCgpLCAnZGF5JykgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHRUb2RheSc7XG5cblx0XHRcdFx0ZGlzYWJsZWQgPSAhaXNWYWxpZCggY3VycmVudERhdGUsIHNlbGVjdGVkICk7XG5cdFx0XHRcdGlmICggZGlzYWJsZWQgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHREaXNhYmxlZCc7XG5cblx0XHRcdFx0ZGF5UHJvcHMgPSB7XG5cdFx0XHRcdFx0a2V5OiBwcmV2TW9udGguZm9ybWF0KCdNX0QnKSxcblx0XHRcdFx0XHQnZGF0YS12YWx1ZSc6IHByZXZNb250aC5kYXRlKCksXG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiBjbGFzc2VzXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmICggIWRpc2FibGVkIClcblx0XHRcdFx0XHRkYXlQcm9wcy5vbkNsaWNrID0gdGhpcy51cGRhdGVTZWxlY3RlZERhdGU7XG5cblx0XHRcdFx0ZGF5cy5wdXNoKCByZW5kZXJlciggZGF5UHJvcHMsIGN1cnJlbnREYXRlLCBzZWxlY3RlZCApICk7XG5cblx0XHRcdFx0aWYgKCBkYXlzLmxlbmd0aCA9PT0gNyApe1xuXHRcdFx0XHRcdHdlZWtzLnB1c2goIERPTS50cigge2tleTogcHJldk1vbnRoLmZvcm1hdCgnTV9EJyl9LCBkYXlzICkgKTtcblx0XHRcdFx0XHRkYXlzID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwcmV2TW9udGguYWRkKCAxLCAnZCcgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHdlZWtzO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVTZWxlY3RlZERhdGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHRoaXMucHJvcHMudXBkYXRlU2VsZWN0ZWREYXRlKGV2ZW50LCB0cnVlKTtcblx0XHR9LFxuXG5cdFx0cmVuZGVyRGF5OiBmdW5jdGlvbiggcHJvcHMsIGN1cnJlbnREYXRlICl7XG5cdFx0XHRyZXR1cm4gRE9NLnRkKCBwcm9wcywgY3VycmVudERhdGUuZGF0ZSgpICk7XG5cdFx0fSxcblxuXHRcdHJlbmRlckZvb3RlcjogZnVuY3Rpb24oKXtcblx0XHRcdGlmICggIXRoaXMucHJvcHMudGltZUZvcm1hdCApXG5cdFx0XHRcdHJldHVybiAnJztcblxuXHRcdFx0dmFyIGRhdGUgPSB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZSB8fCB0aGlzLnByb3BzLnZpZXdEYXRlO1xuXG5cdFx0XHRyZXR1cm4gRE9NLnRmb290KHsga2V5OiAndGYnfSxcblx0XHRcdFx0RE9NLnRyKHt9LFxuXHRcdFx0XHRcdERPTS50ZCh7IG9uQ2xpY2s6IHRoaXMucHJvcHMuc2hvd1ZpZXcoJ3RpbWUnKSwgY29sU3BhbjogNywgY2xhc3NOYW1lOiAncmR0VGltZVRvZ2dsZSd9LCBkYXRlLmZvcm1hdCggdGhpcy5wcm9wcy50aW1lRm9ybWF0ICkpXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSxcblx0XHRpc1ZhbGlkRGF0ZTogZnVuY3Rpb24oKXsgcmV0dXJuIDE7IH1cblx0fSk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBEYXRlVGltZVBpY2tlckRheXM7XG5cblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV80X187XG5cbi8qKiovIH0sXG4vKiA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxuXHR2YXIgRE9NID0gUmVhY3QuRE9NO1xuXHR2YXIgRGF0ZVRpbWVQaWNrZXJNb250aHMgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBET00uZGl2KHsgY2xhc3NOYW1lOiAncmR0TW9udGhzJyB9LCBbXG5cdFx0XHRcdERPTS50YWJsZSh7IGtleTogJ2EnfSwgRE9NLnRoZWFkKHt9LCBET00udHIoe30sIFtcblx0XHRcdFx0XHRET00udGgoeyBrZXk6ICdwcmV2JywgY2xhc3NOYW1lOiAncmR0UHJldicgfSwgRE9NLnNwYW4oe29uQ2xpY2s6IHRoaXMucHJvcHMuc3VidHJhY3RUaW1lKDEsICd5ZWFycycpfSwgJ+KAuScpKSxcblx0XHRcdFx0XHRET00udGgoeyBrZXk6ICd5ZWFyJywgY2xhc3NOYW1lOiAncmR0U3dpdGNoJywgb25DbGljazogdGhpcy5wcm9wcy5zaG93VmlldygneWVhcnMnKSwgY29sU3BhbjogMiwgJ2RhdGEtdmFsdWUnOiB0aGlzLnByb3BzLnZpZXdEYXRlLnllYXIoKX0sIHRoaXMucHJvcHMudmlld0RhdGUueWVhcigpICksXG5cdFx0XHRcdFx0RE9NLnRoKHsga2V5OiAnbmV4dCcsIGNsYXNzTmFtZTogJ3JkdE5leHQnIH0sIERPTS5zcGFuKHtvbkNsaWNrOiB0aGlzLnByb3BzLmFkZFRpbWUoMSwgJ3llYXJzJyl9LCAn4oC6JykpXG5cdFx0XHRcdF0pKSksXG5cdFx0XHRcdERPTS50YWJsZSh7IGtleTogJ21vbnRocyd9LCBET00udGJvZHkoeyBrZXk6ICdiJ30sIHRoaXMucmVuZGVyTW9udGhzKCkpKVxuXHRcdFx0XSk7XG5cdFx0fSxcblxuXHRcdHJlbmRlck1vbnRoczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGF0ZSA9IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlLFxuXHRcdFx0XHRtb250aCA9IHRoaXMucHJvcHMudmlld0RhdGUubW9udGgoKSxcblx0XHRcdFx0eWVhciA9IHRoaXMucHJvcHMudmlld0RhdGUueWVhcigpLFxuXHRcdFx0XHRyb3dzID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRtb250aHMgPSBbXSxcblx0XHRcdFx0cmVuZGVyZXIgPSB0aGlzLnByb3BzLnJlbmRlck1vbnRoIHx8IHRoaXMucmVuZGVyTW9udGgsXG5cdFx0XHRcdGNsYXNzZXMsIHByb3BzXG5cdFx0XHQ7XG5cblx0XHRcdHdoaWxlIChpIDwgMTIpIHtcblx0XHRcdFx0Y2xhc3NlcyA9ICdyZHRNb250aCc7XG5cdFx0XHRcdGlmICggZGF0ZSAmJiBpID09PSBtb250aCAmJiB5ZWFyID09PSBkYXRlLnllYXIoKSApXG5cdFx0XHRcdFx0Y2xhc3NlcyArPSAnIHJkdEFjdGl2ZSc7XG5cblx0XHRcdFx0cHJvcHMgPSB7XG5cdFx0XHRcdFx0a2V5OiBpLFxuXHRcdFx0XHRcdCdkYXRhLXZhbHVlJzogaSxcblx0XHRcdFx0XHRjbGFzc05hbWU6IGNsYXNzZXMsXG5cdFx0XHRcdFx0b25DbGljazogdGhpcy5wcm9wcy51cGRhdGVPbiA9PT0gJ21vbnRocyc/IHRoaXMudXBkYXRlU2VsZWN0ZWRNb250aCA6IHRoaXMucHJvcHMuc2V0RGF0ZSgnbW9udGgnKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdG1vbnRocy5wdXNoKCByZW5kZXJlciggcHJvcHMsIGksIHllYXIsIGRhdGUgJiYgZGF0ZS5jbG9uZSgpICkpO1xuXG5cdFx0XHRcdGlmICggbW9udGhzLmxlbmd0aCA9PT0gNCApe1xuXHRcdFx0XHRcdHJvd3MucHVzaCggRE9NLnRyKHsga2V5OiBtb250aCArICdfJyArIHJvd3MubGVuZ3RoIH0sIG1vbnRocykgKTtcblx0XHRcdFx0XHRtb250aHMgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGkrKztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJvd3M7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZVNlbGVjdGVkTW9udGg6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHRoaXMucHJvcHMudXBkYXRlU2VsZWN0ZWREYXRlKGV2ZW50LCB0cnVlKTtcblx0XHR9LFxuXG5cdFx0cmVuZGVyTW9udGg6IGZ1bmN0aW9uKCBwcm9wcywgbW9udGggKSB7XG5cdFx0XHR2YXIgbW9udGhzU2hvcnQgPSB0aGlzLnByb3BzLnZpZXdEYXRlLmxvY2FsZURhdGEoKS5fbW9udGhzU2hvcnQ7XG5cdFx0XHRyZXR1cm4gRE9NLnRkKCBwcm9wcywgbW9udGhzU2hvcnQuc3RhbmRhbG9uZVxuXHRcdFx0XHQ/IGNhcGl0YWxpemUoIG1vbnRoc1Nob3J0LnN0YW5kYWxvbmVbIG1vbnRoIF0gKVxuXHRcdFx0XHQ6IG1vbnRoc1Nob3J0WyBtb250aCBdXG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG5cblx0ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHtcblx0XHRyZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBEYXRlVGltZVBpY2tlck1vbnRocztcblxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cblx0dmFyIERPTSA9IFJlYWN0LkRPTTtcblx0dmFyIERhdGVUaW1lUGlja2VyWWVhcnMgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB5ZWFyID0gcGFyc2VJbnQodGhpcy5wcm9wcy52aWV3RGF0ZS55ZWFyKCkgLyAxMCwgMTApICogMTA7XG5cblx0XHRcdHJldHVybiBET00uZGl2KHsgY2xhc3NOYW1lOiAncmR0WWVhcnMnIH0sIFtcblx0XHRcdFx0RE9NLnRhYmxlKHsga2V5OiAnYSd9LCBET00udGhlYWQoe30sIERPTS50cih7fSwgW1xuXHRcdFx0XHRcdERPTS50aCh7IGtleTogJ3ByZXYnLCBjbGFzc05hbWU6ICdyZHRQcmV2JyB9LCBET00uc3Bhbih7b25DbGljazogdGhpcy5wcm9wcy5zdWJ0cmFjdFRpbWUoMTAsICd5ZWFycycpfSwgJ+KAuScpKSxcblx0XHRcdFx0XHRET00udGgoeyBrZXk6ICd5ZWFyJywgY2xhc3NOYW1lOiAncmR0U3dpdGNoJywgb25DbGljazogdGhpcy5wcm9wcy5zaG93VmlldygneWVhcnMnKSwgY29sU3BhbjogMiB9LCB5ZWFyICsgJy0nICsgKHllYXIgKyA5KSApLFxuXHRcdFx0XHRcdERPTS50aCh7IGtleTogJ25leHQnLCBjbGFzc05hbWU6ICdyZHROZXh0J30sIERPTS5zcGFuKHtvbkNsaWNrOiB0aGlzLnByb3BzLmFkZFRpbWUoMTAsICd5ZWFycycpfSwgJ+KAuicpKVxuXHRcdFx0XHRcdF0pKSksXG5cdFx0XHRcdERPTS50YWJsZSh7IGtleTogJ3llYXJzJ30sIERPTS50Ym9keSh7fSwgdGhpcy5yZW5kZXJZZWFycyggeWVhciApKSlcblx0XHRcdF0pO1xuXHRcdH0sXG5cblx0XHRyZW5kZXJZZWFyczogZnVuY3Rpb24oIHllYXIgKSB7XG5cdFx0XHR2YXIgeWVhcnMgPSBbXSxcblx0XHRcdFx0aSA9IC0xLFxuXHRcdFx0XHRyb3dzID0gW10sXG5cdFx0XHRcdHJlbmRlcmVyID0gdGhpcy5wcm9wcy5yZW5kZXJZZWFyIHx8IHRoaXMucmVuZGVyWWVhcixcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5wcm9wcy5zZWxlY3RlZERhdGUsXG5cdFx0XHRcdGNsYXNzZXMsIHByb3BzXG5cdFx0XHQ7XG5cblx0XHRcdHllYXItLTtcblx0XHRcdHdoaWxlIChpIDwgMTEpIHtcblx0XHRcdFx0Y2xhc3NlcyA9ICdyZHRZZWFyJztcblx0XHRcdFx0aWYgKCBpID09PSAtMSB8IGkgPT09IDEwIClcblx0XHRcdFx0XHRjbGFzc2VzICs9ICcgcmR0T2xkJztcblx0XHRcdFx0aWYgKCBzZWxlY3RlZERhdGUgJiYgc2VsZWN0ZWREYXRlLnllYXIoKSA9PT0geWVhciApXG5cdFx0XHRcdFx0Y2xhc3NlcyArPSAnIHJkdEFjdGl2ZSc7XG5cblx0XHRcdFx0cHJvcHMgPSB7XG5cdFx0XHRcdFx0a2V5OiB5ZWFyLFxuXHRcdFx0XHRcdCdkYXRhLXZhbHVlJzogeWVhcixcblx0XHRcdFx0XHRjbGFzc05hbWU6IGNsYXNzZXMsXG5cdFx0XHRcdFx0b25DbGljazogdGhpcy5wcm9wcy51cGRhdGVPbiA9PT0gJ3llYXJzJyA/IHRoaXMudXBkYXRlU2VsZWN0ZWRZZWFyIDogdGhpcy5wcm9wcy5zZXREYXRlKCd5ZWFyJylcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR5ZWFycy5wdXNoKCByZW5kZXJlciggcHJvcHMsIHllYXIsIHNlbGVjdGVkRGF0ZSAmJiBzZWxlY3RlZERhdGUuY2xvbmUoKSApKTtcblxuXHRcdFx0XHRpZiAoIHllYXJzLmxlbmd0aCA9PT0gNCApe1xuXHRcdFx0XHRcdHJvd3MucHVzaCggRE9NLnRyKHsga2V5OiBpIH0sIHllYXJzICkgKTtcblx0XHRcdFx0XHR5ZWFycyA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0eWVhcisrO1xuXHRcdFx0XHRpKys7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByb3dzO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVTZWxlY3RlZFllYXI6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHRoaXMucHJvcHMudXBkYXRlU2VsZWN0ZWREYXRlKGV2ZW50LCB0cnVlKTtcblx0XHR9LFxuXG5cdFx0cmVuZGVyWWVhcjogZnVuY3Rpb24oIHByb3BzLCB5ZWFyICl7XG5cdFx0XHRyZXR1cm4gRE9NLnRkKCBwcm9wcywgeWVhciApO1xuXHRcdH1cblx0fSk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBEYXRlVGltZVBpY2tlclllYXJzO1xuXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSxcblx0XHRhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5cdHZhciBET00gPSBSZWFjdC5ET007XG5cdHZhciBEYXRlVGltZVBpY2tlclRpbWUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdFx0Z2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpe1xuXHRcdFx0cmV0dXJuIHRoaXMuY2FsY3VsYXRlU3RhdGUoIHRoaXMucHJvcHMgKTtcblx0XHR9LFxuXHRcdGNhbGN1bGF0ZVN0YXRlOiBmdW5jdGlvbiggcHJvcHMgKXtcblx0XHRcdHZhciBkYXRlID0gcHJvcHMuc2VsZWN0ZWREYXRlIHx8IHByb3BzLnZpZXdEYXRlLFxuXHRcdFx0XHRmb3JtYXQgPSBwcm9wcy50aW1lRm9ybWF0LFxuXHRcdFx0XHRjb3VudGVycyA9IFtdXG5cdFx0XHQ7XG5cblx0XHRcdGlmICggZm9ybWF0LmluZGV4T2YoJ0gnKSAhPT0gLTEgfHwgZm9ybWF0LmluZGV4T2YoJ2gnKSAhPT0gLTEgKXtcblx0XHRcdFx0Y291bnRlcnMucHVzaCgnaG91cnMnKTtcblx0XHRcdFx0aWYgKCBmb3JtYXQuaW5kZXhPZignbScpICE9PSAtMSApe1xuXHRcdFx0XHRcdGNvdW50ZXJzLnB1c2goJ21pbnV0ZXMnKTtcblx0XHRcdFx0XHRpZiAoIGZvcm1hdC5pbmRleE9mKCdzJykgIT09IC0xICl7XG5cdFx0XHRcdFx0XHRjb3VudGVycy5wdXNoKCdzZWNvbmRzJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBkYXlwYXJ0ID0gZmFsc2U7XG5cdFx0XHRpZiAoIHRoaXMucHJvcHMudGltZUZvcm1hdC5pbmRleE9mKCcgQScpICE9PSAtMSAgJiYgdGhpcy5zdGF0ZSAhPT0gbnVsbCApe1xuXHRcdFx0XHRkYXlwYXJ0ID0gKCB0aGlzLnN0YXRlLmhvdXJzID49IDEyICkgPyAnUE0nIDogJ0FNJztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aG91cnM6IGRhdGUuZm9ybWF0KCdIJyksXG5cdFx0XHRcdG1pbnV0ZXM6IGRhdGUuZm9ybWF0KCdtbScpLFxuXHRcdFx0XHRzZWNvbmRzOiBkYXRlLmZvcm1hdCgnc3MnKSxcblx0XHRcdFx0bWlsbGlzZWNvbmRzOiBkYXRlLmZvcm1hdCgnU1NTJyksXG5cdFx0XHRcdGRheXBhcnQ6IGRheXBhcnQsXG5cdFx0XHRcdGNvdW50ZXJzOiBjb3VudGVyc1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHJlbmRlckNvdW50ZXI6IGZ1bmN0aW9uKCB0eXBlICl7XG5cdFx0XHRpZiAodHlwZSAhPT0gJ2RheXBhcnQnKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSA9IHRoaXMuc3RhdGVbIHR5cGUgXTtcblx0XHRcdFx0aWYgKHR5cGUgPT09ICdob3VycycgJiYgdGhpcy5wcm9wcy50aW1lRm9ybWF0LmluZGV4T2YoJyBBJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSAodmFsdWUgLSAxKSAlIDEyICsgMTtcblxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0dmFsdWUgPSAxMjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIERPTS5kaXYoeyBrZXk6IHR5cGUsIGNsYXNzTmFtZTogJ3JkdENvdW50ZXInfSwgW1xuXHRcdFx0XHRcdERPTS5zcGFuKHsga2V5Oid1cCcsIGNsYXNzTmFtZTogJ3JkdEJ0bicsIG9uTW91c2VEb3duOiB0aGlzLm9uU3RhcnRDbGlja2luZyggJ2luY3JlYXNlJywgdHlwZSApIH0sICfilrInICksXG5cdFx0XHRcdFx0RE9NLmRpdih7IGtleTonYycsIGNsYXNzTmFtZTogJ3JkdENvdW50JyB9LCB2YWx1ZSApLFxuXHRcdFx0XHRcdERPTS5zcGFuKHsga2V5OidkbycsIGNsYXNzTmFtZTogJ3JkdEJ0bicsIG9uTW91c2VEb3duOiB0aGlzLm9uU3RhcnRDbGlja2luZyggJ2RlY3JlYXNlJywgdHlwZSApIH0sICfilrwnIClcblx0XHRcdFx0XSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fSxcblx0XHRyZW5kZXJEYXlQYXJ0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBET00uZGl2KHsgY2xhc3NOYW1lOiAncmR0Q291bnRlcicsIGtleTogJ2RheVBhcnQnfSwgW1xuXHRcdFx0XHRET00uc3Bhbih7IGtleTondXAnLCBjbGFzc05hbWU6ICdyZHRCdG4nLCBvbk1vdXNlRG93bjogdGhpcy5vblN0YXJ0Q2xpY2tpbmcoICd0b2dnbGVEYXlQYXJ0JywgJ2hvdXJzJykgfSwgJ+KWsicgKSxcblx0XHRcdFx0RE9NLmRpdih7IGtleTogdGhpcy5zdGF0ZS5kYXlwYXJ0LCBjbGFzc05hbWU6ICdyZHRDb3VudCd9LCB0aGlzLnN0YXRlLmRheXBhcnQgKSxcblx0XHRcdFx0RE9NLnNwYW4oeyBrZXk6J2RvJywgY2xhc3NOYW1lOiAncmR0QnRuJywgb25Nb3VzZURvd246IHRoaXMub25TdGFydENsaWNraW5nKCAndG9nZ2xlRGF5UGFydCcsICdob3VycycpIH0sICfilrwnIClcblx0XHRcdF0pO1xuXHRcdH0sXG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXMsXG5cdFx0XHRcdGNvdW50ZXJzID0gW11cblx0XHRcdDtcblxuXHRcdFx0dGhpcy5zdGF0ZS5jb3VudGVycy5mb3JFYWNoKCBmdW5jdGlvbihjKXtcblx0XHRcdFx0aWYgKCBjb3VudGVycy5sZW5ndGggKVxuXHRcdFx0XHRcdGNvdW50ZXJzLnB1c2goIERPTS5kaXYoIHtrZXk6ICdzZXAnICsgY291bnRlcnMubGVuZ3RoLCBjbGFzc05hbWU6ICdyZHRDb3VudGVyU2VwYXJhdG9yJyB9LCAnOicgKSk7XG5cdFx0XHRcdGNvdW50ZXJzLnB1c2goIG1lLnJlbmRlckNvdW50ZXIoIGMgKSApO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICh0aGlzLnN0YXRlLmRheXBhcnQgIT09IGZhbHNlKSB7XG5cdFx0XHRcdGNvdW50ZXJzLnB1c2goIG1lLnJlbmRlckRheVBhcnQoKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuc3RhdGUuY291bnRlcnMubGVuZ3RoID09PSAzICYmIHRoaXMucHJvcHMudGltZUZvcm1hdC5pbmRleE9mKCdTJykgIT09IC0xICl7XG5cdFx0XHRcdGNvdW50ZXJzLnB1c2goIERPTS5kaXYoIHtjbGFzc05hbWU6ICdyZHRDb3VudGVyU2VwYXJhdG9yJywga2V5OiAnc2VwNScgfSwgJzonICkpO1xuXHRcdFx0XHRjb3VudGVycy5wdXNoKFxuXHRcdFx0XHRcdERPTS5kaXYoIHtjbGFzc05hbWU6ICdyZHRDb3VudGVyIHJkdE1pbGxpJywga2V5OidtJ30sXG5cdFx0XHRcdFx0XHRET00uaW5wdXQoeyB2YWx1ZTogdGhpcy5zdGF0ZS5taWxsaXNlY29uZHMsIHR5cGU6ICd0ZXh0Jywgb25DaGFuZ2U6IHRoaXMudXBkYXRlTWlsbGkgfSlcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gRE9NLmRpdigge2NsYXNzTmFtZTogJ3JkdFRpbWUnfSxcblx0XHRcdFx0RE9NLnRhYmxlKCB7fSwgW1xuXHRcdFx0XHRcdHRoaXMucmVuZGVySGVhZGVyKCksXG5cdFx0XHRcdFx0RE9NLnRib2R5KHtrZXk6ICdiJ30sIERPTS50cih7fSwgRE9NLnRkKHt9LFxuXHRcdFx0XHRcdFx0RE9NLmRpdih7IGNsYXNzTmFtZTogJ3JkdENvdW50ZXJzJyB9LCBjb3VudGVycyApXG5cdFx0XHRcdFx0KSkpXG5cdFx0XHRcdF0pXG5cdFx0XHQpO1xuXHRcdH0sXG5cdFx0Y29tcG9uZW50V2lsbE1vdW50OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHRtZS50aW1lQ29uc3RyYWludHMgPSB7XG5cdFx0XHRcdGhvdXJzOiB7XG5cdFx0XHRcdFx0bWluOiAwLFxuXHRcdFx0XHRcdG1heDogMjMsXG5cdFx0XHRcdFx0c3RlcDogMVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtaW51dGVzOiB7XG5cdFx0XHRcdFx0bWluOiAwLFxuXHRcdFx0XHRcdG1heDogNTksXG5cdFx0XHRcdFx0c3RlcDogMVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZWNvbmRzOiB7XG5cdFx0XHRcdFx0bWluOiAwLFxuXHRcdFx0XHRcdG1heDogNTksXG5cdFx0XHRcdFx0c3RlcDogMSxcblx0XHRcdFx0fSxcblx0XHRcdFx0bWlsbGlzZWNvbmRzOiB7XG5cdFx0XHRcdFx0bWluOiAwLFxuXHRcdFx0XHRcdG1heDogOTk5LFxuXHRcdFx0XHRcdHN0ZXA6IDFcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuXHRcdFx0XHRhc3NpZ24obWUudGltZUNvbnN0cmFpbnRzW3R5cGVdLCBtZS5wcm9wcy50aW1lQ29uc3RyYWludHNbdHlwZV0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB0aGlzLmNhbGN1bGF0ZVN0YXRlKCB0aGlzLnByb3BzICkgKTtcblx0XHR9LFxuXHRcdGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKCBuZXh0UHJvcHMgKXtcblx0XHRcdHRoaXMuc2V0U3RhdGUoIHRoaXMuY2FsY3VsYXRlU3RhdGUoIG5leHRQcm9wcyApICk7XG5cdFx0fSxcblx0XHR1cGRhdGVNaWxsaTogZnVuY3Rpb24oIGUgKXtcblx0XHRcdHZhciBtaWxsaSA9IHBhcnNlSW50KCBlLnRhcmdldC52YWx1ZSwgMTAgKTtcblx0XHRcdGlmICggbWlsbGkgPT09IGUudGFyZ2V0LnZhbHVlICYmIG1pbGxpID49IDAgJiYgbWlsbGkgPCAxMDAwICl7XG5cdFx0XHRcdHRoaXMucHJvcHMuc2V0VGltZSggJ21pbGxpc2Vjb25kcycsIG1pbGxpICk7XG5cdFx0XHRcdHRoaXMuc2V0U3RhdGUoeyBtaWxsaXNlY29uZHM6IG1pbGxpIH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cmVuZGVySGVhZGVyOiBmdW5jdGlvbigpe1xuXHRcdFx0aWYgKCAhdGhpcy5wcm9wcy5kYXRlRm9ybWF0IClcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciBkYXRlID0gdGhpcy5wcm9wcy5zZWxlY3RlZERhdGUgfHwgdGhpcy5wcm9wcy52aWV3RGF0ZTtcblx0XHRcdHJldHVybiBET00udGhlYWQoeyBrZXk6ICdoJ30sIERPTS50cih7fSxcblx0XHRcdFx0RE9NLnRoKCB7Y2xhc3NOYW1lOiAncmR0U3dpdGNoJywgY29sU3BhbjogNCwgb25DbGljazogdGhpcy5wcm9wcy5zaG93VmlldygnZGF5cycpfSwgZGF0ZS5mb3JtYXQoIHRoaXMucHJvcHMuZGF0ZUZvcm1hdCApIClcblx0XHRcdCkpO1xuXHRcdH0sXG5cdFx0b25TdGFydENsaWNraW5nOiBmdW5jdGlvbiggYWN0aW9uLCB0eXBlICl7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKXtcblx0XHRcdFx0dmFyIHVwZGF0ZSA9IHt9O1xuXHRcdFx0XHR1cGRhdGVbIHR5cGUgXSA9IG1lWyBhY3Rpb24gXSggdHlwZSApO1xuXHRcdFx0XHRtZS5zZXRTdGF0ZSggdXBkYXRlICk7XG5cblx0XHRcdFx0bWUudGltZXIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdG1lLmluY3JlYXNlVGltZXIgPSBzZXRJbnRlcnZhbCggZnVuY3Rpb24oKXtcblx0XHRcdFx0XHRcdHVwZGF0ZVsgdHlwZSBdID0gbWVbIGFjdGlvbiBdKCB0eXBlICk7XG5cdFx0XHRcdFx0XHRtZS5zZXRTdGF0ZSggdXBkYXRlICk7XG5cdFx0XHRcdFx0fSwgNzApO1xuXHRcdFx0XHR9LCA1MDApO1xuXG5cdFx0XHRcdG1lLm1vdXNlVXBMaXN0ZW5lciA9IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KCBtZS50aW1lciApO1xuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoIG1lLmluY3JlYXNlVGltZXIgKTtcblx0XHRcdFx0XHRtZS5wcm9wcy5zZXRUaW1lKCB0eXBlLCBtZS5zdGF0ZVsgdHlwZSBdICk7XG5cdFx0XHRcdFx0ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbWUubW91c2VVcExpc3RlbmVyKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtZS5tb3VzZVVwTGlzdGVuZXIpO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdHBhZFZhbHVlczoge1xuXHRcdFx0aG91cnM6IDEsXG5cdFx0XHRtaW51dGVzOiAyLFxuXHRcdFx0c2Vjb25kczogMixcblx0XHRcdG1pbGxpc2Vjb25kczogM1xuXHRcdH0sXG5cdFx0dG9nZ2xlRGF5UGFydDogZnVuY3Rpb24oIHR5cGUgKXsgLy8gdHlwZSBpcyBhbHdheXMgJ2hvdXJzJ1xuXHRcdFx0dmFyIHZhbHVlID0gcGFyc2VJbnQodGhpcy5zdGF0ZVsgdHlwZSBdLCAxMCkgKyAxMjtcblx0XHRcdGlmICggdmFsdWUgPiB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1heCApXG5cdFx0XHRcdHZhbHVlID0gdGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5taW4gKyAodmFsdWUgLSAodGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5tYXggKyAxKSk7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYWQoIHR5cGUsIHZhbHVlICk7XG5cdFx0fSxcblx0XHRpbmNyZWFzZTogZnVuY3Rpb24oIHR5cGUgKXtcblx0XHRcdHZhciB2YWx1ZSA9IHBhcnNlSW50KHRoaXMuc3RhdGVbIHR5cGUgXSwgMTApICsgdGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5zdGVwO1xuXHRcdFx0aWYgKCB2YWx1ZSA+IHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0ubWF4IClcblx0XHRcdFx0dmFsdWUgPSB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1pbiArICggdmFsdWUgLSAoIHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0ubWF4ICArIDEpICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYWQoIHR5cGUsIHZhbHVlICk7XG5cdFx0fSxcblx0XHRkZWNyZWFzZTogZnVuY3Rpb24oIHR5cGUgKXtcblx0XHRcdHZhciB2YWx1ZSA9IHBhcnNlSW50KHRoaXMuc3RhdGVbIHR5cGUgXSwgMTApIC0gdGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5zdGVwO1xuXHRcdFx0aWYgKCB2YWx1ZSA8IHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0ubWluIClcblx0XHRcdFx0dmFsdWUgPSB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1heCArIDEgLSAoIHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0ubWluIC0gdmFsdWUgKTtcblx0XHRcdHJldHVybiB0aGlzLnBhZCggdHlwZSwgdmFsdWUgKTtcblx0XHR9LFxuXHRcdHBhZDogZnVuY3Rpb24oIHR5cGUsIHZhbHVlICl7XG5cdFx0XHR2YXIgc3RyID0gdmFsdWUgKyAnJztcblx0XHRcdHdoaWxlICggc3RyLmxlbmd0aCA8IHRoaXMucGFkVmFsdWVzWyB0eXBlIF0gKVxuXHRcdFx0XHRzdHIgPSAnMCcgKyBzdHI7XG5cdFx0XHRyZXR1cm4gc3RyO1xuXHRcdH1cblx0fSk7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBEYXRlVGltZVBpY2tlclRpbWU7XG5cblxuLyoqKi8gfSxcbi8qIDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHQvLyBUaGlzIGlzIGV4dHJhY3RlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9Qb21heC9yZWFjdC1vbmNsaWNrb3V0c2lkZVxuXHQvLyBBbmQgbW9kaWZpZWQgdG8gc3VwcG9ydCByZWFjdCAwLjEzIGFuZCByZWFjdCAwLjE0XG5cblx0dmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSxcblx0XHR2ZXJzaW9uID0gUmVhY3QudmVyc2lvbiAmJiBSZWFjdC52ZXJzaW9uLnNwbGl0KCcuJylcblx0O1xuXG5cdGlmICggdmVyc2lvbiAmJiAoIHZlcnNpb25bMF0gPiAwIHx8IHZlcnNpb25bMV0gPiAxMyApIClcblx0XHRSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cblx0Ly8gVXNlIGEgcGFyYWxsZWwgYXJyYXkgYmVjYXVzZSB3ZSBjYW4ndCB1c2Vcblx0Ly8gb2JqZWN0cyBhcyBrZXlzLCB0aGV5IGdldCB0b1N0cmluZy1jb2VyY2VkXG5cdHZhciByZWdpc3RlcmVkQ29tcG9uZW50cyA9IFtdO1xuXHR2YXIgaGFuZGxlcnMgPSBbXTtcblxuXHR2YXIgSUdOT1JFX0NMQVNTID0gJ2lnbm9yZS1yZWFjdC1vbmNsaWNrb3V0c2lkZSc7XG5cblx0dmFyIGlzU291cmNlRm91bmQgPSBmdW5jdGlvbihzb3VyY2UsIGxvY2FsTm9kZSkge1xuXHQgaWYgKHNvdXJjZSA9PT0gbG9jYWxOb2RlKSB7XG5cdCAgIHJldHVybiB0cnVlO1xuXHQgfVxuXHQgLy8gU1ZHIDx1c2UvPiBlbGVtZW50cyBkbyBub3QgdGVjaG5pY2FsbHkgcmVzaWRlIGluIHRoZSByZW5kZXJlZCBET00sIHNvXG5cdCAvLyB0aGV5IGRvIG5vdCBoYXZlIGNsYXNzTGlzdCBkaXJlY3RseSwgYnV0IHRoZXkgb2ZmZXIgYSBsaW5rIHRvIHRoZWlyXG5cdCAvLyBjb3JyZXNwb25kaW5nIGVsZW1lbnQsIHdoaWNoIGNhbiBoYXZlIGNsYXNzTGlzdC4gVGhpcyBleHRyYSBjaGVjayBpcyBmb3Jcblx0IC8vIHRoYXQgY2FzZS5cblx0IC8vIFNlZTogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvc3RydWN0Lmh0bWwjSW50ZXJmYWNlU1ZHVXNlRWxlbWVudFxuXHQgLy8gRGlzY3Vzc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL1BvbWF4L3JlYWN0LW9uY2xpY2tvdXRzaWRlL3B1bGwvMTdcblx0IGlmIChzb3VyY2UuY29ycmVzcG9uZGluZ0VsZW1lbnQpIHtcblx0ICAgcmV0dXJuIHNvdXJjZS5jb3JyZXNwb25kaW5nRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoSUdOT1JFX0NMQVNTKTtcblx0IH1cblx0IHJldHVybiBzb3VyY2UuY2xhc3NMaXN0LmNvbnRhaW5zKElHTk9SRV9DTEFTUyk7XG5cdH07XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdCBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7XG5cdCAgIGlmICh0eXBlb2YgdGhpcy5oYW5kbGVDbGlja091dHNpZGUgIT09ICdmdW5jdGlvbicpXG5cdCAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgbGFja3MgYSBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQpIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIG91dHNpZGUgY2xpY2sgZXZlbnRzLicpO1xuXG5cdCAgIHZhciBmbiA9IHRoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyID0gKGZ1bmN0aW9uKGxvY2FsTm9kZSwgZXZlbnRIYW5kbGVyKSB7XG5cdCAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2dCkge1xuXHQgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgdmFyIHNvdXJjZSA9IGV2dC50YXJnZXQ7XG5cdCAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcblx0ICAgICAgIC8vIElmIHNvdXJjZT1sb2NhbCB0aGVuIHRoaXMgZXZlbnQgY2FtZSBmcm9tIFwic29tZXdoZXJlXCJcblx0ICAgICAgIC8vIGluc2lkZSBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuIFdlIGNvdWxkIGhhbmRsZSB0aGlzIHdpdGhcblx0ICAgICAgIC8vIGEgbGF5ZXJlZCBhcHByb2FjaCwgdG9vLCBidXQgdGhhdCByZXF1aXJlcyBnb2luZyBiYWNrIHRvXG5cdCAgICAgICAvLyB0aGlua2luZyBpbiB0ZXJtcyBvZiBEb20gbm9kZSBuZXN0aW5nLCBydW5uaW5nIGNvdW50ZXJcblx0ICAgICAgIC8vIHRvIFJlYWN0J3MgXCJ5b3Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgdGhlIERPTVwiIHBoaWxvc29waHkuXG5cdCAgICAgICB3aGlsZSAoc291cmNlLnBhcmVudE5vZGUpIHtcblx0ICAgICAgICAgZm91bmQgPSBpc1NvdXJjZUZvdW5kKHNvdXJjZSwgbG9jYWxOb2RlKTtcblx0ICAgICAgICAgaWYgKGZvdW5kKSByZXR1cm47XG5cdCAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5wYXJlbnROb2RlO1xuXHQgICAgICAgfVxuXHQgICAgICAgZXZlbnRIYW5kbGVyKGV2dCk7XG5cdCAgICAgfTtcblx0ICAgfShSZWFjdC5maW5kRE9NTm9kZSh0aGlzKSwgdGhpcy5oYW5kbGVDbGlja091dHNpZGUpKTtcblxuXHQgICB2YXIgcG9zID0gcmVnaXN0ZXJlZENvbXBvbmVudHMubGVuZ3RoO1xuXHQgICByZWdpc3RlcmVkQ29tcG9uZW50cy5wdXNoKHRoaXMpO1xuXHQgICBoYW5kbGVyc1twb3NdID0gZm47XG5cblx0ICAgLy8gSWYgdGhlcmUgaXMgYSB0cnV0aHkgZGlzYWJsZU9uQ2xpY2tPdXRzaWRlIHByb3BlcnR5IGZvciB0aGlzXG5cdCAgIC8vIGNvbXBvbmVudCwgZG9uJ3QgaW1tZWRpYXRlbHkgc3RhcnQgbGlzdGVuaW5nIGZvciBvdXRzaWRlIGV2ZW50cy5cblx0ICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSkge1xuXHQgICAgIHRoaXMuZW5hYmxlT25DbGlja091dHNpZGUoKTtcblx0ICAgfVxuXHQgfSxcblxuXHQgY29tcG9uZW50V2lsbFVubW91bnQ6IGZ1bmN0aW9uKCkge1xuXHQgICB0aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSgpO1xuXHQgICB0aGlzLl9fb3V0c2lkZUNsaWNrSGFuZGxlciA9IGZhbHNlO1xuXHQgICB2YXIgcG9zID0gcmVnaXN0ZXJlZENvbXBvbmVudHMuaW5kZXhPZih0aGlzKTtcblx0ICAgaWYgKCBwb3M+LTEpIHtcblx0ICAgICBpZiAoaGFuZGxlcnNbcG9zXSkge1xuXHQgICAgICAgLy8gY2xlYW4gdXAgc28gd2UgZG9uJ3QgbGVhayBtZW1vcnlcblx0ICAgICAgIGhhbmRsZXJzLnNwbGljZShwb3MsIDEpO1xuXHQgICAgICAgcmVnaXN0ZXJlZENvbXBvbmVudHMuc3BsaWNlKHBvcywgMSk7XG5cdCAgICAgfVxuXHQgICB9XG5cdCB9LFxuXG5cdCAvKipcblx0ICAqIENhbiBiZSBjYWxsZWQgdG8gZXhwbGljaXRseSBlbmFibGUgZXZlbnQgbGlzdGVuaW5nXG5cdCAgKiBmb3IgY2xpY2tzIGFuZCB0b3VjaGVzIG91dHNpZGUgb2YgdGhpcyBlbGVtZW50LlxuXHQgICovXG5cdCBlbmFibGVPbkNsaWNrT3V0c2lkZTogZnVuY3Rpb24oKSB7XG5cdCAgIHZhciBmbiA9IHRoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyO1xuXHQgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmbik7XG5cdCAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmbik7XG5cdCB9LFxuXG5cdCAvKipcblx0ICAqIENhbiBiZSBjYWxsZWQgdG8gZXhwbGljaXRseSBkaXNhYmxlIGV2ZW50IGxpc3RlbmluZ1xuXHQgICogZm9yIGNsaWNrcyBhbmQgdG91Y2hlcyBvdXRzaWRlIG9mIHRoaXMgZWxlbWVudC5cblx0ICAqL1xuXHQgZGlzYWJsZU9uQ2xpY2tPdXRzaWRlOiBmdW5jdGlvbigpIHtcblx0ICAgdmFyIGZuID0gdGhpcy5fX291dHNpZGVDbGlja0hhbmRsZXI7XG5cdCAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZuKTtcblx0ICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZuKTtcblx0IH1cblx0fTtcblxuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzlfXztcblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3QtZGF0ZXRpbWUuanMubWFwIl0sImZpbGUiOiJyZWFjdC1kYXRldGltZS5qcyJ9 |
| | | ; |
| | |
| | | /* |
| | | react-datetime v2.6.2 |
| | | react-datetime v2.7.0 |
| | | https://github.com/arqex/react-datetime |
| | | MIT: https://github.com/arqex/react-datetime/raw/master/LICENSE |
| | | */ |
| | | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("React"),require("moment"),require("ReactDOM")):"function"==typeof define&&define.amd?define(["React","moment","ReactDOM"],e):"object"==typeof exports?exports.Datetime=e(require("React"),require("moment"),require("ReactDOM")):t.Datetime=e(t.React,t.moment,t.ReactDOM)}(this,function(t,e,s){return function(t){function e(a){if(s[a])return s[a].exports;var n=s[a]={exports:{},id:a,loaded:!1};return t[a].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var s={};return e.m=t,e.c=s,e.p="",e(0)}([function(t,e,s){"use strict";var a=s(1),n=s(2),r=s(3),i=s(5),o=s(6),c=s(7),p=s(4),u=n.PropTypes,d=n.createClass({mixins:[s(8)],viewComponents:{days:r,months:i,years:o,time:c},propTypes:{onFocus:u.func,onBlur:u.func,onChange:u.func,locale:u.string,input:u.bool,inputProps:u.object,timeConstraints:u.object,viewMode:u.oneOf(["years","months","days","time"]),isValidDate:u.func,open:u.bool,strictParsing:u.bool,closeOnSelect:u.bool,closeOnTab:u.bool},getDefaultProps:function(){var t=function(){};return{className:"",defaultValue:"",inputProps:{},input:!0,onFocus:t,onBlur:t,onChange:t,timeFormat:!0,timeConstraints:{},dateFormat:!0,strictParsing:!0,closeOnSelect:!1,closeOnTab:!0}},getInitialState:function(){var t=this.getStateFromProps(this.props);return void 0===t.open&&(t.open=!this.props.input),t.currentView=this.props.dateFormat?this.props.viewMode||t.updateOn||"days":"time",t},getStateFromProps:function(t){var e,s,a,n,r=this.getFormats(t),i=t.value||t.defaultValue;return i&&"string"==typeof i?e=this.localMoment(i,r.datetime):i&&(e=this.localMoment(i)),e&&!e.isValid()&&(e=null),s=e?e.clone().startOf("month"):this.localMoment().startOf("month"),a=this.getUpdateOn(r),n=e?e.format(r.datetime):i.isValid&&!i.isValid()?"":i||"",{updateOn:a,inputFormat:r.datetime,viewDate:s,selectedDate:e,inputValue:n,open:t.open}},getUpdateOn:function(t){return t.date.match(/[lLD]/)?"days":t.date.indexOf("M")!==-1?"months":t.date.indexOf("Y")!==-1?"years":"days"},getFormats:function(t){var e={date:t.dateFormat||"",time:t.timeFormat||""},s=this.localMoment(t.date).localeData();return e.date===!0?e.date=s.longDateFormat("L"):"days"!==this.getUpdateOn(e)&&(e.time=""),e.time===!0&&(e.time=s.longDateFormat("LT")),e.datetime=e.date&&e.time?e.date+" "+e.time:e.date||e.time,e},componentWillReceiveProps:function(t){var e=this.getFormats(t),s={};t.value!==this.props.value&&(s=this.getStateFromProps(t)),e.datetime!==this.getFormats(this.props).datetime&&(s.inputFormat=e.datetime),void 0===s.open&&(this.props.closeOnSelect&&"time"!==this.state.currentView?s.open=!1:s.open=this.state.open),this.setState(s)},onInputChange:function(t){var e=null===t.target?t:t.target.value,s=this.localMoment(e,this.state.inputFormat),a={inputValue:e};return s.isValid()&&!this.props.value?(a.selectedDate=s,a.viewDate=s.clone().startOf("month")):a.selectedDate=null,this.setState(a,function(){return this.props.onChange(s.isValid()?s:this.state.inputValue)})},onInputKey:function(t){9===t.which&&this.props.closeOnTab&&this.closeCalendar()},showView:function(t){var e=this;return function(){e.setState({currentView:t})}},setDate:function(t){var e=this,s={month:"days",year:"months"};return function(a){e.setState({viewDate:e.state.viewDate.clone()[t](parseInt(a.target.getAttribute("data-value"),10)).startOf(t),currentView:s[t]})}},addTime:function(t,e,s){return this.updateTime("add",t,e,s)},subtractTime:function(t,e,s){return this.updateTime("subtract",t,e,s)},updateTime:function(t,e,s,a){var n=this;return function(){var r={},i=a?"selectedDate":"viewDate";r[i]=n.state[i].clone()[t](e,s),n.setState(r)}},allowedSetTime:["hours","minutes","seconds","milliseconds"],setTime:function(t,e){var s,a=this.allowedSetTime.indexOf(t)+1,n=this.state,r=(n.selectedDate||n.viewDate).clone();for(r[t](e);a<this.allowedSetTime.length;a++)s=this.allowedSetTime[a],r[s](r[s]());this.props.value||this.setState({selectedDate:r,inputValue:r.format(n.inputFormat)}),this.props.onChange(r)},updateSelectedDate:function(t,e){var s,a=t.target,n=0,r=this.state.viewDate,i=this.state.selectedDate||r;a.className.indexOf("rdtDay")!==-1?(a.className.indexOf("rdtNew")!==-1?n=1:a.className.indexOf("rdtOld")!==-1&&(n=-1),s=r.clone().month(r.month()+n).date(parseInt(a.getAttribute("data-value"),10))):a.className.indexOf("rdtMonth")!==-1?s=r.clone().month(parseInt(a.getAttribute("data-value"),10)).date(i.date()):a.className.indexOf("rdtYear")!==-1&&(s=r.clone().month(i.month()).date(i.date()).year(parseInt(a.getAttribute("data-value"),10))),s.hours(i.hours()).minutes(i.minutes()).seconds(i.seconds()).milliseconds(i.milliseconds()),this.props.value?this.props.closeOnSelect&&e&&this.closeCalendar():this.setState({selectedDate:s,viewDate:s.clone().startOf("month"),inputValue:s.format(this.state.inputFormat),open:!(this.props.closeOnSelect&&e)}),this.props.onChange(s)},openCalendar:function(){this.state.open||(this.props.onFocus(),this.setState({open:!0}))},closeCalendar:function(){this.setState({open:!1}),this.props.onBlur(this.state.selectedDate||this.state.inputValue)},handleClickOutside:function(){this.props.input&&this.state.open&&!this.props.open&&(this.setState({open:!1}),this.props.onBlur(this.state.selectedDate||this.state.inputValue))},localMoment:function(t,e){var s=p(t,e,this.props.strictParsing);return this.props.locale&&s.locale(this.props.locale),s},componentProps:{fromProps:["value","isValidDate","renderDay","renderMonth","renderYear","timeConstraints"],fromState:["viewDate","selectedDate","updateOn"],fromThis:["setDate","setTime","showView","addTime","subtractTime","updateSelectedDate","localMoment"]},getComponentProps:function(){var t=this,e=this.getFormats(this.props),s={dateFormat:e.date,timeFormat:e.time};return this.componentProps.fromProps.forEach(function(e){s[e]=t.props[e]}),this.componentProps.fromState.forEach(function(e){s[e]=t.state[e]}),this.componentProps.fromThis.forEach(function(e){s[e]=t[e]}),s},render:function(){var t=this.viewComponents[this.state.currentView],e=n.DOM,s="rdt"+(this.props.className?Array.isArray(this.props.className)?" "+this.props.className.join(" "):" "+this.props.className:""),r=[];return this.props.input?r=[e.input(a({key:"i",type:"text",className:"form-control",onFocus:this.openCalendar,onChange:this.onInputChange,onKeyDown:this.onInputKey,value:this.state.inputValue},this.props.inputProps))]:s+=" rdtStatic",this.state.open&&(s+=" rdtOpen"),e.div({className:s},r.concat(e.div({key:"dt",className:"rdtPicker"},n.createElement(t,this.getComponentProps()))))}});d.moment=p,t.exports=d},function(t,e){"use strict";function s(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function a(t){var e=Object.getOwnPropertyNames(t);return Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(t))),e.filter(function(e){return n.call(t,e)})}var n=Object.prototype.propertyIsEnumerable;t.exports=Object.assign||function(t,e){for(var n,r,i=s(t),o=1;o<arguments.length;o++){n=arguments[o],r=a(Object(n));for(var c=0;c<r.length;c++)i[r[c]]=n[r[c]]}return i}},function(e,s){e.exports=t},function(t,e,s){"use strict";var a=s(2),n=s(4),r=a.DOM,i=a.createClass({render:function(){var t,e=this.renderFooter(),s=this.props.viewDate,a=s.localeData();return t=[r.thead({key:"th"},[r.tr({key:"h"},[r.th({key:"p",className:"rdtPrev"},r.span({onClick:this.props.subtractTime(1,"months")},"‹")),r.th({key:"s",className:"rdtSwitch",onClick:this.props.showView("months"),colSpan:5,"data-value":this.props.viewDate.month()},a.months(s)+" "+s.year()),r.th({key:"n",className:"rdtNext"},r.span({onClick:this.props.addTime(1,"months")},"›"))]),r.tr({key:"d"},this.getDaysOfWeek(a).map(function(t,e){return r.th({key:t+e,className:"dow"},t)}))]),r.tbody({key:"tb"},this.renderDays())],e&&t.push(e),r.div({className:"rdtDays"},r.table({},t))},getDaysOfWeek:function(t){var e=t._weekdaysMin,s=t.firstDayOfWeek(),a=[],n=0;return e.forEach(function(t){a[(7+n++-s)%7]=t}),a},renderDays:function(){var t,e,s,a,i=this.props.viewDate,o=this.props.selectedDate&&this.props.selectedDate.clone(),c=i.clone().subtract(1,"months"),p=i.year(),u=i.month(),d=[],l=[],h=this.props.renderDay||this.renderDay,m=this.props.isValidDate||this.isValidDate;c.date(c.daysInMonth()).startOf("week");for(var f=c.clone().add(42,"d");c.isBefore(f);)t="rdtDay",a=c.clone(),c.year()===p&&c.month()<u||c.year()<p?t+=" rdtOld":(c.year()===p&&c.month()>u||c.year()>p)&&(t+=" rdtNew"),o&&c.isSame(o,"day")&&(t+=" rdtActive"),c.isSame(n(),"day")&&(t+=" rdtToday"),e=!m(a,o),e&&(t+=" rdtDisabled"),s={key:c.format("M_D"),"data-value":c.date(),className:t},e||(s.onClick=this.updateSelectedDate),l.push(h(s,a,o)),7===l.length&&(d.push(r.tr({key:c.format("M_D")},l)),l=[]),c.add(1,"d");return d},updateSelectedDate:function(t){this.props.updateSelectedDate(t,!0)},renderDay:function(t,e){return r.td(t,e.date())},renderFooter:function(){if(!this.props.timeFormat)return"";var t=this.props.selectedDate||this.props.viewDate;return r.tfoot({key:"tf"},r.tr({},r.td({onClick:this.props.showView("time"),colSpan:7,className:"rdtTimeToggle"},t.format(this.props.timeFormat))))},isValidDate:function(){return 1}});t.exports=i},function(t,s){t.exports=e},function(t,e,s){"use strict";function a(t){return t.charAt(0).toUpperCase()+t.slice(1)}var n=s(2),r=n.DOM,i=n.createClass({render:function(){return r.div({className:"rdtMonths"},[r.table({key:"a"},r.thead({},r.tr({},[r.th({key:"prev",className:"rdtPrev"},r.span({onClick:this.props.subtractTime(1,"years")},"‹")),r.th({key:"year",className:"rdtSwitch",onClick:this.props.showView("years"),colSpan:2,"data-value":this.props.viewDate.year()},this.props.viewDate.year()),r.th({key:"next",className:"rdtNext"},r.span({onClick:this.props.addTime(1,"years")},"›"))]))),r.table({key:"months"},r.tbody({key:"b"},this.renderMonths()))])},renderMonths:function(){for(var t,e,s=this.props.selectedDate,a=this.props.viewDate.month(),n=this.props.viewDate.year(),i=[],o=0,c=[],p=this.props.renderMonth||this.renderMonth;o<12;)t="rdtMonth",s&&o===a&&n===s.year()&&(t+=" rdtActive"),e={key:o,"data-value":o,className:t,onClick:"months"===this.props.updateOn?this.updateSelectedMonth:this.props.setDate("month")},c.push(p(e,o,n,s&&s.clone())),4===c.length&&(i.push(r.tr({key:a+"_"+i.length},c)),c=[]),o++;return i},updateSelectedMonth:function(t){this.props.updateSelectedDate(t,!0)},renderMonth:function(t,e){var s=this.props.viewDate.localeData()._monthsShort;return r.td(t,s.standalone?a(s.standalone[e]):s[e])}});t.exports=i},function(t,e,s){"use strict";var a=s(2),n=a.DOM,r=a.createClass({render:function(){var t=10*parseInt(this.props.viewDate.year()/10,10);return n.div({className:"rdtYears"},[n.table({key:"a"},n.thead({},n.tr({},[n.th({key:"prev",className:"rdtPrev"},n.span({onClick:this.props.subtractTime(10,"years")},"‹")),n.th({key:"year",className:"rdtSwitch",onClick:this.props.showView("years"),colSpan:2},t+"-"+(t+9)),n.th({key:"next",className:"rdtNext"},n.span({onClick:this.props.addTime(10,"years")},"›"))]))),n.table({key:"years"},n.tbody({},this.renderYears(t)))])},renderYears:function(t){var e,s,a=[],r=-1,i=[],o=this.props.renderYear||this.renderYear,c=this.props.selectedDate;for(t--;r<11;)e="rdtYear",r===-1|10===r&&(e+=" rdtOld"),c&&c.year()===t&&(e+=" rdtActive"),s={key:t,"data-value":t,className:e,onClick:"years"===this.props.updateOn?this.updateSelectedYear:this.props.setDate("year")},a.push(o(s,t,c&&c.clone())),4===a.length&&(i.push(n.tr({key:r},a)),a=[]),t++,r++;return i},updateSelectedYear:function(t){this.props.updateSelectedDate(t,!0)},renderYear:function(t,e){return n.td(t,e)}});t.exports=r},function(t,e,s){"use strict";var a=s(2),n=s(1),r=a.DOM,i=a.createClass({getInitialState:function(){return this.calculateState(this.props)},calculateState:function(t){var e=t.selectedDate||t.viewDate,s=t.timeFormat,a=[];s.indexOf("H")===-1&&s.indexOf("h")===-1||(a.push("hours"),s.indexOf("m")!==-1&&(a.push("minutes"),s.indexOf("s")!==-1&&a.push("seconds")));var n=!1;return this.props.timeFormat.indexOf(" A")!==-1&&null!==this.state&&(n=this.state.hours>=12?"PM":"AM"),{hours:e.format("H"),minutes:e.format("mm"),seconds:e.format("ss"),milliseconds:e.format("SSS"),daypart:n,counters:a}},renderCounter:function(t){if("daypart"!==t){var e=this.state[t];return"hours"===t&&this.props.timeFormat.indexOf(" A")!==-1&&(e=(e-1)%12+1,0===e&&(e=12)),r.div({key:t,className:"rdtCounter"},[r.span({key:"up",className:"rdtBtn",onMouseDown:this.onStartClicking("increase",t)},"▲"),r.div({key:"c",className:"rdtCount"},e),r.span({key:"do",className:"rdtBtn",onMouseDown:this.onStartClicking("decrease",t)},"▼")])}return""},renderDayPart:function(){return r.div({className:"rdtCounter",key:"dayPart"},[r.span({key:"up",className:"rdtBtn",onMouseDown:this.onStartClicking("toggleDayPart","hours")},"▲"),r.div({key:this.state.daypart,className:"rdtCount"},this.state.daypart),r.span({key:"do",className:"rdtBtn",onMouseDown:this.onStartClicking("toggleDayPart","hours")},"▼")])},render:function(){var t=this,e=[];return this.state.counters.forEach(function(s){e.length&&e.push(r.div({key:"sep"+e.length,className:"rdtCounterSeparator"},":")),e.push(t.renderCounter(s))}),this.state.daypart!==!1&&e.push(t.renderDayPart()),3===this.state.counters.length&&this.props.timeFormat.indexOf("S")!==-1&&(e.push(r.div({className:"rdtCounterSeparator",key:"sep5"},":")),e.push(r.div({className:"rdtCounter rdtMilli",key:"m"},r.input({value:this.state.milliseconds,type:"text",onChange:this.updateMilli})))),r.div({className:"rdtTime"},r.table({},[this.renderHeader(),r.tbody({key:"b"},r.tr({},r.td({},r.div({className:"rdtCounters"},e))))]))},componentWillMount:function(){var t=this;t.timeConstraints={hours:{min:0,max:23,step:1},minutes:{min:0,max:59,step:1},seconds:{min:0,max:59,step:1},milliseconds:{min:0,max:999,step:1}},["hours","minutes","seconds","milliseconds"].forEach(function(e){n(t.timeConstraints[e],t.props.timeConstraints[e])}),this.setState(this.calculateState(this.props))},componentWillReceiveProps:function(t){this.setState(this.calculateState(t))},updateMilli:function(t){var e=parseInt(t.target.value,10);e===t.target.value&&e>=0&&e<1e3&&(this.props.setTime("milliseconds",e),this.setState({milliseconds:e}))},renderHeader:function(){if(!this.props.dateFormat)return null;var t=this.props.selectedDate||this.props.viewDate;return r.thead({key:"h"},r.tr({},r.th({className:"rdtSwitch",colSpan:4,onClick:this.props.showView("days")},t.format(this.props.dateFormat))))},onStartClicking:function(t,e){var s=this;return function(){var a={};a[e]=s[t](e),s.setState(a),s.timer=setTimeout(function(){s.increaseTimer=setInterval(function(){a[e]=s[t](e),s.setState(a)},70)},500),s.mouseUpListener=function(){clearTimeout(s.timer),clearInterval(s.increaseTimer),s.props.setTime(e,s.state[e]),document.body.removeEventListener("mouseup",s.mouseUpListener)},document.body.addEventListener("mouseup",s.mouseUpListener)}},padValues:{hours:1,minutes:2,seconds:2,milliseconds:3},toggleDayPart:function(t){var e=parseInt(this.state[t],10)+12;return e>this.timeConstraints[t].max&&(e=this.timeConstraints[t].min+(e-(this.timeConstraints[t].max+1))),this.pad(t,e)},increase:function(t){var e=parseInt(this.state[t],10)+this.timeConstraints[t].step;return e>this.timeConstraints[t].max&&(e=this.timeConstraints[t].min+(e-(this.timeConstraints[t].max+1))),this.pad(t,e)},decrease:function(t){var e=parseInt(this.state[t],10)-this.timeConstraints[t].step;return e<this.timeConstraints[t].min&&(e=this.timeConstraints[t].max+1-(this.timeConstraints[t].min-e)),this.pad(t,e)},pad:function(t,e){for(var s=e+"";s.length<this.padValues[t];)s="0"+s;return s}});t.exports=i},function(t,e,s){"use strict";var a=s(2),n=a.version&&a.version.split(".");n&&(n[0]>0||n[1]>13)&&(a=s(9));var r=[],i=[],o="ignore-react-onclickoutside",c=function(t,e){return t===e||(t.correspondingElement?t.correspondingElement.classList.contains(o):t.classList.contains(o))};t.exports={componentDidMount:function(){if("function"!=typeof this.handleClickOutside)throw new Error("Component lacks a handleClickOutside(event) function for processing outside click events.");var t=this.__outsideClickHandler=function(t,e){return function(s){s.stopPropagation();for(var a=s.target,n=!1;a.parentNode;){if(n=c(a,t))return;a=a.parentNode}e(s)}}(a.findDOMNode(this),this.handleClickOutside),e=r.length;r.push(this),i[e]=t,this.props.disableOnClickOutside||this.enableOnClickOutside()},componentWillUnmount:function(){this.disableOnClickOutside(),this.__outsideClickHandler=!1;var t=r.indexOf(this);t>-1&&i[t]&&(i.splice(t,1),r.splice(t,1))},enableOnClickOutside:function(){var t=this.__outsideClickHandler;document.addEventListener("mousedown",t),document.addEventListener("touchstart",t)},disableOnClickOutside:function(){var t=this.__outsideClickHandler;document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t)}}},function(t,e){t.exports=s}])}); |
| | | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlYWN0LWRhdGV0aW1lLm1pbi5qcyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwidGhpcyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMl9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV80X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzlfXyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaWQiLCJsb2FkZWQiLCJjYWxsIiwibSIsImMiLCJwIiwiYXNzaWduIiwiUmVhY3QiLCJEYXlzVmlldyIsIk1vbnRoc1ZpZXciLCJZZWFyc1ZpZXciLCJUaW1lVmlldyIsIm1vbWVudCIsIlRZUEVTIiwiUHJvcFR5cGVzIiwiRGF0ZXRpbWUiLCJjcmVhdGVDbGFzcyIsIm1peGlucyIsInZpZXdDb21wb25lbnRzIiwiZGF5cyIsIm1vbnRocyIsInllYXJzIiwidGltZSIsInByb3BUeXBlcyIsIm9uRm9jdXMiLCJmdW5jIiwib25CbHVyIiwib25DaGFuZ2UiLCJsb2NhbGUiLCJzdHJpbmciLCJpbnB1dCIsImJvb2wiLCJpbnB1dFByb3BzIiwib2JqZWN0IiwidGltZUNvbnN0cmFpbnRzIiwidmlld01vZGUiLCJvbmVPZiIsImlzVmFsaWREYXRlIiwib3BlbiIsInN0cmljdFBhcnNpbmciLCJjbG9zZU9uU2VsZWN0IiwiY2xvc2VPblRhYiIsImdldERlZmF1bHRQcm9wcyIsIm5vZiIsImNsYXNzTmFtZSIsImRlZmF1bHRWYWx1ZSIsInRpbWVGb3JtYXQiLCJkYXRlRm9ybWF0IiwiZ2V0SW5pdGlhbFN0YXRlIiwic3RhdGUiLCJnZXRTdGF0ZUZyb21Qcm9wcyIsInByb3BzIiwidW5kZWZpbmVkIiwiY3VycmVudFZpZXciLCJ1cGRhdGVPbiIsInNlbGVjdGVkRGF0ZSIsInZpZXdEYXRlIiwiaW5wdXRWYWx1ZSIsImZvcm1hdHMiLCJnZXRGb3JtYXRzIiwiZGF0ZSIsInZhbHVlIiwibG9jYWxNb21lbnQiLCJkYXRldGltZSIsImlzVmFsaWQiLCJjbG9uZSIsInN0YXJ0T2YiLCJnZXRVcGRhdGVPbiIsImZvcm1hdCIsImlucHV0Rm9ybWF0IiwibWF0Y2giLCJpbmRleE9mIiwibG9jYWxlRGF0YSIsImxvbmdEYXRlRm9ybWF0IiwiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsIm5leHRQcm9wcyIsInVwZGF0ZSIsInNldFN0YXRlIiwib25JbnB1dENoYW5nZSIsImUiLCJ0YXJnZXQiLCJvbklucHV0S2V5Iiwid2hpY2giLCJjbG9zZUNhbGVuZGFyIiwic2hvd1ZpZXciLCJ2aWV3IiwibWUiLCJzZXREYXRlIiwidHlwZSIsIm5leHRWaWV3cyIsIm1vbnRoIiwieWVhciIsInBhcnNlSW50IiwiZ2V0QXR0cmlidXRlIiwiYWRkVGltZSIsImFtb3VudCIsInRvU2VsZWN0ZWQiLCJ1cGRhdGVUaW1lIiwic3VidHJhY3RUaW1lIiwib3AiLCJhbGxvd2VkU2V0VGltZSIsInNldFRpbWUiLCJuZXh0VHlwZSIsImluZGV4IiwibGVuZ3RoIiwidXBkYXRlU2VsZWN0ZWREYXRlIiwiY2xvc2UiLCJtb2RpZmllciIsImN1cnJlbnREYXRlIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyIsIm9wZW5DYWxlbmRhciIsImhhbmRsZUNsaWNrT3V0c2lkZSIsImNvbXBvbmVudFByb3BzIiwiZnJvbVByb3BzIiwiZnJvbVN0YXRlIiwiZnJvbVRoaXMiLCJnZXRDb21wb25lbnRQcm9wcyIsImZvckVhY2giLCJuYW1lIiwicmVuZGVyIiwiQ29tcG9uZW50IiwiRE9NIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsImNoaWxkcmVuIiwia2V5Iiwib25LZXlEb3duIiwiZGl2IiwiY29uY2F0IiwiY3JlYXRlRWxlbWVudCIsIlRvT2JqZWN0IiwidmFsIiwiVHlwZUVycm9yIiwiT2JqZWN0Iiwib3duRW51bWVyYWJsZUtleXMiLCJvYmoiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsInByb3BJc0VudW1lcmFibGUiLCJwcm90b3R5cGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInNvdXJjZSIsImZyb20iLCJ0byIsInMiLCJhcmd1bWVudHMiLCJpIiwiRGF0ZVRpbWVQaWNrZXJEYXlzIiwidGFibGVDaGlsZHJlbiIsImZvb3RlciIsInJlbmRlckZvb3RlciIsInRoZWFkIiwidHIiLCJ0aCIsInNwYW4iLCJvbkNsaWNrIiwiY29sU3BhbiIsImRhdGEtdmFsdWUiLCJnZXREYXlzT2ZXZWVrIiwibWFwIiwiZGF5IiwidGJvZHkiLCJyZW5kZXJEYXlzIiwicHVzaCIsInRhYmxlIiwiX3dlZWtkYXlzTWluIiwiZmlyc3QiLCJmaXJzdERheU9mV2VlayIsImRvdyIsImNsYXNzZXMiLCJkaXNhYmxlZCIsImRheVByb3BzIiwic2VsZWN0ZWQiLCJwcmV2TW9udGgiLCJzdWJ0cmFjdCIsImN1cnJlbnRZZWFyIiwiY3VycmVudE1vbnRoIiwid2Vla3MiLCJyZW5kZXJlciIsInJlbmRlckRheSIsImRheXNJbk1vbnRoIiwibGFzdERheSIsImFkZCIsImlzQmVmb3JlIiwiaXNTYW1lIiwiZXZlbnQiLCJ0ZCIsInRmb290IiwiY2FwaXRhbGl6ZSIsInN0ciIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJEYXRlVGltZVBpY2tlck1vbnRocyIsInJlbmRlck1vbnRocyIsInJvd3MiLCJyZW5kZXJNb250aCIsInVwZGF0ZVNlbGVjdGVkTW9udGgiLCJtb250aHNTaG9ydCIsIl9tb250aHNTaG9ydCIsInN0YW5kYWxvbmUiLCJEYXRlVGltZVBpY2tlclllYXJzIiwicmVuZGVyWWVhcnMiLCJyZW5kZXJZZWFyIiwidXBkYXRlU2VsZWN0ZWRZZWFyIiwiRGF0ZVRpbWVQaWNrZXJUaW1lIiwiY2FsY3VsYXRlU3RhdGUiLCJjb3VudGVycyIsImRheXBhcnQiLCJyZW5kZXJDb3VudGVyIiwib25Nb3VzZURvd24iLCJvblN0YXJ0Q2xpY2tpbmciLCJyZW5kZXJEYXlQYXJ0IiwidXBkYXRlTWlsbGkiLCJyZW5kZXJIZWFkZXIiLCJjb21wb25lbnRXaWxsTW91bnQiLCJtaW4iLCJtYXgiLCJzdGVwIiwibWlsbGkiLCJhY3Rpb24iLCJ0aW1lciIsInNldFRpbWVvdXQiLCJpbmNyZWFzZVRpbWVyIiwic2V0SW50ZXJ2YWwiLCJtb3VzZVVwTGlzdGVuZXIiLCJjbGVhclRpbWVvdXQiLCJjbGVhckludGVydmFsIiwiZG9jdW1lbnQiLCJib2R5IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYWRWYWx1ZXMiLCJ0b2dnbGVEYXlQYXJ0IiwicGFkIiwiaW5jcmVhc2UiLCJkZWNyZWFzZSIsInZlcnNpb24iLCJzcGxpdCIsInJlZ2lzdGVyZWRDb21wb25lbnRzIiwiaGFuZGxlcnMiLCJJR05PUkVfQ0xBU1MiLCJpc1NvdXJjZUZvdW5kIiwibG9jYWxOb2RlIiwiY29ycmVzcG9uZGluZ0VsZW1lbnQiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImNvbXBvbmVudERpZE1vdW50IiwiRXJyb3IiLCJmbiIsIl9fb3V0c2lkZUNsaWNrSGFuZGxlciIsImV2ZW50SGFuZGxlciIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImZvdW5kIiwicGFyZW50Tm9kZSIsImZpbmRET01Ob2RlIiwicG9zIiwiZGlzYWJsZU9uQ2xpY2tPdXRzaWRlIiwiZW5hYmxlT25DbGlja091dHNpZGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkNBQUEsU0FBMkNBLEVBQU1DLEdBQzFCLGdCQUFaQyxVQUEwQyxnQkFBWEMsUUFDeENBLE9BQU9ELFFBQVVELEVBQVFHLFFBQVEsU0FBVUEsUUFBUSxVQUFXQSxRQUFRLGFBQzdDLGtCQUFYQyxTQUF5QkEsT0FBT0MsSUFDOUNELFFBQVEsUUFBUyxTQUFVLFlBQWFKLEdBQ2QsZ0JBQVpD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RCxFQUFRWixFQUFjckcsRUFBUXNHLEdBQ25CLE1BQ1h0RyxHQUFTQSxFQUFPa0gsV0FFbEJKLEVBQWFDLEtBRWYzUCxFQUFNK1AsWUFBWTlRLE1BQU9BLEtBQUswSCxvQkFFNUJxSixFQUFNbEIsRUFBcUI3SSxNQUMvQjZJLEdBQXFCNUUsS0FBS2pMLE1BQzFCOFAsRUFBU2lCLEdBQU9SLEVBSVh2USxLQUFLMkQsTUFBTXFOLHVCQUNkaFIsS0FBS2lSLHdCQUlUQyxxQkFBc0IsV0FDcEJsUixLQUFLZ1Isd0JBQ0xoUixLQUFLd1EsdUJBQXdCLENBQzdCLElBQUlPLEdBQU1sQixFQUFxQjlLLFFBQVEvRSxLQUNsQytRLE9BQ0NqQixFQUFTaUIsS0FFWGpCLEVBQVNxQixPQUFPSixFQUFLLEdBQ3JCbEIsRUFBcUJzQixPQUFPSixFQUFLLEtBU3ZDRSxxQkFBc0IsV0FDcEIsR0FBSVYsR0FBS3ZRLEtBQUt3USxxQkFDZHRCLFVBQVNHLGlCQUFpQixZQUFha0IsR0FDdkNyQixTQUFTRyxpQkFBaUIsYUFBY2tCLElBTzFDUyxzQkFBdUIsV0FDckIsR0FBSVQsR0FBS3ZRLEtBQUt3USxxQkFDZHRCLFVBQVNFLG9CQUFvQixZQUFhbUIsR0FDMUNyQixTQUFTRSxvQkFBb0IsYUFBY21CLE1BT3pDLFNBQVMzUSxFQUFRRCxHQUV0QkMsRUFBT0QsUUFBVVEiLCJmaWxlIjoicmVhY3QtZGF0ZXRpbWUubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiUmVhY3RcIiksIHJlcXVpcmUoXCJtb21lbnRcIiksIHJlcXVpcmUoXCJSZWFjdERPTVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJSZWFjdFwiLCBcIm1vbWVudFwiLCBcIlJlYWN0RE9NXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkRhdGV0aW1lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwiUmVhY3RcIiksIHJlcXVpcmUoXCJtb21lbnRcIiksIHJlcXVpcmUoXCJSZWFjdERPTVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiRGF0ZXRpbWVcIl0gPSBmYWN0b3J5KHJvb3RbXCJSZWFjdFwiXSwgcm9vdFtcIm1vbWVudFwiXSwgcm9vdFtcIlJlYWN0RE9NXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMl9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzRfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV85X18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRcdFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSxcblx0XHREYXlzVmlldyA9IF9fd2VicGFja19yZXF1aXJlX18oMyksXG5cdFx0TW9udGhzVmlldyA9IF9fd2VicGFja19yZXF1aXJlX18oNSksXG5cdFx0WWVhcnNWaWV3ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KSxcblx0XHRUaW1lVmlldyA9IF9fd2VicGFja19yZXF1aXJlX18oNyksXG5cdFx0bW9tZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KVxuXHQ7XG5cblx0dmFyIFRZUEVTID0gUmVhY3QuUHJvcFR5cGVzO1xuXHR2YXIgRGF0ZXRpbWUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdFx0bWl4aW5zOiBbXG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG5cdFx0XSxcblx0XHR2aWV3Q29tcG9uZW50czoge1xuXHRcdFx0ZGF5czogRGF5c1ZpZXcsXG5cdFx0XHRtb250aHM6IE1vbnRoc1ZpZXcsXG5cdFx0XHR5ZWFyczogWWVhcnNWaWV3LFxuXHRcdFx0dGltZTogVGltZVZpZXdcblx0XHR9LFxuXHRcdHByb3BUeXBlczoge1xuXHRcdFx0Ly8gdmFsdWU6IFRZUEVTLm9iamVjdCB8IFRZUEVTLnN0cmluZyxcblx0XHRcdC8vIGRlZmF1bHRWYWx1ZTogVFlQRVMub2JqZWN0IHwgVFlQRVMuc3RyaW5nLFxuXHRcdFx0b25Gb2N1czogVFlQRVMuZnVuYyxcblx0XHRcdG9uQmx1cjogVFlQRVMuZnVuYyxcblx0XHRcdG9uQ2hhbmdlOiBUWVBFUy5mdW5jLFxuXHRcdFx0bG9jYWxlOiBUWVBFUy5zdHJpbmcsXG5cdFx0XHRpbnB1dDogVFlQRVMuYm9vbCxcblx0XHRcdC8vIGRhdGVGb3JtYXQ6IFRZUEVTLnN0cmluZyB8IFRZUEVTLmJvb2wsXG5cdFx0XHQvLyB0aW1lRm9ybWF0OiBUWVBFUy5zdHJpbmcgfCBUWVBFUy5ib29sLFxuXHRcdFx0aW5wdXRQcm9wczogVFlQRVMub2JqZWN0LFxuXHRcdFx0dGltZUNvbnN0cmFpbnRzOiBUWVBFUy5vYmplY3QsXG5cdFx0XHR2aWV3TW9kZTogVFlQRVMub25lT2YoWyd5ZWFycycsICdtb250aHMnLCAnZGF5cycsICd0aW1lJ10pLFxuXHRcdFx0aXNWYWxpZERhdGU6IFRZUEVTLmZ1bmMsXG5cdFx0XHRvcGVuOiBUWVBFUy5ib29sLFxuXHRcdFx0c3RyaWN0UGFyc2luZzogVFlQRVMuYm9vbCxcblx0XHRcdGNsb3NlT25TZWxlY3Q6IFRZUEVTLmJvb2wsXG5cdFx0XHRjbG9zZU9uVGFiOiBUWVBFUy5ib29sXG5cdFx0fSxcblxuXHRcdGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbm9mID0gZnVuY3Rpb24oKXt9O1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y2xhc3NOYW1lOiAnJyxcblx0XHRcdFx0ZGVmYXVsdFZhbHVlOiAnJyxcblx0XHRcdFx0aW5wdXRQcm9wczoge30sXG5cdFx0XHRcdGlucHV0OiB0cnVlLFxuXHRcdFx0XHRvbkZvY3VzOiBub2YsXG5cdFx0XHRcdG9uQmx1cjogbm9mLFxuXHRcdFx0XHRvbkNoYW5nZTogbm9mLFxuXHRcdFx0XHR0aW1lRm9ybWF0OiB0cnVlLFxuXHRcdFx0XHR0aW1lQ29uc3RyYWludHM6IHt9LFxuXHRcdFx0XHRkYXRlRm9ybWF0OiB0cnVlLFxuXHRcdFx0XHRzdHJpY3RQYXJzaW5nOiB0cnVlLFxuXHRcdFx0XHRjbG9zZU9uU2VsZWN0OiBmYWxzZSxcblx0XHRcdFx0Y2xvc2VPblRhYjogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Z2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGVGcm9tUHJvcHMoIHRoaXMucHJvcHMgKTtcblxuXHRcdFx0aWYgKCBzdGF0ZS5vcGVuID09PSB1bmRlZmluZWQgKVxuXHRcdFx0XHRzdGF0ZS5vcGVuID0gIXRoaXMucHJvcHMuaW5wdXQ7XG5cblx0XHRcdHN0YXRlLmN1cnJlbnRWaWV3ID0gdGhpcy5wcm9wcy5kYXRlRm9ybWF0ID8gKHRoaXMucHJvcHMudmlld01vZGUgfHwgc3RhdGUudXBkYXRlT24gfHwgJ2RheXMnKSA6ICd0aW1lJztcblxuXHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdH0sXG5cblx0XHRnZXRTdGF0ZUZyb21Qcm9wczogZnVuY3Rpb24oIHByb3BzICl7XG5cdFx0XHR2YXIgZm9ybWF0cyA9IHRoaXMuZ2V0Rm9ybWF0cyggcHJvcHMgKSxcblx0XHRcdFx0ZGF0ZSA9IHByb3BzLnZhbHVlIHx8IHByb3BzLmRlZmF1bHRWYWx1ZSxcblx0XHRcdFx0c2VsZWN0ZWREYXRlLCB2aWV3RGF0ZSwgdXBkYXRlT24sIGlucHV0VmFsdWVcblx0XHRcdDtcblxuXHRcdFx0aWYgKCBkYXRlICYmIHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJyApXG5cdFx0XHRcdHNlbGVjdGVkRGF0ZSA9IHRoaXMubG9jYWxNb21lbnQoIGRhdGUsIGZvcm1hdHMuZGF0ZXRpbWUgKTtcblx0XHRcdGVsc2UgaWYgKCBkYXRlIClcblx0XHRcdFx0c2VsZWN0ZWREYXRlID0gdGhpcy5sb2NhbE1vbWVudCggZGF0ZSApO1xuXG5cdFx0XHRpZiAoIHNlbGVjdGVkRGF0ZSAmJiAhc2VsZWN0ZWREYXRlLmlzVmFsaWQoKSApXG5cdFx0XHRcdHNlbGVjdGVkRGF0ZSA9IG51bGw7XG5cblx0XHRcdHZpZXdEYXRlID0gc2VsZWN0ZWREYXRlID9cblx0XHRcdFx0c2VsZWN0ZWREYXRlLmNsb25lKCkuc3RhcnRPZignbW9udGgnKSA6XG5cdFx0XHRcdHRoaXMubG9jYWxNb21lbnQoKS5zdGFydE9mKCdtb250aCcpXG5cdFx0XHQ7XG5cblx0XHRcdHVwZGF0ZU9uID0gdGhpcy5nZXRVcGRhdGVPbihmb3JtYXRzKTtcblxuXHRcdFx0aWYgKCBzZWxlY3RlZERhdGUgKVxuXHRcdFx0XHRpbnB1dFZhbHVlID0gc2VsZWN0ZWREYXRlLmZvcm1hdChmb3JtYXRzLmRhdGV0aW1lKTtcblx0XHRcdGVsc2UgaWYgKCBkYXRlLmlzVmFsaWQgJiYgIWRhdGUuaXNWYWxpZCgpIClcblx0XHRcdFx0aW5wdXRWYWx1ZSA9ICcnO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbnB1dFZhbHVlID0gZGF0ZSB8fCAnJztcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dXBkYXRlT246IHVwZGF0ZU9uLFxuXHRcdFx0XHRpbnB1dEZvcm1hdDogZm9ybWF0cy5kYXRldGltZSxcblx0XHRcdFx0dmlld0RhdGU6IHZpZXdEYXRlLFxuXHRcdFx0XHRzZWxlY3RlZERhdGU6IHNlbGVjdGVkRGF0ZSxcblx0XHRcdFx0aW5wdXRWYWx1ZTogaW5wdXRWYWx1ZSxcblx0XHRcdFx0b3BlbjogcHJvcHMub3BlblxuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Z2V0VXBkYXRlT246IGZ1bmN0aW9uKGZvcm1hdHMpe1xuXHRcdFx0aWYgKCBmb3JtYXRzLmRhdGUubWF0Y2goL1tsTERdLykgKXtcblx0XHRcdFx0cmV0dXJuICdkYXlzJztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKCBmb3JtYXRzLmRhdGUuaW5kZXhPZignTScpICE9PSAtMSApe1xuXHRcdFx0XHRyZXR1cm4gJ21vbnRocyc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICggZm9ybWF0cy5kYXRlLmluZGV4T2YoJ1knKSAhPT0gLTEgKXtcblx0XHRcdFx0cmV0dXJuICd5ZWFycyc7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAnZGF5cyc7XG5cdFx0fSxcblxuXHRcdGdldEZvcm1hdHM6IGZ1bmN0aW9uKCBwcm9wcyApe1xuXHRcdFx0dmFyIGZvcm1hdHMgPSB7XG5cdFx0XHRcdFx0ZGF0ZTogcHJvcHMuZGF0ZUZvcm1hdCB8fCAnJyxcblx0XHRcdFx0XHR0aW1lOiBwcm9wcy50aW1lRm9ybWF0IHx8ICcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxvY2FsZSA9IHRoaXMubG9jYWxNb21lbnQoIHByb3BzLmRhdGUgKS5sb2NhbGVEYXRhKClcblx0XHRcdDtcblxuXHRcdFx0aWYgKCBmb3JtYXRzLmRhdGUgPT09IHRydWUgKXtcblx0XHRcdFx0Zm9ybWF0cy5kYXRlID0gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KCdMJyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICggdGhpcy5nZXRVcGRhdGVPbihmb3JtYXRzKSAhPT0gJ2RheXMnICl7XG5cdFx0XHRcdGZvcm1hdHMudGltZSA9ICcnO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGZvcm1hdHMudGltZSA9PT0gdHJ1ZSApe1xuXHRcdFx0XHRmb3JtYXRzLnRpbWUgPSBsb2NhbGUubG9uZ0RhdGVGb3JtYXQoJ0xUJyk7XG5cdFx0XHR9XG5cblx0XHRcdGZvcm1hdHMuZGF0ZXRpbWUgPSBmb3JtYXRzLmRhdGUgJiYgZm9ybWF0cy50aW1lID9cblx0XHRcdFx0Zm9ybWF0cy5kYXRlICsgJyAnICsgZm9ybWF0cy50aW1lIDpcblx0XHRcdFx0Zm9ybWF0cy5kYXRlIHx8IGZvcm1hdHMudGltZVxuXHRcdFx0O1xuXG5cdFx0XHRyZXR1cm4gZm9ybWF0cztcblx0XHR9LFxuXG5cdFx0Y29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24obmV4dFByb3BzKSB7XG5cdFx0XHR2YXIgZm9ybWF0cyA9IHRoaXMuZ2V0Rm9ybWF0cyggbmV4dFByb3BzICksXG5cdFx0XHRcdHVwZGF0ZSA9IHt9XG5cdFx0XHQ7XG5cblx0XHRcdGlmICggbmV4dFByb3BzLnZhbHVlICE9PSB0aGlzLnByb3BzLnZhbHVlICl7XG5cdFx0XHRcdHVwZGF0ZSA9IHRoaXMuZ2V0U3RhdGVGcm9tUHJvcHMoIG5leHRQcm9wcyApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBmb3JtYXRzLmRhdGV0aW1lICE9PSB0aGlzLmdldEZvcm1hdHMoIHRoaXMucHJvcHMgKS5kYXRldGltZSApIHtcblx0XHRcdFx0dXBkYXRlLmlucHV0Rm9ybWF0ID0gZm9ybWF0cy5kYXRldGltZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1cGRhdGUub3BlbiA9PT0gdW5kZWZpbmVkICl7XG5cdFx0XHRcdGlmICggdGhpcy5wcm9wcy5jbG9zZU9uU2VsZWN0ICYmIHRoaXMuc3RhdGUuY3VycmVudFZpZXcgIT09ICd0aW1lJyApe1xuXHRcdFx0XHRcdHVwZGF0ZS5vcGVuID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0dXBkYXRlLm9wZW4gPSB0aGlzLnN0YXRlLm9wZW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXRTdGF0ZSggdXBkYXRlICk7XG5cdFx0fSxcblxuXHRcdG9uSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0dmFyIHZhbHVlID0gZS50YXJnZXQgPT09IG51bGwgPyBlIDogZS50YXJnZXQudmFsdWUsXG5cdFx0XHRcdGxvY2FsTW9tZW50ID0gdGhpcy5sb2NhbE1vbWVudCggdmFsdWUsIHRoaXMuc3RhdGUuaW5wdXRGb3JtYXQgKSxcblx0XHRcdFx0dXBkYXRlID0geyBpbnB1dFZhbHVlOiB2YWx1ZSB9XG5cdFx0XHQ7XG5cblx0XHRcdGlmICggbG9jYWxNb21lbnQuaXNWYWxpZCgpICYmICF0aGlzLnByb3BzLnZhbHVlICkge1xuXHRcdFx0XHR1cGRhdGUuc2VsZWN0ZWREYXRlID0gbG9jYWxNb21lbnQ7XG5cdFx0XHRcdHVwZGF0ZS52aWV3RGF0ZSA9IGxvY2FsTW9tZW50LmNsb25lKCkuc3RhcnRPZignbW9udGgnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR1cGRhdGUuc2VsZWN0ZWREYXRlID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0U3RhdGUoIHVwZGF0ZSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnByb3BzLm9uQ2hhbmdlKCBsb2NhbE1vbWVudC5pc1ZhbGlkKCkgPyBsb2NhbE1vbWVudCA6IHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSApO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdG9uSW5wdXRLZXk6IGZ1bmN0aW9uKCBlICl7XG5cdFx0XHRpZiAoIGUud2hpY2ggPT09IDkgJiYgdGhpcy5wcm9wcy5jbG9zZU9uVGFiICl7XG5cdFx0XHRcdHRoaXMuY2xvc2VDYWxlbmRhcigpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzaG93VmlldzogZnVuY3Rpb24oIHZpZXcgKXtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKXtcblx0XHRcdFx0bWUuc2V0U3RhdGUoeyBjdXJyZW50VmlldzogdmlldyB9KTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdHNldERhdGU6IGZ1bmN0aW9uKCB0eXBlICl7XG5cdFx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0XHRuZXh0Vmlld3MgPSB7XG5cdFx0XHRcdFx0bW9udGg6ICdkYXlzJyxcblx0XHRcdFx0XHR5ZWFyOiAnbW9udGhzJ1xuXHRcdFx0XHR9XG5cdFx0XHQ7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGUgKXtcblx0XHRcdFx0bWUuc2V0U3RhdGUoe1xuXHRcdFx0XHRcdHZpZXdEYXRlOiBtZS5zdGF0ZS52aWV3RGF0ZS5jbG9uZSgpWyB0eXBlIF0oIHBhcnNlSW50KGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLCAxMCkgKS5zdGFydE9mKCB0eXBlICksXG5cdFx0XHRcdFx0Y3VycmVudFZpZXc6IG5leHRWaWV3c1sgdHlwZSBdXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0YWRkVGltZTogZnVuY3Rpb24oIGFtb3VudCwgdHlwZSwgdG9TZWxlY3RlZCApe1xuXHRcdFx0cmV0dXJuIHRoaXMudXBkYXRlVGltZSggJ2FkZCcsIGFtb3VudCwgdHlwZSwgdG9TZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHRzdWJ0cmFjdFRpbWU6IGZ1bmN0aW9uKCBhbW91bnQsIHR5cGUsIHRvU2VsZWN0ZWQgKXtcblx0XHRcdHJldHVybiB0aGlzLnVwZGF0ZVRpbWUoICdzdWJ0cmFjdCcsIGFtb3VudCwgdHlwZSwgdG9TZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVUaW1lOiBmdW5jdGlvbiggb3AsIGFtb3VudCwgdHlwZSwgdG9TZWxlY3RlZCApe1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHZhciB1cGRhdGUgPSB7fSxcblx0XHRcdFx0XHRkYXRlID0gdG9TZWxlY3RlZCA/ICdzZWxlY3RlZERhdGUnIDogJ3ZpZXdEYXRlJ1xuXHRcdFx0XHQ7XG5cblx0XHRcdFx0dXBkYXRlWyBkYXRlIF0gPSBtZS5zdGF0ZVsgZGF0ZSBdLmNsb25lKClbIG9wIF0oIGFtb3VudCwgdHlwZSApO1xuXG5cdFx0XHRcdG1lLnNldFN0YXRlKCB1cGRhdGUgKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGFsbG93ZWRTZXRUaW1lOiBbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcycsICdtaWxsaXNlY29uZHMnXSxcblx0XHRzZXRUaW1lOiBmdW5jdGlvbiggdHlwZSwgdmFsdWUgKXtcblx0XHRcdHZhciBpbmRleCA9IHRoaXMuYWxsb3dlZFNldFRpbWUuaW5kZXhPZiggdHlwZSApICsgMSxcblx0XHRcdFx0c3RhdGUgPSB0aGlzLnN0YXRlLFxuXHRcdFx0XHRkYXRlID0gKHN0YXRlLnNlbGVjdGVkRGF0ZSB8fCBzdGF0ZS52aWV3RGF0ZSkuY2xvbmUoKSxcblx0XHRcdFx0bmV4dFR5cGVcblx0XHRcdDtcblxuXHRcdFx0Ly8gSXQgaXMgbmVlZGVkIHRvIHNldCBhbGwgdGhlIHRpbWUgcHJvcGVydGllc1xuXHRcdFx0Ly8gdG8gbm90IHRvIHJlc2V0IHRoZSB0aW1lXG5cdFx0XHRkYXRlWyB0eXBlIF0oIHZhbHVlICk7XG5cdFx0XHRmb3IgKDsgaW5kZXggPCB0aGlzLmFsbG93ZWRTZXRUaW1lLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0XHRuZXh0VHlwZSA9IHRoaXMuYWxsb3dlZFNldFRpbWVbaW5kZXhdO1xuXHRcdFx0XHRkYXRlWyBuZXh0VHlwZSBdKCBkYXRlW25leHRUeXBlXSgpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggIXRoaXMucHJvcHMudmFsdWUgKXtcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRcdFx0c2VsZWN0ZWREYXRlOiBkYXRlLFxuXHRcdFx0XHRcdGlucHV0VmFsdWU6IGRhdGUuZm9ybWF0KCBzdGF0ZS5pbnB1dEZvcm1hdCApXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5wcm9wcy5vbkNoYW5nZSggZGF0ZSApO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVTZWxlY3RlZERhdGU6IGZ1bmN0aW9uKCBlLCBjbG9zZSApIHtcblx0XHRcdHZhciB0YXJnZXQgPSBlLnRhcmdldCxcblx0XHRcdFx0bW9kaWZpZXIgPSAwLFxuXHRcdFx0XHR2aWV3RGF0ZSA9IHRoaXMuc3RhdGUudmlld0RhdGUsXG5cdFx0XHRcdGN1cnJlbnREYXRlID0gdGhpcy5zdGF0ZS5zZWxlY3RlZERhdGUgfHwgdmlld0RhdGUsXG5cdFx0XHRcdGRhdGVcblx0ICAgIDtcblxuXHRcdFx0aWYgKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigncmR0RGF5JykgIT09IC0xKXtcblx0XHRcdFx0aWYgKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigncmR0TmV3JykgIT09IC0xKVxuXHRcdFx0XHRcdG1vZGlmaWVyID0gMTtcblx0XHRcdFx0ZWxzZSBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdyZHRPbGQnKSAhPT0gLTEpXG5cdFx0XHRcdFx0bW9kaWZpZXIgPSAtMTtcblxuXHRcdFx0XHRkYXRlID0gdmlld0RhdGUuY2xvbmUoKVxuXHRcdFx0XHRcdC5tb250aCggdmlld0RhdGUubW9udGgoKSArIG1vZGlmaWVyIClcblx0XHRcdFx0XHQuZGF0ZSggcGFyc2VJbnQoIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSwgMTAgKSApO1xuXHRcdFx0fSBlbHNlIGlmICh0YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3JkdE1vbnRoJykgIT09IC0xKXtcblx0XHRcdFx0ZGF0ZSA9IHZpZXdEYXRlLmNsb25lKClcblx0XHRcdFx0XHQubW9udGgoIHBhcnNlSW50KCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyksIDEwICkgKVxuXHRcdFx0XHRcdC5kYXRlKCBjdXJyZW50RGF0ZS5kYXRlKCkgKTtcblx0XHRcdH0gZWxzZSBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdyZHRZZWFyJykgIT09IC0xKXtcblx0XHRcdFx0ZGF0ZSA9IHZpZXdEYXRlLmNsb25lKClcblx0XHRcdFx0XHQubW9udGgoIGN1cnJlbnREYXRlLm1vbnRoKCkgKVxuXHRcdFx0XHRcdC5kYXRlKCBjdXJyZW50RGF0ZS5kYXRlKCkgKVxuXHRcdFx0XHRcdC55ZWFyKCBwYXJzZUludCggdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLCAxMCApICk7XG5cdFx0XHR9XG5cblx0XHRcdGRhdGUuaG91cnMoIGN1cnJlbnREYXRlLmhvdXJzKCkgKVxuXHRcdFx0XHQubWludXRlcyggY3VycmVudERhdGUubWludXRlcygpIClcblx0XHRcdFx0LnNlY29uZHMoIGN1cnJlbnREYXRlLnNlY29uZHMoKSApXG5cdFx0XHRcdC5taWxsaXNlY29uZHMoIGN1cnJlbnREYXRlLm1pbGxpc2Vjb25kcygpICk7XG5cblx0XHRcdGlmICggIXRoaXMucHJvcHMudmFsdWUgKXtcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRcdFx0c2VsZWN0ZWREYXRlOiBkYXRlLFxuXHRcdFx0XHRcdHZpZXdEYXRlOiBkYXRlLmNsb25lKCkuc3RhcnRPZignbW9udGgnKSxcblx0XHRcdFx0XHRpbnB1dFZhbHVlOiBkYXRlLmZvcm1hdCggdGhpcy5zdGF0ZS5pbnB1dEZvcm1hdCApLFxuXHRcdFx0XHRcdG9wZW46ICEodGhpcy5wcm9wcy5jbG9zZU9uU2VsZWN0ICYmIGNsb3NlIClcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5wcm9wcy5jbG9zZU9uU2VsZWN0ICYmIGNsb3NlKSB7XG5cdFx0XHRcdFx0dGhpcy5jbG9zZUNhbGVuZGFyKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5wcm9wcy5vbkNoYW5nZSggZGF0ZSApO1xuXHRcdH0sXG5cblx0XHRvcGVuQ2FsZW5kYXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLnN0YXRlLm9wZW4pIHtcblx0XHRcdFx0dGhpcy5wcm9wcy5vbkZvY3VzKCk7XG5cdFx0XHRcdHRoaXMuc2V0U3RhdGUoeyBvcGVuOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjbG9zZUNhbGVuZGFyOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyBvcGVuOiBmYWxzZSB9KTtcblx0XHRcdHRoaXMucHJvcHMub25CbHVyKCB0aGlzLnN0YXRlLnNlbGVjdGVkRGF0ZSB8fCB0aGlzLnN0YXRlLmlucHV0VmFsdWUgKTtcblx0XHR9LFxuXG5cdFx0aGFuZGxlQ2xpY2tPdXRzaWRlOiBmdW5jdGlvbigpe1xuXHRcdFx0aWYgKCB0aGlzLnByb3BzLmlucHV0ICYmIHRoaXMuc3RhdGUub3BlbiAmJiAhdGhpcy5wcm9wcy5vcGVuICl7XG5cdFx0XHRcdHRoaXMuc2V0U3RhdGUoeyBvcGVuOiBmYWxzZSB9KTtcblx0XHRcdFx0dGhpcy5wcm9wcy5vbkJsdXIoIHRoaXMuc3RhdGUuc2VsZWN0ZWREYXRlIHx8IHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRsb2NhbE1vbWVudDogZnVuY3Rpb24oIGRhdGUsIGZvcm1hdCApe1xuXHRcdFx0dmFyIG0gPSBtb21lbnQoIGRhdGUsIGZvcm1hdCwgdGhpcy5wcm9wcy5zdHJpY3RQYXJzaW5nICk7XG5cdFx0XHRpZiAoIHRoaXMucHJvcHMubG9jYWxlIClcblx0XHRcdFx0bS5sb2NhbGUoIHRoaXMucHJvcHMubG9jYWxlICk7XG5cdFx0XHRyZXR1cm4gbTtcblx0XHR9LFxuXG5cdFx0Y29tcG9uZW50UHJvcHM6IHtcblx0XHRcdGZyb21Qcm9wczogWyd2YWx1ZScsICdpc1ZhbGlkRGF0ZScsICdyZW5kZXJEYXknLCAncmVuZGVyTW9udGgnLCAncmVuZGVyWWVhcicsICd0aW1lQ29uc3RyYWludHMnXSxcblx0XHRcdGZyb21TdGF0ZTogWyd2aWV3RGF0ZScsICdzZWxlY3RlZERhdGUnLCAndXBkYXRlT24nXSxcblx0XHRcdGZyb21UaGlzOiBbJ3NldERhdGUnLCAnc2V0VGltZScsICdzaG93VmlldycsICdhZGRUaW1lJywgJ3N1YnRyYWN0VGltZScsICd1cGRhdGVTZWxlY3RlZERhdGUnLCAnbG9jYWxNb21lbnQnXVxuXHRcdH0sXG5cblx0XHRnZXRDb21wb25lbnRQcm9wczogZnVuY3Rpb24oKXtcblx0XHRcdHZhciBtZSA9IHRoaXMsXG5cdFx0XHRcdGZvcm1hdHMgPSB0aGlzLmdldEZvcm1hdHMoIHRoaXMucHJvcHMgKSxcblx0XHRcdFx0cHJvcHMgPSB7ZGF0ZUZvcm1hdDogZm9ybWF0cy5kYXRlLCB0aW1lRm9ybWF0OiBmb3JtYXRzLnRpbWV9XG5cdFx0XHQ7XG5cblx0XHRcdHRoaXMuY29tcG9uZW50UHJvcHMuZnJvbVByb3BzLmZvckVhY2goIGZ1bmN0aW9uKCBuYW1lICl7XG5cdFx0XHRcdHByb3BzWyBuYW1lIF0gPSBtZS5wcm9wc1sgbmFtZSBdO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmNvbXBvbmVudFByb3BzLmZyb21TdGF0ZS5mb3JFYWNoKCBmdW5jdGlvbiggbmFtZSApe1xuXHRcdFx0XHRwcm9wc1sgbmFtZSBdID0gbWUuc3RhdGVbIG5hbWUgXTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5jb21wb25lbnRQcm9wcy5mcm9tVGhpcy5mb3JFYWNoKCBmdW5jdGlvbiggbmFtZSApe1xuXHRcdFx0XHRwcm9wc1sgbmFtZSBdID0gbWVbIG5hbWUgXTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gcHJvcHM7XG5cdFx0fSxcblxuXHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgQ29tcG9uZW50ID0gdGhpcy52aWV3Q29tcG9uZW50c1sgdGhpcy5zdGF0ZS5jdXJyZW50VmlldyBdLFxuXHRcdFx0XHRET00gPSBSZWFjdC5ET00sXG5cdFx0XHRcdGNsYXNzTmFtZSA9ICdyZHQnICsgKHRoaXMucHJvcHMuY2xhc3NOYW1lID9cblx0ICAgICAgICAgICAgICAgICAgKCBBcnJheS5pc0FycmF5KCB0aGlzLnByb3BzLmNsYXNzTmFtZSApID9cblx0ICAgICAgICAgICAgICAgICAgJyAnICsgdGhpcy5wcm9wcy5jbGFzc05hbWUuam9pbiggJyAnICkgOiAnICcgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSkgOiAnJyksXG5cdFx0XHRcdGNoaWxkcmVuID0gW11cblx0XHRcdDtcblxuXHRcdFx0aWYgKCB0aGlzLnByb3BzLmlucHV0ICl7XG5cdFx0XHRcdGNoaWxkcmVuID0gWyBET00uaW5wdXQoIGFzc2lnbih7XG5cdFx0XHRcdFx0a2V5OiAnaScsXG5cdFx0XHRcdFx0dHlwZTondGV4dCcsXG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiAnZm9ybS1jb250cm9sJyxcblx0XHRcdFx0XHRvbkZvY3VzOiB0aGlzLm9wZW5DYWxlbmRhcixcblx0XHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbklucHV0Q2hhbmdlLFxuXHRcdFx0XHRcdG9uS2V5RG93bjogdGhpcy5vbklucHV0S2V5LFxuXHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmlucHV0VmFsdWVcblx0XHRcdFx0fSwgdGhpcy5wcm9wcy5pbnB1dFByb3BzICkpXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsYXNzTmFtZSArPSAnIHJkdFN0YXRpYyc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGhpcy5zdGF0ZS5vcGVuIClcblx0XHRcdFx0Y2xhc3NOYW1lICs9ICcgcmR0T3Blbic7XG5cblx0XHRcdHJldHVybiBET00uZGl2KHtjbGFzc05hbWU6IGNsYXNzTmFtZX0sIGNoaWxkcmVuLmNvbmNhdChcblx0XHRcdFx0RE9NLmRpdihcblx0XHRcdFx0XHR7IGtleTogJ2R0JywgY2xhc3NOYW1lOiAncmR0UGlja2VyJyB9LFxuXHRcdFx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoIENvbXBvbmVudCwgdGhpcy5nZXRDb21wb25lbnRQcm9wcygpKVxuXHRcdFx0XHQpXG5cdFx0XHQpKTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIE1ha2UgbW9tZW50IGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgRGF0ZXRpbWUgY2xhc3Ncblx0RGF0ZXRpbWUubW9tZW50ID0gbW9tZW50O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gRGF0ZXRpbWU7XG5cblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0dmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5cdGZ1bmN0aW9uIFRvT2JqZWN0KHZhbCkge1xuXHRcdGlmICh2YWwgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gT2JqZWN0KHZhbCk7XG5cdH1cblxuXHRmdW5jdGlvbiBvd25FbnVtZXJhYmxlS2V5cyhvYmopIHtcblx0XHR2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7XG5cblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0a2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGtleXMuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdHJldHVybiBwcm9wSXNFbnVtZXJhYmxlLmNhbGwob2JqLCBrZXkpO1xuXHRcdH0pO1xuXHR9XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHRcdHZhciBmcm9tO1xuXHRcdHZhciBrZXlzO1xuXHRcdHZhciB0byA9IFRvT2JqZWN0KHRhcmdldCk7XG5cblx0XHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdFx0ZnJvbSA9IGFyZ3VtZW50c1tzXTtcblx0XHRcdGtleXMgPSBvd25FbnVtZXJhYmxlS2V5cyhPYmplY3QoZnJvbSkpO1xuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dG9ba2V5c1tpXV0gPSBmcm9tW2tleXNbaV1dO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0bztcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzJfXztcblxuLyoqKi8gfSxcbi8qIDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLFxuXHRcdG1vbWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNClcblx0O1xuXG5cdHZhciBET00gPSBSZWFjdC5ET007XG5cdHZhciBEYXRlVGltZVBpY2tlckRheXMgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cblx0XHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGZvb3RlciA9IHRoaXMucmVuZGVyRm9vdGVyKCksXG5cdFx0XHRcdGRhdGUgPSB0aGlzLnByb3BzLnZpZXdEYXRlLFxuXHRcdFx0XHRsb2NhbGUgPSBkYXRlLmxvY2FsZURhdGEoKSxcblx0XHRcdFx0dGFibGVDaGlsZHJlblxuXHRcdFx0O1xuXG5cdFx0XHR0YWJsZUNoaWxkcmVuID0gW1xuXHRcdFx0XHRET00udGhlYWQoeyBrZXk6ICd0aCd9LCBbXG5cdFx0XHRcdFx0RE9NLnRyKHsga2V5OiAnaCd9LCBbXG5cdFx0XHRcdFx0XHRET00udGgoeyBrZXk6ICdwJywgY2xhc3NOYW1lOiAncmR0UHJldicgfSwgRE9NLnNwYW4oe29uQ2xpY2s6IHRoaXMucHJvcHMuc3VidHJhY3RUaW1lKDEsICdtb250aHMnKX0sICfigLknKSksXG5cdFx0XHRcdFx0XHRET00udGgoeyBrZXk6ICdzJywgY2xhc3NOYW1lOiAncmR0U3dpdGNoJywgb25DbGljazogdGhpcy5wcm9wcy5zaG93VmlldygnbW9udGhzJyksIGNvbFNwYW46IDUsICdkYXRhLXZhbHVlJzogdGhpcy5wcm9wcy52aWV3RGF0ZS5tb250aCgpIH0sIGxvY2FsZS5tb250aHMoIGRhdGUgKSArICcgJyArIGRhdGUueWVhcigpICksXG5cdFx0XHRcdFx0XHRET00udGgoeyBrZXk6ICduJywgY2xhc3NOYW1lOiAncmR0TmV4dCcgfSwgRE9NLnNwYW4oe29uQ2xpY2s6IHRoaXMucHJvcHMuYWRkVGltZSgxLCAnbW9udGhzJyl9LCAn4oC6JykpXG5cdFx0XHRcdFx0XSksXG5cdFx0XHRcdFx0RE9NLnRyKHsga2V5OiAnZCd9LCB0aGlzLmdldERheXNPZldlZWsoIGxvY2FsZSApLm1hcCggZnVuY3Rpb24oIGRheSwgaW5kZXggKXsgcmV0dXJuIERPTS50aCh7IGtleTogZGF5ICsgaW5kZXgsIGNsYXNzTmFtZTogJ2Rvdyd9LCBkYXkgKTsgfSkgKVxuXHRcdFx0XHRdKSxcblx0XHRcdFx0RE9NLnRib2R5KHtrZXk6ICd0Yid9LCB0aGlzLnJlbmRlckRheXMoKSlcblx0XHRcdF07XG5cblx0XHRcdGlmICggZm9vdGVyIClcblx0XHRcdFx0dGFibGVDaGlsZHJlbi5wdXNoKCBmb290ZXIgKTtcblxuXHRcdFx0cmV0dXJuIERPTS5kaXYoeyBjbGFzc05hbWU6ICdyZHREYXlzJyB9LFxuXHRcdFx0XHRET00udGFibGUoe30sIHRhYmxlQ2hpbGRyZW4gKVxuXHRcdFx0KTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogR2V0IGEgbGlzdCBvZiB0aGUgZGF5cyBvZiB0aGUgd2Vla1xuXHRcdCAqIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBsb2NhbGVcblx0XHQgKiBAcmV0dXJuIHthcnJheX0gQSBsaXN0IHdpdGggdGhlIHNob3J0bmFtZSBvZiB0aGUgZGF5c1xuXHRcdCAqL1xuXHRcdGdldERheXNPZldlZWs6IGZ1bmN0aW9uKCBsb2NhbGUgKXtcblx0XHRcdHZhciBkYXlzID0gbG9jYWxlLl93ZWVrZGF5c01pbixcblx0XHRcdFx0Zmlyc3QgPSBsb2NhbGUuZmlyc3REYXlPZldlZWsoKSxcblx0XHRcdFx0ZG93ID0gW10sXG5cdFx0XHRcdGkgPSAwXG5cdFx0XHQ7XG5cblx0XHRcdGRheXMuZm9yRWFjaCggZnVuY3Rpb24oIGRheSApe1xuXHRcdFx0XHRkb3dbICg3ICsgKGkrKykgLSBmaXJzdCkgJSA3IF0gPSBkYXk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGRvdztcblx0XHR9LFxuXG5cdFx0cmVuZGVyRGF5czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGF0ZSA9IHRoaXMucHJvcHMudmlld0RhdGUsXG5cdFx0XHRcdHNlbGVjdGVkID0gdGhpcy5wcm9wcy5zZWxlY3RlZERhdGUgJiYgdGhpcy5wcm9wcy5zZWxlY3RlZERhdGUuY2xvbmUoKSxcblx0XHRcdFx0cHJldk1vbnRoID0gZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KCAxLCAnbW9udGhzJyApLFxuXHRcdFx0XHRjdXJyZW50WWVhciA9IGRhdGUueWVhcigpLFxuXHRcdFx0XHRjdXJyZW50TW9udGggPSBkYXRlLm1vbnRoKCksXG5cdFx0XHRcdHdlZWtzID0gW10sXG5cdFx0XHRcdGRheXMgPSBbXSxcblx0XHRcdFx0cmVuZGVyZXIgPSB0aGlzLnByb3BzLnJlbmRlckRheSB8fCB0aGlzLnJlbmRlckRheSxcblx0XHRcdFx0aXNWYWxpZCA9IHRoaXMucHJvcHMuaXNWYWxpZERhdGUgfHwgdGhpcy5pc1ZhbGlkRGF0ZSxcblx0XHRcdFx0Y2xhc3NlcywgZGlzYWJsZWQsIGRheVByb3BzLCBjdXJyZW50RGF0ZVxuXHRcdFx0O1xuXG5cdFx0XHQvLyBHbyB0byB0aGUgbGFzdCB3ZWVrIG9mIHRoZSBwcmV2aW91cyBtb250aFxuXHRcdFx0cHJldk1vbnRoLmRhdGUoIHByZXZNb250aC5kYXlzSW5Nb250aCgpICkuc3RhcnRPZignd2VlaycpO1xuXHRcdFx0dmFyIGxhc3REYXkgPSBwcmV2TW9udGguY2xvbmUoKS5hZGQoNDIsICdkJyk7XG5cblx0XHRcdHdoaWxlICggcHJldk1vbnRoLmlzQmVmb3JlKCBsYXN0RGF5ICkgKXtcblx0XHRcdFx0Y2xhc3NlcyA9ICdyZHREYXknO1xuXHRcdFx0XHRjdXJyZW50RGF0ZSA9IHByZXZNb250aC5jbG9uZSgpO1xuXG5cdFx0XHRcdGlmICggKCBwcmV2TW9udGgueWVhcigpID09PSBjdXJyZW50WWVhciAmJiBwcmV2TW9udGgubW9udGgoKSA8IGN1cnJlbnRNb250aCApIHx8ICggcHJldk1vbnRoLnllYXIoKSA8IGN1cnJlbnRZZWFyICkgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHRPbGQnO1xuXHRcdFx0XHRlbHNlIGlmICggKCBwcmV2TW9udGgueWVhcigpID09PSBjdXJyZW50WWVhciAmJiBwcmV2TW9udGgubW9udGgoKSA+IGN1cnJlbnRNb250aCApIHx8ICggcHJldk1vbnRoLnllYXIoKSA+IGN1cnJlbnRZZWFyICkgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHROZXcnO1xuXG5cdFx0XHRcdGlmICggc2VsZWN0ZWQgJiYgcHJldk1vbnRoLmlzU2FtZShzZWxlY3RlZCwgJ2RheScpIClcblx0XHRcdFx0XHRjbGFzc2VzICs9ICcgcmR0QWN0aXZlJztcblxuXHRcdFx0XHRpZiAocHJldk1vbnRoLmlzU2FtZShtb21lbnQoKSwgJ2RheScpIClcblx0XHRcdFx0XHRjbGFzc2VzICs9ICcgcmR0VG9kYXknO1xuXG5cdFx0XHRcdGRpc2FibGVkID0gIWlzVmFsaWQoIGN1cnJlbnREYXRlLCBzZWxlY3RlZCApO1xuXHRcdFx0XHRpZiAoIGRpc2FibGVkIClcblx0XHRcdFx0XHRjbGFzc2VzICs9ICcgcmR0RGlzYWJsZWQnO1xuXG5cdFx0XHRcdGRheVByb3BzID0ge1xuXHRcdFx0XHRcdGtleTogcHJldk1vbnRoLmZvcm1hdCgnTV9EJyksXG5cdFx0XHRcdFx0J2RhdGEtdmFsdWUnOiBwcmV2TW9udGguZGF0ZSgpLFxuXHRcdFx0XHRcdGNsYXNzTmFtZTogY2xhc3Nlc1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoICFkaXNhYmxlZCApXG5cdFx0XHRcdFx0ZGF5UHJvcHMub25DbGljayA9IHRoaXMudXBkYXRlU2VsZWN0ZWREYXRlO1xuXG5cdFx0XHRcdGRheXMucHVzaCggcmVuZGVyZXIoIGRheVByb3BzLCBjdXJyZW50RGF0ZSwgc2VsZWN0ZWQgKSApO1xuXG5cdFx0XHRcdGlmICggZGF5cy5sZW5ndGggPT09IDcgKXtcblx0XHRcdFx0XHR3ZWVrcy5wdXNoKCBET00udHIoIHtrZXk6IHByZXZNb250aC5mb3JtYXQoJ01fRCcpfSwgZGF5cyApICk7XG5cdFx0XHRcdFx0ZGF5cyA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cHJldk1vbnRoLmFkZCggMSwgJ2QnICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB3ZWVrcztcblx0XHR9LFxuXG5cdFx0dXBkYXRlU2VsZWN0ZWREYXRlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR0aGlzLnByb3BzLnVwZGF0ZVNlbGVjdGVkRGF0ZShldmVudCwgdHJ1ZSk7XG5cdFx0fSxcblxuXHRcdHJlbmRlckRheTogZnVuY3Rpb24oIHByb3BzLCBjdXJyZW50RGF0ZSApe1xuXHRcdFx0cmV0dXJuIERPTS50ZCggcHJvcHMsIGN1cnJlbnREYXRlLmRhdGUoKSApO1xuXHRcdH0sXG5cblx0XHRyZW5kZXJGb290ZXI6IGZ1bmN0aW9uKCl7XG5cdFx0XHRpZiAoICF0aGlzLnByb3BzLnRpbWVGb3JtYXQgKVxuXHRcdFx0XHRyZXR1cm4gJyc7XG5cblx0XHRcdHZhciBkYXRlID0gdGhpcy5wcm9wcy5zZWxlY3RlZERhdGUgfHwgdGhpcy5wcm9wcy52aWV3RGF0ZTtcblxuXHRcdFx0cmV0dXJuIERPTS50Zm9vdCh7IGtleTogJ3RmJ30sXG5cdFx0XHRcdERPTS50cih7fSxcblx0XHRcdFx0XHRET00udGQoeyBvbkNsaWNrOiB0aGlzLnByb3BzLnNob3dWaWV3KCd0aW1lJyksIGNvbFNwYW46IDcsIGNsYXNzTmFtZTogJ3JkdFRpbWVUb2dnbGUnfSwgZGF0ZS5mb3JtYXQoIHRoaXMucHJvcHMudGltZUZvcm1hdCApKVxuXHRcdFx0XHQpXG5cdFx0XHQpO1xuXHRcdH0sXG5cdFx0aXNWYWxpZERhdGU6IGZ1bmN0aW9uKCl7IHJldHVybiAxOyB9XG5cdH0pO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWVQaWNrZXJEYXlzO1xuXG5cbi8qKiovIH0sXG4vKiA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNF9fO1xuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cblx0dmFyIERPTSA9IFJlYWN0LkRPTTtcblx0dmFyIERhdGVUaW1lUGlja2VyTW9udGhzID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gRE9NLmRpdih7IGNsYXNzTmFtZTogJ3JkdE1vbnRocycgfSwgW1xuXHRcdFx0XHRET00udGFibGUoeyBrZXk6ICdhJ30sIERPTS50aGVhZCh7fSwgRE9NLnRyKHt9LCBbXG5cdFx0XHRcdFx0RE9NLnRoKHsga2V5OiAncHJldicsIGNsYXNzTmFtZTogJ3JkdFByZXYnIH0sIERPTS5zcGFuKHtvbkNsaWNrOiB0aGlzLnByb3BzLnN1YnRyYWN0VGltZSgxLCAneWVhcnMnKX0sICfigLknKSksXG5cdFx0XHRcdFx0RE9NLnRoKHsga2V5OiAneWVhcicsIGNsYXNzTmFtZTogJ3JkdFN3aXRjaCcsIG9uQ2xpY2s6IHRoaXMucHJvcHMuc2hvd1ZpZXcoJ3llYXJzJyksIGNvbFNwYW46IDIsICdkYXRhLXZhbHVlJzogdGhpcy5wcm9wcy52aWV3RGF0ZS55ZWFyKCl9LCB0aGlzLnByb3BzLnZpZXdEYXRlLnllYXIoKSApLFxuXHRcdFx0XHRcdERPTS50aCh7IGtleTogJ25leHQnLCBjbGFzc05hbWU6ICdyZHROZXh0JyB9LCBET00uc3Bhbih7b25DbGljazogdGhpcy5wcm9wcy5hZGRUaW1lKDEsICd5ZWFycycpfSwgJ+KAuicpKVxuXHRcdFx0XHRdKSkpLFxuXHRcdFx0XHRET00udGFibGUoeyBrZXk6ICdtb250aHMnfSwgRE9NLnRib2R5KHsga2V5OiAnYid9LCB0aGlzLnJlbmRlck1vbnRocygpKSlcblx0XHRcdF0pO1xuXHRcdH0sXG5cblx0XHRyZW5kZXJNb250aHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRhdGUgPSB0aGlzLnByb3BzLnNlbGVjdGVkRGF0ZSxcblx0XHRcdFx0bW9udGggPSB0aGlzLnByb3BzLnZpZXdEYXRlLm1vbnRoKCksXG5cdFx0XHRcdHllYXIgPSB0aGlzLnByb3BzLnZpZXdEYXRlLnllYXIoKSxcblx0XHRcdFx0cm93cyA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0bW9udGhzID0gW10sXG5cdFx0XHRcdHJlbmRlcmVyID0gdGhpcy5wcm9wcy5yZW5kZXJNb250aCB8fCB0aGlzLnJlbmRlck1vbnRoLFxuXHRcdFx0XHRjbGFzc2VzLCBwcm9wc1xuXHRcdFx0O1xuXG5cdFx0XHR3aGlsZSAoaSA8IDEyKSB7XG5cdFx0XHRcdGNsYXNzZXMgPSAncmR0TW9udGgnO1xuXHRcdFx0XHRpZiAoIGRhdGUgJiYgaSA9PT0gbW9udGggJiYgeWVhciA9PT0gZGF0ZS55ZWFyKCkgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHRBY3RpdmUnO1xuXG5cdFx0XHRcdHByb3BzID0ge1xuXHRcdFx0XHRcdGtleTogaSxcblx0XHRcdFx0XHQnZGF0YS12YWx1ZSc6IGksXG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiBjbGFzc2VzLFxuXHRcdFx0XHRcdG9uQ2xpY2s6IHRoaXMucHJvcHMudXBkYXRlT24gPT09ICdtb250aHMnPyB0aGlzLnVwZGF0ZVNlbGVjdGVkTW9udGggOiB0aGlzLnByb3BzLnNldERhdGUoJ21vbnRoJylcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRtb250aHMucHVzaCggcmVuZGVyZXIoIHByb3BzLCBpLCB5ZWFyLCBkYXRlICYmIGRhdGUuY2xvbmUoKSApKTtcblxuXHRcdFx0XHRpZiAoIG1vbnRocy5sZW5ndGggPT09IDQgKXtcblx0XHRcdFx0XHRyb3dzLnB1c2goIERPTS50cih7IGtleTogbW9udGggKyAnXycgKyByb3dzLmxlbmd0aCB9LCBtb250aHMpICk7XG5cdFx0XHRcdFx0bW9udGhzID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpKys7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByb3dzO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVTZWxlY3RlZE1vbnRoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR0aGlzLnByb3BzLnVwZGF0ZVNlbGVjdGVkRGF0ZShldmVudCwgdHJ1ZSk7XG5cdFx0fSxcblxuXHRcdHJlbmRlck1vbnRoOiBmdW5jdGlvbiggcHJvcHMsIG1vbnRoICkge1xuXHRcdFx0dmFyIG1vbnRoc1Nob3J0ID0gdGhpcy5wcm9wcy52aWV3RGF0ZS5sb2NhbGVEYXRhKCkuX21vbnRoc1Nob3J0O1xuXHRcdFx0cmV0dXJuIERPTS50ZCggcHJvcHMsIG1vbnRoc1Nob3J0LnN0YW5kYWxvbmVcblx0XHRcdFx0PyBjYXBpdGFsaXplKCBtb250aHNTaG9ydC5zdGFuZGFsb25lWyBtb250aCBdIClcblx0XHRcdFx0OiBtb250aHNTaG9ydFsgbW9udGggXVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xuXG5cdGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyKSB7XG5cdFx0cmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblx0fVxuXG5cdG1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWVQaWNrZXJNb250aHM7XG5cblxuLyoqKi8gfSxcbi8qIDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG5cdHZhciBET00gPSBSZWFjdC5ET007XG5cdHZhciBEYXRlVGltZVBpY2tlclllYXJzID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgeWVhciA9IHBhcnNlSW50KHRoaXMucHJvcHMudmlld0RhdGUueWVhcigpIC8gMTAsIDEwKSAqIDEwO1xuXG5cdFx0XHRyZXR1cm4gRE9NLmRpdih7IGNsYXNzTmFtZTogJ3JkdFllYXJzJyB9LCBbXG5cdFx0XHRcdERPTS50YWJsZSh7IGtleTogJ2EnfSwgRE9NLnRoZWFkKHt9LCBET00udHIoe30sIFtcblx0XHRcdFx0XHRET00udGgoeyBrZXk6ICdwcmV2JywgY2xhc3NOYW1lOiAncmR0UHJldicgfSwgRE9NLnNwYW4oe29uQ2xpY2s6IHRoaXMucHJvcHMuc3VidHJhY3RUaW1lKDEwLCAneWVhcnMnKX0sICfigLknKSksXG5cdFx0XHRcdFx0RE9NLnRoKHsga2V5OiAneWVhcicsIGNsYXNzTmFtZTogJ3JkdFN3aXRjaCcsIG9uQ2xpY2s6IHRoaXMucHJvcHMuc2hvd1ZpZXcoJ3llYXJzJyksIGNvbFNwYW46IDIgfSwgeWVhciArICctJyArICh5ZWFyICsgOSkgKSxcblx0XHRcdFx0XHRET00udGgoeyBrZXk6ICduZXh0JywgY2xhc3NOYW1lOiAncmR0TmV4dCd9LCBET00uc3Bhbih7b25DbGljazogdGhpcy5wcm9wcy5hZGRUaW1lKDEwLCAneWVhcnMnKX0sICfigLonKSlcblx0XHRcdFx0XHRdKSkpLFxuXHRcdFx0XHRET00udGFibGUoeyBrZXk6ICd5ZWFycyd9LCBET00udGJvZHkoe30sIHRoaXMucmVuZGVyWWVhcnMoIHllYXIgKSkpXG5cdFx0XHRdKTtcblx0XHR9LFxuXG5cdFx0cmVuZGVyWWVhcnM6IGZ1bmN0aW9uKCB5ZWFyICkge1xuXHRcdFx0dmFyIHllYXJzID0gW10sXG5cdFx0XHRcdGkgPSAtMSxcblx0XHRcdFx0cm93cyA9IFtdLFxuXHRcdFx0XHRyZW5kZXJlciA9IHRoaXMucHJvcHMucmVuZGVyWWVhciB8fCB0aGlzLnJlbmRlclllYXIsXG5cdFx0XHRcdHNlbGVjdGVkRGF0ZSA9IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlLFxuXHRcdFx0XHRjbGFzc2VzLCBwcm9wc1xuXHRcdFx0O1xuXG5cdFx0XHR5ZWFyLS07XG5cdFx0XHR3aGlsZSAoaSA8IDExKSB7XG5cdFx0XHRcdGNsYXNzZXMgPSAncmR0WWVhcic7XG5cdFx0XHRcdGlmICggaSA9PT0gLTEgfCBpID09PSAxMCApXG5cdFx0XHRcdFx0Y2xhc3NlcyArPSAnIHJkdE9sZCc7XG5cdFx0XHRcdGlmICggc2VsZWN0ZWREYXRlICYmIHNlbGVjdGVkRGF0ZS55ZWFyKCkgPT09IHllYXIgKVxuXHRcdFx0XHRcdGNsYXNzZXMgKz0gJyByZHRBY3RpdmUnO1xuXG5cdFx0XHRcdHByb3BzID0ge1xuXHRcdFx0XHRcdGtleTogeWVhcixcblx0XHRcdFx0XHQnZGF0YS12YWx1ZSc6IHllYXIsXG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiBjbGFzc2VzLFxuXHRcdFx0XHRcdG9uQ2xpY2s6IHRoaXMucHJvcHMudXBkYXRlT24gPT09ICd5ZWFycycgPyB0aGlzLnVwZGF0ZVNlbGVjdGVkWWVhciA6IHRoaXMucHJvcHMuc2V0RGF0ZSgneWVhcicpXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0eWVhcnMucHVzaCggcmVuZGVyZXIoIHByb3BzLCB5ZWFyLCBzZWxlY3RlZERhdGUgJiYgc2VsZWN0ZWREYXRlLmNsb25lKCkgKSk7XG5cblx0XHRcdFx0aWYgKCB5ZWFycy5sZW5ndGggPT09IDQgKXtcblx0XHRcdFx0XHRyb3dzLnB1c2goIERPTS50cih7IGtleTogaSB9LCB5ZWFycyApICk7XG5cdFx0XHRcdFx0eWVhcnMgPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHllYXIrKztcblx0XHRcdFx0aSsrO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcm93cztcblx0XHR9LFxuXG5cdFx0dXBkYXRlU2VsZWN0ZWRZZWFyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR0aGlzLnByb3BzLnVwZGF0ZVNlbGVjdGVkRGF0ZShldmVudCwgdHJ1ZSk7XG5cdFx0fSxcblxuXHRcdHJlbmRlclllYXI6IGZ1bmN0aW9uKCBwcm9wcywgeWVhciApe1xuXHRcdFx0cmV0dXJuIERPTS50ZCggcHJvcHMsIHllYXIgKTtcblx0XHR9XG5cdH0pO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWVQaWNrZXJZZWFycztcblxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMiksXG5cdFx0YXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuXHR2YXIgRE9NID0gUmVhY3QuRE9NO1xuXHR2YXIgRGF0ZVRpbWVQaWNrZXJUaW1lID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRcdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRcdHJldHVybiB0aGlzLmNhbGN1bGF0ZVN0YXRlKCB0aGlzLnByb3BzICk7XG5cdFx0fSxcblx0XHRjYWxjdWxhdGVTdGF0ZTogZnVuY3Rpb24oIHByb3BzICl7XG5cdFx0XHR2YXIgZGF0ZSA9IHByb3BzLnNlbGVjdGVkRGF0ZSB8fCBwcm9wcy52aWV3RGF0ZSxcblx0XHRcdFx0Zm9ybWF0ID0gcHJvcHMudGltZUZvcm1hdCxcblx0XHRcdFx0Y291bnRlcnMgPSBbXVxuXHRcdFx0O1xuXG5cdFx0XHRpZiAoIGZvcm1hdC5pbmRleE9mKCdIJykgIT09IC0xIHx8IGZvcm1hdC5pbmRleE9mKCdoJykgIT09IC0xICl7XG5cdFx0XHRcdGNvdW50ZXJzLnB1c2goJ2hvdXJzJyk7XG5cdFx0XHRcdGlmICggZm9ybWF0LmluZGV4T2YoJ20nKSAhPT0gLTEgKXtcblx0XHRcdFx0XHRjb3VudGVycy5wdXNoKCdtaW51dGVzJyk7XG5cdFx0XHRcdFx0aWYgKCBmb3JtYXQuaW5kZXhPZigncycpICE9PSAtMSApe1xuXHRcdFx0XHRcdFx0Y291bnRlcnMucHVzaCgnc2Vjb25kcycpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGF5cGFydCA9IGZhbHNlO1xuXHRcdFx0aWYgKCB0aGlzLnByb3BzLnRpbWVGb3JtYXQuaW5kZXhPZignIEEnKSAhPT0gLTEgICYmIHRoaXMuc3RhdGUgIT09IG51bGwgKXtcblx0XHRcdFx0ZGF5cGFydCA9ICggdGhpcy5zdGF0ZS5ob3VycyA+PSAxMiApID8gJ1BNJyA6ICdBTSc7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGhvdXJzOiBkYXRlLmZvcm1hdCgnSCcpLFxuXHRcdFx0XHRtaW51dGVzOiBkYXRlLmZvcm1hdCgnbW0nKSxcblx0XHRcdFx0c2Vjb25kczogZGF0ZS5mb3JtYXQoJ3NzJyksXG5cdFx0XHRcdG1pbGxpc2Vjb25kczogZGF0ZS5mb3JtYXQoJ1NTUycpLFxuXHRcdFx0XHRkYXlwYXJ0OiBkYXlwYXJ0LFxuXHRcdFx0XHRjb3VudGVyczogY291bnRlcnNcblx0XHRcdH07XG5cdFx0fSxcblx0XHRyZW5kZXJDb3VudGVyOiBmdW5jdGlvbiggdHlwZSApe1xuXHRcdFx0aWYgKHR5cGUgIT09ICdkYXlwYXJ0Jykge1xuXHRcdFx0XHR2YXIgdmFsdWUgPSB0aGlzLnN0YXRlWyB0eXBlIF07XG5cdFx0XHRcdGlmICh0eXBlID09PSAnaG91cnMnICYmIHRoaXMucHJvcHMudGltZUZvcm1hdC5pbmRleE9mKCcgQScpICE9PSAtMSkge1xuXHRcdFx0XHRcdHZhbHVlID0gKHZhbHVlIC0gMSkgJSAxMiArIDE7XG5cblx0XHRcdFx0XHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRcdFx0XHRcdHZhbHVlID0gMTI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBET00uZGl2KHsga2V5OiB0eXBlLCBjbGFzc05hbWU6ICdyZHRDb3VudGVyJ30sIFtcblx0XHRcdFx0XHRET00uc3Bhbih7IGtleTondXAnLCBjbGFzc05hbWU6ICdyZHRCdG4nLCBvbk1vdXNlRG93bjogdGhpcy5vblN0YXJ0Q2xpY2tpbmcoICdpbmNyZWFzZScsIHR5cGUgKSB9LCAn4payJyApLFxuXHRcdFx0XHRcdERPTS5kaXYoeyBrZXk6J2MnLCBjbGFzc05hbWU6ICdyZHRDb3VudCcgfSwgdmFsdWUgKSxcblx0XHRcdFx0XHRET00uc3Bhbih7IGtleTonZG8nLCBjbGFzc05hbWU6ICdyZHRCdG4nLCBvbk1vdXNlRG93bjogdGhpcy5vblN0YXJ0Q2xpY2tpbmcoICdkZWNyZWFzZScsIHR5cGUgKSB9LCAn4pa8JyApXG5cdFx0XHRcdF0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH0sXG5cdFx0cmVuZGVyRGF5UGFydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gRE9NLmRpdih7IGNsYXNzTmFtZTogJ3JkdENvdW50ZXInLCBrZXk6ICdkYXlQYXJ0J30sIFtcblx0XHRcdFx0RE9NLnNwYW4oeyBrZXk6J3VwJywgY2xhc3NOYW1lOiAncmR0QnRuJywgb25Nb3VzZURvd246IHRoaXMub25TdGFydENsaWNraW5nKCAndG9nZ2xlRGF5UGFydCcsICdob3VycycpIH0sICfilrInICksXG5cdFx0XHRcdERPTS5kaXYoeyBrZXk6IHRoaXMuc3RhdGUuZGF5cGFydCwgY2xhc3NOYW1lOiAncmR0Q291bnQnfSwgdGhpcy5zdGF0ZS5kYXlwYXJ0ICksXG5cdFx0XHRcdERPTS5zcGFuKHsga2V5OidkbycsIGNsYXNzTmFtZTogJ3JkdEJ0bicsIG9uTW91c2VEb3duOiB0aGlzLm9uU3RhcnRDbGlja2luZyggJ3RvZ2dsZURheVBhcnQnLCAnaG91cnMnKSB9LCAn4pa8JyApXG5cdFx0XHRdKTtcblx0XHR9LFxuXHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0XHRjb3VudGVycyA9IFtdXG5cdFx0XHQ7XG5cblx0XHRcdHRoaXMuc3RhdGUuY291bnRlcnMuZm9yRWFjaCggZnVuY3Rpb24oYyl7XG5cdFx0XHRcdGlmICggY291bnRlcnMubGVuZ3RoIClcblx0XHRcdFx0XHRjb3VudGVycy5wdXNoKCBET00uZGl2KCB7a2V5OiAnc2VwJyArIGNvdW50ZXJzLmxlbmd0aCwgY2xhc3NOYW1lOiAncmR0Q291bnRlclNlcGFyYXRvcicgfSwgJzonICkpO1xuXHRcdFx0XHRjb3VudGVycy5wdXNoKCBtZS5yZW5kZXJDb3VudGVyKCBjICkgKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZS5kYXlwYXJ0ICE9PSBmYWxzZSkge1xuXHRcdFx0XHRjb3VudGVycy5wdXNoKCBtZS5yZW5kZXJEYXlQYXJ0KCkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLnN0YXRlLmNvdW50ZXJzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLnByb3BzLnRpbWVGb3JtYXQuaW5kZXhPZignUycpICE9PSAtMSApe1xuXHRcdFx0XHRjb3VudGVycy5wdXNoKCBET00uZGl2KCB7Y2xhc3NOYW1lOiAncmR0Q291bnRlclNlcGFyYXRvcicsIGtleTogJ3NlcDUnIH0sICc6JyApKTtcblx0XHRcdFx0Y291bnRlcnMucHVzaChcblx0XHRcdFx0XHRET00uZGl2KCB7Y2xhc3NOYW1lOiAncmR0Q291bnRlciByZHRNaWxsaScsIGtleTonbSd9LFxuXHRcdFx0XHRcdFx0RE9NLmlucHV0KHsgdmFsdWU6IHRoaXMuc3RhdGUubWlsbGlzZWNvbmRzLCB0eXBlOiAndGV4dCcsIG9uQ2hhbmdlOiB0aGlzLnVwZGF0ZU1pbGxpIH0pXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIERPTS5kaXYoIHtjbGFzc05hbWU6ICdyZHRUaW1lJ30sXG5cdFx0XHRcdERPTS50YWJsZSgge30sIFtcblx0XHRcdFx0XHR0aGlzLnJlbmRlckhlYWRlcigpLFxuXHRcdFx0XHRcdERPTS50Ym9keSh7a2V5OiAnYid9LCBET00udHIoe30sIERPTS50ZCh7fSxcblx0XHRcdFx0XHRcdERPTS5kaXYoeyBjbGFzc05hbWU6ICdyZHRDb3VudGVycycgfSwgY291bnRlcnMgKVxuXHRcdFx0XHRcdCkpKVxuXHRcdFx0XHRdKVxuXHRcdFx0KTtcblx0XHR9LFxuXHRcdGNvbXBvbmVudFdpbGxNb3VudDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0bWUudGltZUNvbnN0cmFpbnRzID0ge1xuXHRcdFx0XHRob3Vyczoge1xuXHRcdFx0XHRcdG1pbjogMCxcblx0XHRcdFx0XHRtYXg6IDIzLFxuXHRcdFx0XHRcdHN0ZXA6IDFcblx0XHRcdFx0fSxcblx0XHRcdFx0bWludXRlczoge1xuXHRcdFx0XHRcdG1pbjogMCxcblx0XHRcdFx0XHRtYXg6IDU5LFxuXHRcdFx0XHRcdHN0ZXA6IDFcblx0XHRcdFx0fSxcblx0XHRcdFx0c2Vjb25kczoge1xuXHRcdFx0XHRcdG1pbjogMCxcblx0XHRcdFx0XHRtYXg6IDU5LFxuXHRcdFx0XHRcdHN0ZXA6IDEsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdG1pbGxpc2Vjb25kczoge1xuXHRcdFx0XHRcdG1pbjogMCxcblx0XHRcdFx0XHRtYXg6IDk5OSxcblx0XHRcdFx0XHRzdGVwOiAxXG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcycsICdtaWxsaXNlY29uZHMnXS5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRcdFx0YXNzaWduKG1lLnRpbWVDb25zdHJhaW50c1t0eXBlXSwgbWUucHJvcHMudGltZUNvbnN0cmFpbnRzW3R5cGVdKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSggdGhpcy5jYWxjdWxhdGVTdGF0ZSggdGhpcy5wcm9wcyApICk7XG5cdFx0fSxcblx0XHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV4dFByb3BzICl7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB0aGlzLmNhbGN1bGF0ZVN0YXRlKCBuZXh0UHJvcHMgKSApO1xuXHRcdH0sXG5cdFx0dXBkYXRlTWlsbGk6IGZ1bmN0aW9uKCBlICl7XG5cdFx0XHR2YXIgbWlsbGkgPSBwYXJzZUludCggZS50YXJnZXQudmFsdWUsIDEwICk7XG5cdFx0XHRpZiAoIG1pbGxpID09PSBlLnRhcmdldC52YWx1ZSAmJiBtaWxsaSA+PSAwICYmIG1pbGxpIDwgMTAwMCApe1xuXHRcdFx0XHR0aGlzLnByb3BzLnNldFRpbWUoICdtaWxsaXNlY29uZHMnLCBtaWxsaSApO1xuXHRcdFx0XHR0aGlzLnNldFN0YXRlKHsgbWlsbGlzZWNvbmRzOiBtaWxsaSB9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlbmRlckhlYWRlcjogZnVuY3Rpb24oKXtcblx0XHRcdGlmICggIXRoaXMucHJvcHMuZGF0ZUZvcm1hdCApXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR2YXIgZGF0ZSA9IHRoaXMucHJvcHMuc2VsZWN0ZWREYXRlIHx8IHRoaXMucHJvcHMudmlld0RhdGU7XG5cdFx0XHRyZXR1cm4gRE9NLnRoZWFkKHsga2V5OiAnaCd9LCBET00udHIoe30sXG5cdFx0XHRcdERPTS50aCgge2NsYXNzTmFtZTogJ3JkdFN3aXRjaCcsIGNvbFNwYW46IDQsIG9uQ2xpY2s6IHRoaXMucHJvcHMuc2hvd1ZpZXcoJ2RheXMnKX0sIGRhdGUuZm9ybWF0KCB0aGlzLnByb3BzLmRhdGVGb3JtYXQgKSApXG5cdFx0XHQpKTtcblx0XHR9LFxuXHRcdG9uU3RhcnRDbGlja2luZzogZnVuY3Rpb24oIGFjdGlvbiwgdHlwZSApe1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCl7XG5cdFx0XHRcdHZhciB1cGRhdGUgPSB7fTtcblx0XHRcdFx0dXBkYXRlWyB0eXBlIF0gPSBtZVsgYWN0aW9uIF0oIHR5cGUgKTtcblx0XHRcdFx0bWUuc2V0U3RhdGUoIHVwZGF0ZSApO1xuXG5cdFx0XHRcdG1lLnRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXtcblx0XHRcdFx0XHRtZS5pbmNyZWFzZVRpbWVyID0gc2V0SW50ZXJ2YWwoIGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHR1cGRhdGVbIHR5cGUgXSA9IG1lWyBhY3Rpb24gXSggdHlwZSApO1xuXHRcdFx0XHRcdFx0bWUuc2V0U3RhdGUoIHVwZGF0ZSApO1xuXHRcdFx0XHRcdH0sIDcwKTtcblx0XHRcdFx0fSwgNTAwKTtcblxuXHRcdFx0XHRtZS5tb3VzZVVwTGlzdGVuZXIgPSBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCggbWUudGltZXIgKTtcblx0XHRcdFx0XHRjbGVhckludGVydmFsKCBtZS5pbmNyZWFzZVRpbWVyICk7XG5cdFx0XHRcdFx0bWUucHJvcHMuc2V0VGltZSggdHlwZSwgbWUuc3RhdGVbIHR5cGUgXSApO1xuXHRcdFx0XHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1lLm1vdXNlVXBMaXN0ZW5lcik7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbWUubW91c2VVcExpc3RlbmVyKTtcblx0XHRcdH07XG5cdFx0fSxcblx0XHRwYWRWYWx1ZXM6IHtcblx0XHRcdGhvdXJzOiAxLFxuXHRcdFx0bWludXRlczogMixcblx0XHRcdHNlY29uZHM6IDIsXG5cdFx0XHRtaWxsaXNlY29uZHM6IDNcblx0XHR9LFxuXHRcdHRvZ2dsZURheVBhcnQ6IGZ1bmN0aW9uKCB0eXBlICl7IC8vIHR5cGUgaXMgYWx3YXlzICdob3Vycydcblx0XHRcdHZhciB2YWx1ZSA9IHBhcnNlSW50KHRoaXMuc3RhdGVbIHR5cGUgXSwgMTApICsgMTI7XG5cdFx0XHRpZiAoIHZhbHVlID4gdGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5tYXggKVxuXHRcdFx0XHR2YWx1ZSA9IHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0ubWluICsgKHZhbHVlIC0gKHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0ubWF4ICsgMSkpO1xuXHRcdFx0cmV0dXJuIHRoaXMucGFkKCB0eXBlLCB2YWx1ZSApO1xuXHRcdH0sXG5cdFx0aW5jcmVhc2U6IGZ1bmN0aW9uKCB0eXBlICl7XG5cdFx0XHR2YXIgdmFsdWUgPSBwYXJzZUludCh0aGlzLnN0YXRlWyB0eXBlIF0sIDEwKSArIHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0uc3RlcDtcblx0XHRcdGlmICggdmFsdWUgPiB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1heCApXG5cdFx0XHRcdHZhbHVlID0gdGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5taW4gKyAoIHZhbHVlIC0gKCB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1heCAgKyAxKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMucGFkKCB0eXBlLCB2YWx1ZSApO1xuXHRcdH0sXG5cdFx0ZGVjcmVhc2U6IGZ1bmN0aW9uKCB0eXBlICl7XG5cdFx0XHR2YXIgdmFsdWUgPSBwYXJzZUludCh0aGlzLnN0YXRlWyB0eXBlIF0sIDEwKSAtIHRoaXMudGltZUNvbnN0cmFpbnRzWyB0eXBlIF0uc3RlcDtcblx0XHRcdGlmICggdmFsdWUgPCB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1pbiApXG5cdFx0XHRcdHZhbHVlID0gdGhpcy50aW1lQ29uc3RyYWludHNbIHR5cGUgXS5tYXggKyAxIC0gKCB0aGlzLnRpbWVDb25zdHJhaW50c1sgdHlwZSBdLm1pbiAtIHZhbHVlICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYWQoIHR5cGUsIHZhbHVlICk7XG5cdFx0fSxcblx0XHRwYWQ6IGZ1bmN0aW9uKCB0eXBlLCB2YWx1ZSApe1xuXHRcdFx0dmFyIHN0ciA9IHZhbHVlICsgJyc7XG5cdFx0XHR3aGlsZSAoIHN0ci5sZW5ndGggPCB0aGlzLnBhZFZhbHVlc1sgdHlwZSBdIClcblx0XHRcdFx0c3RyID0gJzAnICsgc3RyO1xuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdH0pO1xuXG5cdG1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWVQaWNrZXJUaW1lO1xuXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cblx0Ly8gVGhpcyBpcyBleHRyYWN0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vUG9tYXgvcmVhY3Qtb25jbGlja291dHNpZGVcblx0Ly8gQW5kIG1vZGlmaWVkIHRvIHN1cHBvcnQgcmVhY3QgMC4xMyBhbmQgcmVhY3QgMC4xNFxuXG5cdHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMiksXG5cdFx0dmVyc2lvbiA9IFJlYWN0LnZlcnNpb24gJiYgUmVhY3QudmVyc2lvbi5zcGxpdCgnLicpXG5cdDtcblxuXHRpZiAoIHZlcnNpb24gJiYgKCB2ZXJzaW9uWzBdID4gMCB8fCB2ZXJzaW9uWzFdID4gMTMgKSApXG5cdFx0UmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5cdC8vIFVzZSBhIHBhcmFsbGVsIGFycmF5IGJlY2F1c2Ugd2UgY2FuJ3QgdXNlXG5cdC8vIG9iamVjdHMgYXMga2V5cywgdGhleSBnZXQgdG9TdHJpbmctY29lcmNlZFxuXHR2YXIgcmVnaXN0ZXJlZENvbXBvbmVudHMgPSBbXTtcblx0dmFyIGhhbmRsZXJzID0gW107XG5cblx0dmFyIElHTk9SRV9DTEFTUyA9ICdpZ25vcmUtcmVhY3Qtb25jbGlja291dHNpZGUnO1xuXG5cdHZhciBpc1NvdXJjZUZvdW5kID0gZnVuY3Rpb24oc291cmNlLCBsb2NhbE5vZGUpIHtcblx0IGlmIChzb3VyY2UgPT09IGxvY2FsTm9kZSkge1xuXHQgICByZXR1cm4gdHJ1ZTtcblx0IH1cblx0IC8vIFNWRyA8dXNlLz4gZWxlbWVudHMgZG8gbm90IHRlY2huaWNhbGx5IHJlc2lkZSBpbiB0aGUgcmVuZGVyZWQgRE9NLCBzb1xuXHQgLy8gdGhleSBkbyBub3QgaGF2ZSBjbGFzc0xpc3QgZGlyZWN0bHksIGJ1dCB0aGV5IG9mZmVyIGEgbGluayB0byB0aGVpclxuXHQgLy8gY29ycmVzcG9uZGluZyBlbGVtZW50LCB3aGljaCBjYW4gaGF2ZSBjbGFzc0xpc3QuIFRoaXMgZXh0cmEgY2hlY2sgaXMgZm9yXG5cdCAvLyB0aGF0IGNhc2UuXG5cdCAvLyBTZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL3N0cnVjdC5odG1sI0ludGVyZmFjZVNWR1VzZUVsZW1lbnRcblx0IC8vIERpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb21heC9yZWFjdC1vbmNsaWNrb3V0c2lkZS9wdWxsLzE3XG5cdCBpZiAoc291cmNlLmNvcnJlc3BvbmRpbmdFbGVtZW50KSB7XG5cdCAgIHJldHVybiBzb3VyY2UuY29ycmVzcG9uZGluZ0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKElHTk9SRV9DTEFTUyk7XG5cdCB9XG5cdCByZXR1cm4gc291cmNlLmNsYXNzTGlzdC5jb250YWlucyhJR05PUkVfQ0xBU1MpO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHQgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCkge1xuXHQgICBpZiAodHlwZW9mIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlICE9PSAnZnVuY3Rpb24nKVxuXHQgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IGxhY2tzIGEgaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50KSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBvdXRzaWRlIGNsaWNrIGV2ZW50cy4nKTtcblxuXHQgICB2YXIgZm4gPSB0aGlzLl9fb3V0c2lkZUNsaWNrSGFuZGxlciA9IChmdW5jdGlvbihsb2NhbE5vZGUsIGV2ZW50SGFuZGxlcikge1xuXHQgICAgIHJldHVybiBmdW5jdGlvbihldnQpIHtcblx0ICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgIHZhciBzb3VyY2UgPSBldnQudGFyZ2V0O1xuXHQgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG5cdCAgICAgICAvLyBJZiBzb3VyY2U9bG9jYWwgdGhlbiB0aGlzIGV2ZW50IGNhbWUgZnJvbSBcInNvbWV3aGVyZVwiXG5cdCAgICAgICAvLyBpbnNpZGUgYW5kIHNob3VsZCBiZSBpZ25vcmVkLiBXZSBjb3VsZCBoYW5kbGUgdGhpcyB3aXRoXG5cdCAgICAgICAvLyBhIGxheWVyZWQgYXBwcm9hY2gsIHRvbywgYnV0IHRoYXQgcmVxdWlyZXMgZ29pbmcgYmFjayB0b1xuXHQgICAgICAgLy8gdGhpbmtpbmcgaW4gdGVybXMgb2YgRG9tIG5vZGUgbmVzdGluZywgcnVubmluZyBjb3VudGVyXG5cdCAgICAgICAvLyB0byBSZWFjdCdzIFwieW91IHNob3VsZG4ndCBjYXJlIGFib3V0IHRoZSBET01cIiBwaGlsb3NvcGh5LlxuXHQgICAgICAgd2hpbGUgKHNvdXJjZS5wYXJlbnROb2RlKSB7XG5cdCAgICAgICAgIGZvdW5kID0gaXNTb3VyY2VGb3VuZChzb3VyY2UsIGxvY2FsTm9kZSk7XG5cdCAgICAgICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuXHQgICAgICAgICBzb3VyY2UgPSBzb3VyY2UucGFyZW50Tm9kZTtcblx0ICAgICAgIH1cblx0ICAgICAgIGV2ZW50SGFuZGxlcihldnQpO1xuXHQgICAgIH07XG5cdCAgIH0oUmVhY3QuZmluZERPTU5vZGUodGhpcyksIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKSk7XG5cblx0ICAgdmFyIHBvcyA9IHJlZ2lzdGVyZWRDb21wb25lbnRzLmxlbmd0aDtcblx0ICAgcmVnaXN0ZXJlZENvbXBvbmVudHMucHVzaCh0aGlzKTtcblx0ICAgaGFuZGxlcnNbcG9zXSA9IGZuO1xuXG5cdCAgIC8vIElmIHRoZXJlIGlzIGEgdHJ1dGh5IGRpc2FibGVPbkNsaWNrT3V0c2lkZSBwcm9wZXJ0eSBmb3IgdGhpc1xuXHQgICAvLyBjb21wb25lbnQsIGRvbid0IGltbWVkaWF0ZWx5IHN0YXJ0IGxpc3RlbmluZyBmb3Igb3V0c2lkZSBldmVudHMuXG5cdCAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlT25DbGlja091dHNpZGUpIHtcblx0ICAgICB0aGlzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlKCk7XG5cdCAgIH1cblx0IH0sXG5cblx0IGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbigpIHtcblx0ICAgdGhpcy5kaXNhYmxlT25DbGlja091dHNpZGUoKTtcblx0ICAgdGhpcy5fX291dHNpZGVDbGlja0hhbmRsZXIgPSBmYWxzZTtcblx0ICAgdmFyIHBvcyA9IHJlZ2lzdGVyZWRDb21wb25lbnRzLmluZGV4T2YodGhpcyk7XG5cdCAgIGlmICggcG9zPi0xKSB7XG5cdCAgICAgaWYgKGhhbmRsZXJzW3Bvc10pIHtcblx0ICAgICAgIC8vIGNsZWFuIHVwIHNvIHdlIGRvbid0IGxlYWsgbWVtb3J5XG5cdCAgICAgICBoYW5kbGVycy5zcGxpY2UocG9zLCAxKTtcblx0ICAgICAgIHJlZ2lzdGVyZWRDb21wb25lbnRzLnNwbGljZShwb3MsIDEpO1xuXHQgICAgIH1cblx0ICAgfVxuXHQgfSxcblxuXHQgLyoqXG5cdCAgKiBDYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkgZW5hYmxlIGV2ZW50IGxpc3RlbmluZ1xuXHQgICogZm9yIGNsaWNrcyBhbmQgdG91Y2hlcyBvdXRzaWRlIG9mIHRoaXMgZWxlbWVudC5cblx0ICAqL1xuXHQgZW5hYmxlT25DbGlja091dHNpZGU6IGZ1bmN0aW9uKCkge1xuXHQgICB2YXIgZm4gPSB0aGlzLl9fb3V0c2lkZUNsaWNrSGFuZGxlcjtcblx0ICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZm4pO1xuXHQgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgZm4pO1xuXHQgfSxcblxuXHQgLyoqXG5cdCAgKiBDYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkgZGlzYWJsZSBldmVudCBsaXN0ZW5pbmdcblx0ICAqIGZvciBjbGlja3MgYW5kIHRvdWNoZXMgb3V0c2lkZSBvZiB0aGlzIGVsZW1lbnQuXG5cdCAgKi9cblx0IGRpc2FibGVPbkNsaWNrT3V0c2lkZTogZnVuY3Rpb24oKSB7XG5cdCAgIHZhciBmbiA9IHRoaXMuX19vdXRzaWRlQ2xpY2tIYW5kbGVyO1xuXHQgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmbik7XG5cdCAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmbik7XG5cdCB9XG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV85X187XG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjsiXX0= |
| | | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("React"),require("moment"),require("ReactDOM")):"function"==typeof define&&define.amd?define(["React","moment","ReactDOM"],e):"object"==typeof exports?exports.Datetime=e(require("React"),require("moment"),require("ReactDOM")):t.Datetime=e(t.React,t.moment,t.ReactDOM)}(this,function(t,e,s){return function(t){function e(a){if(s[a])return s[a].exports;var n=s[a]={exports:{},id:a,loaded:!1};return t[a].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var s={};return e.m=t,e.c=s,e.p="",e(0)}([function(t,e,s){"use strict";var a=s(1),n=s(2),r=s(3),i=s(5),o=s(6),c=s(7),p=s(4),d=n.PropTypes,u=n.createClass({mixins:[s(8)],viewComponents:{days:r,months:i,years:o,time:c},propTypes:{onFocus:d.func,onBlur:d.func,onChange:d.func,locale:d.string,utc:d.bool,input:d.bool,inputProps:d.object,timeConstraints:d.object,viewMode:d.oneOf(["years","months","days","time"]),isValidDate:d.func,open:d.bool,strictParsing:d.bool,closeOnSelect:d.bool,closeOnTab:d.bool},getDefaultProps:function(){var t=function(){};return{className:"",defaultValue:"",inputProps:{},input:!0,onFocus:t,onBlur:t,onChange:t,timeFormat:!0,timeConstraints:{},dateFormat:!0,strictParsing:!0,closeOnSelect:!1,closeOnTab:!0,utc:!1}},getInitialState:function(){var t=this.getStateFromProps(this.props);return void 0===t.open&&(t.open=!this.props.input),t.currentView=this.props.dateFormat?this.props.viewMode||t.updateOn||"days":"time",t},getStateFromProps:function(t){var e,s,a,n,r=this.getFormats(t),i=t.value||t.defaultValue;return i&&"string"==typeof i?e=this.localMoment(i,r.datetime):i&&(e=this.localMoment(i)),e&&!e.isValid()&&(e=null),s=e?e.clone().startOf("month"):this.localMoment().startOf("month"),a=this.getUpdateOn(r),n=e?e.format(r.datetime):i.isValid&&!i.isValid()?"":i||"",{updateOn:a,inputFormat:r.datetime,viewDate:s,selectedDate:e,inputValue:n,open:t.open}},getUpdateOn:function(t){return t.date.match(/[lLD]/)?"days":t.date.indexOf("M")!==-1?"months":t.date.indexOf("Y")!==-1?"years":"days"},getFormats:function(t){var e={date:t.dateFormat||"",time:t.timeFormat||""},s=this.localMoment(t.date).localeData();return e.date===!0?e.date=s.longDateFormat("L"):"days"!==this.getUpdateOn(e)&&(e.time=""),e.time===!0&&(e.time=s.longDateFormat("LT")),e.datetime=e.date&&e.time?e.date+" "+e.time:e.date||e.time,e},componentWillReceiveProps:function(t){var e=this.getFormats(t),s={};t.value===this.props.value&&e.datetime===this.getFormats(this.props).datetime||(s=this.getStateFromProps(t)),void 0===s.open&&(this.props.closeOnSelect&&"time"!==this.state.currentView?s.open=!1:s.open=this.state.open),this.setState(s)},onInputChange:function(t){var e=null===t.target?t:t.target.value,s=this.localMoment(e,this.state.inputFormat),a={inputValue:e};return s.isValid()&&!this.props.value?(a.selectedDate=s,a.viewDate=s.clone().startOf("month")):a.selectedDate=null,this.setState(a,function(){return this.props.onChange(s.isValid()?s:this.state.inputValue)})},onInputKey:function(t){9===t.which&&this.props.closeOnTab&&this.closeCalendar()},showView:function(t){var e=this;return function(){e.setState({currentView:t})}},setDate:function(t){var e=this,s={month:"days",year:"months"};return function(a){e.setState({viewDate:e.state.viewDate.clone()[t](parseInt(a.target.getAttribute("data-value"),10)).startOf(t),currentView:s[t]})}},addTime:function(t,e,s){return this.updateTime("add",t,e,s)},subtractTime:function(t,e,s){return this.updateTime("subtract",t,e,s)},updateTime:function(t,e,s,a){var n=this;return function(){var r={},i=a?"selectedDate":"viewDate";r[i]=n.state[i].clone()[t](e,s),n.setState(r)}},allowedSetTime:["hours","minutes","seconds","milliseconds"],setTime:function(t,e){var s,a=this.allowedSetTime.indexOf(t)+1,n=this.state,r=(n.selectedDate||n.viewDate).clone();for(r[t](e);a<this.allowedSetTime.length;a++)s=this.allowedSetTime[a],r[s](r[s]());this.props.value||this.setState({selectedDate:r,inputValue:r.format(n.inputFormat)}),this.props.onChange(r)},updateSelectedDate:function(t,e){var s,a=t.target,n=0,r=this.state.viewDate,i=this.state.selectedDate||r;a.className.indexOf("rdtDay")!==-1?(a.className.indexOf("rdtNew")!==-1?n=1:a.className.indexOf("rdtOld")!==-1&&(n=-1),s=r.clone().month(r.month()+n).date(parseInt(a.getAttribute("data-value"),10))):a.className.indexOf("rdtMonth")!==-1?s=r.clone().month(parseInt(a.getAttribute("data-value"),10)).date(i.date()):a.className.indexOf("rdtYear")!==-1&&(s=r.clone().month(i.month()).date(i.date()).year(parseInt(a.getAttribute("data-value"),10))),s.hours(i.hours()).minutes(i.minutes()).seconds(i.seconds()).milliseconds(i.milliseconds()),this.props.value?this.props.closeOnSelect&&e&&this.closeCalendar():this.setState({selectedDate:s,viewDate:s.clone().startOf("month"),inputValue:s.format(this.state.inputFormat),open:!(this.props.closeOnSelect&&e)}),this.props.onChange(s)},openCalendar:function(){this.state.open||(this.props.onFocus(),this.setState({open:!0}))},closeCalendar:function(){this.setState({open:!1}),this.props.onBlur(this.state.selectedDate||this.state.inputValue)},handleClickOutside:function(){this.props.input&&this.state.open&&!this.props.open&&(this.setState({open:!1}),this.props.onBlur(this.state.selectedDate||this.state.inputValue))},localMoment:function(t,e){var s=this.props.utc?p.utc:p,a=s(t,e,this.props.strictParsing);return this.props.locale&&a.locale(this.props.locale),a},componentProps:{fromProps:["value","isValidDate","renderDay","renderMonth","renderYear","timeConstraints"],fromState:["viewDate","selectedDate","updateOn"],fromThis:["setDate","setTime","showView","addTime","subtractTime","updateSelectedDate","localMoment"]},getComponentProps:function(){var t=this,e=this.getFormats(this.props),s={dateFormat:e.date,timeFormat:e.time};return this.componentProps.fromProps.forEach(function(e){s[e]=t.props[e]}),this.componentProps.fromState.forEach(function(e){s[e]=t.state[e]}),this.componentProps.fromThis.forEach(function(e){s[e]=t[e]}),s},render:function(){var t=this.viewComponents[this.state.currentView],e=n.DOM,s="rdt"+(this.props.className?Array.isArray(this.props.className)?" "+this.props.className.join(" "):" "+this.props.className:""),r=[];return this.props.input?r=[e.input(a({key:"i",type:"text",className:"form-control",onFocus:this.openCalendar,onChange:this.onInputChange,onKeyDown:this.onInputKey,value:this.state.inputValue},this.props.inputProps))]:s+=" rdtStatic",this.state.open&&(s+=" rdtOpen"),e.div({className:s},r.concat(e.div({key:"dt",className:"rdtPicker"},n.createElement(t,this.getComponentProps()))))}});u.moment=p,t.exports=u},function(t,e){"use strict";function s(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function a(t){var e=Object.getOwnPropertyNames(t);return Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(t))),e.filter(function(e){return n.call(t,e)})}var n=Object.prototype.propertyIsEnumerable;t.exports=Object.assign||function(t,e){for(var n,r,i=s(t),o=1;o<arguments.length;o++){n=arguments[o],r=a(Object(n));for(var c=0;c<r.length;c++)i[r[c]]=n[r[c]]}return i}},function(e,s){e.exports=t},function(t,e,s){"use strict";var a=s(2),n=s(4),r=a.DOM,i=a.createClass({render:function(){var t,e=this.renderFooter(),s=this.props.viewDate,a=s.localeData();return t=[r.thead({key:"th"},[r.tr({key:"h"},[r.th({key:"p",className:"rdtPrev"},r.span({onClick:this.props.subtractTime(1,"months")},"‹")),r.th({key:"s",className:"rdtSwitch",onClick:this.props.showView("months"),colSpan:5,"data-value":this.props.viewDate.month()},a.months(s)+" "+s.year()),r.th({key:"n",className:"rdtNext"},r.span({onClick:this.props.addTime(1,"months")},"›"))]),r.tr({key:"d"},this.getDaysOfWeek(a).map(function(t,e){return r.th({key:t+e,className:"dow"},t)}))]),r.tbody({key:"tb"},this.renderDays())],e&&t.push(e),r.div({className:"rdtDays"},r.table({},t))},getDaysOfWeek:function(t){var e=t._weekdaysMin,s=t.firstDayOfWeek(),a=[],n=0;return e.forEach(function(t){a[(7+n++-s)%7]=t}),a},renderDays:function(){var t,e,s,a,i=this.props.viewDate,o=this.props.selectedDate&&this.props.selectedDate.clone(),c=i.clone().subtract(1,"months"),p=i.year(),d=i.month(),u=[],l=[],h=this.props.renderDay||this.renderDay,m=this.props.isValidDate||this.isValidDate;c.date(c.daysInMonth()).startOf("week");for(var f=c.clone().add(42,"d");c.isBefore(f);)t="rdtDay",a=c.clone(),c.year()===p&&c.month()<d||c.year()<p?t+=" rdtOld":(c.year()===p&&c.month()>d||c.year()>p)&&(t+=" rdtNew"),o&&c.isSame(o,"day")&&(t+=" rdtActive"),c.isSame(n(),"day")&&(t+=" rdtToday"),e=!m(a,o),e&&(t+=" rdtDisabled"),s={key:c.format("M_D"),"data-value":c.date(),className:t},e||(s.onClick=this.updateSelectedDate),l.push(h(s,a,o)),7===l.length&&(u.push(r.tr({key:c.format("M_D")},l)),l=[]),c.add(1,"d");return u},updateSelectedDate:function(t){this.props.updateSelectedDate(t,!0)},renderDay:function(t,e){return r.td(t,e.date())},renderFooter:function(){if(!this.props.timeFormat)return"";var t=this.props.selectedDate||this.props.viewDate;return r.tfoot({key:"tf"},r.tr({},r.td({onClick:this.props.showView("time"),colSpan:7,className:"rdtTimeToggle"},t.format(this.props.timeFormat))))},isValidDate:function(){return 1}});t.exports=i},function(t,s){t.exports=e},function(t,e,s){"use strict";function a(t){return t.charAt(0).toUpperCase()+t.slice(1)}var n=s(2),r=n.DOM,i=n.createClass({render:function(){return r.div({className:"rdtMonths"},[r.table({key:"a"},r.thead({},r.tr({},[r.th({key:"prev",className:"rdtPrev"},r.span({onClick:this.props.subtractTime(1,"years")},"‹")),r.th({key:"year",className:"rdtSwitch",onClick:this.props.showView("years"),colSpan:2,"data-value":this.props.viewDate.year()},this.props.viewDate.year()),r.th({key:"next",className:"rdtNext"},r.span({onClick:this.props.addTime(1,"years")},"›"))]))),r.table({key:"months"},r.tbody({key:"b"},this.renderMonths()))])},renderMonths:function(){for(var t,e,s,a,n=this.props.selectedDate,i=this.props.viewDate.month(),o=this.props.viewDate.year(),c=[],p=0,d=[],u=this.props.renderMonth||this.renderMonth,l=this.props.isValidDate||this.isValidDate,h=1;p<12;)t="rdtMonth",s=this.props.viewDate.clone().set({year:o,month:p,date:h}),a=!l(s),a&&(t+=" rdtDisabled"),n&&p===i&&o===n.year()&&(t+=" rdtActive"),e={key:p,"data-value":p,className:t},a||(e.onClick="months"===this.props.updateOn?this.updateSelectedMonth:this.props.setDate("month")),d.push(u(e,p,o,n&&n.clone())),4===d.length&&(c.push(r.tr({key:i+"_"+c.length},d)),d=[]),p++;return c},updateSelectedMonth:function(t){this.props.updateSelectedDate(t,!0)},renderMonth:function(t,e){var s=this.props.viewDate.localeData()._monthsShort;return r.td(t,s.standalone?a(s.standalone[e]):s[e])},isValidDate:function(){return 1}});t.exports=i},function(t,e,s){"use strict";var a=s(2),n=a.DOM,r=a.createClass({render:function(){var t=10*parseInt(this.props.viewDate.year()/10,10);return n.div({className:"rdtYears"},[n.table({key:"a"},n.thead({},n.tr({},[n.th({key:"prev",className:"rdtPrev"},n.span({onClick:this.props.subtractTime(10,"years")},"‹")),n.th({key:"year",className:"rdtSwitch",onClick:this.props.showView("years"),colSpan:2},t+"-"+(t+9)),n.th({key:"next",className:"rdtNext"},n.span({onClick:this.props.addTime(10,"years")},"›"))]))),n.table({key:"years"},n.tbody({},this.renderYears(t)))])},renderYears:function(t){var e,s,a=[],r=-1,i=[],o=this.props.renderYear||this.renderYear,c=this.props.selectedDate,p=this.props.isValidDate||this.isValidDate;t--;for(var d,u,l=1,h=1;r<11;)e="rdtYear",d=this.props.viewDate.clone().set({year:t,month:l,date:h}),r===-1|10===r&&(e+=" rdtOld"),u=!p(d),u&&(e+=" rdtDisabled"),c&&c.year()===t&&(e+=" rdtActive"),s={key:t,"data-value":t,className:e},u||(s.onClick="years"===this.props.updateOn?this.updateSelectedYear:this.props.setDate("year")),a.push(o(s,t,c&&c.clone())),4===a.length&&(i.push(n.tr({key:r},a)),a=[]),t++,r++;return i},updateSelectedYear:function(t){this.props.updateSelectedDate(t,!0)},renderYear:function(t,e){return n.td(t,e)},isValidDate:function(){return 1}});t.exports=r},function(t,e,s){"use strict";var a=s(2),n=s(1),r=a.DOM,i=a.createClass({getInitialState:function(){return this.calculateState(this.props)},calculateState:function(t){var e=t.selectedDate||t.viewDate,s=t.timeFormat,a=[];s.indexOf("H")===-1&&s.indexOf("h")===-1||(a.push("hours"),s.indexOf("m")!==-1&&(a.push("minutes"),s.indexOf("s")!==-1&&a.push("seconds")));var n=!1;return this.props.timeFormat.indexOf(" A")!==-1&&null!==this.state&&(n=this.state.hours>=12?"PM":"AM"),{hours:e.format("H"),minutes:e.format("mm"),seconds:e.format("ss"),milliseconds:e.format("SSS"),daypart:n,counters:a}},renderCounter:function(t){if("daypart"!==t){var e=this.state[t];return"hours"===t&&this.props.timeFormat.indexOf(" A")!==-1&&(e=(e-1)%12+1,0===e&&(e=12)),r.div({key:t,className:"rdtCounter"},[r.span({key:"up",className:"rdtBtn",onMouseDown:this.onStartClicking("increase",t)},"▲"),r.div({key:"c",className:"rdtCount"},e),r.span({key:"do",className:"rdtBtn",onMouseDown:this.onStartClicking("decrease",t)},"▼")])}return""},renderDayPart:function(){return r.div({className:"rdtCounter",key:"dayPart"},[r.span({key:"up",className:"rdtBtn",onMouseDown:this.onStartClicking("toggleDayPart","hours")},"▲"),r.div({key:this.state.daypart,className:"rdtCount"},this.state.daypart),r.span({key:"do",className:"rdtBtn",onMouseDown:this.onStartClicking("toggleDayPart","hours")},"▼")])},render:function(){var t=this,e=[];return this.state.counters.forEach(function(s){e.length&&e.push(r.div({key:"sep"+e.length,className:"rdtCounterSeparator"},":")),e.push(t.renderCounter(s))}),this.state.daypart!==!1&&e.push(t.renderDayPart()),3===this.state.counters.length&&this.props.timeFormat.indexOf("S")!==-1&&(e.push(r.div({className:"rdtCounterSeparator",key:"sep5"},":")),e.push(r.div({className:"rdtCounter rdtMilli",key:"m"},r.input({value:this.state.milliseconds,type:"text",onChange:this.updateMilli})))),r.div({className:"rdtTime"},r.table({},[this.renderHeader(),r.tbody({key:"b"},r.tr({},r.td({},r.div({className:"rdtCounters"},e))))]))},componentWillMount:function(){var t=this;t.timeConstraints={hours:{min:0,max:23,step:1},minutes:{min:0,max:59,step:1},seconds:{min:0,max:59,step:1},milliseconds:{min:0,max:999,step:1}},["hours","minutes","seconds","milliseconds"].forEach(function(e){n(t.timeConstraints[e],t.props.timeConstraints[e])}),this.setState(this.calculateState(this.props))},componentWillReceiveProps:function(t){this.setState(this.calculateState(t))},updateMilli:function(t){var e=parseInt(t.target.value,10);e===t.target.value&&e>=0&&e<1e3&&(this.props.setTime("milliseconds",e),this.setState({milliseconds:e}))},renderHeader:function(){if(!this.props.dateFormat)return null;var t=this.props.selectedDate||this.props.viewDate;return r.thead({key:"h"},r.tr({},r.th({className:"rdtSwitch",colSpan:4,onClick:this.props.showView("days")},t.format(this.props.dateFormat))))},onStartClicking:function(t,e){var s=this;return function(){var a={};a[e]=s[t](e),s.setState(a),s.timer=setTimeout(function(){s.increaseTimer=setInterval(function(){a[e]=s[t](e),s.setState(a)},70)},500),s.mouseUpListener=function(){clearTimeout(s.timer),clearInterval(s.increaseTimer),s.props.setTime(e,s.state[e]),document.body.removeEventListener("mouseup",s.mouseUpListener)},document.body.addEventListener("mouseup",s.mouseUpListener)}},padValues:{hours:1,minutes:2,seconds:2,milliseconds:3},toggleDayPart:function(t){var e=parseInt(this.state[t],10)+12;return e>this.timeConstraints[t].max&&(e=this.timeConstraints[t].min+(e-(this.timeConstraints[t].max+1))),this.pad(t,e)},increase:function(t){var e=parseInt(this.state[t],10)+this.timeConstraints[t].step;return e>this.timeConstraints[t].max&&(e=this.timeConstraints[t].min+(e-(this.timeConstraints[t].max+1))),this.pad(t,e)},decrease:function(t){var e=parseInt(this.state[t],10)-this.timeConstraints[t].step;return e<this.timeConstraints[t].min&&(e=this.timeConstraints[t].max+1-(this.timeConstraints[t].min-e)),this.pad(t,e)},pad:function(t,e){for(var s=e+"";s.length<this.padValues[t];)s="0"+s;return s}});t.exports=i},function(t,e,s){"use strict";var a=s(2),n=a.version&&a.version.split(".");n&&(n[0]>0||n[1]>13)&&(a=s(9));var r=[],i=[],o="ignore-react-onclickoutside",c=function(t,e){return t===e||(t.correspondingElement?t.correspondingElement.classList.contains(o):t.classList.contains(o))};t.exports={componentDidMount:function(){if("function"!=typeof this.handleClickOutside)throw new Error("Component lacks a handleClickOutside(event) function for processing outside click events.");var t=this.__outsideClickHandler=function(t,e){return function(s){s.stopPropagation();for(var a=s.target,n=!1;a.parentNode;){if(n=c(a,t))return;a=a.parentNode}e(s)}}(a.findDOMNode(this),this.handleClickOutside),e=r.length;r.push(this),i[e]=t,this.props.disableOnClickOutside||this.enableOnClickOutside()},componentWillUnmount:function(){this.disableOnClickOutside(),this.__outsideClickHandler=!1;var t=r.indexOf(this);t>-1&&i[t]&&(i.splice(t,1),r.splice(t,1))},enableOnClickOutside:function(){var t=this.__outsideClickHandler;document.addEventListener("mousedown",t),document.addEventListener("touchstart",t)},disableOnClickOutside:function(){var t=this.__outsideClickHandler;document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t)}}},function(t,e){t.exports=s}])}); |
| | |
| | | { |
| | | "name": "react-datetime", |
| | | "version": "2.6.2", |
| | | "version": "2.7.0", |
| | | "description": "A lightweight but complete datetime picker React.js component.", |
| | | "homepage": "https://github.com/arqex/react-datetime", |
| | | "repository": { |