matrix-react-sdk
Version:
SDK for matrix.org using React
215 lines (172 loc) • 24.4 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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _event = require("matrix-js-sdk/src/@types/event");
var _languageHandler = require("../../../languageHandler");
var _EventUtils = require("../../../utils/EventUtils");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _ContextMenuTooltipButton = require("../../../accessibility/context_menu/ContextMenuTooltipButton");
var _ContextMenu = require("../../structures/ContextMenu");
var _ReactionPicker = _interopRequireDefault(require("../emojipicker/ReactionPicker"));
var _ReactionsRowButton = _interopRequireDefault(require("./ReactionsRowButton"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _dec, _class, _class2, _temp;
// The maximum number of reactions to initially show on a message.
const MAX_ITEMS_WHEN_LIMITED = 8;
const ReactButton = ({
mxEvent,
reactions
}
/*: IProps*/
) => {
const [menuDisplayed, button, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)();
let contextMenu;
if (menuDisplayed) {
const buttonRect = button.current.getBoundingClientRect();
contextMenu = /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenu, (0, _extends2.default)({}, (0, _ContextMenu.aboveLeftOf)(buttonRect), {
onFinished: closeMenu,
managed: false
}), /*#__PURE__*/_react.default.createElement(_ReactionPicker.default, {
mxEvent: mxEvent,
reactions: reactions,
onFinished: closeMenu
}));
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenuTooltipButton.ContextMenuTooltipButton, {
className: (0, _classnames.default)("mx_ReactionsRow_addReactionButton", {
mx_ReactionsRow_addReactionButton_active: menuDisplayed
}),
title: (0, _languageHandler._t)("Add reaction"),
onClick: openMenu,
onContextMenu: e => {
e.preventDefault();
openMenu();
},
isExpanded: menuDisplayed,
inputRef: button
}), contextMenu);
};
let ReactionsRow = (_dec = (0, _replaceableComponent.replaceableComponent)("views.messages.ReactionsRow"), _dec(_class = (_temp = _class2 = class ReactionsRow extends _react.default.PureComponent
/*:: <IProps, IState>*/
{
constructor(props, context) {
super(props, context);
(0, _defineProperty2.default)(this, "onReactionsChange", () => {
// TODO: Call `onHeightChanged` as needed
this.setState({
myReactions: this.getMyReactions()
}); // Using `forceUpdate` for the moment, since we know the overall set of reactions
// has changed (this is triggered by events for that purpose only) and
// `PureComponent`s shallow state / props compare would otherwise filter this out.
this.forceUpdate();
});
(0, _defineProperty2.default)(this, "onShowAllClick", () => {
this.setState({
showAll: true
});
});
if (props.reactions) {
props.reactions.on("Relations.add", this.onReactionsChange);
props.reactions.on("Relations.remove", this.onReactionsChange);
props.reactions.on("Relations.redaction", this.onReactionsChange);
}
this.state = {
myReactions: this.getMyReactions(),
showAll: false
};
}
componentDidUpdate(prevProps) {
if (prevProps.reactions !== this.props.reactions) {
this.props.reactions.on("Relations.add", this.onReactionsChange);
this.props.reactions.on("Relations.remove", this.onReactionsChange);
this.props.reactions.on("Relations.redaction", this.onReactionsChange);
this.onReactionsChange();
}
}
componentWillUnmount() {
if (this.props.reactions) {
this.props.reactions.removeListener("Relations.add", this.onReactionsChange);
this.props.reactions.removeListener("Relations.remove", this.onReactionsChange);
this.props.reactions.removeListener("Relations.redaction", this.onReactionsChange);
}
}
getMyReactions() {
const reactions = this.props.reactions;
if (!reactions) {
return null;
}
const userId = this.context.getUserId();
const myReactions = reactions.getAnnotationsBySender()[userId];
if (!myReactions) {
return null;
}
return [...myReactions.values()];
}
render() {
const {
mxEvent,
reactions
} = this.props;
const {
myReactions,
showAll
} = this.state;
if (!reactions || !(0, _EventUtils.isContentActionable)(mxEvent)) {
return null;
}
let items = reactions.getSortedAnnotationsByKey().map(([content, events]) => {
const count = events.size;
if (!count) {
return null;
}
const myReactionEvent = myReactions && myReactions.find(mxEvent => {
if (mxEvent.isRedacted()) {
return false;
}
return mxEvent.getRelation().key === content;
});
return /*#__PURE__*/_react.default.createElement(_ReactionsRowButton.default, {
key: content,
content: content,
count: count,
mxEvent: mxEvent,
reactionEvents: events,
myReactionEvent: myReactionEvent
});
}).filter(item => !!item);
if (!items.length) return null; // Show the first MAX_ITEMS if there are MAX_ITEMS + 1 or more items.
// The "+ 1" ensure that the "show all" reveals something that takes up
// more space than the button itself.
let showAllButton;
if (items.length > MAX_ITEMS_WHEN_LIMITED + 1 && !showAll) {
items = items.slice(0, MAX_ITEMS_WHEN_LIMITED);
showAllButton = /*#__PURE__*/_react.default.createElement("a", {
className: "mx_ReactionsRow_showAll",
href: "#",
onClick: this.onShowAllClick
}, (0, _languageHandler._t)("Show all"));
}
const cli = this.context;
let addReactionButton;
if (cli.getRoom(mxEvent.getRoomId()).currentState.maySendEvent(_event.EventType.Reaction, cli.getUserId())) {
addReactionButton = /*#__PURE__*/_react.default.createElement(ReactButton, {
mxEvent: mxEvent,
reactions: reactions
});
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ReactionsRow",
role: "toolbar",
"aria-label": (0, _languageHandler._t)("Reactions")
}, items, showAllButton, addReactionButton);
}
}, (0, _defineProperty2.default)(_class2, "contextType", _MatrixClientContext.default), _temp)) || _class);
exports.default = ReactionsRow;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL21lc3NhZ2VzL1JlYWN0aW9uc1Jvdy50c3giXSwibmFtZXMiOlsiTUFYX0lURU1TX1dIRU5fTElNSVRFRCIsIlJlYWN0QnV0dG9uIiwibXhFdmVudCIsInJlYWN0aW9ucyIsIm1lbnVEaXNwbGF5ZWQiLCJidXR0b24iLCJvcGVuTWVudSIsImNsb3NlTWVudSIsImNvbnRleHRNZW51IiwiYnV0dG9uUmVjdCIsImN1cnJlbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJteF9SZWFjdGlvbnNSb3dfYWRkUmVhY3Rpb25CdXR0b25fYWN0aXZlIiwiZSIsInByZXZlbnREZWZhdWx0IiwiUmVhY3Rpb25zUm93IiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsImNvbnRleHQiLCJzZXRTdGF0ZSIsIm15UmVhY3Rpb25zIiwiZ2V0TXlSZWFjdGlvbnMiLCJmb3JjZVVwZGF0ZSIsInNob3dBbGwiLCJvbiIsIm9uUmVhY3Rpb25zQ2hhbmdlIiwic3RhdGUiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUxpc3RlbmVyIiwidXNlcklkIiwiZ2V0VXNlcklkIiwiZ2V0QW5ub3RhdGlvbnNCeVNlbmRlciIsInZhbHVlcyIsInJlbmRlciIsIml0ZW1zIiwiZ2V0U29ydGVkQW5ub3RhdGlvbnNCeUtleSIsIm1hcCIsImNvbnRlbnQiLCJldmVudHMiLCJjb3VudCIsInNpemUiLCJteVJlYWN0aW9uRXZlbnQiLCJmaW5kIiwiaXNSZWRhY3RlZCIsImdldFJlbGF0aW9uIiwia2V5IiwiZmlsdGVyIiwiaXRlbSIsImxlbmd0aCIsInNob3dBbGxCdXR0b24iLCJzbGljZSIsIm9uU2hvd0FsbENsaWNrIiwiY2xpIiwiYWRkUmVhY3Rpb25CdXR0b24iLCJnZXRSb29tIiwiZ2V0Um9vbUlkIiwiY3VycmVudFN0YXRlIiwi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bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgRXZlbnRUeXBlIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL0B0eXBlcy9ldmVudFwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL2V2ZW50XCI7XG5pbXBvcnQgeyBSZWxhdGlvbnMgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3JlbGF0aW9uc1wiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gJy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlcic7XG5pbXBvcnQgeyBpc0NvbnRlbnRBY3Rpb25hYmxlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvRXZlbnRVdGlscyc7XG5pbXBvcnQgeyByZXBsYWNlYWJsZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uIH0gZnJvbSBcIi4uLy4uLy4uL2FjY2Vzc2liaWxpdHkvY29udGV4dF9tZW51L0NvbnRleHRNZW51VG9vbHRpcEJ1dHRvblwiO1xuaW1wb3J0IHsgYWJvdmVMZWZ0T2YsIENvbnRleHRNZW51LCB1c2VDb250ZXh0TWVudSB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgUmVhY3Rpb25QaWNrZXIgZnJvbSBcIi4uL2Vtb2ppcGlja2VyL1JlYWN0aW9uUGlja2VyXCI7XG5pbXBvcnQgUmVhY3Rpb25zUm93QnV0dG9uIGZyb20gXCIuL1JlYWN0aW9uc1Jvd0J1dHRvblwiO1xuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcblxuLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlYWN0aW9ucyB0byBpbml0aWFsbHkgc2hvdyBvbiBhIG1lc3NhZ2UuXG5jb25zdCBNQVhfSVRFTVNfV0hFTl9MSU1JVEVEID0gODtcblxuY29uc3QgUmVhY3RCdXR0b24gPSAoeyBteEV2ZW50LCByZWFjdGlvbnMgfTogSVByb3BzKSA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGJ1dHRvbiwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudSgpO1xuXG4gICAgbGV0IGNvbnRleHRNZW51O1xuICAgIGlmIChtZW51RGlzcGxheWVkKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvblJlY3QgPSBidXR0b24uY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29udGV4dE1lbnUgPSA8Q29udGV4dE1lbnUgey4uLmFib3ZlTGVmdE9mKGJ1dHRvblJlY3QpfSBvbkZpbmlzaGVkPXtjbG9zZU1lbnV9IG1hbmFnZWQ9e2ZhbHNlfT5cbiAgICAgICAgICAgIDxSZWFjdGlvblBpY2tlciBteEV2ZW50PXtteEV2ZW50fSByZWFjdGlvbnM9e3JlYWN0aW9uc30gb25GaW5pc2hlZD17Y2xvc2VNZW51fSAvPlxuICAgICAgICA8L0NvbnRleHRNZW51PjtcbiAgICB9XG5cbiAgICByZXR1cm4gPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICA8Q29udGV4dE1lbnVUb29sdGlwQnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9SZWFjdGlvbnNSb3dfYWRkUmVhY3Rpb25CdXR0b25cIiwge1xuICAgICAgICAgICAgICAgIG14X1JlYWN0aW9uc1Jvd19hZGRSZWFjdGlvbkJ1dHRvbl9hY3RpdmU6IG1lbnVEaXNwbGF5ZWQsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIHRpdGxlPXtfdChcIkFkZCByZWFjdGlvblwiKX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e29wZW5NZW51fVxuICAgICAgICAgICAgb25Db250ZXh0TWVudT17ZSA9PiB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG9wZW5NZW51KCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgaXNFeHBhbmRlZD17bWVudURpc3BsYXllZH1cbiAgICAgICAgICAgIGlucHV0UmVmPXtidXR0b259XG4gICAgICAgIC8+XG5cbiAgICAgICAgeyBjb250ZXh0TWVudSB9XG4gICAgPC9SZWFjdC5GcmFnbWVudD47XG59O1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICAvLyBUaGUgZXZlbnQgd2UncmUgZGlzcGxheWluZyByZWFjdGlvbnMgZm9yXG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7XG4gICAgLy8gVGhlIFJlbGF0aW9ucyBtb2RlbCBmcm9tIHRoZSBKUyBTREsgZm9yIHJlYWN0aW9ucyB0byBgbXhFdmVudGBcbiAgICByZWFjdGlvbnM/OiBSZWxhdGlvbnM7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIG15UmVhY3Rpb25zOiBNYXRyaXhFdmVudFtdO1xuICAgIHNob3dBbGw6IGJvb2xlYW47XG59XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLm1lc3NhZ2VzLlJlYWN0aW9uc1Jvd1wiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhY3Rpb25zUm93IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHN0YXRpYyBjb250ZXh0VHlwZSA9IE1hdHJpeENsaWVudENvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCkge1xuICAgICAgICBzdXBlcihwcm9wcywgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHByb3BzLnJlYWN0aW9ucykge1xuICAgICAgICAgICAgcHJvcHMucmVhY3Rpb25zLm9uKFwiUmVsYXRpb25zLmFkZFwiLCB0aGlzLm9uUmVhY3Rpb25zQ2hhbmdlKTtcbiAgICAgICAgICAgIHByb3BzLnJlYWN0aW9ucy5vbihcIlJlbGF0aW9ucy5yZW1vdmVcIiwgdGhpcy5vblJlYWN0aW9uc0NoYW5nZSk7XG4gICAgICAgICAgICBwcm9wcy5yZWFjdGlvbnMub24oXCJSZWxhdGlvbnMucmVkYWN0aW9uXCIsIHRoaXMub25SZWFjdGlvbnNDaGFuZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIG15UmVhY3Rpb25zOiB0aGlzLmdldE15UmVhY3Rpb25zKCksXG4gICAgICAgICAgICBzaG93QWxsOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAgIGlmIChwcmV2UHJvcHMucmVhY3Rpb25zICE9PSB0aGlzLnByb3BzLnJlYWN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWFjdGlvbnMub24oXCJSZWxhdGlvbnMuYWRkXCIsIHRoaXMub25SZWFjdGlvbnNDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWFjdGlvbnMub24oXCJSZWxhdGlvbnMucmVtb3ZlXCIsIHRoaXMub25SZWFjdGlvbnNDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWFjdGlvbnMub24oXCJSZWxhdGlvbnMucmVkYWN0aW9uXCIsIHRoaXMub25SZWFjdGlvbnNDaGFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5vblJlYWN0aW9uc0NoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnJlYWN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWFjdGlvbnMucmVtb3ZlTGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgXCJSZWxhdGlvbnMuYWRkXCIsXG4gICAgICAgICAgICAgICAgdGhpcy5vblJlYWN0aW9uc0NoYW5nZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnJlYWN0aW9ucy5yZW1vdmVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcIlJlbGF0aW9ucy5yZW1vdmVcIixcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVhY3Rpb25zQ2hhbmdlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucHJvcHMucmVhY3Rpb25zLnJlbW92ZUxpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiUmVsYXRpb25zLnJlZGFjdGlvblwiLFxuICAgICAgICAgICAgICAgIHRoaXMub25SZWFjdGlvbnNDaGFuZ2UsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZWFjdGlvbnNDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IENhbGwgYG9uSGVpZ2h0Q2hhbmdlZGAgYXMgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbXlSZWFjdGlvbnM6IHRoaXMuZ2V0TXlSZWFjdGlvbnMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFVzaW5nIGBmb3JjZVVwZGF0ZWAgZm9yIHRoZSBtb21lbnQsIHNpbmNlIHdlIGtub3cgdGhlIG92ZXJhbGwgc2V0IG9mIHJlYWN0aW9uc1xuICAgICAgICAvLyBoYXMgY2hhbmdlZCAodGhpcyBpcyB0cmlnZ2VyZWQgYnkgZXZlbnRzIGZvciB0aGF0IHB1cnBvc2Ugb25seSkgYW5kXG4gICAgICAgIC8vIGBQdXJlQ29tcG9uZW50YHMgc2hhbGxvdyBzdGF0ZSAvIHByb3BzIGNvbXBhcmUgd291bGQgb3RoZXJ3aXNlIGZpbHRlciB0aGlzIG91dC5cbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldE15UmVhY3Rpb25zKCkge1xuICAgICAgICBjb25zdCByZWFjdGlvbnMgPSB0aGlzLnByb3BzLnJlYWN0aW9ucztcbiAgICAgICAgaWYgKCFyZWFjdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuY29udGV4dC5nZXRVc2VySWQoKTtcbiAgICAgICAgY29uc3QgbXlSZWFjdGlvbnMgPSByZWFjdGlvbnMuZ2V0QW5ub3RhdGlvbnNCeVNlbmRlcigpW3VzZXJJZF07XG4gICAgICAgIGlmICghbXlSZWFjdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbLi4ubXlSZWFjdGlvbnMudmFsdWVzKCldO1xuICAgIH1cblxuICAgIG9uU2hvd0FsbENsaWNrID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNob3dBbGw6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgeyBteEV2ZW50LCByZWFjdGlvbnMgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHsgbXlSZWFjdGlvbnMsIHNob3dBbGwgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgaWYgKCFyZWFjdGlvbnMgfHwgIWlzQ29udGVudEFjdGlvbmFibGUobXhFdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ZW1zID0gcmVhY3Rpb25zLmdldFNvcnRlZEFubm90YXRpb25zQnlLZXkoKS5tYXAoKFtjb250ZW50LCBldmVudHNdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGV2ZW50cy5zaXplO1xuICAgICAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbXlSZWFjdGlvbkV2ZW50ID0gbXlSZWFjdGlvbnMgJiYgbXlSZWFjdGlvbnMuZmluZChteEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobXhFdmVudC5pc1JlZGFjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbXhFdmVudC5nZXRSZWxhdGlvbigpLmtleSA9PT0gY29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIDxSZWFjdGlvbnNSb3dCdXR0b25cbiAgICAgICAgICAgICAgICBrZXk9e2NvbnRlbnR9XG4gICAgICAgICAgICAgICAgY29udGVudD17Y29udGVudH1cbiAgICAgICAgICAgICAgICBjb3VudD17Y291bnR9XG4gICAgICAgICAgICAgICAgbXhFdmVudD17bXhFdmVudH1cbiAgICAgICAgICAgICAgICByZWFjdGlvbkV2ZW50cz17ZXZlbnRzfVxuICAgICAgICAgICAgICAgIG15UmVhY3Rpb25FdmVudD17bXlSZWFjdGlvbkV2ZW50fVxuICAgICAgICAgICAgLz47XG4gICAgICAgIH0pLmZpbHRlcihpdGVtID0+ICEhaXRlbSk7XG5cbiAgICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGZpcnN0IE1BWF9JVEVNUyBpZiB0aGVyZSBhcmUgTUFYX0lURU1TICsgMSBvciBtb3JlIGl0ZW1zLlxuICAgICAgICAvLyBUaGUgXCIrIDFcIiBlbnN1cmUgdGhhdCB0aGUgXCJzaG93IGFsbFwiIHJldmVhbHMgc29tZXRoaW5nIHRoYXQgdGFrZXMgdXBcbiAgICAgICAgLy8gbW9yZSBzcGFjZSB0aGFuIHRoZSBidXR0b24gaXRzZWxmLlxuICAgICAgICBsZXQgc2hvd0FsbEJ1dHRvbjtcbiAgICAgICAgaWYgKChpdGVtcy5sZW5ndGggPiBNQVhfSVRFTVNfV0hFTl9MSU1JVEVEICsgMSkgJiYgIXNob3dBbGwpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuc2xpY2UoMCwgTUFYX0lURU1TX1dIRU5fTElNSVRFRCk7XG4gICAgICAgICAgICBzaG93QWxsQnV0dG9uID0gPGFcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9SZWFjdGlvbnNSb3dfc2hvd0FsbFwiXG4gICAgICAgICAgICAgICAgaHJlZj1cIiNcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25TaG93QWxsQ2xpY2t9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge190KFwiU2hvdyBhbGxcIil9XG4gICAgICAgICAgICA8L2E+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xpID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgIGxldCBhZGRSZWFjdGlvbkJ1dHRvbjtcbiAgICAgICAgaWYgKGNsaS5nZXRSb29tKG14RXZlbnQuZ2V0Um9vbUlkKCkpLmN1cnJlbnRTdGF0ZS5tYXlTZW5kRXZlbnQoRXZlbnRUeXBlLlJlYWN0aW9uLCBjbGkuZ2V0VXNlcklkKCkpKSB7XG4gICAgICAgICAgICBhZGRSZWFjdGlvbkJ1dHRvbiA9IDxSZWFjdEJ1dHRvbiBteEV2ZW50PXtteEV2ZW50fSByZWFjdGlvbnM9e3JlYWN0aW9uc30gLz47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUmVhY3Rpb25zUm93XCJcbiAgICAgICAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwiUmVhY3Rpb25zXCIpfVxuICAgICAgICA+XG4gICAgICAgICAgICB7IGl0ZW1zIH1cbiAgICAgICAgICAgIHsgc2hvd0FsbEJ1dHRvbiB9XG4gICAgICAgICAgICB7IGFkZFJlYWN0aW9uQnV0dG9uIH1cbiAgICAgICAgPC9kaXY+O1xuICAgIH1cbn1cbiJdfQ==