UNPKG

material-ui-datetime-range-picker

Version:

React Datetime Range Picker Component that Implements Google's Material Design Via Material-UI.

229 lines (196 loc) 23.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _dateUtils = require('./dateUtils'); var _DayButton = require('./DayButton'); var _DayButton2 = _interopRequireDefault(_DayButton); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var styles = { root: { display: 'flex', flexDirection: 'column', justifyContent: 'flex-start', fontWeight: 400, height: 228, lineHeight: 2, position: 'relative', textAlign: 'center', MozPaddingStart: 0 }, week: { display: 'flex', flexDirection: 'row', justifyContent: 'space-around', height: 34, marginBottom: 2 } }; var RangeCalendarMonth = function (_Component) { _inherits(RangeCalendarMonth, _Component); function RangeCalendarMonth() { var _ref; var _temp, _this, _ret; _classCallCheck(this, RangeCalendarMonth); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = RangeCalendarMonth.__proto__ || Object.getPrototypeOf(RangeCalendarMonth)).call.apply(_ref, [this].concat(args))), _this), _this.handleTouchTapDay = function (event, date) { if (_this.props.onTouchTapDay) { _this.props.onTouchTapDay(event, date); } }, _temp), _possibleConstructorReturn(_this, _ret); } _createClass(RangeCalendarMonth, [{ key: 'isSelectedDateDisabled', value: function isSelectedDateDisabled() { return this.selectedDateDisabled; } }, { key: 'getMinDate', value: function getMinDate() { return this.props[this.props.edit].minDate || this.props.utils.addYears(new Date(), -100); } }, { key: 'getMaxDate', value: function getMaxDate() { return this.props[this.props.edit].maxDate || this.props.utils.addYears(new Date(), 100); } }, { key: 'disableDaysForBlockedDateTimeRanges', value: function disableDaysForBlockedDateTimeRanges(day) { var ranges = this.props.blockedDateTimeRanges; if (this.props.edit === 'start') { return (0, _dateUtils.isBeforeDate)(day, new Date()) || (0, _dateUtils.isDateInRanges)(ranges, day); } else { var selectedStartDate = this.props.start.selectedDate; var closestRange = (0, _dateUtils.closestRangeAfterStart)(ranges, selectedStartDate); if (closestRange) { return (0, _dateUtils.isBeforeDate)(day, selectedStartDate) || (0, _dateUtils.isAfterDate)(day, closestRange.start); } else { return (0, _dateUtils.isBeforeDate)(day, selectedStartDate); } } } }, { key: 'shouldDisableDate', value: function shouldDisableDate(day) { if (day === null) return false; var disabled = !(0, _dateUtils.isBetweenDates)(day, this.getMinDate(), this.getMaxDate()); if (!disabled && this.props.start.selectedDate && this.props.edit === 'end' && (0, _dateUtils.isBeforeDate)(day, this.props.start.selectedDate)) disabled = true; if (!disabled) disabled = this.disableDaysForBlockedDateTimeRanges(day); if (!disabled && this.props[this.props.edit].shouldDisableDate) disabled = this.props[this.props.edit].shouldDisableDate(day, this.props.start.selectedDate); return disabled; } }, { key: 'hasBlockedTime', value: function hasBlockedTime(day) { var ranges = this.props.blockedDateTimeRanges; if (day === null) return false; return (0, _dateUtils.dateBordersRange)(ranges, day); } }, { key: 'dateInRange', value: function dateInRange(day) { var _props = this.props, end = _props.end, start = _props.start; if (day && start.selectedDate && end.selectedDate) { return (0, _dateUtils.isBetweenDates)(day, start.selectedDate, end.selectedDate); } return false; } }, { key: 'getWeekElements', value: function getWeekElements() { var _this2 = this; var _props2 = this.props, edit = _props2.edit, start = _props2.start; var weekArray = this.props.utils.getWeekArray(this.props[edit].displayDate ? this.props[edit].displayDate : start.displayDate, this.props.firstDayOfWeek); return weekArray.map(function (week, i) { return _react2.default.createElement( 'div', { key: i, style: styles.week }, _this2.getDayElements(week, i) ); }, this); } }, { key: 'getDayElements', value: function getDayElements(week, i) { var _this3 = this; var _props3 = this.props, DateTimeFormat = _props3.DateTimeFormat, blockedDateTimeRanges = _props3.blockedDateTimeRanges, calendarDateWidth = _props3.calendarDateWidth, dayButtonSize = _props3.dayButtonSize, edit = _props3.edit, end = _props3.end, locale = _props3.locale, start = _props3.start; return week.map(function (day, j) { var isStartDate = (0, _dateUtils.isEqualDate)(_this3.props.start.selectedDate, day); var isEndDate = (0, _dateUtils.isEqualDate)(_this3.props.end.selectedDate, day) || isStartDate && !_this3.props.end.selectedDate; var isSameDate = isStartDate || isEndDate; var disabled = _this3.shouldDisableDate(day); var selected = !disabled && isSameDate; var isBetweenDates = _this3.dateInRange(day); var containsBlockedTime = _this3.hasBlockedTime(day); if (isSameDate) { _this3.selectedDateDisabled = disabled; } return _react2.default.createElement(_DayButton2.default, { DateTimeFormat: DateTimeFormat, locale: locale, calendarDateWidth: calendarDateWidth, date: day, dayButtonSize: dayButtonSize, disabled: disabled, isBetweenDates: isBetweenDates, containsBlockedTime: containsBlockedTime, isEndDate: isEndDate, isStartDate: isStartDate, key: 'db' + (i + j), onClick: _this3.handleTouchTapDay.bind(_this3), selected: selected }); }, this); } }, { key: 'render', value: function render() { return _react2.default.createElement( 'div', { style: styles.root }, this.getWeekElements() ); } }]); return RangeCalendarMonth; }(_react.Component); RangeCalendarMonth.propTypes = { DateTimeFormat: _propTypes2.default.func.isRequired, autoOk: _propTypes2.default.bool, blockedDateTimeRanges: _propTypes2.default.array, calendarDateWidth: _propTypes2.default.string, dayButtonSize: _propTypes2.default.string, displayDate: _propTypes2.default.object.isRequired, edit: _propTypes2.default.string.isRequired, end: _propTypes2.default.object.isRequired, firstDayOfWeek: _propTypes2.default.number, locale: _propTypes2.default.string.isRequired, onTouchTapDay: _propTypes2.default.func, start: _propTypes2.default.object.isRequired, utils: _propTypes2.default.object.isRequired }; exports.default = RangeCalendarMonth; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EYXRlUGlja2VyL1JhbmdlQ2FsZW5kYXJNb250aC5qcyJdLCJuYW1lcyI6WyJzdHlsZXMiLCJyb290IiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJqdXN0aWZ5Q29udGVudCIsImZvbnRXZWlnaHQiLCJoZWlnaHQiLCJsaW5lSGVpZ2h0IiwicG9zaXRpb24iLCJ0ZXh0QWxpZ24iLCJNb3pQYWRkaW5nU3RhcnQiLCJ3ZWVrIiwibWFyZ2luQm90dG9tIiwiUmFuZ2VDYWxlbmRhck1vbnRoIiwiaGFuZGxlVG91Y2hUYXBEYXkiLCJldmVudCIsImRhdGUiLCJwcm9wcyIsIm9uVG91Y2hUYXBEYXkiLCJzZWxlY3RlZERhdGVEaXNhYmxlZCIsImVkaXQiLCJtaW5EYXRlIiwidXRpbHMiLCJhZGRZZWFycyIsIkRhdGUiLCJtYXhEYXRlIiwiZGF5IiwicmFuZ2VzIiwiYmxvY2tlZERhdGVUaW1lUmFuZ2VzIiwic2VsZWN0ZWRTdGFydERhdGUiLCJzdGFydCIsInNlbGVjdGVkRGF0ZSIsImNsb3Nlc3RSYW5nZSIsImRpc2FibGVkIiwiZ2V0TWluRGF0ZSIsImdldE1heERhdGUiLCJkaXNhYmxlRGF5c0ZvckJsb2NrZWREYXRlVGltZVJhbmdlcyIsInNob3VsZERpc2FibGVEYXRlIiwiZW5kIiwid2Vla0FycmF5IiwiZ2V0V2Vla0FycmF5IiwiZGlzcGxheURhdGUiLCJmaXJzdERheU9mV2VlayIsIm1hcCIsImkiLCJnZXREYXlFbGVtZW50cyIsIkRhdGVUaW1lRm9ybWF0IiwiY2FsZW5kYXJEYXRlV2lkdGgiLCJkYXlCdXR0b25TaXplIiwibG9jYWxlIiwiaiIsImlzU3RhcnREYXRlIiwiaXNFbmREYXRlIiwiaXNTYW1lRGF0ZSIsInNlbGVjdGVkIiwiaXNCZXR3ZWVuRGF0ZXMiLCJkYXRlSW5SYW5nZSIsImNvbnRhaW5zQmxvY2tlZFRpbWUiLCJoYXNCbG9ja2VkVGltZSIsImJpbmQiLCJnZXRXZWVrRWxlbWVudHMiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImF1dG9PayIsImJvb2wiLCJhcnJheSIsInN0cmluZyIsIm9iamVjdCIsIm51bWJlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQVNBLElBQU1BLFNBQVM7QUFDYkMsUUFBTTtBQUNKQyxhQUFTLE1BREw7QUFFSkMsbUJBQWUsUUFGWDtBQUdKQyxvQkFBZ0IsWUFIWjtBQUlKQyxnQkFBWSxHQUpSO0FBS0pDLFlBQVEsR0FMSjtBQU1KQyxnQkFBWSxDQU5SO0FBT0pDLGNBQVUsVUFQTjtBQVFKQyxlQUFXLFFBUlA7QUFTSkMscUJBQWlCO0FBVGIsR0FETztBQVliQyxRQUFNO0FBQ0pULGFBQVMsTUFETDtBQUVKQyxtQkFBZSxLQUZYO0FBR0pDLG9CQUFnQixjQUhaO0FBSUpFLFlBQVEsRUFKSjtBQUtKTSxrQkFBYztBQUxWO0FBWk8sQ0FBZjs7SUFxQk1DLGtCOzs7Ozs7Ozs7Ozs7Ozs4TUFxQkpDLGlCLEdBQW9CLFVBQUNDLEtBQUQsRUFBUUMsSUFBUixFQUFpQjtBQUNuQyxVQUFJLE1BQUtDLEtBQUwsQ0FBV0MsYUFBZixFQUE4QjtBQUM1QixjQUFLRCxLQUFMLENBQVdDLGFBQVgsQ0FBeUJILEtBQXpCLEVBQWdDQyxJQUFoQztBQUNEO0FBQ0YsSzs7Ozs7NkNBUndCO0FBQ3ZCLGFBQU8sS0FBS0csb0JBQVo7QUFDRDs7O2lDQVFZO0FBQ1gsYUFBTyxLQUFLRixLQUFMLENBQVcsS0FBS0EsS0FBTCxDQUFXRyxJQUF0QixFQUE0QkMsT0FBNUIsSUFBdUMsS0FBS0osS0FBTCxDQUFXSyxLQUFYLENBQWlCQyxRQUFqQixDQUEwQixJQUFJQyxJQUFKLEVBQTFCLEVBQXNDLENBQUMsR0FBdkMsQ0FBOUM7QUFDRDs7O2lDQUVZO0FBQ1gsYUFBTyxLQUFLUCxLQUFMLENBQVcsS0FBS0EsS0FBTCxDQUFXRyxJQUF0QixFQUE0QkssT0FBNUIsSUFBdUMsS0FBS1IsS0FB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O0FBUWpCM0IsT0FBS3lCLG9CQUFVTyxNQUFWLENBQWlCTCxVQVJMO0FBU2pCdkIsa0JBQWdCcUIsb0JBQVVRLE1BVFQ7QUFVakJ0QixVQUFRYyxvQkFBVU0sTUFBVixDQUFpQkosVUFWUjtBQVdqQi9DLGlCQUFlNkMsb0JBQVVDLElBWFI7QUFZakJsQyxTQUFPaUMsb0JBQVVPLE1BQVYsQ0FBaUJMLFVBWlA7QUFhakIzQyxTQUFPeUMsb0JBQVVPLE1BQVYsQ0FBaUJMO0FBYlAsQztrQkFtSk5wRCxrQiIsImZpbGUiOiJSYW5nZUNhbGVuZGFyTW9udGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2RhdGVCb3JkZXJzUmFuZ2UsIGlzQmV0d2VlbkRhdGVzLCBpc0VxdWFsRGF0ZX0gZnJvbSAnLi9kYXRlVXRpbHMnO1xuaW1wb3J0IERheUJ1dHRvbiBmcm9tICcuL0RheUJ1dHRvbic7XG5cbmltcG9ydCB7XG4gIGNsb3Nlc3RSYW5nZUFmdGVyU3RhcnQsXG4gIGlzQWZ0ZXJEYXRlLFxuICBpc0JlZm9yZURhdGUsXG4gIGlzRGF0ZUluUmFuZ2VzLFxufSBmcm9tICcuL2RhdGVVdGlscyc7XG5cbmNvbnN0IHN0eWxlcyA9IHtcbiAgcm9vdDoge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtc3RhcnQnLFxuICAgIGZvbnRXZWlnaHQ6IDQwMCxcbiAgICBoZWlnaHQ6IDIyOCxcbiAgICBsaW5lSGVpZ2h0OiAyLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgTW96UGFkZGluZ1N0YXJ0OiAwLFxuICB9LFxuICB3ZWVrOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJyxcbiAgICBoZWlnaHQ6IDM0LFxuICAgIG1hcmdpbkJvdHRvbTogMixcbiAgfSxcbn07XG5cbmNsYXNzIFJhbmdlQ2FsZW5kYXJNb250aCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgRGF0ZVRpbWVGb3JtYXQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgYXV0b09rOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBibG9ja2VkRGF0ZVRpbWVSYW5nZXM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBjYWxlbmRhckRhdGVXaWR0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBkYXlCdXR0b25TaXplOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGRpc3BsYXlEYXRlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgZWRpdDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIGVuZDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGZpcnN0RGF5T2ZXZWVrOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGxvY2FsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIG9uVG91Y2hUYXBEYXk6IFByb3BUeXBlcy5mdW5jLFxuICAgIHN0YXJ0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgdXRpbHM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgfTtcblxuICBpc1NlbGVjdGVkRGF0ZURpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZURpc2FibGVkO1xuICB9XG5cbiAgaGFuZGxlVG91Y2hUYXBEYXkgPSAoZXZlbnQsIGRhdGUpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5vblRvdWNoVGFwRGF5KSB7XG4gICAgICB0aGlzLnByb3BzLm9uVG91Y2hUYXBEYXkoZXZlbnQsIGRhdGUpO1xuICAgIH1cbiAgfTtcblxuICBnZXRNaW5EYXRlKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzW3RoaXMucHJvcHMuZWRpdF0ubWluRGF0ZSB8fCB0aGlzLnByb3BzLnV0aWxzLmFkZFllYXJzKG5ldyBEYXRlKCksIC0xMDApO1xuICB9XG5cbiAgZ2V0TWF4RGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1t0aGlzLnByb3BzLmVkaXRdLm1heERhdGUgfHwgdGhpcy5wcm9wcy51dGlscy5hZGRZZWFycyhuZXcgRGF0ZSgpLCAxMDApO1xuICB9XG5cbiAgZGlzYWJsZURheXNGb3JCbG9ja2VkRGF0ZVRpbWVSYW5nZXMoZGF5KSB7XG4gICAgY29uc3QgcmFuZ2VzID0gdGhpcy5wcm9wcy5ibG9ja2VkRGF0ZVRpbWVSYW5nZXM7XG4gICAgaWYgKHRoaXMucHJvcHMuZWRpdCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgcmV0dXJuIChpc0JlZm9yZURhdGUoZGF5LCBuZXcgRGF0ZSgpKSB8fCBpc0RhdGVJblJhbmdlcyhyYW5nZXMsIGRheSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IHRoaXMucHJvcHMuc3RhcnQuc2VsZWN0ZWREYXRlO1xuICAgICAgY29uc3QgY2xvc2VzdFJhbmdlID0gY2xvc2VzdFJhbmdlQWZ0ZXJTdGFydChyYW5nZXMsIHNlbGVjdGVkU3RhcnREYXRlKTtcblxuICAgICAgaWYgKGNsb3Nlc3RSYW5nZSkge1xuICAgICAgICByZXR1cm4gaXNCZWZvcmVEYXRlKGRheSwgc2VsZWN0ZWRTdGFydERhdGUpIHx8IGlzQWZ0ZXJEYXRlKGRheSwgY2xvc2VzdFJhbmdlLnN0YXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc0JlZm9yZURhdGUoZGF5LCBzZWxlY3RlZFN0YXJ0RGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2hvdWxkRGlzYWJsZURhdGUoZGF5KSB7XG4gICAgaWYgKGRheSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBkaXNhYmxlZCA9ICFpc0JldHdlZW5EYXRlcyhkYXksIHRoaXMuZ2V0TWluRGF0ZSgpLCB0aGlzLmdldE1heERhdGUoKSk7XG4gICAgaWYgKCFkaXNhYmxlZCAmJiB0aGlzLnByb3BzLnN0YXJ0LnNlbGVjdGVkRGF0ZSAmJiB0aGlzLnByb3BzLmVkaXQgPT09ICdlbmQnICYmXG4gICAgICBpc0JlZm9yZURhdGUoZGF5LCB0aGlzLnByb3BzLnN0YXJ0LnNlbGVjdGVkRGF0ZSkpIGRpc2FibGVkID0gdHJ1ZTtcbiAgICBpZiAoIWRpc2FibGVkKSBkaXNhYmxlZCA9IHRoaXMuZGlzYWJsZURheXNGb3JCbG9ja2VkRGF0ZVRpbWVSYW5nZXMoZGF5KTtcbiAgICBpZiAoIWRpc2FibGVkICYmIHRoaXMucHJvcHNbdGhpcy5wcm9wcy5lZGl0XS5zaG91bGREaXNhYmxlRGF0ZSlcbiAgICAgIGRpc2FibGVkID0gdGhpcy5wcm9wc1t0aGlzLnByb3BzLmVkaXRdLnNob3VsZERpc2FibGVEYXRlKGRheSwgdGhpcy5wcm9wcy5zdGFydC5zZWxlY3RlZERhdGUpO1xuXG4gICAgcmV0dXJuIGRpc2FibGVkO1xuICB9XG5cbiAgaGFzQmxvY2tlZFRpbWUoZGF5KSB7XG4gICAgY29uc3QgcmFuZ2VzID0gdGhpcy5wcm9wcy5ibG9ja2VkRGF0ZVRpbWVSYW5nZXM7XG4gICAgaWYgKGRheSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBkYXRlQm9yZGVyc1JhbmdlKHJhbmdlcywgZGF5KTtcbiAgfVxuXG4gIGRhdGVJblJhbmdlKGRheSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuZCxcbiAgICAgIHN0YXJ0LFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmIChkYXkgJiYgc3RhcnQuc2VsZWN0ZWREYXRlICYmIGVuZC5zZWxlY3RlZERhdGUpIHtcbiAgICAgIHJldHVybiBpc0JldHdlZW5EYXRlcyhkYXksIHN0YXJ0LnNlbGVjdGVkRGF0ZSwgZW5kLnNlbGVjdGVkRGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFdlZWtFbGVtZW50cygpIHtcbiAgICBjb25zdCB7ZWRpdCwgc3RhcnR9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB3ZWVrQXJyYXkgPSB0aGlzLnByb3BzLnV0aWxzLmdldFdlZWtBcnJheSgodGhpcy5wcm9wc1tlZGl0XS5kaXNwbGF5RGF0ZSA/XG4gICAgICB0aGlzLnByb3BzW2VkaXRdLmRpc3BsYXlEYXRlIDogc3RhcnQuZGlzcGxheURhdGUpLCB0aGlzLnByb3BzLmZpcnN0RGF5T2ZXZWVrKTtcblxuICAgIHJldHVybiB3ZWVrQXJyYXkubWFwKCh3ZWVrLCBpKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGtleT17aX0gc3R5bGU9e3N0eWxlcy53ZWVrfT5cbiAgICAgICAgICB7dGhpcy5nZXREYXlFbGVtZW50cyh3ZWVrLCBpKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH0sIHRoaXMpO1xuICB9XG5cbiAgZ2V0RGF5RWxlbWVudHMod2VlaywgaSkge1xuICAgIGNvbnN0IHtcbiAgICAgIERhdGVUaW1lRm9ybWF0LFxuICAgICAgYmxvY2tlZERhdGVUaW1lUmFuZ2VzLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBjYWxlbmRhckRhdGVXaWR0aCxcbiAgICAgIGRheUJ1dHRvblNpemUsXG4gICAgICBlZGl0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBlbmQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIGxvY2FsZSxcbiAgICAgIHN0YXJ0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gd2Vlay5tYXAoKGRheSwgaikgPT4ge1xuICAgICAgY29uc3QgaXNTdGFydERhdGUgPSBpc0VxdWFsRGF0ZSh0aGlzLnByb3BzLnN0YXJ0LnNlbGVjdGVkRGF0ZSwgZGF5KTtcbiAgICAgIGNvbnN0IGlzRW5kRGF0ZSA9IChpc0VxdWFsRGF0ZSh0aGlzLnByb3BzLmVuZC5zZWxlY3RlZERhdGUsIGRheSkgfHxcbiAgICAgICAgKGlzU3RhcnREYXRlICYmICF0aGlzLnByb3BzLmVuZC5zZWxlY3RlZERhdGUpKTtcbiAgICAgIGNvbnN0IGlzU2FtZURhdGUgPSAoaXNTdGFydERhdGUgfHwgaXNFbmREYXRlKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5zaG91bGREaXNhYmxlRGF0ZShkYXkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSAhZGlzYWJsZWQgJiYgaXNTYW1lRGF0ZTtcbiAgICAgIGNvbnN0IGlzQmV0d2VlbkRhdGVzID0gdGhpcy5kYXRlSW5SYW5nZShkYXkpO1xuICAgICAgY29uc3QgY29udGFpbnNCbG9ja2VkVGltZSA9IHRoaXMuaGFzQmxvY2tlZFRpbWUoZGF5KTtcblxuICAgICAgaWYgKGlzU2FtZURhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVEaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERheUJ1dHRvblxuICAgICAgICAgIERhdGVUaW1lRm9ybWF0PXtEYXRlVGltZUZvcm1hdH1cbiAgICAgICAgICBsb2NhbGU9e2xvY2FsZX1cbiAgICAgICAgICBjYWxlbmRhckRhdGVXaWR0aD17Y2FsZW5kYXJEYXRlV2lkdGh9XG4gICAgICAgICAgZGF0ZT17ZGF5fVxuICAgICAgICAgIGRheUJ1dHRvblNpemU9e2RheUJ1dHRvblNpemV9XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGlzQmV0d2VlbkRhdGVzPXtpc0JldHdlZW5EYXRlc31cbiAgICAgICAgICBjb250YWluc0Jsb2NrZWRUaW1lPXtjb250YWluc0Jsb2NrZWRUaW1lfVxuICAgICAgICAgIGlzRW5kRGF0ZT17aXNFbmREYXRlfVxuICAgICAgICAgIGlzU3RhcnREYXRlPXtpc1N0YXJ0RGF0ZX1cbiAgICAgICAgICBrZXk9e2BkYiR7KGkgKyBqKX1gfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlVG91Y2hUYXBEYXkuYmluZCh0aGlzKX1cbiAgICAgICAgICBzZWxlY3RlZD17c2VsZWN0ZWR9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH0sIHRoaXMpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMucm9vdH0+XG4gICAgICAgIHt0aGlzLmdldFdlZWtFbGVtZW50cygpfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSYW5nZUNhbGVuZGFyTW9udGg7XG4iXX0=