tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
300 lines (261 loc) • 29.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _Edit = _interopRequireDefault(require("@material-ui/icons/Edit"));
var _reactBootstrap = require("react-bootstrap");
var _utils = require("../ScripturePane/helpers/utils");
var _fontUtils = require("../common/fontUtils");
var _EditScreen = _interopRequireDefault(require("./EditScreen"));
var _ReasonScreen = _interopRequireDefault(require("./ReasonScreen"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
require("./VerseEditor.styles.css");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
var styles = {
screen: {
display: 'flex',
flexDirection: 'row',
padding: '12px 12px 0 12px'
},
editor: {
width: '320px',
padding: '6px'
},
editHeading: {
paddingLeft: '6px',
fontWeight: 'bold',
fontSize: '16px'
},
reasonHeading: {
margin: '0 0 0 10px',
fontWeight: 'bold',
fontSize: '16px',
width: '240px'
}
};
/**
* Renders a form for editing a single verse
* @property {string} verseText - the verse text to edit
* @property {function} translate - the locale function
* @property {function} onSubmit - callback when the edit is submitted
* @property {function} onCancel - callback when the edit is canceled
*/
var VerseEditor = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(VerseEditor, _React$Component);
var _super = _createSuper(VerseEditor);
function VerseEditor(props) {
var _this;
(0, _classCallCheck2["default"])(this, VerseEditor);
_this = _super.call(this, props);
_this._handleCancel = _this._handleCancel.bind((0, _assertThisInitialized2["default"])(_this));
_this._handleSubmit = _this._handleSubmit.bind((0, _assertThisInitialized2["default"])(_this));
_this._handleVerseChange = _this._handleVerseChange.bind((0, _assertThisInitialized2["default"])(_this));
_this._handleReasonChange = _this._handleReasonChange.bind((0, _assertThisInitialized2["default"])(_this));
_this._handleReset = _this._handleReset.bind((0, _assertThisInitialized2["default"])(_this));
_this._resetState = _this._resetState.bind((0, _assertThisInitialized2["default"])(_this));
_this.state = {
newVerse: '',
verseChanged: false,
reasons: [],
isOptionDialogOpen: false
};
return _this;
}
(0, _createClass2["default"])(VerseEditor, [{
key: "_resetState",
value: function _resetState() {
this.setState({
newVerse: '',
verseChanged: false,
reasons: [],
isOptionDialogOpen: false
});
}
}, {
key: "isVerseChangedAndHaveReasons",
value: function isVerseChangedAndHaveReasons() {
var _this$state = this.state,
reasons = _this$state.reasons,
verseChanged = _this$state.verseChanged;
return verseChanged && reasons && reasons.length;
}
}, {
key: "isVerseChanged",
value: function isVerseChanged() {
var verseChanged = this.state.verseChanged;
return verseChanged;
}
}, {
key: "_handleCancel",
value: function _handleCancel() {
var onCancel = this.props.onCancel;
onCancel();
this._resetState();
}
}, {
key: "_handleReset",
value: function _handleReset() {
var verseText = this.props.verseText;
this.setState({
newVerse: verseText,
verseChanged: false
});
}
}, {
key: "_handleSubmit",
value: function _handleSubmit() {
var _this$props = this.props,
verseText = _this$props.verseText,
onSubmit = _this$props.onSubmit;
if (this.isVerseChangedAndHaveReasons() && onSubmit) {
var _this$state2 = this.state,
newVerse = _this$state2.newVerse,
reasons = _this$state2.reasons;
onSubmit(verseText, newVerse, reasons);
this._resetState();
this._handleCancel();
}
}
}, {
key: "_handleVerseChange",
value: function _handleVerseChange(newVerse) {
var verseText = this.props.verseText;
this.setState({
newVerse: newVerse,
verseChanged: newVerse !== verseText
});
}
}, {
key: "_handleReasonChange",
value: function _handleReasonChange(newReasons) {
this.setState({
reasons: newReasons
});
}
}, {
key: "render",
value: function render() {
var _this$props2 = this.props,
open = _this$props2.open,
verseText = _this$props2.verseText,
translate = _this$props2.translate,
verseTitle = _this$props2.verseTitle,
targetLanguage = _this$props2.targetLanguage,
targetLanguageFont = _this$props2.targetLanguageFont,
targetLanguageFontSize = _this$props2.targetLanguageFontSize,
direction = _this$props2.direction;
var _this$state3 = this.state,
newVerse = _this$state3.newVerse,
reasons = _this$state3.reasons,
verseChanged = _this$state3.verseChanged;
var text = !verseChanged ? verseText : newVerse;
var isVerseChangedAndHaveReason = this.isVerseChangedAndHaveReasons();
var isVerseChanged = this.isVerseChanged();
var targetLanguageFontClassName = (0, _fontUtils.getFontClassName)(targetLanguageFont);
var title = /*#__PURE__*/_react["default"].createElement("span", {
className: targetLanguageFontClassName
}, /*#__PURE__*/_react["default"].createElement(_Edit["default"], {
className: "edit-icon",
style: {
fontSize: '24px'
}
}), translate('edit_verse_title', {
passage: verseTitle
}));
var rows = 9 + (!targetLanguage ? 1 : 0); // make taller if no language label
var headingStyle = _objectSpread({}, styles.editHeading);
if (!(0, _utils.isLTR)(direction)) {
// if rtl, right justify
headingStyle.textAlign = 'right';
headingStyle.paddingRight = '6px';
}
return /*#__PURE__*/_react["default"].createElement(_BaseDialog["default"], {
key: "VerseEditor-".concat(verseTitle),
modal: true,
open: open,
title: title,
onClose: this._handleCancel,
actionsEnabled: false
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "screen",
style: styles.screen
}, /*#__PURE__*/_react["default"].createElement("div", null, targetLanguage ? /*#__PURE__*/_react["default"].createElement("div", {
style: headingStyle
}, targetLanguage) : '', /*#__PURE__*/_react["default"].createElement(_EditScreen["default"], {
rows: rows,
verseText: text,
style: styles.editor,
onChange: this._handleVerseChange,
targetLanguageFontClassName: targetLanguageFontClassName,
targetLanguageFontSize: targetLanguageFontSize,
direction: direction
})), /*#__PURE__*/_react["default"].createElement("div", {
style: styles.reasonHeading
}, /*#__PURE__*/_react["default"].createElement("div", null, translate('select_reasons')), /*#__PURE__*/_react["default"].createElement(_ReasonScreen["default"], {
translate: translate,
selectedReasons: reasons,
columns: 1,
onChange: this._handleReasonChange
}))), /*#__PURE__*/_react["default"].createElement("div", {
className: "actions"
}, /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-second",
onClick: this._handleCancel
}, translate('buttons.cancel_button')), /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-second",
disabled: !isVerseChanged,
onClick: this._handleReset
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "repeat",
style: {
marginRight: '10px',
transform: 'scaleX(-1)'
}
}), translate('buttons.reset_button')), /*#__PURE__*/_react["default"].createElement("button", {
className: "btn-prime",
disabled: !isVerseChangedAndHaveReason,
onClick: this._handleSubmit
}, /*#__PURE__*/_react["default"].createElement(_reactBootstrap.Glyphicon, {
glyph: "ok",
style: {
marginRight: '10px'
}
}), translate('buttons.save_button'))));
}
}]);
return VerseEditor;
}(_react["default"].Component);
VerseEditor.propTypes = {
open: _propTypes["default"].bool.isRequired,
verseTitle: _propTypes["default"].string.isRequired,
verseText: _propTypes["default"].string.isRequired,
translate: _propTypes["default"].func.isRequired,
onCancel: _propTypes["default"].func.isRequired,
onSubmit: _propTypes["default"].func.isRequired,
targetLanguage: _propTypes["default"].string.isRequired,
targetLanguageFont: _propTypes["default"].string,
targetLanguageFontSize: _propTypes["default"].string,
direction: _propTypes["default"].string.isRequired
};
VerseEditor.defaultProps = {
targetLanguage: '',
direction: 'ltr',
targetLanguageFontSize: '100%'
};
var _default = VerseEditor;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9WZXJzZUVkaXRvci9WZXJzZUVkaXRvci5qcyJdLCJuYW1lcyI6WyJzdHlsZXMiLCJzY3JlZW4iLCJkaXNwbGF5IiwiZmxleERpcmVjdGlvbiIsInBhZGRpbmciLCJlZGl0b3IiLCJ3aWR0aCIsImVkaXRIZWFkaW5nIiwicGFkZGluZ0xlZnQiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJyZWFzb25IZWFkaW5nIiwibWFyZ2luIiwiVmVyc2VFZGl0b3IiLCJwcm9wcyIsIl9oYW5kbGVDYW5jZWwiLCJiaW5kIiwiX2hhbmRsZVN1Ym1pdCIsIl9oYW5kbGVWZXJzZUNoYW5nZSIsIl9oYW5kbGVSZWFzb25DaGFuZ2UiLCJfaGFuZGxlUmVzZXQiLCJfcmVzZXRTdGF0ZSIsInN0YXRlIiwibmV3VmVyc2UiLCJ2ZXJzZUNoYW5nZWQiLCJyZWFzb25zIiwiaXNPcHRpb25EaWFsb2dPcGVuIiwic2V0U3RhdGUiLCJsZW5ndGgiLCJvbkNhbmNlbCIsInZlcnNlVGV4dCIsIm9uU3VibWl0IiwiaXNWZXJzZUNoYW5nZWRBbmRIYXZlUmVhc29ucyIsIm5ld1JlYXNvbnMiLCJvcGVuIiwidHJhbnNsYXRlIiwidmVyc2VUaXRsZSIsInRhcmdldExhbmd1YWdlIiwidGFyZ2V0TGFuZ3VhZ2VGb250IiwidGFyZ2V0TGFuZ3VhZ2VGb250U2l6ZSIsImRpcmVjdGlvbiIsInRleHQiLCJpc1ZlcnNlQ2hhbmdlZEFuZEhhdmVSZWFzb24iLCJpc1ZlcnNlQ2hhbmdlZCIsInRhcmdldExhbmd1YWdlRm9udENsYXNzTmFtZSIsInRpdGxlIiwicGFzc2FnZSIsInJvd3MiLCJoZWFkaW5nU3R5bGUiLCJ0ZXh0QWxpZ24iLCJwYWRkaW5nUmlnaHQiLCJtYXJnaW5SaWdodCIsInRyYW5zZm9ybSIsIlJlYWN0IiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYm9vbCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJmdW5jIiwiZGVmYXVsdFByb3BzIl0sIm1h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QUU7QUFIQyxDQUEzQjtlQU1lMUIsVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEVkaXRJY29uIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9FZGl0JztcbmltcG9ydCB7IEdseXBoaWNvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBpc0xUUiB9IGZyb20gJy4uL1NjcmlwdHVyZVBhbmUvaGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBnZXRGb250Q2xhc3NOYW1lIH0gZnJvbSAnLi4vY29tbW9uL2ZvbnRVdGlscyc7XG4vLyBjb21wb25lbnRzXG5pbXBvcnQgRWRpdFNjcmVlbiBmcm9tICcuL0VkaXRTY3JlZW4nO1xuaW1wb3J0IFJlYXNvblNjcmVlbiBmcm9tICcuL1JlYXNvblNjcmVlbic7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tICcuL0Jhc2VEaWFsb2cnO1xuXG5pbXBvcnQgJy4vVmVyc2VFZGl0b3Iuc3R5bGVzLmNzcyc7XG5cbmNvbnN0IHN0eWxlcyA9IHtcbiAgc2NyZWVuOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAncm93JywgcGFkZGluZzogJzEycHggMTJweCAwIDEycHgnLFxuICB9LFxuICBlZGl0b3I6IHsgd2lkdGg6ICczMjBweCcsIHBhZGRpbmc6ICc2cHgnIH0sXG4gIGVkaXRIZWFkaW5nOiB7XG4gICAgcGFkZGluZ0xlZnQ6ICc2cHgnLCBmb250V2VpZ2h0OiAnYm9sZCcsIGZvbnRTaXplOiAnMTZweCcsXG4gIH0sXG4gIHJlYXNvbkhlYWRpbmc6IHtcbiAgICBtYXJnaW46ICcwIDAgMCAxMHB4JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgZm9udFNpemU6ICcxNnB4JyxcbiAgICB3aWR0aDogJzI0MHB4JyxcbiAgfSxcblxufTtcblxuLyoqXG4gKiBSZW5kZXJzIGEgZm9ybSBmb3IgZWRpdGluZyBhIHNpbmdsZSB2ZXJzZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNlVGV4dCAtIHRoZSB2ZXJzZSB0ZXh0IHRvIGVkaXRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHRyYW5zbGF0ZSAtIHRoZSBsb2NhbGUgZnVuY3Rpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uU3VibWl0IC0gY2FsbGJhY2sgd2hlbiB0aGUgZWRpdCBpcyBzdWJtaXR0ZWRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9uQ2FuY2VsIC0gY2FsbGJhY2sgd2hlbiB0aGUgZWRpdCBpcyBjYW5jZWxlZFxuICovXG5jbGFzcyBWZXJzZUVkaXRvciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuX2hhbmRsZUNhbmNlbCA9IHRoaXMuX2hhbmRsZUNhbmNlbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2hhbmRsZVN1Ym1pdCA9IHRoaXMuX2hhbmRsZVN1Ym1pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2hhbmRsZVZlcnNlQ2hhbmdlID0gdGhpcy5faGFuZGxlVmVyc2VDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9oYW5kbGVSZWFzb25DaGFuZ2UgPSB0aGlzLl9oYW5kbGVSZWFzb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9oYW5kbGVSZXNldCA9IHRoaXMuX2hhbmRsZVJlc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcmVzZXRTdGF0ZSA9IHRoaXMuX3Jlc2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbmV3VmVyc2U6ICcnLFxuICAgICAgdmVyc2VDaGFuZ2VkOiBmYWxzZSxcbiAgICAgIHJlYXNvbnM6IFtdLFxuICAgICAgaXNPcHRpb25EaWFsb2dPcGVuOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgX3Jlc2V0U3RhdGUoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBuZXdWZXJzZTogJycsXG4gICAgICB2ZXJzZUNoYW5nZWQ6IGZhbHNlLFxuICAgICAgcmVhc29uczogW10sXG4gICAgICBpc09wdGlvbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgaXNWZXJzZUNoYW5nZWRBbmRIYXZlUmVhc29ucygpIHtcbiAgICBjb25zdCB7IHJlYXNvbnMsIHZlcnNlQ2hhbmdlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gdmVyc2VDaGFuZ2VkICYmIHJlYXNvbnMgJiYgcmVhc29ucy5sZW5ndGg7XG4gIH1cblxuICBpc1ZlcnNlQ2hhbmdlZCgpIHtcbiAgICBjb25zdCB7IHZlcnNlQ2hhbmdlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gdmVyc2VDaGFuZ2VkO1xuICB9XG5cbiAgX2hhbmRsZUNhbmNlbCgpIHtcbiAgICBjb25zdCB7IG9uQ2FuY2VsIH0gPSB0aGlzLnByb3BzO1xuICAgIG9uQ2FuY2VsKCk7XG4gICAgdGhpcy5fcmVzZXRTdGF0ZSgpO1xuICB9XG5cbiAgX2hhbmRsZVJlc2V0KCkge1xuICAgIGNvbnN0IHsgdmVyc2VUZXh0IH0gPSB0aGlzLnByb3BzO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBuZXdWZXJzZTogdmVyc2VUZXh0LFxuICAgICAgdmVyc2VDaGFuZ2VkOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIF9oYW5kbGVTdWJtaXQoKSB7XG4gICAgY29uc3QgeyB2ZXJzZVRleHQsIG9uU3VibWl0IH0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHRoaXMuaXNWZXJzZUNoYW5nZWRBbmRIYXZlUmVhc29ucygpICYmIG9uU3VibWl0KSB7XG4gICAgICBjb25zdCB7IG5ld1ZlcnNlLCByZWFzb25zIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgb25TdWJtaXQodmVyc2VUZXh0LCBuZXdWZXJzZSwgcmVhc29ucyk7XG4gICAgICB0aGlzLl9yZXNldFN0YXRlKCk7XG4gICAgICB0aGlzLl9oYW5kbGVDYW5jZWwoKTtcbiAgICB9XG4gIH1cblxuICBfaGFuZGxlVmVyc2VDaGFuZ2UobmV3VmVyc2UpIHtcbiAgICBjb25zdCB7IHZlcnNlVGV4dCB9ID0gdGhpcy5wcm9wcztcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbmV3VmVyc2UsXG4gICAgICB2ZXJzZUNoYW5nZWQ6IG5ld1ZlcnNlICE9PSB2ZXJzZVRleHQsXG4gICAgfSk7XG4gIH1cblxuICBfaGFuZGxlUmVhc29uQ2hhbmdlKG5ld1JlYXNvbnMpIHtcbiAgICB0aGlzLnNldFN0YXRlKHsgcmVhc29uczogbmV3UmVhc29ucyB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBvcGVuLFxuICAgICAgdmVyc2VUZXh0LFxuICAgICAgdHJhbnNsYXRlLFxuICAgICAgdmVyc2VUaXRsZSxcbiAgICAgIHRhcmdldExhbmd1YWdlLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250LFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250U2l6ZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICBuZXdWZXJzZSwgcmVhc29ucywgdmVyc2VDaGFuZ2VkLFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGxldCB0ZXh0ID0gIXZlcnNlQ2hhbmdlZCA/IHZlcnNlVGV4dCA6IG5ld1ZlcnNlO1xuICAgIGNvbnN0IGlzVmVyc2VDaGFuZ2VkQW5kSGF2ZVJlYXNvbiA9IHRoaXMuaXNWZXJzZUNoYW5nZWRBbmRIYXZlUmVhc29ucygpO1xuICAgIGNvbnN0IGlzVmVyc2VDaGFuZ2VkID0gdGhpcy5pc1ZlcnNlQ2hhbmdlZCgpO1xuICAgIGNvbnN0IHRhcmdldExhbmd1YWdlRm9udENsYXNzTmFtZSA9IGdldEZvbnRDbGFzc05hbWUodGFyZ2V0TGFuZ3VhZ2VGb250KTtcbiAgICBjb25zdCB0aXRsZSA9IChcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGFyZ2V0TGFuZ3VhZ2VGb250Q2xhc3NOYW1lfT5cbiAgICAgICAgPEVkaXRJY29uIGNsYXNzTmFtZT0nZWRpdC1pY29uJyBzdHlsZT17eyBmb250U2l6ZTogJzI0cHgnIH19Lz5cbiAgICAgICAge3RyYW5zbGF0ZSgnZWRpdF92ZXJzZV90aXRsZScsIHsgcGFzc2FnZTogdmVyc2VUaXRsZSB9KX1cbiAgICAgIDwvc3Bhbj5cbiAgICApO1xuICAgIGNvbnN0IHJvd3MgPSA5ICsgKCF0YXJnZXRMYW5ndWFnZSA/IDEgOiAwKTsgLy8gbWFrZSB0YWxsZXIgaWYgbm8gbGFuZ3VhZ2UgbGFiZWxcbiAgICBjb25zdCBoZWFkaW5nU3R5bGUgPSB7IC4uLnN0eWxlcy5lZGl0SGVhZGluZyB9O1xuXG4gICAgaWYgKCFpc0xUUihkaXJlY3Rpb24pKSB7IC8vIGlmIHJ0bCwgcmlnaHQganVzdGlmeVxuICAgICAgaGVhZGluZ1N0eWxlLnRleHRBbGlnbiA9ICdyaWdodCc7XG4gICAgICBoZWFkaW5nU3R5bGUucGFkZGluZ1JpZ2h0ID0gJzZweCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxCYXNlRGlhbG9nXG4gICAgICAgIGtleT17YFZlcnNlRWRpdG9yLSR7dmVyc2VUaXRsZX1gfVxuICAgICAgICBtb2RhbD17dHJ1ZX1cbiAgICAgICAgb3Blbj17b3Blbn1cbiAgICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgICBvbkNsb3NlPXt0aGlzLl9oYW5kbGVDYW5jZWx9XG4gICAgICAgIGFjdGlvbnNFbmFibGVkPXtmYWxzZX1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3NjcmVlbicgc3R5bGU9e3N0eWxlcy5zY3JlZW59PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7IHRhcmdldExhbmd1YWdlID8gKFxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtoZWFkaW5nU3R5bGV9PlxuICAgICAgICAgICAgICAgIHt0YXJnZXRMYW5ndWFnZX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogJyd9XG4gICAgICAgICAgICA8RWRpdFNjcmVlblxuICAgICAgICAgICAgICByb3dzPXtyb3dzfVxuICAgICAgICAgICAgICB2ZXJzZVRleHQ9e3RleHR9XG4gICAgICAgICAgICAgIHN0eWxlPXtzdHlsZXMuZWRpdG9yfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5faGFuZGxlVmVyc2VDaGFuZ2V9XG4gICAgICAgICAgICAgIHRhcmdldExhbmd1YWdlRm9udENsYXNzTmFtZT17dGFyZ2V0TGFuZ3VhZ2VGb250Q2xhc3NOYW1lfVxuICAgICAgICAgICAgICB0YXJnZXRMYW5ndWFnZUZvbnRTaXplPXt0YXJnZXRMYW5ndWFnZUZvbnRTaXplfVxuICAgICAgICAgICAgICBkaXJlY3Rpb249e2RpcmVjdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT17c3R5bGVzLnJlYXNvbkhlYWRpbmd9PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3RyYW5zbGF0ZSgnc2VsZWN0X3JlYXNvbnMnKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPFJlYXNvblNjcmVlblxuICAgICAgICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgICAgICAgICAgc2VsZWN0ZWRSZWFzb25zPXtyZWFzb25zfVxuICAgICAgICAgICAgICBjb2x1bW5zPXsxfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5faGFuZGxlUmVhc29uQ2hhbmdlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhY3Rpb25zJz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0bi1zZWNvbmRcIlxuICAgICAgICAgICAgb25DbGljaz17dGhpcy5faGFuZGxlQ2FuY2VsfT5cbiAgICAgICAgICAgIHt0cmFuc2xhdGUoJ2J1dHRvbnMuY2FuY2VsX2J1dHRvbicpfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuLXNlY29uZFwiXG4gICAgICAgICAgICBkaXNhYmxlZD17IWlzVmVyc2VDaGFuZ2VkfVxuICAgICAgICAgICAgb25DbGljaz17dGhpcy5faGFuZGxlUmVzZXR9PlxuICAgICAgICAgICAgeyAvKiBUUklDS1kgLSBkbyBtaXJyb3IgaW1hZ2Ugb2YgcmVwZWF0IHRvIG1ha2UgcmVzZXQgaWNvbiAqLyB9XG4gICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdyZXBlYXQnIHN0eWxlPXt7IG1hcmdpblJpZ2h0OiAnMTBweCcsIHRyYW5zZm9ybTogJ3NjYWxlWCgtMSknIH19IC8+XG4gICAgICAgICAgICB7dHJhbnNsYXRlKCdidXR0b25zLnJlc2V0X2J1dHRvbicpfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuLXByaW1lXCJcbiAgICAgICAgICAgIGRpc2FibGVkPXshaXNWZXJzZUNoYW5nZWRBbmRIYXZlUmVhc29ufVxuICAgICAgICAgICAgb25DbGljaz17dGhpcy5faGFuZGxlU3VibWl0fT5cbiAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J29rJyBzdHlsZT17eyBtYXJnaW5SaWdodDogJzEwcHgnIH19IC8+XG4gICAgICAgICAgICB7dHJhbnNsYXRlKCdidXR0b25zLnNhdmVfYnV0dG9uJyl9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICk7XG4gIH1cbn1cblxuVmVyc2VFZGl0b3IucHJvcFR5cGVzID0ge1xuICBvcGVuOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICB2ZXJzZVRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHZlcnNlVGV4dDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICB0cmFuc2xhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvblN1Ym1pdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0TGFuZ3VhZ2U6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0TGFuZ3VhZ2VGb250OiBQcm9wVHlwZXMuc3RyaW5nLFxuICB0YXJnZXRMYW5ndWFnZUZvbnRTaXplOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBkaXJlY3Rpb246IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbn07XG5cblZlcnNlRWRpdG9yLmRlZmF1bHRQcm9wcyA9IHtcbiAgdGFyZ2V0TGFuZ3VhZ2U6ICcnLFxuICBkaXJlY3Rpb246ICdsdHInLFxuICB0YXJnZXRMYW5ndWFnZUZvbnRTaXplOiAnMTAwJScsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBWZXJzZUVkaXRvcjtcbiJdfQ==