matrix-react-sdk
Version:
SDK for matrix.org using React
224 lines (221 loc) • 42.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _types = require("matrix-js-sdk/src/types");
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext"));
var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap"));
var _languageHandler = require("../../../languageHandler");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _MiniAvatarUploader = _interopRequireWildcard(require("../elements/MiniAvatarUploader"));
var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _SpaceStore = _interopRequireDefault(require("../../../stores/spaces/SpaceStore"));
var _space = require("../../../utils/space");
var _EventTileBubble = _interopRequireDefault(require("../messages/EventTileBubble"));
var _RoomSettingsDialog = require("../dialogs/RoomSettingsDialog");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _UIComponents = require("../../../customisations/helpers/UIComponents");
var _UIFeature = require("../../../settings/UIFeature");
var _rooms = require("../../../utils/rooms");
var _LocalRoom = require("../../../models/LocalRoom");
var _shouldEncryptRoomWithSingle3rdPartyInvite = require("../../../utils/room/shouldEncryptRoomWithSingle3rdPartyInvite");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2020, 2021 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function hasExpectedEncryptionSettings(matrixClient, room) {
const isEncrypted = matrixClient.isRoomEncrypted(room.roomId);
const isPublic = room.getJoinRule() === "public";
return isPublic || !(0, _rooms.privateShouldBeEncrypted)(matrixClient) || isEncrypted;
}
const determineIntroMessage = (room, encryptedSingle3rdPartyInvite) => {
if (room instanceof _LocalRoom.LocalRoom) {
return (0, _languageHandler._td)("room|intro|send_message_start_dm");
}
if (encryptedSingle3rdPartyInvite) {
return (0, _languageHandler._td)("room|intro|encrypted_3pid_dm_pending_join");
}
return (0, _languageHandler._td)("room|intro|start_of_dm_history");
};
const NewRoomIntro = () => {
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const {
room,
roomId
} = (0, _react.useContext)(_RoomContext.default);
if (!room || !roomId) {
throw new Error("Unable to create a NewRoomIntro without room and roomId");
}
const isLocalRoom = room instanceof _LocalRoom.LocalRoom;
const dmPartner = isLocalRoom ? room.targets[0]?.userId : _DMRoomMap.default.shared().getUserIdForRoomId(roomId);
let body;
if (dmPartner) {
const {
shouldEncrypt: encryptedSingle3rdPartyInvite
} = (0, _shouldEncryptRoomWithSingle3rdPartyInvite.shouldEncryptRoomWithSingle3rdPartyInvite)(room);
const introMessage = determineIntroMessage(room, encryptedSingle3rdPartyInvite);
let caption;
if (!(room instanceof _LocalRoom.LocalRoom) && !encryptedSingle3rdPartyInvite && room.getJoinedMemberCount() + room.getInvitedMemberCount() === 2) {
caption = (0, _languageHandler._t)("room|intro|dm_caption");
}
const member = room?.getMember(dmPartner);
const displayName = room?.name || member?.rawDisplayName || dmPartner;
body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: room,
size: _MiniAvatarUploader.AVATAR_SIZE,
onClick: () => {
_dispatcher.default.dispatch({
action: _actions.Action.ViewUser,
// XXX: We should be using a real member object and not assuming what the receiver wants.
member: member || {
userId: dmPartner
}
});
}
}), /*#__PURE__*/_react.default.createElement("h2", null, room.name), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)(introMessage, {}, {
displayName: () => /*#__PURE__*/_react.default.createElement("strong", null, displayName)
})), caption && /*#__PURE__*/_react.default.createElement("p", null, caption));
} else {
const inRoom = room && room.getMyMembership() === _types.KnownMembership.Join;
const topic = room.currentState.getStateEvents(_matrix.EventType.RoomTopic, "")?.getContent()?.topic;
const canAddTopic = inRoom && room.currentState.maySendStateEvent(_matrix.EventType.RoomTopic, cli.getSafeUserId());
const onTopicClick = () => {
_dispatcher.default.dispatch({
action: "open_room_settings",
room_id: roomId
}, true);
// focus the topic field to help the user find it as it'll gain an outline
setTimeout(() => {
window.document.getElementById("profileTopic")?.focus();
});
};
let topicText;
if (canAddTopic && topic) {
topicText = (0, _languageHandler._t)("room|intro|topic_edit", {
topic
}, {
a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
element: "a",
kind: "link_inline",
onClick: onTopicClick
}, sub)
});
} else if (topic) {
topicText = (0, _languageHandler._t)("room|intro|topic", {
topic
});
} else if (canAddTopic) {
topicText = (0, _languageHandler._t)("room|intro|no_topic", {}, {
a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
element: "a",
kind: "link_inline",
onClick: onTopicClick
}, sub)
});
}
const creator = room.currentState.getStateEvents(_matrix.EventType.RoomCreate, "")?.getSender();
const creatorName = creator && room?.getMember(creator)?.rawDisplayName || creator;
let createdText;
if (creator === cli.getUserId()) {
createdText = (0, _languageHandler._t)("room|intro|you_created");
} else {
createdText = (0, _languageHandler._t)("room|intro|user_created", {
displayName: creatorName
});
}
let parentSpace;
if (_SpaceStore.default.instance.activeSpaceRoom?.canInvite(cli.getSafeUserId()) && _SpaceStore.default.instance.isRoomInSpace(_SpaceStore.default.instance.activeSpace, room.roomId)) {
parentSpace = _SpaceStore.default.instance.activeSpaceRoom;
}
let buttons;
if (parentSpace && (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.InviteUsers)) {
buttons = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_NewRoomIntro_buttons"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_NewRoomIntro_inviteButton",
kind: "primary",
onClick: () => {
(0, _space.showSpaceInvite)(parentSpace);
}
}, (0, _languageHandler._t)("invite|to_space", {
spaceName: parentSpace.name
})), room.canInvite(cli.getSafeUserId()) && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_NewRoomIntro_inviteButton",
kind: "primary_outline",
onClick: () => {
_dispatcher.default.dispatch({
action: "view_invite",
roomId
});
}
}, (0, _languageHandler._t)("room|intro|room_invite")));
} else if (room.canInvite(cli.getSafeUserId()) && (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.InviteUsers)) {
buttons = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_NewRoomIntro_buttons"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_NewRoomIntro_inviteButton",
kind: "primary",
onClick: () => {
_dispatcher.default.dispatch({
action: "view_invite",
roomId
});
}
}, (0, _languageHandler._t)("room|invite_this_room")));
}
const avatarUrl = room.currentState.getStateEvents(_matrix.EventType.RoomAvatar, "")?.getContent()?.url;
let avatar = /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: room,
size: _MiniAvatarUploader.AVATAR_SIZE,
viewAvatarOnClick: !!avatarUrl
});
if (!avatarUrl) {
avatar = /*#__PURE__*/_react.default.createElement(_MiniAvatarUploader.default, {
hasAvatar: false,
noAvatarLabel: (0, _languageHandler._t)("room|intro|no_avatar_label"),
setAvatarUrl: url => cli.sendStateEvent(roomId, _matrix.EventType.RoomAvatar, {
url
}, "")
}, avatar);
}
body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, avatar, /*#__PURE__*/_react.default.createElement("h2", null, room.name), /*#__PURE__*/_react.default.createElement("p", null, createdText, " ", (0, _languageHandler._t)("room|intro|start_of_room", {}, {
roomName: () => /*#__PURE__*/_react.default.createElement("strong", null, room.name)
})), /*#__PURE__*/_react.default.createElement("p", null, topicText), buttons);
}
function openRoomSettings(event) {
event.preventDefault();
_dispatcher.default.dispatch({
action: "open_room_settings",
initial_tab_id: _RoomSettingsDialog.RoomSettingsTab.Security
});
}
const subText = (0, _languageHandler._t)("room|intro|private_unencrypted_warning");
let subButton;
if (room.currentState.mayClientSendStateEvent(_matrix.EventType.RoomEncryption, _MatrixClientPeg.MatrixClientPeg.safeGet()) && !isLocalRoom) {
subButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "link_inline",
onClick: openRoomSettings
}, (0, _languageHandler._t)("room|intro|enable_encryption_prompt"));
}
const subtitle = /*#__PURE__*/_react.default.createElement("span", null, " ", subText, " ", subButton, " ");
return /*#__PURE__*/_react.default.createElement("li", {
className: "mx_NewRoomIntro"
}, !hasExpectedEncryptionSettings(cli, room) && /*#__PURE__*/_react.default.createElement(_EventTileBubble.default, {
className: "mx_cryptoEvent mx_cryptoEvent_icon_warning",
title: (0, _languageHandler._t)("room|intro|unencrypted_warning"),
subtitle: subtitle
}), body);
};
var _default = exports.default = NewRoomIntro;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX3R5cGVzIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1Jvb21Db250ZXh0IiwiX0RNUm9vbU1hcCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9NaW5pQXZhdGFyVXBsb2FkZXIiLCJfUm9vbUF2YXRhciIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfU3BhY2VTdG9yZSIsIl9zcGFjZSIsIl9FdmVudFRpbGVCdWJibGUiLCJfUm9vbVNldHRpbmdzRGlhbG9nIiwiX01hdHJpeENsaWVudFBlZyIsIl9VSUNvbXBvbmVudHMiLCJfVUlGZWF0dXJlIiwiX3Jvb21zIiwiX0xvY2FsUm9vbSIsIl9zaG91bGRFbmNyeXB0Um9vbVdpdGhTaW5nbGUzcmRQYXJ0eUludml0ZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsImhhc0V4cGVjdGVkRW5jcnlwdGlvblNldHRpbmdzIiwibWF0cml4Q2xpZW50Iiwicm9vbSIsImlzRW5jcnlwdGVkIiwiaXNSb29tRW5jcnlwdGVkIiwicm9vbUlkIiwiaXNQdWJsaWMiLCJnZXRKb2luUnVsZSIsInByaXZhdGVTaG91bGRCZUVuY3J5cHRlZCIsImRldGVybWluZUludHJvTWVzc2FnZSIsImVuY3J5cHRlZFNpbmdsZTNyZFBhcnR5SW52aXRlIiwiTG9jYWxSb29tIiwiX3RkIiwiTmV3Um9vbUludHJvIiwiY2xpIiwidXNlQ29udGV4dCIsIk1hdHJpeENsaWVudENvbnRleHQiLCJSb29tQ29udGV4dCIsIkVycm9yIiwiaXNMb2NhbFJvb20iLCJkbVBhcnRuZXIiLCJ0YXJnZXRzIiwidXNlcklkIiwiRE1Sb29tTWFwIiwic2hhcmVkIiwiZ2V0VXNlcklkRm9yUm9vbUlkIiwiYm9keSIsInNob3VsZEVuY3J5cHQiLCJzaG91bGRFbmNyeXB0Um9vbVdpdGhTaW5nbGUzcmRQYXJ0eUludml0ZSIsImludHJvTWVzc2FnZSIsImNhcHRpb24iLCJnZXRKb2luZWRNZW1iZXJDb3VudCIsImdldEludml0ZWRNZW1iZXJDb3VudCIsIl90IiwibWVtYmVyIiwiZ2V0TWVtYmVyIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwicmF3RGlzcGxheU5hbWUiLCJjcmVhdGVFbGVtZW50IiwiRnJhZ21lbnQiLCJzaXplIiwiQVZBVEFSX1NJWkUiLCJvbkNsaWNrIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIlZpZXdVc2VyIiwiaW5Sb29tIiwiZ2V0TXlNZW1iZXJzaGlwIiwiS25vd25NZW1iZXJzaGlwIiwiSm9pbiIsInRvcGljIiwiY3VycmVudFN0YXRlIiwiZ2V0U3RhdGVFdmVudHMiLCJFdmVudFR5cGUiLCJSb29tVG9waWMiLCJnZXRDb250ZW50IiwiY2FuQWRkVG9waWMiLCJtYXlTZW5kU3RhdGVFdmVudCIsImdldFNhZmVVc2VySWQiLCJvblRvcGljQ2xpY2siLCJyb29tX2lkIiwic2V0VGltZW91dCIsIndpbmRvdyIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJmb2N1cyIsInRvcGljVGV4dCIsInN1YiIsImVsZW1lbnQiLCJraW5kIiwiY3JlYXRvciIsIlJvb21DcmVhdGUiLCJnZXRTZW5kZXIiLCJjcmVhdG9yTmFtZSIsImNyZWF0ZWRUZXh0IiwiZ2V0VXNlcklkIiwicGFyZW50U3BhY2UiLCJTcGFjZVN0b3JlIiwiaW5zdGFuY2UiLCJhY3RpdmVTcGFjZVJvb20iLCJjYW5JbnZpdGUiLCJpc1Jvb21JblNwYWNlIiwiYWN0aXZlU3BhY2UiLCJidXR0b25zIiwic2hvdWxkU2hvd0NvbXBvbmVudCIsIlVJQ29tcG9uZW50IiwiSW52aXRlVXNlcnMiLCJjbGFzc05hbWUiLCJzaG93U3BhY2VJbnZpdGUiLCJzcGFjZU5hbWUiLCJhdmF0YXJVcmwiLCJSb29tQXZhdGFyIiwidXJsIiwiYXZhdGFyIiwidmlld0F2YXRhck9uQ2xpY2siLCJoYXNBdmF0YXIiLCJub0F2YXRhckxhYmVsIiwic2V0QXZhdGFyVXJsIiwic2VuZFN0YXRlRXZlbnQiLCJyb29tTmFtZSIsIm9wZW5Sb29tU2V0dGluZ3MiLCJldmVudCIsInByZXZlbnREZWZhdWx0IiwiaW5pdGlhbF90YWJfaWQiLCJSb29tU2V0dGluZ3NUYWIiLCJTZWN1cml0eSIsInN1YlRleHQiLCJzdWJCdXR0b24iLCJtYXlDbGllbnRTZW5kU3RhdGVFdmVudCIsIlJvb21FbmNyeXB0aW9uIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsInN1YnRpdGxlIiwidGl0bGUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9yb29tcy9OZXdSb29tSW50cm8udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwLCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBFdmVudFR5cGUsIFJvb20sIFVzZXIsIE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEtub3duTWVtYmVyc2hpcCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy90eXBlc1wiO1xuXG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IFJvb21Db250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IERNUm9vbU1hcCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvRE1Sb29tTWFwXCI7XG5pbXBvcnQgeyBfdCwgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uLCB7IEJ1dHRvbkV2ZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBNaW5pQXZhdGFyVXBsb2FkZXIsIHsgQVZBVEFSX1NJWkUgfSBmcm9tIFwiLi4vZWxlbWVudHMvTWluaUF2YXRhclVwbG9hZGVyXCI7XG5pbXBvcnQgUm9vbUF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9Sb29tQXZhdGFyXCI7XG5pbXBvcnQgZGVmYXVsdERpc3BhdGNoZXIgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgVmlld1VzZXJQYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHMvVmlld1VzZXJQYXlsb2FkXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgU3BhY2VTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3NwYWNlcy9TcGFjZVN0b3JlXCI7XG5pbXBvcnQgeyBzaG93U3BhY2VJbnZpdGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvc3BhY2VcIjtcbmltcG9ydCBFdmVudFRpbGVCdWJibGUgZnJvbSBcIi4uL21lc3NhZ2VzL0V2ZW50VGlsZUJ1YmJsZVwiO1xuaW1wb3J0IHsgUm9vbVNldHRpbmdzVGFiIH0gZnJvbSBcIi4uL2RpYWxvZ3MvUm9vbVNldHRpbmdzRGlhbG9nXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBzaG91bGRTaG93Q29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2N1c3RvbWlzYXRpb25zL2hlbHBlcnMvVUlDb21wb25lbnRzXCI7XG5pbXBvcnQgeyBVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9VSUZlYXR1cmVcIjtcbmltcG9ydCB7IHByaXZhdGVTaG91bGRCZUVuY3J5cHRlZCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yb29tc1wiO1xuaW1wb3J0IHsgTG9jYWxSb29tIH0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy9Mb2NhbFJvb21cIjtcbmltcG9ydCB7IHNob3VsZEVuY3J5cHRSb29tV2l0aFNpbmdsZTNyZFBhcnR5SW52aXRlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jvb20vc2hvdWxkRW5jcnlwdFJvb21XaXRoU2luZ2xlM3JkUGFydHlJbnZpdGVcIjtcblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRFbmNyeXB0aW9uU2V0dGluZ3MobWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQsIHJvb206IFJvb20pOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0VuY3J5cHRlZDogYm9vbGVhbiA9IG1hdHJpeENsaWVudC5pc1Jvb21FbmNyeXB0ZWQocm9vbS5yb29tSWQpO1xuICAgIGNvbnN0IGlzUHVibGljOiBib29sZWFuID0gcm9vbS5nZXRKb2luUnVsZSgpID09PSBcInB1YmxpY1wiO1xuICAgIHJldHVybiBpc1B1YmxpYyB8fCAhcHJpdmF0ZVNob3VsZEJlRW5jcnlwdGVkKG1hdHJpeENsaWVudCkgfHwgaXNFbmNyeXB0ZWQ7XG59XG5cbmNvbnN0IGRldGVybWluZUludHJvTWVzc2FnZSA9IChyb29tOiBSb29tLCBlbmNyeXB0ZWRTaW5nbGUzcmRQYXJ0eUludml0ZTogYm9vbGVhbik6IFRyYW5zbGF0aW9uS2V5ID0+IHtcbiAgICBpZiAocm9vbSBpbnN0YW5jZW9mIExvY2FsUm9vbSkge1xuICAgICAgICByZXR1cm4gX3RkKFwicm9vbXxpbnRyb3xzZW5kX21lc3NhZ2Vfc3RhcnRfZG1cIik7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRlZFNpbmdsZTNyZFBhcnR5SW52aXRlKSB7XG4gICAgICAgIHJldHVybiBfdGQoXCJyb29tfGludHJvfGVuY3J5cHRlZF8zcGlkX2RtX3BlbmRpbmdfam9pblwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RkKFwicm9vbXxpbnRyb3xzdGFydF9vZl9kbV9oaXN0b3J5XCIpO1xufTtcblxuY29uc3QgTmV3Um9vbUludHJvOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgICBjb25zdCBjbGkgPSB1c2VDb250ZXh0KE1hdHJpeENsaWVudENvbnRleHQpO1xuICAgIGNvbnN0IHsgcm9vbSwgcm9vbUlkIH0gPSB1c2VDb250ZXh0KFJvb21Db250ZXh0KTtcblxuICAgIGlmICghcm9vbSB8fCAhcm9vbUlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBjcmVhdGUgYSBOZXdSb29tSW50cm8gd2l0aG91dCByb29tIGFuZCByb29tSWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaXNMb2NhbFJvb20gPSByb29tIGluc3RhbmNlb2YgTG9jYWxSb29tO1xuICAgIGNvbnN0IGRtUGFydG5lciA9IGlzTG9jYWxSb29tID8gcm9vbS50YXJnZXRzWzBdPy51c2VySWQgOiBETVJvb21NYXAuc2hhcmVkKCkuZ2V0VXNlcklkRm9yUm9vbUlkKHJvb21JZCk7XG5cbiAgICBsZXQgYm9keTogSlNYLkVsZW1lbnQ7XG4gICAgaWYgKGRtUGFydG5lcikge1xuICAgICAgICBjb25zdCB7IHNob3VsZEVuY3J5cHQ6IGVuY3J5cHRlZFNpbmdsZTNyZFBhcnR5SW52aXRlIH0gPSBzaG91bGRFbmNyeXB0Um9vbVdpdGhTaW5nbGUzcmRQYXJ0eUludml0ZShyb29tKTtcbiAgICAgICAgY29uc3QgaW50cm9NZXNzYWdlID0gZGV0ZXJtaW5lSW50cm9NZXNzYWdlKHJvb20sIGVuY3J5cHRlZFNpbmdsZTNyZFBhcnR5SW52aXRlKTtcbiAgICAgICAgbGV0IGNhcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKHJvb20gaW5zdGFuY2VvZiBMb2NhbFJvb20pICYmXG4gICAgICAgICAgICAhZW5jcnlwdGVkU2luZ2xlM3JkUGFydHlJbnZpdGUgJiZcbiAgICAgICAgICAgIHJvb20uZ2V0Sm9pbmVkTWVtYmVyQ291bnQoKSArIHJvb20uZ2V0SW52aXRlZE1lbWJlckNvdW50KCkgPT09IDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjYXB0aW9uID0gX3QoXCJyb29tfGludHJvfGRtX2NhcHRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW1iZXIgPSByb29tPy5nZXRNZW1iZXIoZG1QYXJ0bmVyKTtcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSByb29tPy5uYW1lIHx8IG1lbWJlcj8ucmF3RGlzcGxheU5hbWUgfHwgZG1QYXJ0bmVyO1xuICAgICAgICBib2R5ID0gKFxuICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgIDxSb29tQXZhdGFyXG4gICAgICAgICAgICAgICAgICAgIHJvb209e3Jvb219XG4gICAgICAgICAgICAgICAgICAgIHNpemU9e0FWQVRBUl9TSVpFfVxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaDxWaWV3VXNlclBheWxvYWQ+KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3VXNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IFdlIHNob3VsZCBiZSB1c2luZyBhIHJlYWwgbWVtYmVyIG9iamVjdCBhbmQgbm90IGFzc3VtaW5nIHdoYXQgdGhlIHJlY2VpdmVyIHdhbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcjogbWVtYmVyIHx8ICh7IHVzZXJJZDogZG1QYXJ0bmVyIH0gYXMgVXNlciksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgPGgyPntyb29tLm5hbWV9PC9oMj5cblxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogKCkgPT4gPHN0cm9uZz57ZGlzcGxheU5hbWV9PC9zdHJvbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAge2NhcHRpb24gJiYgPHA+e2NhcHRpb259PC9wPn1cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5Sb29tID0gcm9vbSAmJiByb29tLmdldE15TWVtYmVyc2hpcCgpID09PSBLbm93bk1lbWJlcnNoaXAuSm9pbjtcbiAgICAgICAgY29uc3QgdG9waWMgPSByb29tLmN1cnJlbnRTdGF0ZS5nZXRTdGF0ZUV2ZW50cyhFdmVudFR5cGUuUm9vbVRvcGljLCBcIlwiKT8uZ2V0Q29udGVudCgpPy50b3BpYztcbiAgICAgICAgY29uc3QgY2FuQWRkVG9waWMgPSBpblJvb20gJiYgcm9vbS5jdXJyZW50U3RhdGUubWF5U2VuZFN0YXRlRXZlbnQoRXZlbnRUeXBlLlJvb21Ub3BpYywgY2xpLmdldFNhZmVVc2VySWQoKSk7XG5cbiAgICAgICAgY29uc3Qgb25Ub3BpY0NsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwib3Blbl9yb29tX3NldHRpbmdzXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvb21faWQ6IHJvb21JZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gZm9jdXMgdGhlIHRvcGljIGZpZWxkIHRvIGhlbHAgdGhlIHVzZXIgZmluZCBpdCBhcyBpdCdsbCBnYWluIGFuIG91dGxpbmVcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInByb2ZpbGVUb3BpY1wiKT8uZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0b3BpY1RleHQ7XG4gICAgICAgIGlmIChjYW5BZGRUb3BpYyAmJiB0b3BpYykge1xuICAgICAgICAgICAgdG9waWNUZXh0ID0gX3QoXG4gICAgICAgICAgICAgICAgXCJyb29tfGludHJvfHRvcGljX2VkaXRcIixcbiAgICAgICAgICAgICAgICB7IHRvcGljIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhOiAoc3ViKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBlbGVtZW50PVwiYVwiIGtpbmQ9XCJsaW5rX2lubGluZVwiIG9uQ2xpY2s9e29uVG9waWNDbGlja30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Yn1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3BpYykge1xuICAgICAgICAgICAgdG9waWNUZXh0ID0gX3QoXCJyb29tfGludHJvfHRvcGljXCIsIHsgdG9waWMgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2FuQWRkVG9waWMpIHtcbiAgICAgICAgICAgIHRvcGljVGV4dCA9IF90KFxuICAgICAgICAgICAgICAgIFwicm9vbXxpbnRyb3xub190b3BpY1wiLFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYTogKHN1YikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gZWxlbWVudD1cImFcIiBraW5kPVwibGlua19pbmxpbmVcIiBvbkNsaWNrPXtvblRvcGljQ2xpY2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWJ9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcmVhdG9yID0gcm9vbS5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoRXZlbnRUeXBlLlJvb21DcmVhdGUsIFwiXCIpPy5nZXRTZW5kZXIoKTtcbiAgICAgICAgY29uc3QgY3JlYXRvck5hbWUgPSAoY3JlYXRvciAmJiByb29tPy5nZXRNZW1iZXIoY3JlYXRvcik/LnJhd0Rpc3BsYXlOYW1lKSB8fCBjcmVhdG9yO1xuXG4gICAgICAgIGxldCBjcmVhdGVkVGV4dDogc3RyaW5nO1xuICAgICAgICBpZiAoY3JlYXRvciA9PT0gY2xpLmdldFVzZXJJZCgpKSB7XG4gICAgICAgICAgICBjcmVhdGVkVGV4dCA9IF90KFwicm9vbXxpbnRyb3x5b3VfY3JlYXRlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyZWF0ZWRUZXh0ID0gX3QoXCJyb29tfGludHJvfHVzZXJfY3JlYXRlZFwiLCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGNyZWF0b3JOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50U3BhY2U6IFJvb20gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFNwYWNlU3RvcmUuaW5zdGFuY2UuYWN0aXZlU3BhY2VSb29tPy5jYW5JbnZpdGUoY2xpLmdldFNhZmVVc2VySWQoKSkgJiZcbiAgICAgICAgICAgIFNwYWNlU3RvcmUuaW5zdGFuY2UuaXNSb29tSW5TcGFjZShTcGFjZVN0b3JlLmluc3RhbmNlLmFjdGl2ZVNwYWNlISwgcm9vbS5yb29tSWQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcGFyZW50U3BhY2UgPSBTcGFjZVN0b3JlLmluc3RhbmNlLmFjdGl2ZVNwYWNlUm9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidXR0b25zOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHBhcmVudFNwYWNlICYmIHNob3VsZFNob3dDb21wb25lbnQoVUlDb21wb25lbnQuSW52aXRlVXNlcnMpKSB7XG4gICAgICAgICAgICBidXR0b25zID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTmV3Um9vbUludHJvX2J1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X05ld1Jvb21JbnRyb19pbnZpdGVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTcGFjZUludml0ZShwYXJlbnRTcGFjZSEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiaW52aXRlfHRvX3NwYWNlXCIsIHsgc3BhY2VOYW1lOiBwYXJlbnRTcGFjZS5uYW1lIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIHtyb29tLmNhbkludml0ZShjbGkuZ2V0U2FmZVVzZXJJZCgpKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X05ld1Jvb21JbnRyb19pbnZpdGVCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9XCJwcmltYXJ5X291dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goeyBhY3Rpb246IFwidmlld19pbnZpdGVcIiwgcm9vbUlkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwicm9vbXxpbnRyb3xyb29tX2ludml0ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm9vbS5jYW5JbnZpdGUoY2xpLmdldFNhZmVVc2VySWQoKSkgJiYgc2hvdWxkU2hvd0NvbXBvbmVudChVSUNvbXBvbmVudC5JbnZpdGVVc2VycykpIHtcbiAgICAgICAgICAgIGJ1dHRvbnMgPSAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9OZXdSb29tSW50cm9fYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTmV3Um9vbUludHJvX2ludml0ZUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goeyBhY3Rpb246IFwidmlld19pbnZpdGVcIiwgcm9vbUlkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwicm9vbXxpbnZpdGVfdGhpc19yb29tXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXZhdGFyVXJsID0gcm9vbS5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoRXZlbnRUeXBlLlJvb21BdmF0YXIsIFwiXCIpPy5nZXRDb250ZW50KCk/LnVybDtcbiAgICAgICAgbGV0IGF2YXRhciA9IDxSb29tQXZhdGFyIHJvb209e3Jvb219IHNpemU9e0FWQVRBUl9TSVpFfSB2aWV3QXZhdGFyT25DbGljaz17ISFhdmF0YXJVcmx9IC8+O1xuXG4gICAgICAgIGlmICghYXZhdGFyVXJsKSB7XG4gICAgICAgICAgICBhdmF0YXIgPSAoXG4gICAgICAgICAgICAgICAgPE1pbmlBdmF0YXJVcGxvYWRlclxuICAgICAgICAgICAgICAgICAgICBoYXNBdmF0YXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBub0F2YXRhckxhYmVsPXtfdChcInJvb218aW50cm98bm9fYXZhdGFyX2xhYmVsXCIpfVxuICAgICAgICAgICAgICAgICAgICBzZXRBdmF0YXJVcmw9eyh1cmwpID0+IGNsaS5zZW5kU3RhdGVFdmVudChyb29tSWQsIEV2ZW50VHlwZS5Sb29tQXZhdGFyLCB7IHVybCB9LCBcIlwiKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHthdmF0YXJ9XG4gICAgICAgICAgICAgICAgPC9NaW5pQXZhdGFyVXBsb2FkZXI+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keSA9IChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7YXZhdGFyfVxuXG4gICAgICAgICAgICAgICAgPGgyPntyb29tLm5hbWV9PC9oMj5cblxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICB7Y3JlYXRlZFRleHR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInJvb218aW50cm98c3RhcnRfb2Zfcm9vbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbU5hbWU6ICgpID0+IDxzdHJvbmc+e3Jvb20ubmFtZX08L3N0cm9uZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cD57dG9waWNUZXh0fTwvcD5cbiAgICAgICAgICAgICAgICB7YnV0dG9uc31cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb3BlblJvb21TZXR0aW5ncyhldmVudDogQnV0dG9uRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgICAgICAgYWN0aW9uOiBcIm9wZW5fcm9vbV9zZXR0aW5nc1wiLFxuICAgICAgICAgICAgaW5pdGlhbF90YWJfaWQ6IFJvb21TZXR0aW5nc1RhYi5TZWN1cml0eSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViVGV4dCA9IF90KFwicm9vbXxpbnRyb3xwcml2YXRlX3VuZW5jcnlwdGVkX3dhcm5pbmdcIik7XG5cbiAgICBsZXQgc3ViQnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICAgIHJvb20uY3VycmVudFN0YXRlLm1heUNsaWVudFNlbmRTdGF0ZUV2ZW50KEV2ZW50VHlwZS5Sb29tRW5jcnlwdGlvbiwgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKSkgJiZcbiAgICAgICAgIWlzTG9jYWxSb29tXG4gICAgKSB7XG4gICAgICAgIHN1YkJ1dHRvbiA9IChcbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGtpbmQ9XCJsaW5rX2lubGluZVwiIG9uQ2xpY2s9e29wZW5Sb29tU2V0dGluZ3N9PlxuICAgICAgICAgICAgICAgIHtfdChcInJvb218aW50cm98ZW5hYmxlX2VuY3J5cHRpb25fcHJvbXB0XCIpfVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnRpdGxlID0gKFxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHtcIiBcIn1cbiAgICAgICAgICAgIHtzdWJUZXh0fSB7c3ViQnV0dG9ufXtcIiBcIn1cbiAgICAgICAgPC9zcGFuPlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8bGkgY2xhc3NOYW1lPVwibXhfTmV3Um9vbUludHJvXCI+XG4gICAgICAgICAgICB7IWhhc0V4cGVjdGVkRW5jcnlwdGlvblNldHRpbmdzKGNsaSwgcm9vbSkgJiYgKFxuICAgICAgICAgICAgICAgIDxFdmVudFRpbGVCdWJibGVcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfY3J5cHRvRXZlbnQgbXhfY3J5cHRvRXZlbnRfaWNvbl93YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwicm9vbXxpbnRyb3x1bmVuY3J5cHRlZF93YXJuaW5nXCIpfVxuICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZT17c3VidGl0bGV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHtib2R5fVxuICAgICAgICA8L2xpPlxuICAgICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOZXdSb29tSW50cm87XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxvQkFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU0sVUFBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBUyxt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