matrix-react-sdk
Version:
SDK for matrix.org using React
262 lines (190 loc) • 28.6 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _matrixWidgetApi = require("matrix-widget-api");
var _IconizedContextMenu = _interopRequireWildcard(require("./IconizedContextMenu"));
var _ContextMenu = require("../../structures/ContextMenu");
var _languageHandler = require("../../../languageHandler");
var _WidgetUtils = _interopRequireDefault(require("../../../utils/WidgetUtils"));
var _WidgetMessagingStore = require("../../../stores/widgets/WidgetMessagingStore");
var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _QuestionDialog = _interopRequireDefault(require("../dialogs/QuestionDialog"));
var _ErrorDialog = _interopRequireDefault(require("../dialogs/ErrorDialog"));
var _WidgetType = require("../../../widgets/WidgetType");
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _WidgetLayoutStore = require("../../../stores/widgets/WidgetLayoutStore");
var _Livestream = require("../../../Livestream");
/*
Copyright 2020 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
const WidgetContextMenu
/*: React.FC<IProps>*/
= (_ref) => {
let {
onFinished,
app,
userWidget,
onDeleteClick,
showUnpin
} = _ref,
props = (0, _objectWithoutProperties2.default)(_ref, ["onFinished", "app", "userWidget", "onDeleteClick", "showUnpin"]);
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const {
room,
roomId
} = (0, _react.useContext)(_RoomContext.default);
const widgetMessaging = _WidgetMessagingStore.WidgetMessagingStore.instance.getMessagingForId(app.id);
const canModify = userWidget || _WidgetUtils.default.canUserModifyWidgets(roomId);
let streamAudioStreamButton;
if ((0, _Livestream.getConfigLivestreamUrl)() && _WidgetType.WidgetType.JITSI.matches(app.type)) {
const onStreamAudioClick = async () => {
try {
await (0, _Livestream.startJitsiAudioLivestream)(widgetMessaging, roomId);
} catch (err) {
console.error("Failed to start livestream", err); // XXX: won't i18n well, but looks like widget api only support 'message'?
const message = err.message || (0, _languageHandler._t)("Unable to start audio streaming.");
_Modal.default.createTrackedDialog('WidgetContext Menu', 'Livestream failed', _ErrorDialog.default, {
title: (0, _languageHandler._t)('Failed to start livestream'),
description: message
});
}
onFinished();
};
streamAudioStreamButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onStreamAudioClick,
label: (0, _languageHandler._t)("Start audio stream")
});
}
let unpinButton;
if (showUnpin) {
const onUnpinClick = () => {
_WidgetLayoutStore.WidgetLayoutStore.instance.moveToContainer(room, app, _WidgetLayoutStore.Container.Right);
onFinished();
};
unpinButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onUnpinClick,
label: (0, _languageHandler._t)("Unpin")
});
}
let editButton;
if (canModify && _WidgetUtils.default.isManagedByManager(app)) {
const onEditClick = () => {
_WidgetUtils.default.editWidget(room, app);
onFinished();
};
editButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onEditClick,
label: (0, _languageHandler._t)("Edit")
});
}
let snapshotButton;
if (widgetMessaging?.hasCapability(_matrixWidgetApi.MatrixCapabilities.Screenshots)) {
const onSnapshotClick = () => {
widgetMessaging?.takeScreenshot().then(data => {
_dispatcher.default.dispatch({
action: 'picture_snapshot',
file: data.screenshot
});
}).catch(err => {
console.error("Failed to take screenshot: ", err);
});
onFinished();
};
snapshotButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onSnapshotClick,
label: (0, _languageHandler._t)("Take a picture")
});
}
let deleteButton;
if (onDeleteClick || canModify) {
const onDeleteClickDefault = () => {
// Show delete confirmation dialog
_Modal.default.createTrackedDialog('Delete Widget', '', _QuestionDialog.default, {
title: (0, _languageHandler._t)("Delete Widget"),
description: (0, _languageHandler._t)("Deleting a widget removes it for all users in this room." + " Are you sure you want to delete this widget?"),
button: (0, _languageHandler._t)("Delete widget"),
onFinished: confirmed => {
if (!confirmed) return;
_WidgetUtils.default.setRoomWidget(roomId, app.id);
}
});
onFinished();
};
deleteButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onDeleteClick || onDeleteClickDefault,
label: userWidget ? (0, _languageHandler._t)("Remove") : (0, _languageHandler._t)("Remove for everyone")
});
}
let isAllowedWidget = _SettingsStore.default.getValue("allowedWidgets", roomId)[app.eventId];
if (isAllowedWidget === undefined) {
isAllowedWidget = app.creatorUserId === cli.getUserId();
}
const isLocalWidget = _WidgetType.WidgetType.JITSI.matches(app.type);
let revokeButton;
if (!userWidget && !isLocalWidget && isAllowedWidget) {
const onRevokeClick = () => {
console.info("Revoking permission for widget to load: " + app.eventId);
const current = _SettingsStore.default.getValue("allowedWidgets", roomId);
current[app.eventId] = false;
const level = _SettingsStore.default.firstSupportedLevel("allowedWidgets");
_SettingsStore.default.setValue("allowedWidgets", roomId, level, current).catch(err => {
console.error(err); // We don't really need to do anything about this - the user will just hit the button again.
});
onFinished();
};
revokeButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onRevokeClick,
label: (0, _languageHandler._t)("Revoke permissions")
});
}
const pinnedWidgets = _WidgetLayoutStore.WidgetLayoutStore.instance.getContainerWidgets(room, _WidgetLayoutStore.Container.Top);
const widgetIndex = pinnedWidgets.findIndex(widget => widget.id === app.id);
let moveLeftButton;
if (showUnpin && widgetIndex > 0) {
const onClick = () => {
_WidgetLayoutStore.WidgetLayoutStore.instance.moveWithinContainer(room, _WidgetLayoutStore.Container.Top, app, -1);
onFinished();
};
moveLeftButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onClick,
label: (0, _languageHandler._t)("Move left")
});
}
let moveRightButton;
if (showUnpin && widgetIndex < pinnedWidgets.length - 1) {
const onClick = () => {
_WidgetLayoutStore.WidgetLayoutStore.instance.moveWithinContainer(room, _WidgetLayoutStore.Container.Top, app, 1);
onFinished();
};
moveRightButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onClick,
label: (0, _languageHandler._t)("Move right")
});
}
return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, props, {
chevronFace: _ContextMenu.ChevronFace.None,
onFinished: onFinished
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, streamAudioStreamButton, editButton, revokeButton, deleteButton, snapshotButton, moveLeftButton, moveRightButton, unpinButton));
};
var _default = WidgetContextMenu;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2NvbnRleHRfbWVudXMvV2lkZ2V0Q29udGV4dE1lbnUudHN4Il0sIm5hbWVzIjpbIldpZGdldENvbnRleHRNZW51Iiwib25GaW5pc2hlZCIsImFwcCIsInVzZXJXaWRnZXQiLCJvbkRlbGV0ZUNsaWNrIiwic2hvd1VucGluIiwicHJvcHMiLCJjbGkiLCJNYXRyaXhDbGllbnRDb250ZXh0Iiwicm9vbSIsInJvb21JZCIsIlJvb21Db250ZXh0Iiwid2lkZ2V0TWVzc2FnaW5nIiwiV2lkZ2V0TWVzc2FnaW5nU3RvcmUiLCJpbnN0YW5jZSIsImdldE1lc3NhZ2luZ0ZvcklkIiwiaWQiLCJjYW5Nb2RpZnkiLCJXaWRnZXRVdGlscyIsImNhblVzZXJNb2RpZnlXaWRnZXRzIiwic3RyZWFtQXVkaW9TdHJlYW1CdXR0b24iLCJXaWRnZXRUeXBlIiwiSklUU0kiLCJtYXRjaGVzIiwidHlwZSIsIm9uU3RyZWFtQXVkaW9DbGljayIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsIm1lc3NhZ2UiLCJNb2RhbCIsImNyZWF0ZVRyYWNrZWREaWFsb2ciLCJFcnJvckRpYWxvZyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJ1bnBpbkJ1dHRvbiIsIm9uVW5waW5DbGljayIsIldpZGdldExheW91dFN0b3JlIiwibW92ZVRvQ29udGFpbmVyIiwiQ29udGFpbmVyIiwiUmlnaHQiLCJlZGl0QnV0dG9uIiwiaXNNYW5hZ2VkQnlNYW5hZ2VyIiwib25FZGl0Q2xpY2siLCJlZGl0V2lkZ2V0Iiwic25hcHNob3RCdXR0b24iLCJoYXNDYXBhYmlsaXR5IiwiTWF0cml4Q2FwYWJpbGl0aWVzIiwiU2NyZWVuc2hvdHMiLCJvblNuYXBzaG90Q2xpY2siLCJ0YWtlU2NyZWVuc2hvdCIsInRoZW4iLCJkYXRhIiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJmaWxlIiwic2NyZWVuc2hvdCIsImNhdGNoIiwiZGVsZXRlQnV0dG9uIiwib25EZWxldGVDbGlja0RlZmF1bHQiLCJRdWVzdGlvbkRpYWxvZyIsImJ1dHRvbiIsImNvbmZpcm1lZCIsInNldFJvb21XaWRnZXQiLCJpc0FsbG93ZWRXaWRnZXQiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJldmVudElkIiwidW5kZWZpbmVkIiwiY3JlYXRvclVzZXJJZCIsImdldFVzZXJJZCIsImlzTG9jYWxXaWRnZXQiLCJyZXZva2VCdXR0b24iLCJvblJldm9rZUNsaWNrIiwiaW5mbyIsImN1cnJlbnQiLCJsZXZlbCIsImZpcnN0U3VwcG9ydGVkTGV2ZWwiLCJzZXRWYWx1ZSIsInBpbm5lZFdpZGdldHMiLCJnZXRDb250YWluZXJXaWRnZXRzIiwiVG9wIiwid2lkZ2V0SW5kZXgiLCJmaW5kSW5kZXgiLCJ3aWRnZXQiLCJtb3ZlTGVmdEJ1dHRvbiIsIm9uQ2xpY2siLCJtb3ZlV2l0aGluQ29udGFpbmVyIiwibW92ZVJpZ2h0QnV0dG9uIiwibGVuZ3RoIiwiQ2hldnJvbkZhY2UiLCJOb25lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQThCQSxNQUFNQTtBQUFtQztBQUFBLEVBQUcsVUFPdEM7QUFBQSxNQVB1QztBQUN6Q0MsSUFBQUEsVUFEeUM7QUFFekNDLElBQUFBLEdBRnlDO0FBR3pDQyxJQUFBQSxVQUh5QztBQUl6Q0MsSUFBQUEsYUFKeUM7QUFLekNDLElBQUFBO0FBTHlDLEdBT3ZDO0FBQUEsTUFEQ0MsS0FDRDtBQUNGLFFBQU1DLEdBQUcsR0FBRyx1QkFBV0MsNEJBQVgsQ0FBWjtBQUNBLFFBQU07QUFBQ0MsSUFBQUEsSUFBRDtBQUFPQyxJQUFBQTtBQUFQ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TixFQUdNZ0MsWUFITixFQUlNZCxZQUpOLEVBS01kLGNBTE4sRUFNTXlDLGNBTk4sRUFPTUcsZUFQTixFQVFNdEQsV0FSTixDQURHLENBQVA7QUFZSCxDQTFKRDs7ZUE0SmVuQyxpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBSZWFjdCwge3VzZUNvbnRleHR9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtNYXRyaXhDYXBhYmlsaXRpZXN9IGZyb20gXCJtYXRyaXgtd2lkZ2V0LWFwaVwiO1xuXG5pbXBvcnQgSWNvbml6ZWRDb250ZXh0TWVudSwge0ljb25pemVkQ29udGV4dE1lbnVPcHRpb24sIEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0fSBmcm9tIFwiLi9JY29uaXplZENvbnRleHRNZW51XCI7XG5pbXBvcnQge0NoZXZyb25GYWNlfSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9Db250ZXh0TWVudVwiO1xuaW1wb3J0IHtfdH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHtJQXBwfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1dpZGdldFN0b3JlXCI7XG5pbXBvcnQgV2lkZ2V0VXRpbHMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1dpZGdldFV0aWxzXCI7XG5pbXBvcnQge1dpZGdldE1lc3NhZ2luZ1N0b3JlfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3dpZGdldHMvV2lkZ2V0TWVzc2FnaW5nU3RvcmVcIjtcbmltcG9ydCBSb29tQ29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvUm9vbUNvbnRleHRcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCBRdWVzdGlvbkRpYWxvZyBmcm9tIFwiLi4vZGlhbG9ncy9RdWVzdGlvbkRpYWxvZ1wiO1xuaW1wb3J0IEVycm9yRGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL0Vycm9yRGlhbG9nXCI7XG5pbXBvcnQge1dpZGdldFR5cGV9IGZyb20gXCIuLi8uLi8uLi93aWRnZXRzL1dpZGdldFR5cGVcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBDb250YWluZXIsIFdpZGdldExheW91dFN0b3JlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy93aWRnZXRzL1dpZGdldExheW91dFN0b3JlXCI7XG5pbXBvcnQgeyBnZXRDb25maWdMaXZlc3RyZWFtVXJsLCBzdGFydEppdHNpQXVkaW9MaXZlc3RyZWFtIH0gZnJvbSBcIi4uLy4uLy4uL0xpdmVzdHJlYW1cIjtcblxuaW50ZXJmYWNlIElQcm9wcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBJY29uaXplZENvbnRleHRNZW51PiB7XG4gICAgYXBwOiBJQXBwO1xuICAgIHVzZXJXaWRnZXQ/OiBib29sZWFuO1xuICAgIHNob3dVbnBpbj86IGJvb2xlYW47XG4gICAgLy8gb3ZlcnJpZGUgZGVsZXRlIGhhbmRsZXJcbiAgICBvbkRlbGV0ZUNsaWNrPygpOiB2b2lkO1xufVxuXG5jb25zdCBXaWRnZXRDb250ZXh0TWVudTogUmVhY3QuRkM8SVByb3BzPiA9ICh7XG4gICAgb25GaW5pc2hlZCxcbiAgICBhcHAsXG4gICAgdXNlcldpZGdldCxcbiAgICBvbkRlbGV0ZUNsaWNrLFxuICAgIHNob3dVbnBpbixcbiAgICAuLi5wcm9wc1xufSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3Qge3Jvb20sIHJvb21JZH0gPSB1c2VDb250ZXh0KFJvb21Db250ZXh0KTtcblxuICAgIGNvbnN0IHdpZGdldE1lc3NhZ2luZyA9IFdpZGdldE1lc3NhZ2luZ1N0b3JlLmluc3RhbmNlLmdldE1lc3NhZ2luZ0ZvcklkKGFwcC5pZCk7XG4gICAgY29uc3QgY2FuTW9kaWZ5ID0gdXNlcldpZGdldCB8fCBXaWRnZXRVdGlscy5jYW5Vc2VyTW9kaWZ5V2lkZ2V0cyhyb29tSWQpO1xuXG4gICAgbGV0IHN0cmVhbUF1ZGlvU3RyZWFtQnV0dG9uO1xuICAgIGlmIChnZXRDb25maWdMaXZlc3RyZWFtVXJsKCkgJiYgV2lkZ2V0VHlwZS5KSVRTSS5tYXRjaGVzKGFwcC50eXBlKSkge1xuICAgICAgICBjb25zdCBvblN0cmVhbUF1ZGlvQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0YXJ0Sml0c2lBdWRpb0xpdmVzdHJlYW0od2lkZ2V0TWVzc2FnaW5nLCByb29tSWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzdGFydCBsaXZlc3RyZWFtXCIsIGVycik7XG4gICAgICAgICAgICAgICAgLy8gWFhYOiB3b24ndCBpMThuIHdlbGwsIGJ1dCBsb29rcyBsaWtlIHdpZGdldCBhcGkgb25seSBzdXBwb3J0ICdtZXNzYWdlJz9cbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgX3QoXCJVbmFibGUgdG8gc3RhcnQgYXVkaW8gc3RyZWFtaW5nLlwiKTtcbiAgICAgICAgICAgICAgICBNb2RhbC5jcmVhdGVUcmFja2VkRGlhbG9nKCdXaWRnZXRDb250ZXh0IE1lbnUnLCAnTGl2ZXN0cmVhbSBmYWlsZWQnLCBFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogX3QoJ0ZhaWxlZCB0byBzdGFydCBsaXZlc3RyZWFtJyksXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICB9O1xuICAgICAgICBzdHJlYW1BdWRpb1N0cmVhbUJ1dHRvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICBvbkNsaWNrPXtvblN0cmVhbUF1ZGlvQ2xpY2t9IGxhYmVsPXtfdChcIlN0YXJ0IGF1ZGlvIHN0cmVhbVwiKX1cbiAgICAgICAgLz47XG4gICAgfVxuXG4gICAgbGV0IHVucGluQnV0dG9uO1xuICAgIGlmIChzaG93VW5waW4pIHtcbiAgICAgICAgY29uc3Qgb25VbnBpbkNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UubW92ZVRvQ29udGFpbmVyKHJvb20sIGFwcCwgQ29udGFpbmVyLlJpZ2h0KTtcbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB1bnBpbkJ1dHRvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uIG9uQ2xpY2s9e29uVW5waW5DbGlja30gbGFiZWw9e190KFwiVW5waW5cIil9IC8+O1xuICAgIH1cblxuICAgIGxldCBlZGl0QnV0dG9uO1xuICAgIGlmIChjYW5Nb2RpZnkgJiYgV2lkZ2V0VXRpbHMuaXNNYW5hZ2VkQnlNYW5hZ2VyKGFwcCkpIHtcbiAgICAgICAgY29uc3Qgb25FZGl0Q2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBXaWRnZXRVdGlscy5lZGl0V2lkZ2V0KHJvb20sIGFwcCk7XG4gICAgICAgICAgICBvbkZpbmlzaGVkKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZWRpdEJ1dHRvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uIG9uQ2xpY2s9e29uRWRpdENsaWNrfSBsYWJlbD17X3QoXCJFZGl0XCIpfSAvPjtcbiAgICB9XG5cbiAgICBsZXQgc25hcHNob3RCdXR0b247XG4gICAgaWYgKHdpZGdldE1lc3NhZ2luZz8uaGFzQ2FwYWJpbGl0eShNYXRyaXhDYXBhYmlsaXRpZXMuU2NyZWVuc2hvdHMpKSB7XG4gICAgICAgIGNvbnN0IG9uU25hcHNob3RDbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIHdpZGdldE1lc3NhZ2luZz8udGFrZVNjcmVlbnNob3QoKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BpY3R1cmVfc25hcHNob3QnLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBkYXRhLnNjcmVlbnNob3QsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gdGFrZSBzY3JlZW5zaG90OiBcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNuYXBzaG90QnV0dG9uID0gPEljb25pemVkQ29udGV4dE1lbnVPcHRpb24gb25DbGljaz17b25TbmFwc2hvdENsaWNrfSBsYWJlbD17X3QoXCJUYWtlIGEgcGljdHVyZVwiKX0gLz47XG4gICAgfVxuXG4gICAgbGV0IGRlbGV0ZUJ1dHRvbjtcbiAgICBpZiAob25EZWxldGVDbGljayB8fCBjYW5Nb2RpZnkpIHtcbiAgICAgICAgY29uc3Qgb25EZWxldGVDbGlja0RlZmF1bHQgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBTaG93IGRlbGV0ZSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVUcmFja2VkRGlhbG9nKCdEZWxldGUgV2lkZ2V0JywgJycsIFF1ZXN0aW9uRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiRGVsZXRlIFdpZGdldFwiKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXG4gICAgICAgICAgICAgICAgICAgIFwiRGVsZXRpbmcgYSB3aWRnZXQgcmVtb3ZlcyBpdCBmb3IgYWxsIHVzZXJzIGluIHRoaXMgcm9vbS5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyB3aWRnZXQ/XCIpLFxuICAgICAgICAgICAgICAgIGJ1dHRvbjogX3QoXCJEZWxldGUgd2lkZ2V0XCIpLFxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ6IChjb25maXJtZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgV2lkZ2V0VXRpbHMuc2V0Um9vbVdpZGdldChyb29tSWQsIGFwcC5pZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRlbGV0ZUJ1dHRvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICBvbkNsaWNrPXtvbkRlbGV0ZUNsaWNrIHx8IG9uRGVsZXRlQ2xpY2tEZWZhdWx0fVxuICAgICAgICAgICAgbGFiZWw9e3VzZXJXaWRnZXQgPyBfdChcIlJlbW92ZVwiKSA6IF90KFwiUmVtb3ZlIGZvciBldmVyeW9uZVwiKX1cbiAgICAgICAgLz47XG4gICAgfVxuXG4gICAgbGV0IGlzQWxsb3dlZFdpZGdldCA9IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJhbGxvd2VkV2lkZ2V0c1wiLCByb29tSWQpW2FwcC5ldmVudElkXTtcbiAgICBpZiAoaXNBbGxvd2VkV2lkZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXNBbGxvd2VkV2lkZ2V0ID0gYXBwLmNyZWF0b3JVc2VySWQgPT09IGNsaS5nZXRVc2VySWQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvY2FsV2lkZ2V0ID0gV2lkZ2V0VHlwZS5KSVRTSS5tYXRjaGVzKGFwcC50eXBlKTtcbiAgICBsZXQgcmV2b2tlQnV0dG9uO1xuICAgIGlmICghdXNlcldpZGdldCAmJiAhaXNMb2NhbFdpZGdldCAmJiBpc0FsbG93ZWRXaWRnZXQpIHtcbiAgICAgICAgY29uc3Qgb25SZXZva2VDbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlJldm9raW5nIHBlcm1pc3Npb24gZm9yIHdpZGdldCB0byBsb2FkOiBcIiArIGFwcC5ldmVudElkKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiYWxsb3dlZFdpZGdldHNcIiwgcm9vbUlkKTtcbiAgICAgICAgICAgIGN1cnJlbnRbYXBwLmV2ZW50SWRdID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBsZXZlbCA9IFNldHRpbmdzU3RvcmUuZmlyc3RTdXBwb3J0ZWRMZXZlbChcImFsbG93ZWRXaWRnZXRzXCIpO1xuICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcImFsbG93ZWRXaWRnZXRzXCIsIHJvb21JZCwgbGV2ZWwsIGN1cnJlbnQpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGRvIGFueXRoaW5nIGFib3V0IHRoaXMgLSB0aGUgdXNlciB3aWxsIGp1c3QgaGl0IHRoZSBidXR0b24gYWdhaW4uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXZva2VCdXR0b24gPSA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbiBvbkNsaWNrPXtvblJldm9rZUNsaWNrfSBsYWJlbD17X3QoXCJSZXZva2UgcGVybWlzc2lvbnNcIil9IC8+O1xuICAgIH1cblxuICAgIGNvbnN0IHBpbm5lZFdpZGdldHMgPSBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5nZXRDb250YWluZXJXaWRnZXRzKHJvb20sIENvbnRhaW5lci5Ub3ApO1xuICAgIGNvbnN0IHdpZGdldEluZGV4ID0gcGlubmVkV2lkZ2V0cy5maW5kSW5kZXgod2lkZ2V0ID0+IHdpZGdldC5pZCA9PT0gYXBwLmlkKTtcblxuICAgIGxldCBtb3ZlTGVmdEJ1dHRvbjtcbiAgICBpZiAoc2hvd1VucGluICYmIHdpZGdldEluZGV4ID4gMCkge1xuICAgICAgICBjb25zdCBvbkNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UubW92ZVdpdGhpbkNvbnRhaW5lcihyb29tLCBDb250YWluZXIuVG9wLCBhcHAsIC0xKTtcbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBtb3ZlTGVmdEJ1dHRvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uIG9uQ2xpY2s9e29uQ2xpY2t9IGxhYmVsPXtfdChcIk1vdmUgbGVmdFwiKX0gLz47XG4gICAgfVxuXG4gICAgbGV0IG1vdmVSaWdodEJ1dHRvbjtcbiAgICBpZiAoc2hvd1VucGluICYmIHdpZGdldEluZGV4IDwgcGlubmVkV2lkZ2V0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnN0IG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5tb3ZlV2l0aGluQ29udGFpbmVyKHJvb20sIENvbnRhaW5lci5Ub3AsIGFwcCwgMSk7XG4gICAgICAgICAgICBvbkZpbmlzaGVkKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbW92ZVJpZ2h0QnV0dG9uID0gPEljb25pemVkQ29udGV4dE1lbnVPcHRpb24gb25DbGljaz17b25DbGlja30gbGFiZWw9e190KFwiTW92ZSByaWdodFwiKX0gLz47XG4gICAgfVxuXG4gICAgcmV0dXJuIDxJY29uaXplZENvbnRleHRNZW51IHsuLi5wcm9wc30gY2hldnJvbkZhY2U9e0NoZXZyb25GYWNlLk5vbmV9IG9uRmluaXNoZWQ9e29uRmluaXNoZWR9PlxuICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3Q+XG4gICAgICAgICAgICB7IHN0cmVhbUF1ZGlvU3RyZWFtQnV0dG9uIH1cbiAgICAgICAgICAgIHsgZWRpdEJ1dHRvbiB9XG4gICAgICAgICAgICB7IHJldm9rZUJ1dHRvbiB9XG4gICAgICAgICAgICB7IGRlbGV0ZUJ1dHRvbiB9XG4gICAgICAgICAgICB7IHNuYXBzaG90QnV0dG9uIH1cbiAgICAgICAgICAgIHsgbW92ZUxlZnRCdXR0b24gfVxuICAgICAgICAgICAgeyBtb3ZlUmlnaHRCdXR0b24gfVxuICAgICAgICAgICAgeyB1bnBpbkJ1dHRvbiB9XG4gICAgICAgIDwvSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3Q+XG4gICAgPC9JY29uaXplZENvbnRleHRNZW51Pjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFdpZGdldENvbnRleHRNZW51O1xuIl19