tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
446 lines (388 loc) • 46.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styles = require("@material-ui/core/styles");
var _List = _interopRequireDefault(require("@material-ui/core/List"));
var _RootRef = _interopRequireDefault(require("@material-ui/core/RootRef"));
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
var _MenuItem = _interopRequireDefault(require("./MenuItem"));
var _MenuGroup = _interopRequireDefault(require("./MenuGroup"));
var _EmptyItem = _interopRequireDefault(require("./EmptyItem"));
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 theme = (0, _styles.createMuiTheme)({
typography: {
fontFamily: ['"Noto Sans"', 'Roboto', 'Arial'].join(','),
fontSize: 12
},
props: {
MuiButtonBase: {
disableRipple: true
}
},
overrides: {
MuiListItem: {
root: {
paddingTop: 6,
paddingBottom: 6,
minHeight: 40
},
gutters: {
paddingLeft: 10,
paddingRight: 5
}
},
MuiSvgIcon: {
root: {
fontSize: 22
}
},
MuiListItemText: {
root: {
paddingLeft: 5
},
inset: {
paddingLeft: '32px!important'
}
},
MuiListItemIcon: {
root: {
marginRight: 5
}
},
MuiChip: {
root: {
margin: 2,
height: 26
},
label: {
paddingLeft: 8,
paddingRight: 8
},
deleteIcon: {
marginRight: 2
}
},
MuiListSubheader: {
root: {
lineHeight: 'inherit'
}
}
}
});
var styles = function styles() {
return {
root: {
overflowY: 'scroll',
color: '#FFFFFF',
backgroundColor: '#333333'
},
header: {
borderBottom: 'solid #ffffff4d 1px'
},
text: {
color: '#FFFFFF',
fontSize: 'inherit'
}
};
};
/**
* Displays a list of grouped menu items
* @param {[]} entries - an array of menu entries
* @param {object} [active=null] - the active menu item object
* @param {object[]} [statusIcons=[]] - an array of status configurations to control menu item icons
* @param {*} [header=null] - a component to display as the menu header
* @param {*} [height="auto"] - the height of the menu
* @param {*} [width=250] - the width of the menu
* @param {boolean} [autoSelect=true] - controls whether or not opening a group will automatically select the first child
* @param {boolean} [autoScroll=true] - controls whether or not the menu will automatically scroll to the active item
* @param {string} [emptyNotice=""] - an optional message to display when the menu is empty
*/
var Menu = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(Menu, _React$Component);
var _super = _createSuper(Menu);
function Menu(props) {
var _this;
(0, _classCallCheck2["default"])(this, Menu);
_this = _super.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "menuRef", /*#__PURE__*/_react["default"].createRef());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedGroupRef", /*#__PURE__*/_react["default"].createRef());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "selectedItemRef", /*#__PURE__*/_react["default"].createRef());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scrollToSelectedGroup", function () {
var instant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
_this.scrollIntoView(_this.selectedGroupRef, instant);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scrollToSelectedItem", function () {
var instant = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
_this.scrollIntoView(_this.selectedItemRef, instant);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scrollIntoView", function (ref) {
var instant = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
if (ref && ref.scrollIntoView && !_this.isRefInView(ref)) {
ref.scrollIntoView({
block: 'center',
behavior: instant ? 'instant' : 'smooth'
});
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isRefInView", function (ref) {
if (ref && ref.getBoundingClientRect && _this.menuRef && _this.menuRef.current && _this.menuRef.current.getBoundingClientRect) {
var rect = ref.getBoundingClientRect();
var menuRect = _this.menuRef.current.getBoundingClientRect();
return rect.top >= menuRect.top && rect.bottom <= menuRect.bottom;
} else {
return false;
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "normalizeStatusIcons", (0, _memoizeOne["default"])(function (statusIcons) {
var normalized = [];
for (var i = 0, len = statusIcons.length; i < len; i++) {
var icon = Object.assign({}, {
value: true
}, statusIcons[i]);
normalized.push(icon);
}
return normalized;
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOpen", function (group) {
return function () {
var autoSelect = _this.props.autoSelect;
var groupId = _this.getGroupIdForGroup(group);
if (_this.state.opened === groupId) {
_this.setState({
opened: -1
});
} else {
_this.setState({
opened: groupId
}); // auto select newly opened groups if not controlled elsewhere
var firstChild = group.children[0];
if (autoSelect && firstChild && !_this.isGroupSelected(group)) {
_this.handleClick(firstChild)();
}
}
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleClick", function (item) {
return function () {
var _this$props = _this.props,
onItemClick = _this$props.onItemClick,
active = _this$props.active;
if (typeof onItemClick === 'function') {
onItemClick(item);
} // skip internal state if managed externally.
if (!active) {
_this.setState({
active: item
});
}
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isGroupOpen", function (group) {
return _this.state.opened === _this.getGroupIdForGroup(group);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isGroupSelected", function (group) {
var active = _this.getActive();
var selected = active && (group.organizeByRef && group.organizeByRef === active.organizeByRef || group.id === active.groupId);
return selected;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isItemSelected", function (item) {
var activeItem = _this.getActive();
var groupId = item.groupId,
itemId = item.itemId;
var selected = activeItem && activeItem.groupId === groupId && activeItem.itemId === itemId;
return selected;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getActive", function () {
return _this.props.active ? _this.props.active : _this.state.active;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleGroupRef", function (group) {
return function (ref) {
if (_this.isGroupSelected(group)) {
_this.selectedGroupRef = ref;
}
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleItemRef", function (item) {
return function (ref) {
if (_this.isItemSelected(item)) {
_this.selectedItemRef = ref;
}
};
});
var autoOpen = null; // TRICKY: start with the controlled group open
var _active = props.active,
_autoSelect = props.autoSelect;
if (_active && _autoSelect) {
autoOpen = _this.getGroupIdForItem(_active);
}
_this.state = {
opened: autoOpen,
active: null
};
return _this;
}
/**
* if organizeByRef is set, used it. Otherwise we use the groupId
* @param item
* @return {string|*}
*/
(0, _createClass2["default"])(Menu, [{
key: "getGroupIdForItem",
value: function getGroupIdForItem(item) {
return (item === null || item === void 0 ? void 0 : item.organizeByRef) || (item === null || item === void 0 ? void 0 : item.groupId);
}
/**
* if organizeByRef is set, used it. Otherwise we use the Id
* @param group
* @return {string|*}
*/
}, {
key: "getGroupIdForGroup",
value: function getGroupIdForGroup(group) {
return (group === null || group === void 0 ? void 0 : group.organizeByRef) || (group === null || group === void 0 ? void 0 : group.id);
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
var opened = this.state.opened;
var autoScroll = this.props.autoScroll; // scroll to the selection
if (autoScroll && opened) {
this.scrollToSelectedItem();
} else if (autoScroll) {
this.scrollToSelectedGroup();
}
}
/**
*
* @param prevProps
* @param prevState
* @param nextContent
*/
// eslint-disable-next-line no-unused-vars
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps, prevState, nextContent) {
var opened = this.state.opened;
var autoScroll = this.props.autoScroll;
var prevActive = prevProps.active ? prevProps.active : prevState.active;
var active = this.getActive();
var activeGroupId = this.getGroupIdForItem(active);
if (active && prevActive && this.getGroupIdForItem(prevActive) !== activeGroupId && activeGroupId !== opened) {
// open the active group if it was changed externally
this.setState({
opened: activeGroupId
});
} else if (autoScroll && this.state.opened) {
// scroll to the current selection
this.scrollToSelectedItem();
}
}
/**
* Scrolls the selected group into view
* @param {boolean} [instant=true] - makes the scroll execute instantly.
*/
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props2 = this.props,
classes = _this$props2.classes,
header = _this$props2.header,
height = _this$props2.height,
width = _this$props2.width,
entries = _this$props2.entries,
statusIcons = _this$props2.statusIcons,
emptyNotice = _this$props2.emptyNotice,
targetLanguageFont = _this$props2.targetLanguageFont;
var normalizedStatusIcons = this.normalizeStatusIcons(statusIcons);
return /*#__PURE__*/_react["default"].createElement(_styles.ThemeProvider, {
theme: theme
}, /*#__PURE__*/_react["default"].createElement(_RootRef["default"], {
rootRef: this.menuRef
}, /*#__PURE__*/_react["default"].createElement(_List["default"], {
component: "nav",
subheader: header,
className: classes.root,
style: {
height: height,
width: width,
minWidth: width
}
}, entries.map(function (group, index) {
return /*#__PURE__*/_react["default"].createElement(_RootRef["default"], {
key: index,
rootRef: _this2.handleGroupRef(group)
}, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_MenuGroup["default"], {
selected: _this2.isGroupSelected(group),
onClick: _this2.handleOpen(group),
progress: group.progress,
open: _this2.isGroupOpen(group),
label: group.title
}), _this2.isGroupOpen(group) ? /*#__PURE__*/_react["default"].createElement(_List["default"], {
component: "div",
disablePadding: true
}, group.children.map(function (item, index) {
return /*#__PURE__*/_react["default"].createElement(_RootRef["default"], {
key: index,
rootRef: _this2.handleItemRef(item)
}, /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], {
status: item,
selected: _this2.isItemSelected(item),
statusIcons: normalizedStatusIcons,
onClick: _this2.handleClick(item),
tooltip: item.tooltip ? item.tooltip : item.title,
title: item.title,
targetLanguageFont: targetLanguageFont,
direction: item.direction
}));
})) : null));
}), /*#__PURE__*/_react["default"].createElement(_EmptyItem["default"], {
key: "empty",
label: emptyNotice,
enabled: entries.length === 0
}))));
}
}]);
return Menu;
}(_react["default"].Component);
Menu.propTypes = {
classes: _propTypes["default"].object.isRequired,
entries: _propTypes["default"].array,
active: _propTypes["default"].object,
header: _propTypes["default"].element,
height: _propTypes["default"].any,
onItemClick: _propTypes["default"].func,
width: _propTypes["default"].number,
statusIcons: _propTypes["default"].array,
emptyNotice: _propTypes["default"].string,
autoSelect: _propTypes["default"].bool,
autoScroll: _propTypes["default"].bool,
targetLanguageFont: _propTypes["default"].string
};
Menu.defaultProps = {
active: null,
height: 'auto',
entries: [],
width: 250,
emptyNotice: '',
autoSelect: true,
autoScroll: true,
statusIcons: []
};
Menu.muiName = 'List';
var _default = (0, _styles.withStyles)(styles)(Menu);
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Hcm91cGVkTWVudS9NZW51L2luZGV4LmpzIl0sIm5hbWVzIjpbInRoZW1lIiwidHlwb2dyYXBoeSIsImZvbnRGYW1pbHkiLCJqb2luIiwiZm9udFNpemUiLCJwcm9wcyIsIk11aUJ1dHRvbkJhc2UiLCJkaXNhYmxlUmlwcGxlIiwib3ZlcnJpZGVzIiwiTXVpTGlzdEl0ZW0iLCJyb290IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJtaW5IZWlnaHQiLCJndXR0ZXJzIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJNdWlTdmdJY29uIiwiTXVpTGlzdEl0ZW1UZXh0IiwiaW5zZXQiLCJNdWlMaXN0SXRlbUljb24iLCJtYXJnaW5SaWdodCIsIk11aUNoaXAiLCJtYXJnaW4iLCJoZWlnaHQiLCJsYWJlbCIsImRlbGV0ZUljb24iLCJNdWlMaXN0U3ViaGVhZGVyIiwibGluZUhlaWdodCIsInN0eWxlcyIsIm92ZXJmbG93WSIsImNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiaGVhZGVyIiwiYm9yZGVyQm90dG9tIiwidGV4dCIsIk1lbnUiLCJSZWFjdCIsImNyZWF0ZVJlZiIsImluc3RhbnQiLCJzY3JvbGxJbnRvVmlldyIsInNlbGVjdGVkR3JvdXBSZWYiLCJzZWxlY3RlZEl0ZW1SZWYiLCJyZWYiLCJpc1JlZkluVmlldyIsImJsb2NrIiwiYmVoYXZpb3IiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJtZW51UmVmIiwiY3VycmVudCIsInJlY3QiLCJtZW51UmVjdCIsInRvcCIsImJvdHRvbSIsInN0YXR1c0ljb25zIiwibm9ybWFsaXplZCIsImkiLCJsZW4iLCJsZW5ndGgiLCJpY29uIiwiT2JqZWN0IiwiYXNzaWduIiwidmFsdWUiLCJwdXNoIiwiZ3JvdXAiLCJhdXRvU2VsZWN0IiwiZ3JvdXBJZCIsImdldEdyb3VwSWRGb3JHcm91cCIsInN0YXRlIiwib3BlbmVkIiwic2V0U3RhdGUiLCJmaXJzdENoaWxkIiwiY2hpbGRyZW4iLCJpc0dyb3VwU2VsZWN0ZWQiLCJoYW5kbGVDbGljayIsIml0ZW0iLCJvbkl0ZW1DbGljayIsImFjdGl2ZSIsImdldEFjdGl2ZSIsInNlbGVjdGVkIiwib3JnYW5pemVCeVJlZiIsImlkIiwiYWN0aXZlSXRlbSIsIml0ZW1JZCIsImlzSXRlbVNlbGVjdGVkIiwiYXV0b09wZW4iLCJnZXRHcm91cElkRm9ySXRlbSIsImF1dG9TY3JvbGwiLCJzY3JvbGxUb1NlbGVjdGVkSXRlbSIsInNjcm9sbFRvU2VsZWN0ZWRHcm91cCIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsIm5leHRDb250ZW50IiwicHJldkFjdGl2ZSIsImFjdGl2ZUdyb3VwSWQiLCJjbGFzc2VzIiwid2lkdGgiLCJlbnRyaWVzIiwiZW1wdHlOb3RpY2UiLCJ0YXJnZXRMYW5ndWFnZUZvbnQiLCJub3JtYWxpemVkU3RhdHVzSWNvbnMiLCJub3JtYWxpemVTdGF0dXNJY29ucyIsIm1pbldpZHRoIiwibWFwIiwiaW5kZXgiLCJoYW5kbGVHcm91cFJlZiIsImhhbmRsZU9wZW4iLCJwcm9ncmVzcyIsImlzR3JvdXBPcGVuIiwidGl0bGUiLCJoYW5kbGVJdGVtUmVmIiwidG9vbHRpcCIsImRpcmVjdGlvbiIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheSIsImVsZW1lbnQiLCJhbnkiLCJmdW5jIiwibnVtYmVyIiwic3RyaW5nIiwiYm9vbCIsImRlZmF1bHRQcm9wcyIsIm11aU5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLEtBQUssR0FBRyw0QkFBZTtBQUMzQkMsRUFBQUEsVUFBVSxFQUFFO0FBQ1ZDLElBQUFBLFVBQVUsRUFBRSxDQUNWLGFBRFUsRUFFVixRQUZVLEVBR1YsT0FIVSxFQUlWQyxJQUpVLENBSUwsR0FK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cm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge1xuICB3aXRoU3R5bGVzLFxuICBjcmVhdGVNdWlUaGVtZSxcbiAgVGhlbWVQcm92aWRlciBhcyBNdWlUaGVtZVByb3ZpZGVyLFxufSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuaW1wb3J0IExpc3QgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdCc7XG5pbXBvcnQgUm9vdFJlZiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9Sb290UmVmJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ21lbW9pemUtb25lJztcbmltcG9ydCBNZW51SXRlbSBmcm9tICcuL01lbnVJdGVtJztcbmltcG9ydCBNZW51R3JvdXAgZnJvbSAnLi9NZW51R3JvdXAnO1xuaW1wb3J0IEVtcHR5SXRlbSBmcm9tICcuL0VtcHR5SXRlbSc7XG5cbmNvbnN0IHRoZW1lID0gY3JlYXRlTXVpVGhlbWUoe1xuICB0eXBvZ3JhcGh5OiB7XG4gICAgZm9udEZhbWlseTogW1xuICAgICAgJ1wiTm90byBTYW5zXCInLFxuICAgICAgJ1JvYm90bycsXG4gICAgICAnQXJpYWwnLFxuICAgIF0uam9pbignLCcpLFxuICAgIGZvbnRTaXplOiAxMixcbiAgfSxcbiAgcHJvcHM6IHsgTXVpQnV0dG9uQmFzZTogeyBkaXNhYmxlUmlwcGxlOiB0cnVlIH0gfSxcbiAgb3ZlcnJpZGVzOiB7XG4gICAgTXVpTGlzdEl0ZW06IHtcbiAgICAgIHJvb3Q6IHtcbiAgICAgICAgcGFkZGluZ1RvcDogNixcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogNixcbiAgICAgICAgbWluSGVpZ2h0OiA0MCxcbiAgICAgIH0sXG4gICAgICBndXR0ZXJzOiB7XG4gICAgICAgIHBhZGRpbmdMZWZ0OiAxMCxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiA1LFxuICAgICAgfSxcbiAgICB9LFxuICAgIE11aVN2Z0ljb246IHsgcm9vdDogeyBmb250U2l6ZTogMjIgfSB9LFxuICAgIE11aUxpc3RJdGVtVGV4dDoge1xuICAgICAgcm9vdDogeyBwYWRkaW5nTGVmdDogNSB9LFxuICAgICAgaW5zZXQ6IHsgcGFkZGluZ0xlZnQ6ICczMnB4IWltcG9ydGFudCcgfSxcbiAgICB9LFxuICAgIE11aUxpc3RJdGVtSWNvbjogeyByb290OiB7IG1hcmdpblJpZ2h0OiA1IH0gfSxcbiAgICBNdWlDaGlwOiB7XG4gICAgICByb290OiB7XG4gICAgICAgIG1hcmdpbjogMixcbiAgICAgICAgaGVpZ2h0OiAyNixcbiAgICAgIH0sXG4gICAgICBsYWJlbDoge1xuICAgICAgICBwYWRkaW5nTGVmdDogOCxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiA4LFxuICAgICAgfSxcbiAgICAgIGRlbGV0ZUljb246IHsgbWFyZ2luUmlnaHQ6IDIgfSxcbiAgICB9LFxuICAgIE11aUxpc3RTdWJoZWFkZXI6IHsgcm9vdDogeyBsaW5lSGVpZ2h0OiAnaW5oZXJpdCcgfSB9LFxuICB9LFxufSk7XG5cbmNvbnN0IHN0eWxlcyA9ICgpID0+ICh7XG4gIHJvb3Q6IHtcbiAgICBvdmVyZmxvd1k6ICdzY3JvbGwnLFxuICAgIGNvbG9yOiAnI0ZGRkZGRicsXG4gICAgYmFja2dyb3VuZENvbG9yOiAnIzMzMzMzMycsXG4gIH0sXG4gIGhlYWRlcjogeyBib3JkZXJCb3R0b206ICdzb2xpZCAjZmZmZmZmNGQgMXB4JyB9LFxuICB0ZXh0OiB7XG4gICAgY29sb3I6ICcjRkZGRkZGJyxcbiAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICB9LFxufSk7XG5cbi8qKlxuICogRGlzcGxheXMgYSBsaXN0IG9mIGdyb3VwZWQgbWVudSBpdGVtc1xuICogQHBhcmFtIHtbXX0gZW50cmllcyAtIGFuIGFycmF5IG9mIG1lbnUgZW50cmllc1xuICogQHBhcmFtIHtvYmplY3R9IFthY3RpdmU9bnVsbF0gLSB0aGUgYWN0aXZlIG1lbnUgaXRlbSBvYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0W119IFtzdGF0dXNJY29ucz1bXV0gLSBhbiBhcnJheSBvZiBzdGF0dXMgY29uZmlndXJhdGlvbnMgdG8gY29udHJvbCBtZW51IGl0ZW0gaWNvbnNcbiAqIEBwYXJhbSB7Kn0gW2hlYWRlcj1udWxsXSAtIGEgY29tcG9uZW50IHRvIGRpc3BsYXkgYXMgdGhlIG1lbnUgaGVhZGVyXG4gKiBAcGFyYW0geyp9IFtoZWlnaHQ9XCJhdXRvXCJdIC0gdGhlIGhlaWdodCBvZiB0aGUgbWVudVxuICogQHBhcmFtIHsqfSBbd2lkdGg9MjUwXSAtIHRoZSB3aWR0aCBvZiB0aGUgbWVudVxuICogQHBhcmFtIHtib29sZWFufSBbYXV0b1NlbGVjdD10cnVlXSAtIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IG9wZW5pbmcgYSBncm91cCB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCBjaGlsZFxuICogQHBhcmFtIHtib29sZWFufSBbYXV0b1Njcm9sbD10cnVlXSAtIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtZW51IHdpbGwgYXV0b21hdGljYWxseSBzY3JvbGwgdG8gdGhlIGFjdGl2ZSBpdGVtXG4gKiBAcGFyYW0ge3N0cmluZ30gW2VtcHR5Tm90aWNlPVwiXCJdIC0gYW4gb3B0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdGhlIG1lbnUgaXMgZW1wdHlcbiAqL1xuY2xhc3MgTWVudSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIG1lbnVSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgc2VsZWN0ZWRHcm91cFJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICBzZWxlY3RlZEl0ZW1SZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBsZXQgYXV0b09wZW4gPSBudWxsO1xuXG4gICAgLy8gVFJJQ0tZOiBzdGFydCB3aXRoIHRoZSBjb250cm9sbGVkIGdyb3VwIG9wZW5cbiAgICBjb25zdCB7IGFjdGl2ZSwgYXV0b1NlbGVjdCB9ID0gcHJvcHM7XG5cbiAgICBpZiAoYWN0aXZlICYmIGF1dG9TZWxlY3QpIHtcbiAgICAgIGF1dG9PcGVuID0gdGhpcy5nZXRHcm91cElkRm9ySXRlbShhY3RpdmUpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBvcGVuZWQ6IGF1dG9PcGVuLFxuICAgICAgYWN0aXZlOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogaWYgb3JnYW5pemVCeVJlZiBpcyBzZXQsIHVzZWQgaXQuICBPdGhlcndpc2Ugd2UgdXNlIHRoZSBncm91cElkXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqIEByZXR1cm4ge3N0cmluZ3wqfVxuICAgKi9cbiAgZ2V0R3JvdXBJZEZvckl0ZW0oaXRlbSkge1xuICAgIHJldHVybiBpdGVtPy5vcmdhbml6ZUJ5UmVmIHx8IGl0ZW0/Lmdyb3VwSWQ7XG4gIH1cblxuICAvKipcbiAgICogaWYgb3JnYW5pemVCeVJlZiBpcyBzZXQsIHVzZWQgaXQuICBPdGhlcndpc2Ugd2UgdXNlIHRoZSBJZFxuICAgKiBAcGFyYW0gZ3JvdXBcbiAgICogQHJldHVybiB7c3RyaW5nfCp9XG4gICAqL1xuICBnZXRHcm91cElkRm9yR3JvdXAoZ3JvdXApIHtcbiAgICByZXR1cm4gZ3JvdXA/Lm9yZ2FuaXplQnlSZWYgfHwgZ3JvdXA/LmlkO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgeyBvcGVuZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBhdXRvU2Nyb2xsIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgLy8gc2Nyb2xsIHRvIHRoZSBzZWxlY3Rpb25cbiAgICBpZiAoYXV0b1Njcm9sbCAmJiBvcGVuZWQpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKTtcbiAgICB9IGVsc2UgaWYgKGF1dG9TY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEdyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwcmV2UHJvcHNcbiAgICogQHBhcmFtIHByZXZTdGF0ZVxuICAgKiBAcGFyYW0gbmV4dENvbnRlbnRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIG5leHRDb250ZW50KSB7XG4gICAgY29uc3QgeyBvcGVuZWQgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBhdXRvU2Nyb2xsIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHByZXZBY3RpdmUgPSBwcmV2UHJvcHMuYWN0aXZlID8gcHJldlByb3BzLmFjdGl2ZSA6IHByZXZTdGF0ZS5hY3RpdmU7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcbiAgICBjb25zdCBhY3RpdmVHcm91cElkID0gdGhpcy5nZXRHcm91cElkRm9ySXRlbShhY3RpdmUpO1xuXG4gICAgaWYgKFxuICAgICAgYWN0aXZlICYmXG4gICAgICBwcmV2QWN0aXZlICYmXG4gICAgICB0aGlzLmdldEdyb3VwSWRGb3JJdGVtKHByZXZBY3RpdmUpICE9PSBhY3RpdmVHcm91cElkICYmXG4gICAgICBhY3RpdmVHcm91cElkICE9PSBvcGVuZWRcbiAgICApIHtcbiAgICAgIC8vIG9wZW4gdGhlIGFjdGl2ZSBncm91cCBpZiBpdCB3YXMgY2hhbmdlZCBleHRlcm5hbGx5XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbmVkOiBhY3RpdmVHcm91cElkIH0pO1xuICAgIH0gZWxzZSBpZiAoYXV0b1Njcm9sbCAmJiB0aGlzLnN0YXRlLm9wZW5lZCkge1xuICAgICAgLy8gc2Nyb2xsIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkSXRlbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSBzZWxlY3RlZCBncm91cCBpbnRvIHZpZXdcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5zdGFudD10cnVlXSAtIG1ha2VzIHRoZSBzY3JvbGwgZXhlY3V0ZSBpbnN0YW50bHkuXG4gICAqL1xuICBzY3JvbGxUb1NlbGVjdGVkR3JvdXAgPSAoaW5zdGFudCA9IHRydWUpID0+IHtcbiAgICB0aGlzLnNjcm9sbEludG9WaWV3KHRoaXMuc2VsZWN0ZWRHcm91cFJlZiwgaW5zdGFudCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW50byB2aWV3XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luc3RhbnQ9dHJ1ZV0gLSBtYWtlcyB0aGUgc2Nyb2xsIGV4ZWN1dGUgaW5zdGFudGx5LlxuICAgKi9cbiAgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0gPSAoaW5zdGFudCA9IHRydWUpID0+IHtcbiAgICB0aGlzLnNjcm9sbEludG9WaWV3KHRoaXMuc2VsZWN0ZWRJdGVtUmVmLCBpbnN0YW50KTtcbiAgfTtcblxuICAvKipcbiAgICogU2Nyb2xscyBhIHJlZiBpbnRvIHZpZXdcbiAgICogQHBhcmFtIHJlZlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnN0YW50PXRydWVdIC0gbWFrZXMgdGhlIHNjcm9sbCBleGVjdXRlIGluc3RhbnRseVxuICAgKi9cbiAgc2Nyb2xsSW50b1ZpZXcgPSAocmVmLCBpbnN0YW50ID0gdHJ1ZSkgPT4ge1xuICAgIGlmIChcbiAgICAgIHJlZiAmJlxuICAgICAgcmVmLnNjcm9sbEludG9WaWV3ICYmXG4gICAgICAhdGhpcy5pc1JlZkluVmlldyhyZWYpXG4gICAgKSB7XG4gICAgICByZWYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICBibG9jazogJ2NlbnRlcicsXG4gICAgICAgIGJlaGF2aW9yOiBpbnN0YW50ID8gJ2luc3RhbnQnIDogJ3Ntb290aCcsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGRvbSByZWN0IGlzIHdpdGhpbiBhbm90aGVyXG4gICAqIEBwYXJhbSByZWYgLSBhIHJlYWN0IHJlZlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUmVmSW5WaWV3ID0gKHJlZikgPT4ge1xuICAgIGlmIChyZWYgJiYgcmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiB0aGlzLm1lbnVSZWYgJiZcbiAgICAgIHRoaXMubWVudVJlZi5jdXJyZW50ICYmIHRoaXMubWVudVJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgY29uc3QgcmVjdCA9IHJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG1lbnVSZWN0ID0gdGhpcy5tZW51UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gcmVjdC50b3AgPj0gbWVudVJlY3QudG9wICYmIHJlY3QuYm90dG9tIDw9IG1lbnVSZWN0LmJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQXBwbGllcyBkZWZhdWx0IGtleSB2YWx1ZXMgdG8gdGhlIHN0YXR1cyBpY29ucy5cbiAgICogVGhpcyBwcmVwYXJlcyBzdGF0dXMgaWNvbnMgZm9yIHVzZSBpbiB0aGUgbWVudS5cbiAgICogQHBhcmFtIHtvYmplY3RbXX0gc3RhdHVzSWNvbnMgLSBhbiBhcnJheSBvZiBzdGF0dXMgaWNvbiBvYmplY3RzXG4gICAqIEByZXR1cm5zIHtvYmplY3RbXX0gLSBhbiBhcnJheSBvZiBub3JtYWxpemVkIHN0YXR1cyBpY29uIG9iamVjdHMuXG4gICAqL1xuICBub3JtYWxpemVTdGF0dXNJY29ucyA9IG1lbW9pemUoc3RhdHVzSWNvbnMgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdGF0dXNJY29ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaWNvbiA9IE9iamVjdC5hc3NpZ24oe30sIHsgdmFsdWU6IHRydWUgfSwgc3RhdHVzSWNvbnNbaV0pO1xuICAgICAgbm9ybWFsaXplZC5wdXNoKGljb24pO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgb3BlbmluZyBhIGdyb3VwIHdpdGhpbiB0aGUgbWVudS5cbiAgICogSWYgYXV0byBzZWxlY3RlZCBpcyBlbmFibGVkIHRoaXMgd2lsbCBhbHNvIHNlbGVjdCB0aGUgZmlyc3QgY2hpbGRcbiAgICogQHBhcmFtIHtvYmplY3R9IGdyb3VwIC0gdGhlIGdyb3VwIGJlaW5nIG9wZW5lZFxuICAgKi9cbiAgaGFuZGxlT3BlbiA9IGdyb3VwID0+ICgpID0+IHtcbiAgICBjb25zdCB7IGF1dG9TZWxlY3QgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuZ2V0R3JvdXBJZEZvckdyb3VwKGdyb3VwKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLm9wZW5lZCA9PT0gZ3JvdXBJZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogLTEgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuZWQ6IGdyb3VwSWQgfSk7XG5cbiAgICAgIC8vIGF1dG8gc2VsZWN0IG5ld2x5IG9wZW5lZCBncm91cHMgaWYgbm90IGNvbnRyb2xsZWQgZWxzZXdoZXJlXG4gICAgICBjb25zdCBmaXJzdENoaWxkID0gZ3JvdXAuY2hpbGRyZW5bMF07XG5cbiAgICAgIGlmIChhdXRvU2VsZWN0ICYmIGZpcnN0Q2hpbGQgJiYgIXRoaXMuaXNHcm91cFNlbGVjdGVkKGdyb3VwKSkge1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrKGZpcnN0Q2hpbGQpKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG1lbnUgaXRlbSBjbGlja3MuXG4gICAqIElmIHRoZSBhY3RpdmUgbWVudSBpdGVtIGlzIGNvbnRyb2xsZWQgZXh0ZXJuYWxseSB0aGlzIHdpbGwgZGVmZXIgY29udHJvbCB0byB0aGUgcGFyZW50XG4gICAqIG90aGVyd2lzZSBtZW51IHNlbGVjdGlvbnMgd2lsbCBiZSBtYW5hZ2VkIGludGVybmFsbHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtIC0gdGhlIGNsaWNrZWQgbWVudSBpdGVtIG9iamVjdFxuICAgKi9cbiAgaGFuZGxlQ2xpY2sgPSBpdGVtID0+ICgpID0+IHtcbiAgICBjb25zdCB7IG9uSXRlbUNsaWNrLCBhY3RpdmUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAodHlwZW9mIG9uSXRlbUNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvbkl0ZW1DbGljayhpdGVtKTtcbiAgICB9XG5cbiAgICAvLyBza2lwIGludGVybmFsIHN0YXRlIGlmIG1hbmFnZWQgZXh0ZXJuYWxseS5cbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZTogaXRlbSB9KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGdyb3VwIGlzIG9wZW5lZFxuICAgKiBAcGFyYW0ge29iamVjdH0gZ3JvdXAgLSB0aGUgbWVudSBncm91cFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzR3JvdXBPcGVuID0gZ3JvdXAgPT4gdGhpcy5zdGF0ZS5vcGVuZWQgPT09IHRoaXMuZ2V0R3JvdXBJZEZvckdyb3VwKGdyb3VwKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZ3JvdXAgaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IGdyb3VwIC0gdGhlIG1lbnUgZ3JvdXBcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0dyb3VwU2VsZWN0ZWQgPSBncm91cCA9PiB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gYWN0aXZlICYmIChcbiAgICAgIChncm91cC5vcmdhbml6ZUJ5UmVmICYmIGdyb3VwLm9yZ2FuaXplQnlSZWYgPT09IGFjdGl2ZS5vcmdhbml6ZUJ5UmVmKVxuICAgICAgfHwgKGdyb3VwLmlkID09PSBhY3RpdmUuZ3JvdXBJZClcbiAgICApO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtIC0gdGhlIG1lbnUgaXRlbVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSXRlbVNlbGVjdGVkID0gaXRlbSA9PiB7XG4gICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMuZ2V0QWN0aXZlKCk7XG4gICAgY29uc3Qge1xuICAgICAgZ3JvdXBJZCxcbiAgICAgIGl0ZW1JZCxcbiAgICB9ID0gaXRlbTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGFjdGl2ZUl0ZW0gJiZcbiAgICAgIGFjdGl2ZUl0ZW0uZ3JvdXBJZCA9PT0gZ3JvdXBJZCAmJlxuICAgICAgYWN0aXZlSXRlbS5pdGVtSWQgPT09IGl0ZW1JZDtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgKiBJZiB0aGUgYWN0aXZlIGl0ZW0gaXMgY29udHJvbGxlZCBleHRlcm5hbGx5IGl0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9XG4gICAqL1xuICBnZXRBY3RpdmUgPSAoKSA9PiB0aGlzLnByb3BzLmFjdGl2ZSA/IHRoaXMucHJvcHMuYWN0aXZlIDogdGhpcy5zdGF0ZS5hY3RpdmU7XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSByZWFjdCByZWYgdG8gdGhlIGdyb3VwLlxuICAgKiBUaGlzIGRldGVybWluZXMgaWYgdGhlIGdyb3VwIGlzIHNlbGVjdGVkIGFuZCBzdG9yZXMgaXRzIHJlZlxuICAgKiBAcGFyYW0ge29iamVjdH0gZ3JvdXAgLSB0aGUgbWVudSBncm91cFxuICAgKi9cbiAgaGFuZGxlR3JvdXBSZWYgPSBncm91cCA9PiByZWYgPT4ge1xuICAgIGlmICh0aGlzLmlzR3JvdXBTZWxlY3RlZChncm91cCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cFJlZiA9IHJlZjtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSByZWFjdCByZWYgdG8gdGhlIGl0ZW0uXG4gICAqIFRoaXMgZGV0ZXJtaW5lcyBpZiB0aGUgbWVudSBpdGVtIGlzIHNlbGVjdGVkIGFuZCBzdG9yZXMgaXQncyByZWZcbiAgICogQHBhcmFtIHtvYmplY3R9IGl0ZW0gLSB0aGUgbWVudSBpdGVtXG4gICAqL1xuICBoYW5kbGVJdGVtUmVmID0gaXRlbSA9PiByZWYgPT4ge1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbVJlZiA9IHJlZjtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzZXMsXG4gICAgICBoZWFkZXIsXG4gICAgICBoZWlnaHQsXG4gICAgICB3aWR0aCxcbiAgICAgIGVudHJpZXMsXG4gICAgICBzdGF0dXNJY29ucyxcbiAgICAgIGVtcHR5Tm90aWNlLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2VGb250LFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGF0dXNJY29ucyA9IHRoaXMubm9ybWFsaXplU3RhdHVzSWNvbnMoc3RhdHVzSWNvbnMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxNdWlUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgIDxSb290UmVmIHJvb3RSZWY9e3RoaXMubWVudVJlZn0+XG4gICAgICAgICAgPExpc3RcbiAgICAgICAgICAgIGNvbXBvbmVudD1cIm5hdlwiXG4gICAgICAgICAgICBzdWJoZWFkZXI9e2hlYWRlcn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5yb290fVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgaGVpZ2h0LCB3aWR0aCwgbWluV2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZW50cmllcy5tYXAoKGdyb3VwLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8Um9vdFJlZiBrZXk9e2luZGV4fSByb290UmVmPXt0aGlzLmhhbmRsZUdyb3VwUmVmKGdyb3VwKX0+XG4gICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgPE1lbnVHcm91cFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5pc0dyb3VwU2VsZWN0ZWQoZ3JvdXApfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZU9wZW4oZ3JvdXApfVxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz17Z3JvdXAucHJvZ3Jlc3N9XG4gICAgICAgICAgICAgICAgICAgIG9wZW49e3RoaXMuaXNHcm91cE9wZW4oZ3JvdXApfVxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17Z3JvdXAudGl0bGV9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3RoaXMuaXNHcm91cE9wZW4oZ3JvdXApID8gKFxuICAgICAgICAgICAgICAgICAgICA8TGlzdCBjb21wb25lbnQ9XCJkaXZcIiBkaXNhYmxlUGFkZGluZz5cbiAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuY2hpbGRyZW4ubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFJvb3RSZWYga2V5PXtpbmRleH0gcm9vdFJlZj17dGhpcy5oYW5kbGVJdGVtUmVmKGl0ZW0pfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXtpdGVtfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXt0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0ljb25zPXtub3JtYWxpemVkU3RhdHVzSWNvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDbGljayhpdGVtKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPXtpdGVtLnRvb2x0aXAgPyBpdGVtLnRvb2x0aXAgOiBpdGVtLnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtpdGVtLnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldExhbmd1YWdlRm9udD17dGFyZ2V0TGFuZ3VhZ2VGb250fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbj17aXRlbS5kaXJlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1Jvb3RSZWY+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvTGlzdD5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgIDwvUm9vdFJlZj5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPEVtcHR5SXRlbSBrZXk9XCJlbXB0eVwiIGxhYmVsPXtlbXB0eU5vdGljZX1cbiAgICAgICAgICAgICAgZW5hYmxlZD17ZW50cmllcy5sZW5ndGggPT09IDB9Lz5cbiAgICAgICAgICA8L0xpc3Q+XG4gICAgICAgIDwvUm9vdFJlZj5cbiAgICAgIDwvTXVpVGhlbWVQcm92aWRlcj5cbiAgICApO1xuICB9XG59XG5cbk1lbnUucHJvcFR5cGVzID0ge1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGVudHJpZXM6IFByb3BUeXBlcy5hcnJheSxcbiAgYWN0aXZlOiBQcm9wVHlwZXMub2JqZWN0LFxuICBoZWFkZXI6IFByb3BUeXBlcy5lbGVtZW50LFxuICBoZWlnaHQ6IFByb3BUeXBlcy5hbnksXG4gIG9uSXRlbUNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcbiAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIHN0YXR1c0ljb25zOiBQcm9wVHlwZXMuYXJyYXksXG4gIGVtcHR5Tm90aWNlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBhdXRvU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgYXV0b1Njcm9sbDogUHJvcFR5cGVzLmJvb2wsXG4gIHRhcmdldExhbmd1YWdlRm9udDogUHJvcFR5cGVzLnN0cmluZyxcbn07XG5cbk1lbnUuZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IG51bGwsXG4gIGhlaWdodDogJ2F1dG8nLFxuICBlbnRyaWVzOiBbXSxcbiAgd2lkdGg6IDI1MCxcbiAgZW1wdHlOb3RpY2U6ICcnLFxuICBhdXRvU2VsZWN0OiB0cnVlLFxuICBhdXRvU2Nyb2xsOiB0cnVlLFxuICBzdGF0dXNJY29uczogW10sXG59O1xuXG5NZW51Lm11aU5hbWUgPSAnTGlzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzKShNZW51KTtcbiJdfQ==