react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
403 lines (343 loc) • 35.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _uuid = require('uuid');
var _uuid2 = _interopRequireDefault(_uuid);
var _FormElement = require('./FormElement');
var _FormElement2 = _interopRequireDefault(_FormElement);
var _Input = require('./Input');
var _Input2 = _interopRequireDefault(_Input);
var _Icon = require('./Icon');
var _Icon2 = _interopRequireDefault(_Icon);
var _Datepicker = require('./Datepicker');
var _Datepicker2 = _interopRequireDefault(_Datepicker);
var _reactOnclickoutside = require('react-onclickoutside');
var _reactOnclickoutside2 = _interopRequireDefault(_reactOnclickoutside);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DateInput = function (_Component) {
(0, _inherits3.default)(DateInput, _Component);
function DateInput(props) {
(0, _classCallCheck3.default)(this, DateInput);
var _this = (0, _possibleConstructorReturn3.default)(this, (DateInput.__proto__ || (0, _getPrototypeOf2.default)(DateInput)).call(this, props));
_this.handleClickOutside = _this.handleClickOutside.bind(_this);
_this.state = {
id: 'form-element-' + (0, _uuid2.default)(),
opened: props.defaultOpened || false
};
_this.onDateIconClick = _this.onDateIconClick.bind(_this);
_this.onInputKeyDown = _this.onInputKeyDown.bind(_this);
_this.onInputChange = _this.onInputChange.bind(_this);
_this.onInputBlur = _this.onInputBlur.bind(_this);
_this.onDatepickerSelect = _this.onDatepickerSelect.bind(_this);
_this.onDatepickerBlur = _this.onDatepickerBlur.bind(_this);
_this.onDatepickerClose = _this.onDatepickerClose.bind(_this);
_this.inputRef = _this.inputRef.bind(_this);
return _this;
}
(0, _createClass3.default)(DateInput, [{
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
if (this.props.onValueChange && prevState.value !== this.state.value) {
this.props.onValueChange(this.state.value, prevState.value);
}
}
}, {
key: 'onDateIconClick',
value: function onDateIconClick() {
var _this2 = this;
setTimeout(function () {
if (_this2.props.inputFocused) {
var inputEl = _reactDom2.default.findDOMNode(_this2.input);
if (inputEl) {
inputEl.focus();
}
}
_this2.showDatepicker();
}, 10);
}
}, {
key: 'onInputKeyDown',
value: function onInputKeyDown(e) {
var _this3 = this;
if (e.keyCode === 13) {
// return key
this.onDatepickerClose();
e.preventDefault();
e.stopPropagation();
this.setValueFromInput(e.target.value);
if (this.props.onComplete) {
setTimeout(function () {
_this3.props.onComplete();
}, 10);
}
} else if (e.keyCode === 40) {
// down key
this.showDatepicker();
e.preventDefault();
e.stopPropagation();
} else if (e.keyCode === 27) {
// ESC
this.onDatepickerClose();
e.preventDefault();
e.stopPropagation();
}
if (this.props.onKeyDown) {
this.props.onKeyDown(e);
}
}
}, {
key: 'onInputChange',
value: function onInputChange(e) {
var inputValue = e.target.value;
this.setState({ inputValue: inputValue });
if (this.props.onChange) {
this.props.onChange(e, inputValue);
}
}
}, {
key: 'onInputBlur',
value: function onInputBlur(e) {
var _this4 = this;
this.setValueFromInput(e.target.value);
setTimeout(function () {
if (!_this4.isFocusedInComponent()) {
if (_this4.props.onBlur) {
_this4.props.onBlur();
}
if (_this4.props.onComplete) {
_this4.props.onComplete();
}
}
}, 10);
}
}, {
key: 'onDatepickerSelect',
value: function onDatepickerSelect(value) {
var _this5 = this;
this.setState({ value: value, inputValue: undefined });
setTimeout(function () {
_this5.setState({ opened: false });
var inputEl = _reactDom2.default.findDOMNode(_this5.input);
if (inputEl) {
inputEl.focus();
inputEl.select();
}
if (_this5.props.onComplete) {
_this5.props.onComplete();
}
}, 200);
}
}, {
key: 'onDatepickerBlur',
value: function onDatepickerBlur() {
var _this6 = this;
this.setState({ opened: false });
setTimeout(function () {
if (!_this6.isFocusedInComponent()) {
if (_this6.props.onBlur) {
_this6.props.onBlur();
}
if (_this6.props.onComplete) {
_this6.props.onComplete();
}
}
}, 10);
}
}, {
key: 'onDatepickerClose',
value: function onDatepickerClose() {
this.setState({ opened: false });
var inputEl = _reactDom2.default.findDOMNode(this.input);
if (inputEl) {
inputEl.focus();
inputEl.select();
}
}
}, {
key: 'setValueFromInput',
value: function setValueFromInput(inputValue) {
var value = this.state.value;
if (!inputValue) {
value = '';
} else {
value = (0, _moment2.default)(inputValue, this.props.dateFormat);
if (value.isValid()) {
value = value.format('YYYY-MM-DD');
} else {
value = inputValue;
}
}
this.setState({ value: value, inputValue: undefined });
}
}, {
key: 'inputRef',
value: function inputRef(ref) {
this.input = ref;
}
// provided by 'react-onclickoutside' HOC
}, {
key: 'handleClickOutside',
value: function handleClickOutside() {
if (!this.state.opened) {
return;
}
this.onDatepickerClose();
}
}, {
key: 'isFocusedInComponent',
value: function isFocusedInComponent() {
var rootEl = _reactDom2.default.findDOMNode(this);
var targetEl = document.activeElement;
while (targetEl && targetEl !== rootEl) {
targetEl = targetEl.parentNode;
}
return !!targetEl;
}
}, {
key: 'showDatepicker',
value: function showDatepicker() {
var value = this.state.value;
if (typeof this.state.inputValue !== 'undefined') {
value = (0, _moment2.default)(this.state.inputValue, this.props.dateFormat);
if (value.isValid()) {
value = value.format('YYYY-MM-DD');
} else {
value = this.state.value;
}
}
this.setState({ opened: !this.state.opened, value: value });
}
}, {
key: 'renderInput',
value: function renderInput(_ref) {
var inputValue = _ref.inputValue,
props = (0, _objectWithoutProperties3.default)(_ref, ['inputValue']);
var inputDateClassNames = (0, _classnames2.default)('slds-input-has-icon', 'slds-input-has-icon--right', props.className);
var pprops = props;
delete pprops.onValueChange;
delete pprops.defaultOpened;
delete pprops.inputFocused;
delete pprops.disableOnClickOutside;
delete pprops.enableOnClickOutside;
delete pprops.outsideClickIgnoreClass;
delete pprops.preventDefault;
delete pprops.eventTypes;
delete pprops.stopPropagation;
return _react2.default.createElement(
'div',
{ className: inputDateClassNames },
_react2.default.createElement(_Input2.default, (0, _extends3.default)({
ref: this.inputRef,
value: inputValue
}, props, {
onKeyDown: this.onInputKeyDown,
onChange: this.onInputChange,
onBlur: this.onInputBlur,
onClick: this.onDateIconClick
})),
_react2.default.createElement(_Icon2.default, {
icon: 'event',
className: 'slds-input__icon',
style: { cursor: 'pointer' },
onClick: this.onDateIconClick
})
);
}
}, {
key: 'renderDropdown',
value: function renderDropdown(dateValue) {
var datepickerClassNames = (0, _classnames2.default)('slds-dropdown', 'slds-dropdown--left');
return this.state.opened ? _react2.default.createElement(_Datepicker2.default, {
className: datepickerClassNames,
selectedDate: dateValue,
autoFocus: !this.props.inputFocused,
onSelect: this.onDatepickerSelect,
onBlur: this.onDatepickerBlur,
onClose: this.onDatepickerClose,
disablePastDateSelection: this.props.disablePastDateSelection
}) : _react2.default.createElement('div', null);
}
}, {
key: 'render',
value: function render() {
var id = this.props.id || this.state.id;
var _props = this.props,
totalCols = _props.totalCols,
cols = _props.cols,
label = _props.label,
required = _props.required,
error = _props.error,
defaultValue = _props.defaultValue,
value = _props.value,
dateFormat = _props.dateFormat,
tooltip = _props.tooltip,
props = (0, _objectWithoutProperties3.default)(_props, ['totalCols', 'cols', 'label', 'required', 'error', 'defaultValue', 'value', 'dateFormat', 'tooltip']);
var dateValue = typeof value !== 'undefined' ? value : typeof this.state.value !== 'undefined' ? this.state.value : defaultValue;
var mvalue = (0, _moment2.default)(dateValue, 'YYYY-MM-DD');
var inputValue = typeof this.state.inputValue !== 'undefined' ? this.state.inputValue : typeof dateValue !== 'undefined' ? mvalue.isValid() ? mvalue.format(dateFormat) : dateValue : undefined;
var dropdown = this.renderDropdown(dateValue);
var formElemProps = { id: id, totalCols: totalCols, cols: cols, label: label, required: required, error: error, dropdown: dropdown, tooltip: tooltip };
return _react2.default.createElement(
_FormElement2.default,
formElemProps,
this.renderInput((0, _extends3.default)({ id: id, inputValue: inputValue }, props))
);
}
}]);
return DateInput;
}(_react.Component);
DateInput.propTypes = {
id: _propTypes2.default.string,
className: _propTypes2.default.string,
label: _propTypes2.default.string,
required: _propTypes2.default.bool,
error: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string, _propTypes2.default.shape({
message: _propTypes2.default.string
})]),
totalCols: _propTypes2.default.number,
cols: _propTypes2.default.number,
value: _propTypes2.default.string,
onKeyDown: _propTypes2.default.func,
onBlur: _propTypes2.default.func,
defaultValue: _propTypes2.default.string,
defaultOpened: _propTypes2.default.bool,
dateFormat: _propTypes2.default.string,
onChange: _propTypes2.default.func,
onValueChange: _propTypes2.default.func,
onComplete: _propTypes2.default.func,
disablePastDateSelection: _propTypes2.default.bool,
inputFocused: _propTypes2.default.bool,
tooltip: _propTypes2.default.element
};
DateInput.defaultProps = {
dateFormat: 'L',
inputFocused: false
};
DateInput.isFormElement = true;
exports.default = (0, _reactOnclickoutside2.default)(DateInput);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0RhdGVJbnB1dC5qcyJdLCJuYW1lcyI6WyJEYXRlSW5wdXQiLCJwcm9wcyIsImhhbmRsZUNsaWNrT3V0c2lkZSIsImJpbmQiLCJzdGF0ZSIsImlkIiwib3BlbmVkIiwiZGVmYXVsdE9wZW5lZCIsIm9uRGF0ZUljb25DbGljayIsIm9uSW5wdXRLZXlEb3duIiwib25JbnB1dENoYW5nZSIsIm9uSW5wdXRCbHVyIiwib25EYXRlcGlja2VyU2VsZWN0Iiwib25EYXRlcGlja2VyQmx1ciIsIm9uRGF0ZXBpY2tlckNsb3NlIiwiaW5wdXRSZWYiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJvblZhbHVlQ2hhbmdlIiwidmFsdWUiLCJzZXRUaW1lb3V0IiwiaW5wdXRGb2N1c2VkIiwiaW5wdXRFbCIsImZpbmRET01Ob2RlIiwiaW5wdXQiLCJmb2N1cyIsInNob3dEYXRlcGlja2VyIiwiZSIsImtleUNvZGUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInNldFZhbHVlRnJvbUlucHV0IiwidGFyZ2V0Iiwib25Db21wbGV0ZSIsIm9uS2V5RG93biIsImlucHV0VmFsdWUiLCJzZXRTdGF0ZSIsIm9uQ2hhbmdlIiwiaXNGb2N1c2VkSW5Db21wb25lbnQiLCJvbkJsdXIiLCJ1bmRlZmluZWQiLCJzZWxlY3QiLCJkYXRlRm9ybWF0IiwiaXNWYWxpZCIsImZvcm1hdCIsInJlZiIsInJvb3RFbCIsInRhcmdldEVsIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwicGFyZW50Tm9kZSIsImlucHV0RGF0ZUNsYXNzTmFtZXMiLCJjbGFzc05hbWUiLCJwcHJvcHMiLCJkaXNhYmxlT25DbGlja091dHNpZGUiLCJlbmFibGVPbkNsaWNrT3V0c2lkZSIsIm91dHNpZGVDbGlja0lnbm9yZUNsYXNzIiwiZXZlbnRUeXBlcyIsImN1cnNvciIsImRhdGVWYWx1ZSIsImRhdGVwaWNrZXJDbGFzc05hbWVzIiwiZGlzYWJsZVBhc3REYXRlU2VsZWN0aW9uIiwidG90YWxDb2xzIiwiY29scyIsImxhYmVsIiwicmVxdWlyZWQiLCJlcnJvciIsImRlZmF1bHRWYWx1ZSIsInRvb2x0aXAiLCJtdmFsdWUiLCJkcm9wZG93biIsInJlbmRlckRyb3Bkb3duIiwiZm9ybUVsZW1Qcm9wcyIsInJlbmRlcklucHV0IiwicHJvcFR5cGVzIiwic3RyaW5nIiwiYm9vbCIsIm9uZU9mVHlwZSIsInNoYXBlIiwibWVzc2FnZSIsIm51bWJlciIsImZ1bmMiLCJlbGVtZW50IiwiZGVmYXVsdFByb3BzIiwiaXNGb3JtRWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztJQUVNQSxTOzs7QUFDSixxQkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBLDRJQUNYQSxLQURXOztBQUVqQixVQUFLQyxrQkFBTCxHQUEwQixNQUFLQSxrQkFBTCxDQUF3QkMsSUFBeEIsT0FBMUI7QUFDQSxVQUFLQyxLQUFMLEdBQWE7QUFDWEMsNEJBQW9CLHFCQURUO0FBRVhDLGNBQVNMLE1BQU1NLGFBQU4sSUFBdUI7QUFGckIsS0FBYjs7QUFLQSxVQUFLQyxlQUFMLEdBQXVCLE1BQUtBLGVBQUwsQ0FBcUJMLElBQXJCLE9BQXZCO0FBQ0EsVUFBS00sY0FBTCxHQUFzQixNQUFLQSxjQUFMLENBQW9CTixJQUFwQixPQUF0QjtBQUNBLFVBQUtPLGFBQUwsR0FBcUIsTUFBS0EsYUFBTCxDQUFtQlAsSUFBbkIsT0FBckI7QUFDQSxVQUFLUSxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJSLElBQWpCLE9BQW5COztBQUVBLFVBQUtTLGtCQUFMLEdBQTBCLE1BQUtBLGtCQUFMLENBQXdCVCxJQUF4QixPQUExQjtBQUNBLFVBQUtVLGdCQUFMLEdBQXdCLE1BQUtBLGdCQUFMLENBQXNCVixJQUF0QixPQUF4QjtBQUNBLFVBQUtXLGlCQUFMLEdBQXlCLE1BQUtBLGlCQUFMLENBQXVCWCxJQUF2QixPQUF6Qjs7QUFFQSxVQUFLWSxRQUFMLEdBQWdCLE1BQUtBLFFBQUwsQ0FBY1osSUFBZCxPQUFoQjtBQWpCaUI7QUFrQmxCOzs7O3VDQUVrQmEsUyxFQUFXQyxTLEVBQVc7QUFDdkMsVUFBSSxLQUFLaEIsS0FBTCxDQUFXaUIsYUFBWCxJQUE0QkQsVUFBVUUsS0FBVixLQUFvQixLQUFLZixLQUFMLENBQVdlLEtBQS9ELEVBQXNFO0FBQ3BFLGFBQUtsQixLQUFMLENBQVdpQixhQUFYLENBQXlCLEtBQUtkLEtBQUwsQ0FBV2UsS0FBcEMsRUFBMkNGLFVBQVVFLEtBQXJEO0FBQ0Q7QUFDRjs7O3NDQUVpQjtBQUFBOztBQUNoQkMsaUJBQVcsWUFBTTtBQUNmLFlBQUksT0FBS25CLEtBQUwsQ0FBV29CLFlBQWYsRUFBNkI7QUFDM0IsY0FBTUMsVUFBVSxtQkFBU0MsV0FBVCxDQUFxQixPQUFLQyxLQUExQixDQUFoQjtBQUNBLGNBQUlGLE9BQUosRUFBYTtBQUNYQSxvQkFBUUcsS0FBUjtBQUNEO0FBQ0Y7QUFDRCxlQUFLQyxjQUFMO0FBQ0QsT0FSRCxFQVFHLEVBUkg7QUFTRDs7O21DQUVjQyxDLEVBQUc7QUFBQTs7QUFDaEIsVUFBSUEsRUFBRUMsT0FBRixLQUFjLEVBQWxCLEVBQXNCO0FBQUU7QUFDdEIsYUFBS2QsaUJBQUw7QUFDQWEsVUFBRUUsY0FBRjtBQUNBRixVQUFFRyxlQUFGO0FBQ0EsYUFBS0MsaUJBQUwsQ0FBdUJKLEVBQUVLLE1BQUYsQ0FBU2IsS0FBaEM7QUFDQSxZQUFJLEtBQUtsQixLQUFMLENBQVdnQyxVQUFmLEVBQTJCO0FBQ3pCYixxQkFBVyxZQUFNO0FBQ2YsbUJBQUtuQixLQUFMLENBQVdnQyxVQUFYO0FBQ0QsV0FGRCxFQUVHLEVBRkg7QUFHRDtBQUNGLE9BVkQsTUFVTyxJQUFJTixFQUFFQyxPQUFGLEtBQWMsRUFBbEIsRUFBc0I7QUFBRTtBQUM3QixhQUFLRixjQUFMO0FBQ0FDLFVBQUVFLGNBQUY7QUFDQUYsVUFBRUcsZUFBRjtBQUNELE9BSk0sTUFJQSxJQUFJSCxFQUFFQyxPQUFGLEtBQWMsRUFBbEIsRUFBc0I7QUFBRTtBQUM3QixhQUFLZCxpQkFBTDtBQUNBYSxVQUFFRSxjQUFGO0FBQ0FGLFVBQUVHLGVBQUY7QUFDRDtBQUNELFVBQUksS0FBSzdCLEtBQUwsQ0FBV2lDLFNBQWYsRUFBMEI7QUFDeEIsYUFBS2pDLEtBQUwsQ0FBV2lDLFNBQVgsQ0FBcUJQLENBQXJCO0FBQ0Q7QUFDRjs7O2tDQUVhQSxDLEVBQUc7QUFDZixVQUFNUSxhQUFhUixFQUFFSyxNQUFGLENBQVNiLEtBQTVCO0FBQ0EsV0FBS2lCLFFBQUwsQ0FBYyxFQUFFRCxzQkFBRixFQUFkO0FBQ0EsVUFBSSxLQUFLbEMsS0FBTCxDQUFXb0MsUUFBZixFQUF5QjtBQUN2QixhQUFLcEMsS0FBTCxDQUFXb0MsUUFBWCxDQUFvQlYsQ0FBcEIsRUFBdUJRLFVBQXZCO0FBQ0Q7QUFDRjs7O2dDQUVXUixDLEVBQUc7QUFBQTs7QUFDYixXQUFLSSxpQkFBTCxDQUF1QkosRUFBRUssTUFBRixDQUFTYixLQUFoQztBQUNBQyxpQkFBVyxZQUFNO0FBQ2YsWUFBSSxDQUFDLE9BQUtrQixvQkFBTCxFQUFMLEVBQWtDO0FBQ2hDLGNBQUksT0FBS3JDLEtBQUwsQ0FBV3NDLE1BQWYsRUFBdUI7QUFDckIsbUJBQUt0QyxLQUFMLENBQVdzQyxNQUFYO0FBQ0Q7QUFDRCxjQUFJLE9BQUt0QyxLQUFMLENBQVdnQyxVQUFmLEVBQTJCO0FBQ3pCLG1CQUFLaEMsS0FBTCxDQUFXZ0MsVUFBWDtBQUNEO0FBQ0Y7QUFDRixPQVRELEVBU0csRUFUSDtBQVVEOzs7dUNBRWtCZCxLLEVBQU87QUFBQTs7QUFDeEIsV0FBS2lCLFFBQUwsQ0FBYyxFQUFFakIsWUFBRixFQUFTZ0IsWUFBWUssU0FBckIsRUFBZDtBQUNBcEIsaUJBQVcsWUFBTTtBQUNmLGVBQUtnQixRQUFMLENBQWMsRUFBRTlCLFFBQVEsS0FBVixFQUFkO0FBQ0EsWUFBTWdCLFVBQVUsbUJBQVNDLFdBQVQsQ0FBcUIsT0FBS0MsS0FBMUIsQ0FBaEI7QUFDQSxZQUFJRixPQUFKLEVBQWE7QUFDWEEsa0JBQVFHLEtBQVI7QUFDQUgsa0JBQVFtQixNQUFSO0FBQ0Q7QUFDRCxZQUFJLE9BQUt4QyxLQUFMLENBQVdnQyxVQUFmLEVBQTJCO0FBQ3pCLGlCQUFLaEMsS0FBTCxDQUFXZ0MsVUFBWDtBQUNEO0FBQ0YsT0FWRCxFQVVHLEdBVkg7QUFXRDs7O3VDQUVrQjtBQUFBOztBQUNqQixXQUFLRyxRQUFMLENBQWMsRUFBRTlCLFFBQVEsS0FBVixFQUFkO0FBQ0FjLGlCQUFXLFlBQU07QUFDZixZQUFJLENBQUMsT0FBS2tCLG9CQUFMLEVBQUwsRUFBa0M7QUFDaEMsY0FBSSxPQUFLckMsS0FBTCxDQUFXc0MsTUFBZixFQUF1QjtBQUNyQixtQkFBS3RDLEtBQUwsQ0FBV3NDLE1BQVg7QUFDRDtBQUNELGNBQUksT0FBS3RDLEtBQUwsQ0FBV2dDLFVBQWYsRUFBMkI7QUFDekIsbUJBQUtoQyxLQUFMLENBQVdnQyxVQUFYO0FBQ0Q7QUFDRjtBQUNGLE9BVEQsRUFTRyxFQVRIO0FBVUQ7Ozt3Q0FFbUI7QUFDbEIsV0FBS0csUUFBTCxDQUFjLEVBQUU5QixRQUFRLEtBQVYsRUFBZDtBQUNBLFVBQU1nQixVQUFVLG1CQUFTQyxXQUFULENBQXFCLEtBQUtDLEtBQTFCLENBQWhCO0FBQ0EsVUFBSUYsT0FBSixFQUFhO0FBQ1hBLGdCQUFRRyxLQUFSO0FBQ0FILGdCQUFRbUIsTUFBUjtBQUNEO0FBQ0Y7OztzQ0FFaUJOLFUsRUFBWTtBQUM1QixVQUFJaEIsUUFBUSxLQUFLZixLQUFMLENBQVdlLEtBQXZCO0FBQ0EsVUFBSSxDQUFDZ0IsVUFBTCxFQUFpQjtBQUNmaEIsZ0JBQVEsRUFBUjtBQUNELE9BRkQsTUFFTztBQUNMQSxnQkFBUSxzQkFBT2dCLFVBQVAsRUFBbUIsS0FBS2xDLEtBQUwsQ0FBV3lDLFVBQTlCLENBQVI7QUFDQSxZQUFJdkIsTUFBTXdCLE9BQU4sRUFBSixFQUFxQjtBQUNuQnhCLGtCQUFRQSxNQUFNeUIsTUFBTixDQUFhLFlBQWIsQ0FBUjtBQUNELFNBRkQsTUFFTztBQUNMekIsa0JBQVFnQixVQUFSO0FBQ0Q7QUFDRjtBQUNELFdBQUtDLFFBQUwsQ0FBYyxFQUFFakIsWUFBRixFQUFTZ0IsWUFBWUssU0FBckIsRUFBZDtBQUNEOzs7NkJBRVFLLEcsRUFBSztBQUNaLFdBQUtyQixLQUFMLEdBQWFxQixHQUFiO0FBQ0Q7O0FBRUQ7Ozs7eUNBQ3FCO0FBQ25CLFVBQUksQ0FBQyxLQUFLekMsS0FBTCxDQUFXRSxNQUFoQixFQUF3QjtBQUN0QjtBQUNEO0FBQ0QsV0FBS1EsaUJBQUw7QUFDRDs7OzJDQUVzQjtBQUNyQixVQUFNZ0MsU0FBUyxtQkFBU3ZCLFdBQVQsQ0FBcUIsSUFBckIsQ0FBZjtBQUNBLFVBQUl3QixXQUFXQyxTQUFTQyxhQUF4QjtBQUNBLGFBQU9GLFlBQVlBLGFBQWFELE1BQWhDLEVBQXdDO0FBQ3RDQyxtQkFBV0EsU0FBU0csVUFBcEI7QUFDRDtBQUNELGFBQU8sQ0FBQyxDQUFDSCxRQUFUO0FBQ0Q7OztxQ0FFZ0I7QUFDZixVQUFJNUIsUUFBUSxLQUFLZixLQUFMLENBQVdlLEtBQXZCO0FBQ0EsVUFBSSxPQUFPLEtBQUtmLEtBQUwsQ0FBVytCLFVBQWxCLEtBQWlDLFdBQXJDLEVBQWtEO0FBQ2hEaEIsZ0JBQVEsc0JBQU8sS0FBS2YsS0FBTCxDQUFXK0IsVUFBbEIsRUFBOEIsS0FBS2xDLEtBQUwsQ0FBV3lDLFVBQXpDLENBQVI7QUFDQSxZQUFJdkIsTUFBTXdCLE9BQU4sRUFBSixFQUFxQjtBQUNuQnhCLGtCQUFRQSxNQUFNeUIsTUFBTixDQUFhLFlBQWIsQ0FBUjtBQUNELFNBRkQsTUFFTztBQUNMekIsa0JBQVEsS0FBS2YsS0FBTCxDQUFXZSxLQUFuQjtBQUNEO0FBQ0Y7QUFDRCxXQUFLaUIsUUFBTCxDQUFjLEVBQUU5QixRQUFRLENBQUMsS0FBS0YsS0FBTCxDQUFXRSxNQUF0QixFQUE4QmEsWUFBOUIsRUFBZDtBQUNEOzs7c0NBRXFDO0FBQUEsVUFBeEJnQixVQUF3QixRQUF4QkEsVUFBd0I7QUFBQSxVQUFUbEMsS0FBUzs7QUFDcEMsVUFBTWtELHNCQUFzQiwwQkFDMUIscUJBRDBCLEVBRTFCLDRCQUYwQixFQUcxQmxELE1BQU1tRCxTQUhvQixDQUE1QjtBQUtBLFVBQU1DLFNBQVNwRCxLQUFmO0FBQ0EsYUFBT29ELE9BQU9uQyxhQUFkO0FBQ0EsYUFBT21DLE9BQU85QyxhQUFkO0FBQ0EsYUFBTzhDLE9BQU9oQyxZQUFkO0FBQ0EsYUFBT2dDLE9BQU9DLHFCQUFkO0FBQ0EsYUFBT0QsT0FBT0Usb0JBQWQ7QUFDQSxhQUFPRixPQUFPRyx1QkFBZDtBQUNBLGFBQU9ILE9BQU94QixjQUFkO0FBQ0EsYUFBT3dCLE9BQU9JLFVBQWQ7QUFDQSxhQUFPSixPQUFPdkIsZUFBZDs7QUFFQSxhQUNFO0FBQUE7QUFBQSxVQUFLLFdBQVdxQixtQkFBaEI7QUFDRTtBQUNFLGVBQUssS0FBS3BDLFFBRFo7QUFFRSxpQkFBUW9CO0FBRlYsV0FHT2xDLEtBSFA7QUFJRSxxQkFBWSxLQUFLUSxjQUpuQjtBQUtFLG9CQUFXLEtBQUtDLGFBTGxCO0FBTUUsa0JBQVMsS0FBS0MsV0FOaEI7QUFPRSxtQkFBVSxLQUFLSDtBQVBqQixXQURGO0FBVUU7QUFDRSxnQkFBSyxPQURQO0FBRUUscUJBQVUsa0JBRlo7QUFHRSxpQkFBUSxFQUFFa0QsUUFBUSxTQUFWLEVBSFY7QUFJRSxtQkFBVSxLQUFLbEQ7QUFKakI7QUFWRixPQURGO0FBbUJEOzs7bUNBRWNtRCxTLEVBQVc7QUFDeEIsVUFBTUMsdUJBQXVCLDBCQUMzQixlQUQyQixFQUUzQixxQkFGMkIsQ0FBN0I7QUFJQSxhQUNFLEtBQUt4RCxLQUFMLENBQVdFLE1BQVgsR0FDRTtBQUNFLG1CQUFZc0Qsb0JBRGQ7QUFFRSxzQkFBZUQsU0FGakI7QUFHRSxtQkFBVyxDQUFDLEtBQUsxRCxLQUFMLENBQVdvQixZQUh6QjtBQUlFLGtCQUFXLEtBQUtULGtCQUpsQjtBQUtFLGdCQUFTLEtBQUtDLGdCQUxoQjtBQU1FLGlCQUFVLEtBQUtDLGlCQU5qQjtBQU9FLGtDQUEwQixLQUFLYixLQUFMLENBQVc0RDtBQVB2QyxRQURGLEdBVUUsMENBWEo7QUFhRDs7OzZCQUVRO0FBQ1AsVUFBTXhELEtBQUssS0FBS0osS0FBTCxDQUFXSSxFQUFYLElBQWlCLEtBQUtELEtBQUwsQ0FBV0MsRUFBdkM7QUFETyxtQkFNSCxLQUFLSixLQU5GO0FBQUEsVUFHTDZELFNBSEssVUFHTEEsU0FISztBQUFBLFVBR01DLElBSE4sVUFHTUEsSUFITjtBQUFBLFVBR1lDLEtBSFosVUFHWUEsS0FIWjtBQUFBLFVBR21CQyxRQUhuQixVQUdtQkEsUUFIbkI7QUFBQSxVQUc2QkMsS0FIN0IsVUFHNkJBLEtBSDdCO0FBQUEsVUFJTEMsWUFKSyxVQUlMQSxZQUpLO0FBQUEsVUFJU2hELEtBSlQsVUFJU0EsS0FKVDtBQUFBLFVBSWdCdUIsVUFKaEIsVUFJZ0JBLFVBSmhCO0FBQUEsVUFJNEIwQixPQUo1QixVQUk0QkEsT0FKNUI7QUFBQSxVQUtGbkUsS0FMRTs7QUFPUCxVQUFNMEQsWUFDSixPQUFPeEMsS0FBUCxLQUFpQixXQUFqQixHQUErQkEsS0FBL0IsR0FDQSxPQUFPLEtBQUtmLEtBQUwsQ0FBV2UsS0FBbEIsS0FBNEIsV0FBNUIsR0FBMEMsS0FBS2YsS0FBTCxDQUFXZSxLQUFyRCxHQUNBZ0QsWUFIRjtBQUlBLFVBQU1FLFNBQVMsc0JBQU9WLFNBQVAsRUFBa0IsWUFBbEIsQ0FBZjtBQUNBLFVBQU14QixhQUNKLE9BQU8sS0FBSy9CLEtBQUwsQ0FBVytCLFVBQWxCLEtBQWlDLFdBQWpDLEdBQStDLEtBQUsvQixLQUFMLENBQVcrQixVQUExRCxHQUNBLE9BQU93QixTQUFQLEtBQXFCLFdBQXJCLEdBQ0dVLE9BQU8xQixPQUFQLEtBQW1CMEIsT0FBT3pCLE1BQVAsQ0FBY0YsVUFBZCxDQUFuQixHQUErQ2lCLFNBRGxELEdBQytEbkIsU0FIakU7QUFJQSxVQUFNOEIsV0FBVyxLQUFLQyxjQUFMLENBQW9CWixTQUFwQixDQUFqQjtBQUNBLFVBQU1hLGdCQUFnQixFQUFFbkUsTUFBRixFQUFNeUQsb0JBQU4sRUFBaUJDLFVBQWpCLEVBQXVCQyxZQUF2QixFQUE4QkMsa0JBQTlCLEVBQXdDQyxZQUF4QyxFQUErQ0ksa0JBQS9DLEVBQXlERixnQkFBekQsRUFBdEI7QUFDQSxhQUNFO0FBQUE7QUFBa0JJLHFCQUFsQjtBQUNJLGFBQUtDLFdBQUwsMEJBQW1CcEUsTUFBbkIsRUFBdUI4QixzQkFBdkIsSUFBc0NsQyxLQUF0QztBQURKLE9BREY7QUFLRDs7Ozs7QUFHSEQsVUFBVTBFLFNBQVYsR0FBc0I7QUFDcEJyRSxNQUFJLG9CQUFVc0UsTUFETTtBQUVwQnZCLGFBQVcsb0JBQVV1QixNQUZEO0FBR3BCWCxTQUFPLG9CQUFVVyxNQUhHO0FBSXBCVixZQUFVLG9CQUFVVyxJQUpBO0FBS3BCVixTQUFPLG9CQUFVVyxTQUFWLENBQW9CLENBQ3pCLG9CQUFVRCxJQURlLEVBRXpCLG9CQUFVRCxNQUZlLEVBR3pCLG9CQUFVRyxLQUFWLENBQWdCO0FBQ2RDLGFBQVMsb0JBQVVKO0FBREwsR0FBaEIsQ0FIeUIsQ0FBcEIsQ0FMYTtBQVlwQmIsYUFBVyxvQkFBVWtCLE1BWkQ7QUFhcEJqQixRQUFNLG9CQUFVaUIsTUFiSTtBQWNwQjdELFNBQU8sb0JBQVV3RCxNQWRHO0FBZXBCekMsYUFBVyxvQkFBVStDLElBZkQ7QUFnQnBCMUMsVUFBUSxvQkFBVTBDLElBaEJFO0FBaUJwQmQsZ0JBQWMsb0JBQVVRLE1BakJKO0FBa0JwQnBFLGlCQUFlLG9CQUFVcUUsSUFsQkw7QUFtQnBCbEMsY0FBWSxvQkFBVWlDLE1BbkJGO0FBb0JwQnRDLFlBQVUsb0JBQVU0QyxJQXBCQTtBQXFCcEIvRCxpQkFBZSxvQkFBVStELElBckJMO0FBc0JwQmhELGNBQVksb0JBQVVnRCxJQXRCRjtBQXVCcEJwQiw0QkFBMEIsb0JBQVVlLElBdkJoQjtBQXdCcEJ2RCxnQkFBYyxvQkFBVXVELElBeEJKO0FBeUJwQlIsV0FBUyxvQkFBVWM7QUF6QkMsQ0FBdEI7O0FBNEJBbEYsVUFBVW1GLFlBQVYsR0FBeUI7QUFDdkJ6QyxjQUFZLEdBRFc7QUFFdkJyQixnQkFBYztBQUZTLENBQXpCOztBQUtBckIsVUFBVW9GLGFBQVYsR0FBMEIsSUFBMUI7O2tCQUVlLG1DQUFlcEYsU0FBZixDIiwiZmlsZSI6IkRhdGVJbnB1dC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IEZvcm1FbGVtZW50IGZyb20gJy4vRm9ybUVsZW1lbnQnO1xuaW1wb3J0IElucHV0IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uJztcbmltcG9ydCBEYXRlcGlja2VyIGZyb20gJy4vRGF0ZXBpY2tlcic7XG5pbXBvcnQgb25DbGlja091dHNpZGUgZnJvbSAncmVhY3Qtb25jbGlja291dHNpZGUnO1xuXG5jbGFzcyBEYXRlSW5wdXQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSA9IHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlkOiBgZm9ybS1lbGVtZW50LSR7dXVpZCgpfWAsXG4gICAgICBvcGVuZWQ6IChwcm9wcy5kZWZhdWx0T3BlbmVkIHx8IGZhbHNlKSxcbiAgICB9O1xuXG4gICAgdGhpcy5vbkRhdGVJY29uQ2xpY2sgPSB0aGlzLm9uRGF0ZUljb25DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25JbnB1dEtleURvd24gPSB0aGlzLm9uSW5wdXRLZXlEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlID0gdGhpcy5vbklucHV0Q2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbklucHV0Qmx1ciA9IHRoaXMub25JbnB1dEJsdXIuYmluZCh0aGlzKTtcblxuICAgIHRoaXMub25EYXRlcGlja2VyU2VsZWN0ID0gdGhpcy5vbkRhdGVwaWNrZXJTZWxlY3QuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRGF0ZXBpY2tlckJsdXIgPSB0aGlzLm9uRGF0ZXBpY2tlckJsdXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRGF0ZXBpY2tlckNsb3NlID0gdGhpcy5vbkRhdGVwaWNrZXJDbG9zZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pbnB1dFJlZiA9IHRoaXMuaW5wdXRSZWYuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uVmFsdWVDaGFuZ2UgJiYgcHJldlN0YXRlLnZhbHVlICE9PSB0aGlzLnN0YXRlLnZhbHVlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uVmFsdWVDaGFuZ2UodGhpcy5zdGF0ZS52YWx1ZSwgcHJldlN0YXRlLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVJY29uQ2xpY2soKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5pbnB1dEZvY3VzZWQpIHtcbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMuaW5wdXQpO1xuICAgICAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlcigpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG9uSW5wdXRLZXlEb3duKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykgeyAvLyByZXR1cm4ga2V5XG4gICAgICB0aGlzLm9uRGF0ZXBpY2tlckNsb3NlKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5zZXRWYWx1ZUZyb21JbnB1dChlLnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vbkNvbXBsZXRlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9LCAxMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDQwKSB7IC8vIGRvd24ga2V5XG4gICAgICB0aGlzLnNob3dEYXRlcGlja2VyKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykgeyAvLyBFU0NcbiAgICAgIHRoaXMub25EYXRlcGlja2VyQ2xvc2UoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLm9uS2V5RG93bikge1xuICAgICAgdGhpcy5wcm9wcy5vbktleURvd24oZSk7XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dENoYW5nZShlKSB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBpbnB1dFZhbHVlIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGUsIGlucHV0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRCbHVyKGUpIHtcbiAgICB0aGlzLnNldFZhbHVlRnJvbUlucHV0KGUudGFyZ2V0LnZhbHVlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0ZvY3VzZWRJbkNvbXBvbmVudCgpKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQmx1cikge1xuICAgICAgICAgIHRoaXMucHJvcHMub25CbHVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25Db21wbGV0ZSkge1xuICAgICAgICAgIHRoaXMucHJvcHMub25Db21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgb25EYXRlcGlja2VyU2VsZWN0KHZhbHVlKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlLCBpbnB1dFZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiBmYWxzZSB9KTtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLmlucHV0KTtcbiAgICAgIGlmIChpbnB1dEVsKSB7XG4gICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgICAgaW5wdXRFbC5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckJsdXIoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogZmFsc2UgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNGb2N1c2VkSW5Db21wb25lbnQoKSkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkJsdXIpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ29tcGxldGUpIHtcbiAgICAgICAgICB0aGlzLnByb3BzLm9uQ29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckNsb3NlKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGZhbHNlIH0pO1xuICAgIGNvbnN0IGlucHV0RWwgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzLmlucHV0KTtcbiAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgaW5wdXRFbC5mb2N1cygpO1xuICAgICAgaW5wdXRFbC5zZWxlY3QoKTtcbiAgICB9XG4gIH1cblxuICBzZXRWYWx1ZUZyb21JbnB1dChpbnB1dFZhbHVlKSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gbW9tZW50KGlucHV0VmFsdWUsIHRoaXMucHJvcHMuZGF0ZUZvcm1hdCk7XG4gICAgICBpZiAodmFsdWUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZSwgaW5wdXRWYWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9XG5cbiAgaW5wdXRSZWYocmVmKSB7XG4gICAgdGhpcy5pbnB1dCA9IHJlZjtcbiAgfVxuXG4gIC8vIHByb3ZpZGVkIGJ5ICdyZWFjdC1vbmNsaWNrb3V0c2lkZScgSE9DXG4gIGhhbmRsZUNsaWNrT3V0c2lkZSgpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUub3BlbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25EYXRlcGlja2VyQ2xvc2UoKTtcbiAgfVxuXG4gIGlzRm9jdXNlZEluQ29tcG9uZW50KCkge1xuICAgIGNvbnN0IHJvb3RFbCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuICAgIGxldCB0YXJnZXRFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKHRhcmdldEVsICYmIHRhcmdldEVsICE9PSByb290RWwpIHtcbiAgICAgIHRhcmdldEVsID0gdGFyZ2V0RWwucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGFyZ2V0RWw7XG4gIH1cblxuICBzaG93RGF0ZXBpY2tlcigpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgIGlmICh0eXBlb2YgdGhpcy5zdGF0ZS5pbnB1dFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWUgPSBtb21lbnQodGhpcy5zdGF0ZS5pbnB1dFZhbHVlLCB0aGlzLnByb3BzLmRhdGVGb3JtYXQpO1xuICAgICAgaWYgKHZhbHVlLmlzVmFsaWQoKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiAhdGhpcy5zdGF0ZS5vcGVuZWQsIHZhbHVlIH0pO1xuICB9XG5cbiAgcmVuZGVySW5wdXQoeyBpbnB1dFZhbHVlLCAuLi5wcm9wcyB9KSB7XG4gICAgY29uc3QgaW5wdXREYXRlQ2xhc3NOYW1lcyA9IGNsYXNzbmFtZXMoXG4gICAgICAnc2xkcy1pbnB1dC1oYXMtaWNvbicsXG4gICAgICAnc2xkcy1pbnB1dC1oYXMtaWNvbi0tcmlnaHQnLFxuICAgICAgcHJvcHMuY2xhc3NOYW1lXG4gICAgKTtcbiAgICBjb25zdCBwcHJvcHMgPSBwcm9wcztcbiAgICBkZWxldGUgcHByb3BzLm9uVmFsdWVDaGFuZ2U7XG4gICAgZGVsZXRlIHBwcm9wcy5kZWZhdWx0T3BlbmVkO1xuICAgIGRlbGV0ZSBwcHJvcHMuaW5wdXRGb2N1c2VkO1xuICAgIGRlbGV0ZSBwcHJvcHMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlO1xuICAgIGRlbGV0ZSBwcHJvcHMuZW5hYmxlT25DbGlja091dHNpZGU7XG4gICAgZGVsZXRlIHBwcm9wcy5vdXRzaWRlQ2xpY2tJZ25vcmVDbGFzcztcbiAgICBkZWxldGUgcHByb3BzLnByZXZlbnREZWZhdWx0O1xuICAgIGRlbGV0ZSBwcHJvcHMuZXZlbnRUeXBlcztcbiAgICBkZWxldGUgcHByb3BzLnN0b3BQcm9wYWdhdGlvbjtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17aW5wdXREYXRlQ2xhc3NOYW1lc30+XG4gICAgICAgIDxJbnB1dFxuICAgICAgICAgIHJlZj17dGhpcy5pbnB1dFJlZn1cbiAgICAgICAgICB2YWx1ZT17IGlucHV0VmFsdWUgfVxuICAgICAgICAgIHsgLi4ucHJvcHMgfVxuICAgICAgICAgIG9uS2V5RG93bj17IHRoaXMub25JbnB1dEtleURvd24gfVxuICAgICAgICAgIG9uQ2hhbmdlPXsgdGhpcy5vbklucHV0Q2hhbmdlIH1cbiAgICAgICAgICBvbkJsdXI9eyB0aGlzLm9uSW5wdXRCbHVyIH1cbiAgICAgICAgICBvbkNsaWNrPXsgdGhpcy5vbkRhdGVJY29uQ2xpY2sgfVxuICAgICAgICAvPlxuICAgICAgICA8SWNvblxuICAgICAgICAgIGljb249J2V2ZW50J1xuICAgICAgICAgIGNsYXNzTmFtZT0nc2xkcy1pbnB1dF9faWNvbidcbiAgICAgICAgICBzdHlsZT17IHsgY3Vyc29yOiAncG9pbnRlcicgfSB9XG4gICAgICAgICAgb25DbGljaz17IHRoaXMub25EYXRlSWNvbkNsaWNrIH1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJEcm9wZG93bihkYXRlVmFsdWUpIHtcbiAgICBjb25zdCBkYXRlcGlja2VyQ2xhc3NOYW1lcyA9IGNsYXNzbmFtZXMoXG4gICAgICAnc2xkcy1kcm9wZG93bicsXG4gICAgICAnc2xkcy1kcm9wZG93bi0tbGVmdCdcbiAgICApO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0YXRlLm9wZW5lZCA/XG4gICAgICAgIDxEYXRlcGlja2VyXG4gICAgICAgICAgY2xhc3NOYW1lPXsgZGF0ZXBpY2tlckNsYXNzTmFtZXMgfVxuICAgICAgICAgIHNlbGVjdGVkRGF0ZT17IGRhdGVWYWx1ZSB9XG4gICAgICAgICAgYXV0b0ZvY3VzPXshdGhpcy5wcm9wcy5pbnB1dEZvY3VzZWR9XG4gICAgICAgICAgb25TZWxlY3Q9eyB0aGlzLm9uRGF0ZXBpY2tlclNlbGVjdCB9XG4gICAgICAgICAgb25CbHVyPXsgdGhpcy5vbkRhdGVwaWNrZXJCbHVyIH1cbiAgICAgICAgICBvbkNsb3NlPXsgdGhpcy5vbkRhdGVwaWNrZXJDbG9zZSB9XG4gICAgICAgICAgZGlzYWJsZVBhc3REYXRlU2VsZWN0aW9uPXt0aGlzLnByb3BzLmRpc2FibGVQYXN0RGF0ZVNlbGVjdGlvbn1cbiAgICAgICAgLz4gOlxuICAgICAgICA8ZGl2IC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucHJvcHMuaWQgfHwgdGhpcy5zdGF0ZS5pZDtcbiAgICBjb25zdCB7XG4gICAgICB0b3RhbENvbHMsIGNvbHMsIGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsXG4gICAgICBkZWZhdWx0VmFsdWUsIHZhbHVlLCBkYXRlRm9ybWF0LCB0b29sdGlwLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZGF0ZVZhbHVlID1cbiAgICAgIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6XG4gICAgICB0eXBlb2YgdGhpcy5zdGF0ZS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLnN0YXRlLnZhbHVlIDpcbiAgICAgIGRlZmF1bHRWYWx1ZTtcbiAgICBjb25zdCBtdmFsdWUgPSBtb21lbnQoZGF0ZVZhbHVlLCAnWVlZWS1NTS1ERCcpO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPVxuICAgICAgdHlwZW9mIHRoaXMuc3RhdGUuaW5wdXRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLnN0YXRlLmlucHV0VmFsdWUgOlxuICAgICAgdHlwZW9mIGRhdGVWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAobXZhbHVlLmlzVmFsaWQoKSA/IG12YWx1ZS5mb3JtYXQoZGF0ZUZvcm1hdCkgOiBkYXRlVmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5yZW5kZXJEcm9wZG93bihkYXRlVmFsdWUpO1xuICAgIGNvbnN0IGZvcm1FbGVtUHJvcHMgPSB7IGlkLCB0b3RhbENvbHMsIGNvbHMsIGxhYmVsLCByZXF1aXJlZCwgZXJyb3IsIGRyb3Bkb3duLCB0b29sdGlwIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxGb3JtRWxlbWVudCB7IC4uLmZvcm1FbGVtUHJvcHMgfT5cbiAgICAgICAgeyB0aGlzLnJlbmRlcklucHV0KHsgaWQsIGlucHV0VmFsdWUsIC4uLnByb3BzIH0pIH1cbiAgICAgIDwvRm9ybUVsZW1lbnQ+XG4gICAgKTtcbiAgfVxufVxuXG5EYXRlSW5wdXQucHJvcFR5cGVzID0ge1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgcmVxdWlyZWQ6IFByb3BUeXBlcy5ib29sLFxuICBlcnJvcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbWVzc2FnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KSxcbiAgXSksXG4gIHRvdGFsQ29sczogUHJvcFR5cGVzLm51bWJlcixcbiAgY29sczogUHJvcFR5cGVzLm51bWJlcixcbiAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgZGVmYXVsdE9wZW5lZDogUHJvcFR5cGVzLmJvb2wsXG4gIGRhdGVGb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25WYWx1ZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ29tcGxldGU6IFByb3BUeXBlcy5mdW5jLFxuICBkaXNhYmxlUGFzdERhdGVTZWxlY3Rpb246IFByb3BUeXBlcy5ib29sLFxuICBpbnB1dEZvY3VzZWQ6IFByb3BUeXBlcy5ib29sLFxuICB0b29sdGlwOiBQcm9wVHlwZXMuZWxlbWVudCxcbn07XG5cbkRhdGVJbnB1dC5kZWZhdWx0UHJvcHMgPSB7XG4gIGRhdGVGb3JtYXQ6ICdMJyxcbiAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbn07XG5cbkRhdGVJbnB1dC5pc0Zvcm1FbGVtZW50ID0gdHJ1ZTtcblxuZXhwb3J0IGRlZmF1bHQgb25DbGlja091dHNpZGUoRGF0ZUlucHV0KTtcbiJdfQ==