UNPKG

matrix-react-sdk

Version:
156 lines (150 loc) 23.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.CreationGrouper = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _types = require("matrix-js-sdk/src/types"); var _BaseGrouper = require("./BaseGrouper"); var _voiceBroadcast = require("../../../voice-broadcast"); var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap")); var _languageHandler = require("../../../languageHandler"); var _DateSeparator = _interopRequireDefault(require("../../views/messages/DateSeparator")); var _NewRoomIntro = _interopRequireDefault(require("../../views/rooms/NewRoomIntro")); var _GenericEventListSummary = _interopRequireDefault(require("../../views/elements/GenericEventListSummary")); var _TimelineSeparator = require("../../views/messages/TimelineSeparator"); /* Copyright 2024 New Vector Ltd. Copyright 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. */ // Wrap initial room creation events into a GenericEventListSummary // Grouping only events sent by the same user that sent the `m.room.create` and only until // the first non-state event, beacon_info event or membership event which is not regarding the sender of the `m.room.create` event class CreationGrouper extends _BaseGrouper.BaseGrouper { shouldGroup({ event, shouldShow }) { const panel = this.panel; const createEvent = this.firstEventAndShouldShow.event; if (!shouldShow) { return true; } if (panel.wantsSeparator(this.firstEventAndShouldShow.event, event) === _TimelineSeparator.SeparatorKind.Date) { return false; } const eventType = event.getType(); if (eventType === _matrix.EventType.RoomMember && (event.getStateKey() !== createEvent.getSender() || event.getContent()["membership"] !== _types.KnownMembership.Join)) { return false; } // beacons are not part of room creation configuration // should be shown in timeline if (_matrix.M_BEACON_INFO.matches(eventType)) { return false; } if (_voiceBroadcast.VoiceBroadcastInfoEventType === eventType) { // always show voice broadcast info events in timeline return false; } if (event.isState() && event.getSender() === createEvent.getSender()) { return true; } return false; } add(wrappedEvent) { const { event: ev, shouldShow } = wrappedEvent; const panel = this.panel; this.readMarker = this.readMarker || panel.readMarkerForEvent(ev.getId(), ev === this.lastShownEvent); if (!shouldShow) { return; } if (ev.getType() === _matrix.EventType.RoomEncryption) { this.ejectedEvents.push(wrappedEvent); } else { this.events.push(wrappedEvent); } } getTiles() { // If we don't have any events to group, don't even try to group them. The logic // below assumes that we have a group of events to deal with, but we might not if // the events we were supposed to group were redacted. if (!this.events || !this.events.length) return []; const panel = this.panel; const ret = []; const isGrouped = true; const createEvent = this.firstEventAndShouldShow; const lastShownEvent = this.lastShownEvent; if (panel.wantsSeparator(this.prevEvent, createEvent.event) === _TimelineSeparator.SeparatorKind.Date) { const ts = createEvent.event.getTs(); ret.push( /*#__PURE__*/_react.default.createElement("li", { key: ts + "~" }, /*#__PURE__*/_react.default.createElement(_DateSeparator.default, { roomId: createEvent.event.getRoomId(), ts: ts }))); } // If this m.room.create event should be shown (room upgrade) then show it before the summary if (createEvent.shouldShow) { // pass in the createEvent as prevEvent as well so no extra DateSeparator is rendered ret.push(...panel.getTilesForEvent(createEvent.event, createEvent)); } for (const ejected of this.ejectedEvents) { ret.push(...panel.getTilesForEvent(createEvent.event, ejected, createEvent.event === lastShownEvent, isGrouped)); } const eventTiles = this.events.map(e => { // In order to prevent DateSeparators from appearing in the expanded form // of GenericEventListSummary, render each member event as if the previous // one was itself. This way, the timestamp of the previous event === the // timestamp of the current event, and no DateSeparator is inserted. return panel.getTilesForEvent(e.event, e, e.event === lastShownEvent, isGrouped); }).reduce((a, b) => a.concat(b), []); // Get sender profile from the latest event in the summary as the m.room.create doesn't contain one const ev = this.events[this.events.length - 1].event; let summaryText; const roomId = ev.getRoomId(); const creator = ev.sender?.name ?? ev.getSender(); if (roomId && _DMRoomMap.default.shared().getUserIdForRoomId(roomId)) { summaryText = (0, _languageHandler._t)("timeline|creation_summary_dm", { creator }); } else { summaryText = (0, _languageHandler._t)("timeline|creation_summary_room", { creator }); } ret.push( /*#__PURE__*/_react.default.createElement(_NewRoomIntro.default, { key: "newroomintro" })); ret.push( /*#__PURE__*/_react.default.createElement(_GenericEventListSummary.default, { key: "roomcreationsummary", events: this.events.map(e => e.event), onToggle: panel.onHeightChanged // Update scroll state , summaryMembers: ev.sender ? [ev.sender] : undefined, summaryText: summaryText, layout: this.panel.props.layout }, eventTiles)); if (this.readMarker) { ret.push(this.readMarker); } return ret; } getNewPrevEvent() { return this.firstEventAndShouldShow.event; } } exports.CreationGrouper = CreationGrouper; (0, _defineProperty2.default)(CreationGrouper, "canStartGroup", function (_panel, { event }) { return event.getType() === _matrix.EventType.RoomCreate; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfdHlwZXMiLCJfQmFzZUdyb3VwZXIiLCJfdm9pY2VCcm9hZGNhc3QiLCJfRE1Sb29tTWFwIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9EYXRlU2VwYXJhdG9yIiwiX05ld1Jvb21JbnRybyIsIl9HZW5lcmljRXZlbnRMaXN0U3VtbWFyeSIsIl9UaW1lbGluZVNlcGFyYXRvciIsIkNyZWF0aW9uR3JvdXBlciIsIkJhc2VHcm91cGVyIiwic2hvdWxkR3JvdXAiLCJldmVudCIsInNob3VsZFNob3ciLCJwYW5lbCIsImNyZWF0ZUV2ZW50IiwiZmlyc3RFdmVudEFuZFNob3VsZFNob3ciLCJ3YW50c1NlcGFyYXRvciIsIlNlcGFyYXRvcktpbmQiLCJEYXRlIiwiZXZlbnRUeXBlIiwiZ2V0VHlwZSIsIkV2ZW50VHlwZSIsIlJvb21NZW1iZXIiLCJnZXRTdGF0ZUtleSIsImdldFNlbmRlciIsImdldENvbnRlbnQiLCJLbm93bk1lbWJlcnNoaXAiLCJKb2luIiwiTV9CRUFDT05fSU5GTyIsIm1hdGNoZXMiLCJWb2ljZUJyb2FkY2FzdEluZm9FdmVudFR5cGUiLCJpc1N0YXRlIiwiYWRkIiwid3JhcHBlZEV2ZW50IiwiZXYiLCJyZWFkTWFya2VyIiwicmVhZE1hcmtlckZvckV2ZW50IiwiZ2V0SWQiLCJsYXN0U2hvd25FdmVudCIsIlJvb21FbmNyeXB0aW9uIiwiZWplY3RlZEV2ZW50cyIsInB1c2giLCJldmVudHMiLCJnZXRUaWxlcyIsImxlbmd0aCIsInJldCIsImlzR3JvdXBlZCIsInByZXZFdmVudCIsInRzIiwiZ2V0VHMiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsImtleSIsInJvb21JZCIsImdldFJvb21JZCIsImdldFRpbGVzRm9yRXZlbnQiLCJlamVjdGVkIiwiZXZlbnRUaWxlcyIsIm1hcCIsImUiLCJyZWR1Y2UiLCJhIiwiYiIsImNvbmNhdCIsInN1bW1hcnlUZXh0IiwiY3JlYXRvciIsInNlbmRlciIsIm5hbWUiLCJETVJvb21NYXAiLCJzaGFyZWQiLCJnZXRVc2VySWRGb3JSb29tSWQiLCJfdCIsIm9uVG9nZ2xlIiwib25IZWlnaHRDaGFuZ2VkIiwic3VtbWFyeU1lbWJlcnMiLCJ1bmRlZmluZWQiLCJsYXlvdXQiLCJwcm9wcyIsImdldE5ld1ByZXZFdmVudCIsImV4cG9ydHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiX3BhbmVsIiwiUm9vbUNyZWF0ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvZ3JvdXBlci9DcmVhdGlvbkdyb3VwZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEV2ZW50VHlwZSwgTV9CRUFDT05fSU5GTywgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBLbm93bk1lbWJlcnNoaXAgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdHlwZXNcIjtcblxuaW1wb3J0IHsgQmFzZUdyb3VwZXIgfSBmcm9tIFwiLi9CYXNlR3JvdXBlclwiO1xuaW1wb3J0IE1lc3NhZ2VQYW5lbCwgeyBXcmFwcGVkRXZlbnQgfSBmcm9tIFwiLi4vTWVzc2FnZVBhbmVsXCI7XG5pbXBvcnQgeyBWb2ljZUJyb2FkY2FzdEluZm9FdmVudFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vdm9pY2UtYnJvYWRjYXN0XCI7XG5pbXBvcnQgRE1Sb29tTWFwIGZyb20gXCIuLi8uLi8uLi91dGlscy9ETVJvb21NYXBcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IERhdGVTZXBhcmF0b3IgZnJvbSBcIi4uLy4uL3ZpZXdzL21lc3NhZ2VzL0RhdGVTZXBhcmF0b3JcIjtcbmltcG9ydCBOZXdSb29tSW50cm8gZnJvbSBcIi4uLy4uL3ZpZXdzL3Jvb21zL05ld1Jvb21JbnRyb1wiO1xuaW1wb3J0IEdlbmVyaWNFdmVudExpc3RTdW1tYXJ5IGZyb20gXCIuLi8uLi92aWV3cy9lbGVtZW50cy9HZW5lcmljRXZlbnRMaXN0U3VtbWFyeVwiO1xuaW1wb3J0IHsgU2VwYXJhdG9yS2luZCB9IGZyb20gXCIuLi8uLi92aWV3cy9tZXNzYWdlcy9UaW1lbGluZVNlcGFyYXRvclwiO1xuXG4vLyBXcmFwIGluaXRpYWwgcm9vbSBjcmVhdGlvbiBldmVudHMgaW50byBhIEdlbmVyaWNFdmVudExpc3RTdW1tYXJ5XG4vLyBHcm91cGluZyBvbmx5IGV2ZW50cyBzZW50IGJ5IHRoZSBzYW1lIHVzZXIgdGhhdCBzZW50IHRoZSBgbS5yb29tLmNyZWF0ZWAgYW5kIG9ubHkgdW50aWxcbi8vIHRoZSBmaXJzdCBub24tc3RhdGUgZXZlbnQsIGJlYWNvbl9pbmZvIGV2ZW50IG9yIG1lbWJlcnNoaXAgZXZlbnQgd2hpY2ggaXMgbm90IHJlZ2FyZGluZyB0aGUgc2VuZGVyIG9mIHRoZSBgbS5yb29tLmNyZWF0ZWAgZXZlbnRcblxuZXhwb3J0IGNsYXNzIENyZWF0aW9uR3JvdXBlciBleHRlbmRzIEJhc2VHcm91cGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIGNhblN0YXJ0R3JvdXAgPSBmdW5jdGlvbiAoX3BhbmVsOiBNZXNzYWdlUGFuZWwsIHsgZXZlbnQgfTogV3JhcHBlZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBldmVudC5nZXRUeXBlKCkgPT09IEV2ZW50VHlwZS5Sb29tQ3JlYXRlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgc2hvdWxkR3JvdXAoeyBldmVudCwgc2hvdWxkU2hvdyB9OiBXcmFwcGVkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBhbmVsO1xuICAgICAgICBjb25zdCBjcmVhdGVFdmVudCA9IHRoaXMuZmlyc3RFdmVudEFuZFNob3VsZFNob3cuZXZlbnQ7XG4gICAgICAgIGlmICghc2hvdWxkU2hvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhbmVsLndhbnRzU2VwYXJhdG9yKHRoaXMuZmlyc3RFdmVudEFuZFNob3VsZFNob3cuZXZlbnQsIGV2ZW50KSA9PT0gU2VwYXJhdG9yS2luZC5EYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBldmVudFR5cGUgPT09IEV2ZW50VHlwZS5Sb29tTWVtYmVyICYmXG4gICAgICAgICAgICAoZXZlbnQuZ2V0U3RhdGVLZXkoKSAhPT0gY3JlYXRlRXZlbnQuZ2V0U2VuZGVyKCkgfHxcbiAgICAgICAgICAgICAgICBldmVudC5nZXRDb250ZW50KClbXCJtZW1iZXJzaGlwXCJdICE9PSBLbm93bk1lbWJlcnNoaXAuSm9pbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWFjb25zIGFyZSBub3QgcGFydCBvZiByb29tIGNyZWF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgLy8gc2hvdWxkIGJlIHNob3duIGluIHRpbWVsaW5lXG4gICAgICAgIGlmIChNX0JFQUNPTl9JTkZPLm1hdGNoZXMoZXZlbnRUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFZvaWNlQnJvYWRjYXN0SW5mb0V2ZW50VHlwZSA9PT0gZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICAvLyBhbHdheXMgc2hvdyB2b2ljZSBicm9hZGNhc3QgaW5mbyBldmVudHMgaW4gdGltZWxpbmVcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5pc1N0YXRlKCkgJiYgZXZlbnQuZ2V0U2VuZGVyKCkgPT09IGNyZWF0ZUV2ZW50LmdldFNlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHdyYXBwZWRFdmVudDogV3JhcHBlZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnQ6IGV2LCBzaG91bGRTaG93IH0gPSB3cmFwcGVkRXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wYW5lbDtcbiAgICAgICAgdGhpcy5yZWFkTWFya2VyID0gdGhpcy5yZWFkTWFya2VyIHx8IHBhbmVsLnJlYWRNYXJrZXJGb3JFdmVudChldi5nZXRJZCgpISwgZXYgPT09IHRoaXMubGFzdFNob3duRXZlbnQpO1xuICAgICAgICBpZiAoIXNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXYuZ2V0VHlwZSgpID09PSBFdmVudFR5cGUuUm9vbUVuY3J5cHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZWplY3RlZEV2ZW50cy5wdXNoKHdyYXBwZWRFdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKHdyYXBwZWRFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGlsZXMoKTogUmVhY3ROb2RlW10ge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBldmVudHMgdG8gZ3JvdXAsIGRvbid0IGV2ZW4gdHJ5IHRvIGdyb3VwIHRoZW0uIFRoZSBsb2dpY1xuICAgICAgICAvLyBiZWxvdyBhc3N1bWVzIHRoYXQgd2UgaGF2ZSBhIGdyb3VwIG9mIGV2ZW50cyB0byBkZWFsIHdpdGgsIGJ1dCB3ZSBtaWdodCBub3QgaWZcbiAgICAgICAgLy8gdGhlIGV2ZW50cyB3ZSB3ZXJlIHN1cHBvc2VkIHRvIGdyb3VwIHdlcmUgcmVkYWN0ZWQuXG4gICAgICAgIGlmICghdGhpcy5ldmVudHMgfHwgIXRoaXMuZXZlbnRzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wYW5lbDtcbiAgICAgICAgY29uc3QgcmV0OiBSZWFjdE5vZGVbXSA9IFtdO1xuICAgICAgICBjb25zdCBpc0dyb3VwZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBjcmVhdGVFdmVudCA9IHRoaXMuZmlyc3RFdmVudEFuZFNob3VsZFNob3c7XG4gICAgICAgIGNvbnN0IGxhc3RTaG93bkV2ZW50ID0gdGhpcy5sYXN0U2hvd25FdmVudDtcblxuICAgICAgICBpZiAocGFuZWwud2FudHNTZXBhcmF0b3IodGhpcy5wcmV2RXZlbnQsIGNyZWF0ZUV2ZW50LmV2ZW50KSA9PT0gU2VwYXJhdG9yS2luZC5EYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0cyA9IGNyZWF0ZUV2ZW50LmV2ZW50LmdldFRzKCk7XG4gICAgICAgICAgICByZXQucHVzaChcbiAgICAgICAgICAgICAgICA8bGkga2V5PXt0cyArIFwiflwifT5cbiAgICAgICAgICAgICAgICAgICAgPERhdGVTZXBhcmF0b3Igcm9vbUlkPXtjcmVhdGVFdmVudC5ldmVudC5nZXRSb29tSWQoKSF9IHRzPXt0c30gLz5cbiAgICAgICAgICAgICAgICA8L2xpPixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIG0ucm9vbS5jcmVhdGUgZXZlbnQgc2hvdWxkIGJlIHNob3duIChyb29tIHVwZ3JhZGUpIHRoZW4gc2hvdyBpdCBiZWZvcmUgdGhlIHN1bW1hcnlcbiAgICAgICAgaWYgKGNyZWF0ZUV2ZW50LnNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIC8vIHBhc3MgaW4gdGhlIGNyZWF0ZUV2ZW50IGFzIHByZXZFdmVudCBhcyB3ZWxsIHNvIG5vIGV4dHJhIERhdGVTZXBhcmF0b3IgaXMgcmVuZGVyZWRcbiAgICAgICAgICAgIHJldC5wdXNoKC4uLnBhbmVsLmdldFRpbGVzRm9yRXZlbnQoY3JlYXRlRXZlbnQuZXZlbnQsIGNyZWF0ZUV2ZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGVqZWN0ZWQgb2YgdGhpcy5lamVjdGVkRXZlbnRzKSB7XG4gICAgICAgICAgICByZXQucHVzaChcbiAgICAgICAgICAgICAgICAuLi5wYW5lbC5nZXRUaWxlc0ZvckV2ZW50KGNyZWF0ZUV2ZW50LmV2ZW50LCBlamVjdGVkLCBjcmVhdGVFdmVudC5ldmVudCA9PT0gbGFzdFNob3duRXZlbnQsIGlzR3JvdXBlZCksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRUaWxlcyA9IHRoaXMuZXZlbnRzXG4gICAgICAgICAgICAubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBEYXRlU2VwYXJhdG9ycyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgZXhwYW5kZWQgZm9ybVxuICAgICAgICAgICAgICAgIC8vIG9mIEdlbmVyaWNFdmVudExpc3RTdW1tYXJ5LCByZW5kZXIgZWFjaCBtZW1iZXIgZXZlbnQgYXMgaWYgdGhlIHByZXZpb3VzXG4gICAgICAgICAgICAgICAgLy8gb25lIHdhcyBpdHNlbGYuIFRoaXMgd2F5LCB0aGUgdGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBldmVudCA9PT0gdGhlXG4gICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wIG9mIHRoZSBjdXJyZW50IGV2ZW50LCBhbmQgbm8gRGF0ZVNlcGFyYXRvciBpcyBpbnNlcnRlZC5cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFuZWwuZ2V0VGlsZXNGb3JFdmVudChlLmV2ZW50LCBlLCBlLmV2ZW50ID09PSBsYXN0U2hvd25FdmVudCwgaXNHcm91cGVkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xuICAgICAgICAvLyBHZXQgc2VuZGVyIHByb2ZpbGUgZnJvbSB0aGUgbGF0ZXN0IGV2ZW50IGluIHRoZSBzdW1tYXJ5IGFzIHRoZSBtLnJvb20uY3JlYXRlIGRvZXNuJ3QgY29udGFpbiBvbmVcbiAgICAgICAgY29uc3QgZXYgPSB0aGlzLmV2ZW50c1t0aGlzLmV2ZW50cy5sZW5ndGggLSAxXS5ldmVudDtcblxuICAgICAgICBsZXQgc3VtbWFyeVRleHQ6IHN0cmluZztcbiAgICAgICAgY29uc3Qgcm9vbUlkID0gZXYuZ2V0Um9vbUlkKCk7XG4gICAgICAgIGNvbnN0IGNyZWF0b3IgPSBldi5zZW5kZXI/Lm5hbWUgPz8gZXYuZ2V0U2VuZGVyKCk7XG4gICAgICAgIGlmIChyb29tSWQgJiYgRE1Sb29tTWFwLnNoYXJlZCgpLmdldFVzZXJJZEZvclJvb21JZChyb29tSWQpKSB7XG4gICAgICAgICAgICBzdW1tYXJ5VGV4dCA9IF90KFwidGltZWxpbmV8Y3JlYXRpb25fc3VtbWFyeV9kbVwiLCB7IGNyZWF0b3IgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdW1tYXJ5VGV4dCA9IF90KFwidGltZWxpbmV8Y3JlYXRpb25fc3VtbWFyeV9yb29tXCIsIHsgY3JlYXRvciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldC5wdXNoKDxOZXdSb29tSW50cm8ga2V5PVwibmV3cm9vbWludHJvXCIgLz4pO1xuXG4gICAgICAgIHJldC5wdXNoKFxuICAgICAgICAgICAgPEdlbmVyaWNFdmVudExpc3RTdW1tYXJ5XG4gICAgICAgICAgICAgICAga2V5PVwicm9vbWNyZWF0aW9uc3VtbWFyeVwiXG4gICAgICAgICAgICAgICAgZXZlbnRzPXt0aGlzLmV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnQpfVxuICAgICAgICAgICAgICAgIG9uVG9nZ2xlPXtwYW5lbC5vbkhlaWdodENoYW5nZWR9IC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGVcbiAgICAgICAgICAgICAgICBzdW1tYXJ5TWVtYmVycz17ZXYuc2VuZGVyID8gW2V2LnNlbmRlcl0gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgc3VtbWFyeVRleHQ9e3N1bW1hcnlUZXh0fVxuICAgICAgICAgICAgICAgIGxheW91dD17dGhpcy5wYW5lbC5wcm9wcy5sYXlvdXR9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2V2ZW50VGlsZXN9XG4gICAgICAgICAgICA8L0dlbmVyaWNFdmVudExpc3RTdW1tYXJ5PixcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5yZWFkTWFya2VyKSB7XG4gICAgICAgICAgICByZXQucHVzaCh0aGlzLnJlYWRNYXJrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TmV3UHJldkV2ZW50KCk6IE1hdHJpeEV2ZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RFdmVudEFuZFNob3VsZFNob3cuZXZlbnQ7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLGVBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLGdCQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxj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