matrix-react-sdk
Version:
SDK for matrix.org using React
209 lines (207 loc) • 39.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.ThreadPanelHeaderFilterOptionItem = exports.ThreadPanelHeader = exports.ThreadFilterType = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _compoundWeb = require("@vector-im/compound-web");
var _logger = require("matrix-js-sdk/src/logger");
var _threads = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/threads"));
var _checkAll = require("../../../res/img/element-icons/check-all.svg");
var _BaseCard = _interopRequireDefault(require("../views/right_panel/BaseCard"));
var _MatrixClientContext = _interopRequireWildcard(require("../../contexts/MatrixClientContext"));
var _languageHandler = require("../../languageHandler");
var _ContextMenuButton = require("../../accessibility/context_menu/ContextMenuButton");
var _ContextMenu = _interopRequireWildcard(require("./ContextMenu"));
var _RoomContext = _interopRequireWildcard(require("../../contexts/RoomContext"));
var _TimelinePanel = _interopRequireDefault(require("./TimelinePanel"));
var _Layout = require("../../settings/enums/Layout");
var _Measured = _interopRequireDefault(require("../views/elements/Measured"));
var _PosthogTrackers = _interopRequireDefault(require("../../PosthogTrackers"));
var _Spinner = _interopRequireDefault(require("../views/elements/Spinner"));
var _notifications = require("../../utils/notifications");
var _EmptyState = _interopRequireDefault(require("../views/right_panel/EmptyState"));
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; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /*
Copyright 2024 New Vector Ltd.
Copyright 2021-2023 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.
*/
let ThreadFilterType = exports.ThreadFilterType = /*#__PURE__*/function (ThreadFilterType) {
ThreadFilterType[ThreadFilterType["My"] = 0] = "My";
ThreadFilterType[ThreadFilterType["All"] = 1] = "All";
return ThreadFilterType;
}({});
const ThreadPanelHeaderFilterOptionItem = ({
label,
description,
onClick,
isSelected
}) => {
return /*#__PURE__*/_react.default.createElement(_ContextMenu.MenuItemRadio, {
active: isSelected,
className: "mx_ThreadPanel_Header_FilterOptionItem",
onClick: onClick
}, /*#__PURE__*/_react.default.createElement("span", null, label), /*#__PURE__*/_react.default.createElement("span", null, description));
};
exports.ThreadPanelHeaderFilterOptionItem = ThreadPanelHeaderFilterOptionItem;
const ThreadPanelHeader = ({
filterOption,
setFilterOption
}) => {
const mxClient = (0, _MatrixClientContext.useMatrixClientContext)();
const roomContext = (0, _RoomContext.useRoomContext)();
const [menuDisplayed, button, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)();
const options = [{
label: (0, _languageHandler._t)("threads|all_threads"),
description: (0, _languageHandler._t)("threads|all_threads_description"),
key: ThreadFilterType.All
}, {
label: (0, _languageHandler._t)("threads|my_threads"),
description: (0, _languageHandler._t)("threads|my_threads_description"),
key: ThreadFilterType.My
}];
const value = options.find(option => option.key === filterOption);
const contextMenuOptions = options.map(opt => /*#__PURE__*/_react.default.createElement(ThreadPanelHeaderFilterOptionItem, {
key: opt.key,
label: opt.label,
description: opt.description,
onClick: () => {
setFilterOption(opt.key);
closeMenu();
},
isSelected: opt === value
}));
const contextMenu = menuDisplayed ? /*#__PURE__*/_react.default.createElement(_ContextMenu.default, {
top: 108,
right: 33,
onFinished: closeMenu,
chevronFace: _ContextMenu.ChevronFace.Top,
wrapperClassName: "mx_BaseCard_header_title"
}, contextMenuOptions) : null;
const onMarkAllThreadsReadClick = _react.default.useCallback(e => {
_PosthogTrackers.default.trackInteraction("WebThreadsMarkAllReadButton", e);
if (!roomContext.room) {
_logger.logger.error("No room in context to mark all threads read");
return;
}
// This actually clears all room notifications by sending an unthreaded read receipt.
// We'd have to loop over all unread threads (pagninating back to find any we don't
// know about yet) and send threaded receipts for all of them... or implement a
// specific API for it. In practice, the user will have to be viewing the room to
// see this button, so will have marked the room itself read anyway.
(0, _notifications.clearRoomNotification)(roomContext.room, mxClient).catch(e => {
_logger.logger.error("Failed to mark all threads read", e);
});
}, [roomContext.room, mxClient]);
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_BaseCard_header_title"
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.Tooltip, {
label: (0, _languageHandler._t)("threads|mark_all_read")
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.IconButton, {
onClick: onMarkAllThreadsReadClick,
size: "24px"
}, /*#__PURE__*/_react.default.createElement(_checkAll.Icon, null))), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ThreadPanel_vertical_separator"
}), /*#__PURE__*/_react.default.createElement(_ContextMenuButton.ContextMenuButton, {
className: "mx_ThreadPanel_dropdown",
ref: button,
isExpanded: menuDisplayed,
onClick: ev => {
openMenu();
_PosthogTrackers.default.trackInteraction("WebRightPanelThreadPanelFilterDropdown", ev);
}
}, `${(0, _languageHandler._t)("threads|show_thread_filter")} ${value?.label}`), contextMenu);
};
exports.ThreadPanelHeader = ThreadPanelHeader;
const ThreadPanel = ({
roomId,
onClose,
permalinkCreator
}) => {
const mxClient = (0, _react.useContext)(_MatrixClientContext.default);
const roomContext = (0, _react.useContext)(_RoomContext.default);
const timelinePanel = (0, _react.useRef)(null);
const card = (0, _react.useRef)(null);
const closeButonRef = (0, _react.useRef)(null);
const [filterOption, setFilterOption] = (0, _react.useState)(ThreadFilterType.All);
const [room, setRoom] = (0, _react.useState)(null);
const [narrow, setNarrow] = (0, _react.useState)(false);
const timelineSet = filterOption === ThreadFilterType.My ? room?.threadsTimelineSets[1] : room?.threadsTimelineSets[0];
const hasThreads = Boolean(room?.threadsTimelineSets?.[0]?.getLiveTimeline()?.getEvents()?.length);
(0, _react.useEffect)(() => {
const room = mxClient.getRoom(roomId);
room?.createThreadsTimelineSets().then(() => room.fetchRoomThreads()).then(() => {
setFilterOption(ThreadFilterType.All);
setRoom(room);
});
}, [mxClient, roomId]);
(0, _react.useEffect)(() => {
if (timelineSet && !_matrix.Thread.hasServerSideSupport) {
timelinePanel.current?.refreshTimeline();
}
}, [timelineSet, timelinePanel]);
return /*#__PURE__*/_react.default.createElement(_RoomContext.default.Provider, {
value: _objectSpread(_objectSpread({}, roomContext), {}, {
timelineRenderingType: _RoomContext.TimelineRenderingType.ThreadsList,
showHiddenEvents: true,
narrow
})
}, /*#__PURE__*/_react.default.createElement(_BaseCard.default, {
header: hasThreads && /*#__PURE__*/_react.default.createElement(ThreadPanelHeader, {
filterOption: filterOption,
setFilterOption: setFilterOption
}),
id: "thread-panel",
className: "mx_ThreadPanel",
ariaLabelledBy: "thread-panel-tab",
role: "tabpanel",
onClose: onClose,
withoutScrollContainer: true,
ref: card,
closeButtonRef: closeButonRef
}, card.current && /*#__PURE__*/_react.default.createElement(_Measured.default, {
sensor: card.current,
onMeasurement: setNarrow
}), timelineSet ? /*#__PURE__*/_react.default.createElement(_TimelinePanel.default, {
key: filterOption + ":" + (timelineSet.getFilter()?.filterId ?? roomId),
ref: timelinePanel,
showReadReceipts: false // No RR support in thread's list
,
manageReadReceipts: false // No RR support in thread's list
,
manageReadMarkers: false // No RM support in thread's list
,
sendReadReceiptOnLoad: false // No RR support in thread's list
,
timelineSet: timelineSet,
showUrlPreview: false // No URL previews at the threads list level
,
empty: /*#__PURE__*/_react.default.createElement(_EmptyState.default, {
Icon: _threads.default,
title: (0, _languageHandler._t)("threads|empty_title"),
description: (0, _languageHandler._t)("threads|empty_description", {
replyInThread: (0, _languageHandler._t)("action|reply_in_thread")
})
}),
alwaysShowTimestamps: true,
layout: _Layout.Layout.Group,
hideThreadedMessages: false,
hidden: false,
showReactions: false,
className: "mx_RoomView_messagePanel",
membersLoaded: true,
permalinkCreator: permalinkCreator,
disableGrouping: true
}) : /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AutoHideScrollbar"
}, /*#__PURE__*/_react.default.createElement(_Spinner.default, null))));
};
var _default = exports.default = ThreadPanel;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2NvbXBvdW5kV2ViIiwiX2xvZ2dlciIsIl90aHJlYWRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jaGVja0FsbCIsIl9CYXNlQ2FyZCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Db250ZXh0TWVudUJ1dHRvbiIsIl9Db250ZXh0TWVudSIsIl9Sb29tQ29udGV4dCIsIl9UaW1lbGluZVBhbmVsIiwiX0xheW91dCIsIl9NZWFzdXJlZCIsIl9Qb3N0aG9nVHJhY2tlcnMiLCJfU3Bpbm5lciIsIl9ub3RpZmljYXRpb25zIiwiX0VtcHR5U3RhdGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJUaHJlYWRGaWx0ZXJUeXBlIiwiZXhwb3J0cyIsIlRocmVhZFBhbmVsSGVhZGVyRmlsdGVyT3B0aW9uSXRlbSIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJvbkNsaWNrIiwiaXNTZWxlY3RlZCIsImNyZWF0ZUVsZW1lbnQiLCJNZW51SXRlbVJhZGlvIiwiYWN0aXZlIiwiY2xhc3NOYW1lIiwiVGhyZWFkUGFuZWxIZWFkZXIiLCJmaWx0ZXJPcHRpb24iLCJzZXRGaWx0ZXJPcHRpb24iLCJteENsaWVudCIsInVzZU1hdHJpeENsaWVudENvbnRleHQiLCJyb29tQ29udGV4dCIsInVzZVJvb21Db250ZXh0IiwibWVudURpc3BsYXllZCIsImJ1dHRvbiIsIm9wZW5NZW51IiwiY2xvc2VNZW51IiwidXNlQ29udGV4dE1lbnUiLCJvcHRpb25zIiwiX3QiLCJrZXkiLCJBbGwiLCJNeSIsInZhbHVlIiwiZmluZCIsIm9wdGlvbiIsImNvbnRleHRNZW51T3B0aW9ucyIsIm1hcCIsIm9wdCIsImNvbnRleHRNZW51IiwidG9wIiwicmlnaHQiLCJvbkZpbmlzaGVkIiwiY2hldnJvbkZhY2UiLCJDaGV2cm9uRmFjZSIsIlRvcCIsIndyYXBwZXJDbGFzc05hbWUiLCJvbk1hcmtBbGxUaHJlYWRzUmVhZENsaWNrIiwiUmVhY3QiLCJ1c2VDYWxsYmFjayIsIlBvc3Rob2dUcmFja2VycyIsInRyYWNrSW50ZXJhY3Rpb24iLCJyb29tIiwibG9nZ2VyIiwiZXJyb3IiLCJjbGVhclJvb21Ob3RpZmljYXRpb24iLCJjYXRjaCIsIlRvb2x0aXAiLCJJY29uQnV0dG9uIiwic2l6ZSIsIkljb24iLCJDb250ZXh0TWVudUJ1dHRvbiIsInJlZiIsImlzRXhwYW5kZWQiLCJldiIsIlRocmVhZFBhbmVsIiwicm9vbUlkIiwib25DbG9zZSIsInBlcm1hbGlua0NyZWF0b3IiLCJ1c2VDb250ZXh0IiwiTWF0cml4Q2xpZW50Q29udGV4dCIsIlJvb21Db250ZXh0IiwidGltZWxpbmVQYW5lbCIsInVzZVJlZiIsImNhcmQiLCJjbG9zZUJ1dG9uUmVmIiwidXNlU3RhdGUiLCJzZXRSb29tIiwibmFycm93Iiwic2V0TmFycm93IiwidGltZWxpbmVTZXQiLCJ0aHJlYWRzVGltZWxpbmVTZXRzIiwiaGFzVGhyZWFkcyIsIkJvb2xlYW4iLCJnZXRMaXZlVGltZWxpbmUiLCJnZXRFdmVudHMiLCJ1c2VFZmZlY3QiLCJnZXRSb29tIiwiY3JlYXRlVGhyZWFkc1RpbWVsaW5lU2V0cyIsInRoZW4iLCJmZXRjaFJvb21UaHJlYWRzIiwiVGhyZWFkIiwiaGFzU2VydmVyU2lkZVN1cHBvcnQiLCJjdXJyZW50IiwicmVmcmVzaFRpbWVsaW5lIiwiUHJvdmlkZXIiLCJ0aW1lbGluZVJlbmRlcmluZ1R5cGUiLCJUaW1lbGluZVJlbmRlcmluZ1R5cGUiLCJUaHJlYWRzTGlzdCIsInNob3dIaWRkZW5FdmVudHMiLCJoZWFkZXIiLCJpZCIsImFyaWFMYWJlbGxlZEJ5Iiwicm9sZSIsIndpdGhvdXRTY3JvbGxDb250YWluZXIiLCJjbG9zZUJ1dHRvblJlZiIsInNlbnNvciIsIm9uTWVhc3VyZW1lbnQiLCJnZXRGaWx0ZXIiLCJmaWx0ZXJJZCIsInNob3dSZWFkUmVjZWlwdHMiLCJtYW5hZ2VSZWFkUmVjZWlwdHMiLCJtYW5hZ2VSZWFkTWFya2VycyIsInNlbmRSZWFkUmVjZWlwdE9uTG9hZCIsInNob3dVcmxQcmV2aWV3IiwiZW1wdHkiLCJUaHJlYWRzSWNvbiIsInRpdGxlIiwicmVwbHlJblRocmVhZCIsImFsd2F5c1Nob3dUaW1lc3RhbXBzIiwibGF5b3V0IiwiTGF5b3V0IiwiR3JvdXAiLCJoaWRlVGhyZWFkZWRNZXNzYWdlcyIsImhpZGRlbiIsInNob3dSZWFjdGlvbnMiLCJtZW1iZXJzTG9hZGVkIiwiZGlzYWJsZUdyb3VwaW5nIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zdHJ1Y3R1cmVzL1RocmVhZFBhbmVsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMS0yMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IE9wdGlvbmFsIH0gZnJvbSBcIm1hdHJpeC1ldmVudHMtc2RrXCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBFdmVudFRpbWVsaW5lU2V0LCBSb29tLCBUaHJlYWQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBJY29uQnV0dG9uLCBUb29sdGlwIH0gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtd2ViXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgVGhyZWFkc0ljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL3RocmVhZHNcIjtcblxuaW1wb3J0IHsgSWNvbiBhcyBNYXJrQWxsVGhyZWFkc1JlYWRJY29uIH0gZnJvbSBcIi4uLy4uLy4uL3Jlcy9pbWcvZWxlbWVudC1pY29ucy9jaGVjay1hbGwuc3ZnXCI7XG5pbXBvcnQgQmFzZUNhcmQgZnJvbSBcIi4uL3ZpZXdzL3JpZ2h0X3BhbmVsL0Jhc2VDYXJkXCI7XG5pbXBvcnQgUmVzaXplTm90aWZpZXIgZnJvbSBcIi4uLy4uL3V0aWxzL1Jlc2l6ZU5vdGlmaWVyXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCwgeyB1c2VNYXRyaXhDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVCdXR0b24gfSBmcm9tIFwiLi4vLi4vYWNjZXNzaWJpbGl0eS9jb250ZXh0X21lbnUvQ29udGV4dE1lbnVCdXR0b25cIjtcbmltcG9ydCBDb250ZXh0TWVudSwgeyBDaGV2cm9uRmFjZSwgTWVudUl0ZW1SYWRpbywgdXNlQ29udGV4dE1lbnUgfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IFJvb21Db250ZXh0LCB7IFRpbWVsaW5lUmVuZGVyaW5nVHlwZSwgdXNlUm9vbUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vY29udGV4dHMvUm9vbUNvbnRleHRcIjtcbmltcG9ydCBUaW1lbGluZVBhbmVsIGZyb20gXCIuL1RpbWVsaW5lUGFuZWxcIjtcbmltcG9ydCB7IExheW91dCB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9lbnVtcy9MYXlvdXRcIjtcbmltcG9ydCB7IFJvb21QZXJtYWxpbmtDcmVhdG9yIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Blcm1hbGlua3MvUGVybWFsaW5rc1wiO1xuaW1wb3J0IE1lYXN1cmVkIGZyb20gXCIuLi92aWV3cy9lbGVtZW50cy9NZWFzdXJlZFwiO1xuaW1wb3J0IFBvc3Rob2dUcmFja2VycyBmcm9tIFwiLi4vLi4vUG9zdGhvZ1RyYWNrZXJzXCI7XG5pbXBvcnQgeyBCdXR0b25FdmVudCB9IGZyb20gXCIuLi92aWV3cy9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgU3Bpbm5lciBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvU3Bpbm5lclwiO1xuaW1wb3J0IHsgY2xlYXJSb29tTm90aWZpY2F0aW9uIH0gZnJvbSBcIi4uLy4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcbmltcG9ydCBFbXB0eVN0YXRlIGZyb20gXCIuLi92aWV3cy9yaWdodF9wYW5lbC9FbXB0eVN0YXRlXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHJvb21JZDogc3RyaW5nO1xuICAgIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gICAgcmVzaXplTm90aWZpZXI6IFJlc2l6ZU5vdGlmaWVyO1xuICAgIHBlcm1hbGlua0NyZWF0b3I6IFJvb21QZXJtYWxpbmtDcmVhdG9yO1xufVxuXG5leHBvcnQgZW51bSBUaHJlYWRGaWx0ZXJUeXBlIHtcbiAgICBcIk15XCIsXG4gICAgXCJBbGxcIixcbn1cblxudHlwZSBUaHJlYWRQYW5lbEhlYWRlck9wdGlvbiA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAga2V5OiBUaHJlYWRGaWx0ZXJUeXBlO1xufTtcblxuZXhwb3J0IGNvbnN0IFRocmVhZFBhbmVsSGVhZGVyRmlsdGVyT3B0aW9uSXRlbTogUmVhY3QuRkM8XG4gICAgVGhyZWFkUGFuZWxIZWFkZXJPcHRpb24gJiB7XG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XG4gICAgICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgfVxuPiA9ICh7IGxhYmVsLCBkZXNjcmlwdGlvbiwgb25DbGljaywgaXNTZWxlY3RlZCB9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPE1lbnVJdGVtUmFkaW8gYWN0aXZlPXtpc1NlbGVjdGVkfSBjbGFzc05hbWU9XCJteF9UaHJlYWRQYW5lbF9IZWFkZXJfRmlsdGVyT3B0aW9uSXRlbVwiIG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgICAgICAgPHNwYW4+e2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPntkZXNjcmlwdGlvbn08L3NwYW4+XG4gICAgICAgIDwvTWVudUl0ZW1SYWRpbz5cbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFRocmVhZFBhbmVsSGVhZGVyOiBSZWFjdC5GQzx7XG4gICAgZmlsdGVyT3B0aW9uOiBUaHJlYWRGaWx0ZXJUeXBlO1xuICAgIHNldEZpbHRlck9wdGlvbjogKGZpbHRlck9wdGlvbjogVGhyZWFkRmlsdGVyVHlwZSkgPT4gdm9pZDtcbn0+ID0gKHsgZmlsdGVyT3B0aW9uLCBzZXRGaWx0ZXJPcHRpb24gfSkgPT4ge1xuICAgIGNvbnN0IG14Q2xpZW50ID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuICAgIGNvbnN0IHJvb21Db250ZXh0ID0gdXNlUm9vbUNvbnRleHQoKTtcbiAgICBjb25zdCBbbWVudURpc3BsYXllZCwgYnV0dG9uLCBvcGVuTWVudSwgY2xvc2VNZW51XSA9IHVzZUNvbnRleHRNZW51PEhUTUxFbGVtZW50PigpO1xuICAgIGNvbnN0IG9wdGlvbnM6IHJlYWRvbmx5IFRocmVhZFBhbmVsSGVhZGVyT3B0aW9uW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBfdChcInRocmVhZHN8YWxsX3RocmVhZHNcIiksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXCJ0aHJlYWRzfGFsbF90aHJlYWRzX2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAga2V5OiBUaHJlYWRGaWx0ZXJUeXBlLkFsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IF90KFwidGhyZWFkc3xteV90aHJlYWRzXCIpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFwidGhyZWFkc3xteV90aHJlYWRzX2Rlc2NyaXB0aW9uXCIpLFxuICAgICAgICAgICAga2V5OiBUaHJlYWRGaWx0ZXJUeXBlLk15LFxuICAgICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24ua2V5ID09PSBmaWx0ZXJPcHRpb24pO1xuICAgIGNvbnN0IGNvbnRleHRNZW51T3B0aW9ucyA9IG9wdGlvbnMubWFwKChvcHQpID0+IChcbiAgICAgICAgPFRocmVhZFBhbmVsSGVhZGVyRmlsdGVyT3B0aW9uSXRlbVxuICAgICAgICAgICAga2V5PXtvcHQua2V5fVxuICAgICAgICAgICAgbGFiZWw9e29wdC5sYWJlbH1cbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtvcHQuZGVzY3JpcHRpb259XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0RmlsdGVyT3B0aW9uKG9wdC5rZXkpO1xuICAgICAgICAgICAgICAgIGNsb3NlTWVudSgpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ9e29wdCA9PT0gdmFsdWV9XG4gICAgICAgIC8+XG4gICAgKSk7XG4gICAgY29uc3QgY29udGV4dE1lbnUgPSBtZW51RGlzcGxheWVkID8gKFxuICAgICAgICA8Q29udGV4dE1lbnVcbiAgICAgICAgICAgIHRvcD17MTA4fVxuICAgICAgICAgICAgcmlnaHQ9ezMzfVxuICAgICAgICAgICAgb25GaW5pc2hlZD17Y2xvc2VNZW51fVxuICAgICAgICAgICAgY2hldnJvbkZhY2U9e0NoZXZyb25GYWNlLlRvcH1cbiAgICAgICAgICAgIHdyYXBwZXJDbGFzc05hbWU9XCJteF9CYXNlQ2FyZF9oZWFkZXJfdGl0bGVcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7Y29udGV4dE1lbnVPcHRpb25zfVxuICAgICAgICA8L0NvbnRleHRNZW51PlxuICAgICkgOiBudWxsO1xuXG4gICAgY29uc3Qgb25NYXJrQWxsVGhyZWFkc1JlYWRDbGljayA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgUG9zdGhvZ1RyYWNrZXJzLnRyYWNrSW50ZXJhY3Rpb24oXCJXZWJUaHJlYWRzTWFya0FsbFJlYWRCdXR0b25cIiwgZSk7XG4gICAgICAgICAgICBpZiAoIXJvb21Db250ZXh0LnJvb20pIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJObyByb29tIGluIGNvbnRleHQgdG8gbWFyayBhbGwgdGhyZWFkcyByZWFkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgYWN0dWFsbHkgY2xlYXJzIGFsbCByb29tIG5vdGlmaWNhdGlvbnMgYnkgc2VuZGluZyBhbiB1bnRocmVhZGVkIHJlYWQgcmVjZWlwdC5cbiAgICAgICAgICAgIC8vIFdlJ2QgaGF2ZSB0byBsb29wIG92ZXIgYWxsIHVucmVhZCB0aHJlYWRzIChwYWduaW5hdGluZyBiYWNrIHRvIGZpbmQgYW55IHdlIGRvbid0XG4gICAgICAgICAgICAvLyBrbm93IGFib3V0IHlldCkgYW5kIHNlbmQgdGhyZWFkZWQgcmVjZWlwdHMgZm9yIGFsbCBvZiB0aGVtLi4uIG9yIGltcGxlbWVudCBhXG4gICAgICAgICAgICAvLyBzcGVjaWZpYyBBUEkgZm9yIGl0LiBJbiBwcmFjdGljZSwgdGhlIHVzZXIgd2lsbCBoYXZlIHRvIGJlIHZpZXdpbmcgdGhlIHJvb20gdG9cbiAgICAgICAgICAgIC8vIHNlZSB0aGlzIGJ1dHRvbiwgc28gd2lsbCBoYXZlIG1hcmtlZCB0aGUgcm9vbSBpdHNlbGYgcmVhZCBhbnl3YXkuXG4gICAgICAgICAgICBjbGVhclJvb21Ob3RpZmljYXRpb24ocm9vbUNvbnRleHQucm9vbSwgbXhDbGllbnQpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRmFpbGVkIHRvIG1hcmsgYWxsIHRocmVhZHMgcmVhZFwiLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBbcm9vbUNvbnRleHQucm9vbSwgbXhDbGllbnRdLFxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0Jhc2VDYXJkX2hlYWRlcl90aXRsZVwiPlxuICAgICAgICAgICAgPFRvb2x0aXAgbGFiZWw9e190KFwidGhyZWFkc3xtYXJrX2FsbF9yZWFkXCIpfT5cbiAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvbiBvbkNsaWNrPXtvbk1hcmtBbGxUaHJlYWRzUmVhZENsaWNrfSBzaXplPVwiMjRweFwiPlxuICAgICAgICAgICAgICAgICAgICA8TWFya0FsbFRocmVhZHNSZWFkSWNvbiAvPlxuICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVGhyZWFkUGFuZWxfdmVydGljYWxfc2VwYXJhdG9yXCIgLz5cbiAgICAgICAgICAgIDxDb250ZXh0TWVudUJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1RocmVhZFBhbmVsX2Ryb3Bkb3duXCJcbiAgICAgICAgICAgICAgICByZWY9e2J1dHRvbn1cbiAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXttZW51RGlzcGxheWVkfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhldjogQnV0dG9uRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3Blbk1lbnUoKTtcbiAgICAgICAgICAgICAgICAgICAgUG9zdGhvZ1RyYWNrZXJzLnRyYWNrSW50ZXJhY3Rpb24oXCJXZWJSaWdodFBhbmVsVGhyZWFkUGFuZWxGaWx0ZXJEcm9wZG93blwiLCBldik7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7YCR7X3QoXCJ0aHJlYWRzfHNob3dfdGhyZWFkX2ZpbHRlclwiKX0gJHt2YWx1ZT8ubGFiZWx9YH1cbiAgICAgICAgICAgIDwvQ29udGV4dE1lbnVCdXR0b24+XG4gICAgICAgICAgICB7Y29udGV4dE1lbnV9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5jb25zdCBUaHJlYWRQYW5lbDogUmVhY3QuRkM8SVByb3BzPiA9ICh7IHJvb21JZCwgb25DbG9zZSwgcGVybWFsaW5rQ3JlYXRvciB9KSA9PiB7XG4gICAgY29uc3QgbXhDbGllbnQgPSB1c2VDb250ZXh0KE1hdHJpeENsaWVudENvbnRleHQpO1xuICAgIGNvbnN0IHJvb21Db250ZXh0ID0gdXNlQ29udGV4dChSb29tQ29udGV4dCk7XG4gICAgY29uc3QgdGltZWxpbmVQYW5lbCA9IHVzZVJlZjxUaW1lbGluZVBhbmVsIHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgY2FyZCA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IGNsb3NlQnV0b25SZWYgPSB1c2VSZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICAgIGNvbnN0IFtmaWx0ZXJPcHRpb24sIHNldEZpbHRlck9wdGlvbl0gPSB1c2VTdGF0ZTxUaHJlYWRGaWx0ZXJUeXBlPihUaHJlYWRGaWx0ZXJUeXBlLkFsbCk7XG4gICAgY29uc3QgW3Jvb20sIHNldFJvb21dID0gdXNlU3RhdGU8Um9vbSB8IG51bGw+KG51bGwpO1xuICAgIGNvbnN0IFtuYXJyb3csIHNldE5hcnJvd10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgICBjb25zdCB0aW1lbGluZVNldDogT3B0aW9uYWw8RXZlbnRUaW1lbGluZVNldD4gPVxuICAgICAgICBmaWx0ZXJPcHRpb24gPT09IFRocmVhZEZpbHRlclR5cGUuTXkgPyByb29tPy50aHJlYWRzVGltZWxpbmVTZXRzWzFdIDogcm9vbT8udGhyZWFkc1RpbWVsaW5lU2V0c1swXTtcbiAgICBjb25zdCBoYXNUaHJlYWRzID0gQm9vbGVhbihyb29tPy50aHJlYWRzVGltZWxpbmVTZXRzPy5bMF0/LmdldExpdmVUaW1lbGluZSgpPy5nZXRFdmVudHMoKT8ubGVuZ3RoKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb20gPSBteENsaWVudC5nZXRSb29tKHJvb21JZCk7XG4gICAgICAgIHJvb21cbiAgICAgICAgICAgID8uY3JlYXRlVGhyZWFkc1RpbWVsaW5lU2V0cygpXG4gICAgICAgICAgICAudGhlbigoKSA9PiByb29tLmZldGNoUm9vbVRocmVhZHMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRGaWx0ZXJPcHRpb24oVGhyZWFkRmlsdGVyVHlwZS5BbGwpO1xuICAgICAgICAgICAgICAgIHNldFJvb20ocm9vbSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LCBbbXhDbGllbnQsIHJvb21JZF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHRpbWVsaW5lU2V0ICYmICFUaHJlYWQuaGFzU2VydmVyU2lkZVN1cHBvcnQpIHtcbiAgICAgICAgICAgIHRpbWVsaW5lUGFuZWwuY3VycmVudD8ucmVmcmVzaFRpbWVsaW5lKCk7XG4gICAgICAgIH1cbiAgICB9LCBbdGltZWxpbmVTZXQsIHRpbWVsaW5lUGFuZWxdKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxSb29tQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgICAgdmFsdWU9e3tcbiAgICAgICAgICAgICAgICAuLi5yb29tQ29udGV4dCxcbiAgICAgICAgICAgICAgICB0aW1lbGluZVJlbmRlcmluZ1R5cGU6IFRpbWVsaW5lUmVuZGVyaW5nVHlwZS5UaHJlYWRzTGlzdCxcbiAgICAgICAgICAgICAgICBzaG93SGlkZGVuRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5hcnJvdyxcbiAgICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICAgIDxCYXNlQ2FyZFxuICAgICAgICAgICAgICAgIGhlYWRlcj17XG4gICAgICAgICAgICAgICAgICAgIGhhc1RocmVhZHMgJiYgPFRocmVhZFBhbmVsSGVhZGVyIGZpbHRlck9wdGlvbj17ZmlsdGVyT3B0aW9ufSBzZXRGaWx0ZXJPcHRpb249e3NldEZpbHRlck9wdGlvbn0gLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWQ9XCJ0aHJlYWQtcGFuZWxcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1RocmVhZFBhbmVsXCJcbiAgICAgICAgICAgICAgICBhcmlhTGFiZWxsZWRCeT1cInRocmVhZC1wYW5lbC10YWJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJ0YWJwYW5lbFwiXG4gICAgICAgICAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgICAgICAgICB3aXRob3V0U2Nyb2xsQ29udGFpbmVyPXt0cnVlfVxuICAgICAgICAgICAgICAgIHJlZj17Y2FyZH1cbiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvblJlZj17Y2xvc2VCdXRvblJlZn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y2FyZC5jdXJyZW50ICYmIDxNZWFzdXJlZCBzZW5zb3I9e2NhcmQuY3VycmVudH0gb25NZWFzdXJlbWVudD17c2V0TmFycm93fSAvPn1cbiAgICAgICAgICAgICAgICB7dGltZWxpbmVTZXQgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxUaW1lbGluZVBhbmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2ZpbHRlck9wdGlvbiArIFwiOlwiICsgKHRpbWVsaW5lU2V0LmdldEZpbHRlcigpPy5maWx0ZXJJZCA/PyByb29tSWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXt0aW1lbGluZVBhbmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1JlYWRSZWNlaXB0cz17ZmFsc2V9IC8vIE5vIFJSIHN1cHBvcnQgaW4gdGhyZWFkJ3MgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlUmVhZFJlY2VpcHRzPXtmYWxzZX0gLy8gTm8gUlIgc3VwcG9ydCBpbiB0aHJlYWQncyBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VSZWFkTWFya2Vycz17ZmFsc2V9IC8vIE5vIFJNIHN1cHBvcnQgaW4gdGhyZWFkJ3MgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlYWRSZWNlaXB0T25Mb2FkPXtmYWxzZX0gLy8gTm8gUlIgc3VwcG9ydCBpbiB0aHJlYWQncyBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lbGluZVNldD17dGltZWxpbmVTZXR9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93VXJsUHJldmlldz17ZmFsc2V9IC8vIE5vIFVSTCBwcmV2aWV3cyBhdCB0aGUgdGhyZWFkcyBsaXN0IGxldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbXB0eT17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEVtcHR5U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbj17VGhyZWFkc0ljb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInRocmVhZHN8ZW1wdHlfdGl0bGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtfdChcInRocmVhZHN8ZW1wdHlfZGVzY3JpcHRpb25cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlJblRocmVhZDogX3QoXCJhY3Rpb258cmVwbHlfaW5fdGhyZWFkXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2hvd1RpbWVzdGFtcHM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9e0xheW91dC5Hcm91cH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVUaHJlYWRlZE1lc3NhZ2VzPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93UmVhY3Rpb25zPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1Jvb21WaWV3X21lc3NhZ2VQYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzTG9hZGVkPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGVybWFsaW5rQ3JlYXRvcj17cGVybWFsaW5rQ3JlYXRvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVHcm91cGluZz17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0F1dG9IaWRlU2Nyb2xsYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9CYXNlQ2FyZD5cbiAgICAgICAgPC9Sb29tQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xufTtcbmV4cG9ydCBkZWZhdWx0IFRocmVhZFBhbmVsO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUVBLElBQUFNLFNBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUwsT0FBQTtBQUVBLElBQUFRLG9CQUFBLEdBQUFULHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxnQkFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsa0JBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLFlBQUEsR0FBQVosdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFZLFlBQUEsR0FBQWIsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFhLGNBQUEsR0FBQVIsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFjLE9BQUEsR0FBQWQsT0FBQTtBQUVBLElBQUFlLFNBQUEsR0FBQVYsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFnQixnQkFBQSxHQUFBWCxzQkFBQSxDQUFBTCxPQUFBO0FBRUEsSUFBQWlCLFFBQUEsR0FBQVosc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFrQixjQUFBLEdBQUFsQixP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