matrix-react-sdk
Version:
SDK for matrix.org using React
179 lines (140 loc) • 20.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _CallView = _interopRequireDefault(require("./CallView"));
var _RoomViewStore = _interopRequireDefault(require("../../../stores/RoomViewStore"));
var _CallHandler = _interopRequireWildcard(require("../../../CallHandler"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _PersistentApp = _interopRequireDefault(require("../elements/PersistentApp"));
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _call = require("matrix-js-sdk/src/webrtc/call");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _temp;
const SHOW_CALL_IN_STATES = [_call.CallState.Connected, _call.CallState.InviteSent, _call.CallState.Connecting, _call.CallState.CreateAnswer, _call.CallState.CreateOffer, _call.CallState.WaitLocalMedia];
// Splits a list of calls into one 'primary' one and a list
// (which should be a single element) of other calls.
// The primary will be the one not on hold, or an arbitrary one
// if they're all on hold)
function getPrimarySecondaryCalls(calls
/*: MatrixCall[]*/
)
/*: [MatrixCall, MatrixCall[]]*/
{
let primary
/*: MatrixCall*/
= null;
let secondaries
/*: MatrixCall[]*/
= [];
for (const call of calls) {
if (!SHOW_CALL_IN_STATES.includes(call.state)) continue;
if (!call.isRemoteOnHold() && primary === null) {
primary = call;
} else {
secondaries.push(call);
}
}
if (primary === null && secondaries.length > 0) {
primary = secondaries[0];
secondaries = secondaries.slice(1);
}
if (secondaries.length > 1) {
// We should never be in more than two calls so this shouldn't happen
console.log("Found more than 1 secondary call! Other calls will not be shown.");
}
return [primary, secondaries];
}
/**
* CallPreview shows a small version of CallView hovering over the UI in 'picture-in-picture'
* (PiP mode). It displays the call(s) which is *not* in the room the user is currently viewing.
*/
let CallPreview = (_dec = (0, _replaceableComponent.replaceableComponent)("views.voip.CallPreview"), _dec(_class = (_temp = class CallPreview extends _react.default.Component
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "roomStoreToken", void 0);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "settingsWatcherRef", void 0);
(0, _defineProperty2.default)(this, "onRoomViewStoreUpdate", payload => {
if (_RoomViewStore.default.getRoomId() === this.state.roomId) return;
const roomId = _RoomViewStore.default.getRoomId();
const [primaryCall, secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(roomId));
this.setState({
roomId,
primaryCall: primaryCall,
secondaryCall: secondaryCalls[0]
});
});
(0, _defineProperty2.default)(this, "onAction", (payload
/*: ActionPayload*/
) => {
switch (payload.action) {
// listen for call state changes to prod the render method, which
// may hide the global CallView if the call it is tracking is dead
case 'call_state':
{
this.updateCalls();
break;
}
}
});
(0, _defineProperty2.default)(this, "updateCalls", () => {
const [primaryCall, secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(this.state.roomId));
this.setState({
primaryCall: primaryCall,
secondaryCall: secondaryCalls[0]
});
});
(0, _defineProperty2.default)(this, "onCallRemoteHold", () => {
const [primaryCall, secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(this.state.roomId));
this.setState({
primaryCall: primaryCall,
secondaryCall: secondaryCalls[0]
});
});
const _roomId = _RoomViewStore.default.getRoomId();
const [_primaryCall, _secondaryCalls] = getPrimarySecondaryCalls(_CallHandler.default.sharedInstance().getAllActiveCallsNotInRoom(_roomId));
this.state = {
roomId: _roomId,
primaryCall: _primaryCall,
secondaryCall: _secondaryCalls[0]
};
}
componentDidMount() {
_CallHandler.default.sharedInstance().addListener(_CallHandler.CallHandlerEvent.CallChangeRoom, this.updateCalls);
this.roomStoreToken = _RoomViewStore.default.addListener(this.onRoomViewStoreUpdate);
this.dispatcherRef = _dispatcher.default.register(this.onAction);
_MatrixClientPeg.MatrixClientPeg.get().on(_call.CallEvent.RemoteHoldUnhold, this.onCallRemoteHold);
}
componentWillUnmount() {
_CallHandler.default.sharedInstance().removeListener(_CallHandler.CallHandlerEvent.CallChangeRoom, this.updateCalls);
_MatrixClientPeg.MatrixClientPeg.get().removeListener(_call.CallEvent.RemoteHoldUnhold, this.onCallRemoteHold);
if (this.roomStoreToken) {
this.roomStoreToken.remove();
}
_dispatcher.default.unregister(this.dispatcherRef);
_SettingsStore.default.unwatchSetting(this.settingsWatcherRef);
}
render() {
if (this.state.primaryCall) {
return /*#__PURE__*/_react.default.createElement(_CallView.default, {
call: this.state.primaryCall,
secondaryCall: this.state.secondaryCall,
pipMode: true
});
}
return /*#__PURE__*/_react.default.createElement(_PersistentApp.default, null);
}
}, _temp)) || _class);
exports.default = CallPreview;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3ZvaXAvQ2FsbFByZXZpZXcudHN4Il0sIm5hbWVzIjpbIlNIT1dfQ0FMTF9JTl9TVEFURVMiLCJDYWxsU3RhdGUiLCJDb25uZWN0ZWQiLCJJbnZpdGVTZW50IiwiQ29ubmVjdGluZyIsIkNyZWF0ZUFuc3dlciIsIkNyZWF0ZU9mZmVyIiwiV2FpdExvY2FsTWVkaWEiLCJnZXRQcmltYXJ5U2Vjb25kYXJ5Q2FsbHMiLCJjYWxscyIsInByaW1hcnkiLCJzZWNvbmRhcmllcyIsImNhbGwiLCJpbmNsdWRlcyIsInN0YXRlIiwiaXNSZW1vdGVPbkhvbGQiLCJwdXNoIiwibGVuZ3RoIiwic2xpY2UiLCJjb25zb2xlIiwibG9nIiwiQ2FsbFByZXZpZXciLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJwYXlsb2FkIiwiUm9vbVZpZXdTdG9yZSIsImdldFJvb21JZCIsInJvb21JZCIsInByaW1hcnlDYWxsIiwic2Vjb25kYXJ5Q2FsbHMiLCJDYWxsSGFuZGxlciIsInNoYXJlZEluc3RhbmNlIiwiZ2V0QWxsQWN0aXZlQ2FsbHNOb3RJblJvb20iLCJzZXRTdGF0ZSIsInNlY29uZGFyeUNhbGwiLCJhY3Rpb24iLCJ1cGRhdGVDYWxscyIsImNvbXBvbmVudERpZE1vdW50IiwiYWRkTGlzdGVuZXIiLCJDYWxsSGFuZGxlckV2ZW50IiwiQ2FsbENoYW5nZVJvb20iLCJyb29tU3RvcmVUb2tlbiIsIm9uUm9vbVZpZXdTdG9yZVVwZGF0ZSIsImRpc3BhdGNoZXJSZWYiLCJkaXMiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0Iiwib24iLCJDYWxsRXZlbnQiLCJSZW1vdGVIb2xkVW5ob2xkIiwib25DYWxsUmVtb3RlSG9sZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmUiLCJ1bnJlZ2lzdGVyIiwiU2V0dGluZ3NT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QXRCLENBQXlCQyxnQkFBVUMsZ0JBQW5DLEVBQXFELEtBQUtDLGdCQUExRDtBQUNIOztBQUVNQyxFQUFBQSxvQkFBUCxHQUE4QjtBQUMxQnZCLHlCQUFZQyxjQUFaLEdBQTZCdUIsY0FBN0IsQ0FBNENmLDhCQUFpQkMsY0FBN0QsRUFBNkUsS0FBS0osV0FBbEY7O0FBQ0FXLHFDQUFnQkMsR0FBaEIsR0FBc0JNLGNBQXRCLENBQXFDSixnQkFBVUMsZ0JBQS9DLEVBQWlFLEtBQUtDLGdCQUF0RTs7QUFDQSxRQUFJLEtBQUtYLGNBQVQsRUFBeUI7QUFDckIsV0FBS0EsY0FBTCxDQUFvQmMsTUFBcEI7QUFDSDs7QUFDRFgsd0JBQUlZLFVBQUosQ0FBZSxLQUFLYixhQUFwQjs7QUFDQWMsMkJBQWNDLGNBQWQsQ0FBNkIsS0FBS0Msa0JBQWxDO0FBQ0g7O0FBa0RNQyxFQUFBQSxNQUFQLEdBQWdCO0FBQ1osUUFBSSxLQUFLaEQsS0FBTCxDQUFXZ0IsV0FBZixFQUE0QjtBQUN4QiwwQkFDSSw2QkFBQyxpQkFBRDtBQUFVLFFBQUEsSUFBSSxFQUFFLEtBQUtoQixLQUFMLENBQVdnQixXQUEzQjtBQUF3QyxRQUFBLGFBQWEsRUFBRSxLQUFLaEIsS0FBTCxDQUFXc0IsYUFBbEU7QUFBaUYsUUFBQSxPQUFPLEVBQUU7QUFBMUYsUUFESjtBQUdIOztBQUVELHdCQUFPLDZCQUFDLHNCQUFELE9BQVA7QUFDSDs7QUE5Rm9FLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTcsIDIwMTggTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IENhbGxWaWV3IGZyb20gXCIuL0NhbGxWaWV3XCI7XG5pbXBvcnQgUm9vbVZpZXdTdG9yZSBmcm9tICcuLi8uLi8uLi9zdG9yZXMvUm9vbVZpZXdTdG9yZSc7XG5pbXBvcnQgQ2FsbEhhbmRsZXIsIHsgQ2FsbEhhbmRsZXJFdmVudCB9IGZyb20gJy4uLy4uLy4uL0NhbGxIYW5kbGVyJztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tICcuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzJztcbmltcG9ydCBQZXJzaXN0ZW50QXBwIGZyb20gXCIuLi9lbGVtZW50cy9QZXJzaXN0ZW50QXBwXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgQ2FsbEV2ZW50LCBDYWxsU3RhdGUsIE1hdHJpeENhbGwgfSBmcm9tICdtYXRyaXgtanMtc2RrL3NyYy93ZWJydGMvY2FsbCc7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tICcuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5cbmNvbnN0IFNIT1dfQ0FMTF9JTl9TVEFURVMgPSBbXG4gICAgQ2FsbFN0YXRlLkNvbm5lY3RlZCxcbiAgICBDYWxsU3RhdGUuSW52aXRlU2VudCxcbiAgICBDYWxsU3RhdGUuQ29ubmVjdGluZyxcbiAgICBDYWxsU3RhdGUuQ3JlYXRlQW5zd2VyLFxuICAgIENhbGxTdGF0ZS5DcmVhdGVPZmZlcixcbiAgICBDYWxsU3RhdGUuV2FpdExvY2FsTWVkaWEsXG5dO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgcm9vbUlkOiBzdHJpbmc7XG5cbiAgICAvLyBUaGUgbWFpbiBjYWxsIHRoYXQgd2UgYXJlIGRpc3BsYXlpbmcgKGllLiBub3QgaW5jbHVkaW5nIHRoZSBjYWxsIGluIHRoZSByb29tIGJlaW5nIHZpZXdlZCwgaWYgYW55KVxuICAgIHByaW1hcnlDYWxsOiBNYXRyaXhDYWxsO1xuXG4gICAgLy8gQW55IG90aGVyIGNhbGwgd2UncmUgZGlzcGxheWluZzogb25seSBpZiB0aGUgdXNlciBpcyBvbiB0d28gY2FsbHMgYW5kIG5vdCB2aWV3aW5nIGVpdGhlciBvZiB0aGUgcm9vbXNcbiAgICAvLyB0aGV5IGJlbG9uZyB0b1xuICAgIHNlY29uZGFyeUNhbGw6IE1hdHJpeENhbGw7XG59XG5cbi8vIFNwbGl0cyBhIGxpc3Qgb2YgY2FsbHMgaW50byBvbmUgJ3ByaW1hcnknIG9uZSBhbmQgYSBsaXN0XG4vLyAod2hpY2ggc2hvdWxkIGJlIGEgc2luZ2xlIGVsZW1lbnQpIG9mIG90aGVyIGNhbGxzLlxuLy8gVGhlIHByaW1hcnkgd2lsbCBiZSB0aGUgb25lIG5vdCBvbiBob2xkLCBvciBhbiBhcmJpdHJhcnkgb25lXG4vLyBpZiB0aGV5J3JlIGFsbCBvbiBob2xkKVxuZnVuY3Rpb24gZ2V0UHJpbWFyeVNlY29uZGFyeUNhbGxzKGNhbGxzOiBNYXRyaXhDYWxsW10pOiBbTWF0cml4Q2FsbCwgTWF0cml4Q2FsbFtdXSB7XG4gICAgbGV0IHByaW1hcnk6IE1hdHJpeENhbGwgPSBudWxsO1xuICAgIGxldCBzZWNvbmRhcmllczogTWF0cml4Q2FsbFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNhbGwgb2YgY2FsbHMpIHtcbiAgICAgICAgaWYgKCFTSE9XX0NBTExfSU5fU1RBVEVTLmluY2x1ZGVzKGNhbGwuc3RhdGUpKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoIWNhbGwuaXNSZW1vdGVPbkhvbGQoKSAmJiBwcmltYXJ5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBwcmltYXJ5ID0gY2FsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlY29uZGFyaWVzLnB1c2goY2FsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJpbWFyeSA9PT0gbnVsbCAmJiBzZWNvbmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByaW1hcnkgPSBzZWNvbmRhcmllc1swXTtcbiAgICAgICAgc2Vjb25kYXJpZXMgPSBzZWNvbmRhcmllcy5zbGljZSgxKTtcbiAgICB9XG5cbiAgICBpZiAoc2Vjb25kYXJpZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaW4gbW9yZSB0aGFuIHR3byBjYWxscyBzbyB0aGlzIHNob3VsZG4ndCBoYXBwZW5cbiAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBtb3JlIHRoYW4gMSBzZWNvbmRhcnkgY2FsbCEgT3RoZXIgY2FsbHMgd2lsbCBub3QgYmUgc2hvd24uXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBbcHJpbWFyeSwgc2Vjb25kYXJpZXNdO1xufVxuXG4vKipcbiAqIENhbGxQcmV2aWV3IHNob3dzIGEgc21hbGwgdmVyc2lvbiBvZiBDYWxsVmlldyBob3ZlcmluZyBvdmVyIHRoZSBVSSBpbiAncGljdHVyZS1pbi1waWN0dXJlJ1xuICogKFBpUCBtb2RlKS4gSXQgZGlzcGxheXMgdGhlIGNhbGwocykgd2hpY2ggaXMgKm5vdCogaW4gdGhlIHJvb20gdGhlIHVzZXIgaXMgY3VycmVudGx5IHZpZXdpbmcuXG4gKi9cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLnZvaXAuQ2FsbFByZXZpZXdcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbGxQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSByb29tU3RvcmVUb2tlbjogYW55O1xuICAgIHByaXZhdGUgZGlzcGF0Y2hlclJlZjogc3RyaW5nO1xuICAgIHByaXZhdGUgc2V0dGluZ3NXYXRjaGVyUmVmOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICBjb25zdCByb29tSWQgPSBSb29tVmlld1N0b3JlLmdldFJvb21JZCgpO1xuXG4gICAgICAgIGNvbnN0IFtwcmltYXJ5Q2FsbCwgc2Vjb25kYXJ5Q2FsbHNdID0gZ2V0UHJpbWFyeVNlY29uZGFyeUNhbGxzKFxuICAgICAgICAgICAgQ2FsbEhhbmRsZXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRBbGxBY3RpdmVDYWxsc05vdEluUm9vbShyb29tSWQpLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICByb29tSWQsXG4gICAgICAgICAgICBwcmltYXJ5Q2FsbDogcHJpbWFyeUNhbGwsXG4gICAgICAgICAgICBzZWNvbmRhcnlDYWxsOiBzZWNvbmRhcnlDYWxsc1swXSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIENhbGxIYW5kbGVyLnNoYXJlZEluc3RhbmNlKCkuYWRkTGlzdGVuZXIoQ2FsbEhhbmRsZXJFdmVudC5DYWxsQ2hhbmdlUm9vbSwgdGhpcy51cGRhdGVDYWxscyk7XG4gICAgICAgIHRoaXMucm9vbVN0b3JlVG9rZW4gPSBSb29tVmlld1N0b3JlLmFkZExpc3RlbmVyKHRoaXMub25Sb29tVmlld1N0b3JlVXBkYXRlKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyUmVmID0gZGlzLnJlZ2lzdGVyKHRoaXMub25BY3Rpb24pO1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkub24oQ2FsbEV2ZW50LlJlbW90ZUhvbGRVbmhvbGQsIHRoaXMub25DYWxsUmVtb3RlSG9sZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBDYWxsSGFuZGxlci5zaGFyZWRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKENhbGxIYW5kbGVyRXZlbnQuQ2FsbENoYW5nZVJvb20sIHRoaXMudXBkYXRlQ2FsbHMpO1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkucmVtb3ZlTGlzdGVuZXIoQ2FsbEV2ZW50LlJlbW90ZUhvbGRVbmhvbGQsIHRoaXMub25DYWxsUmVtb3RlSG9sZCk7XG4gICAgICAgIGlmICh0aGlzLnJvb21TdG9yZVRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnJvb21TdG9yZVRva2VuLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGRpcy51bnJlZ2lzdGVyKHRoaXMuZGlzcGF0Y2hlclJlZik7XG4gICAgICAgIFNldHRpbmdzU3RvcmUudW53YXRjaFNldHRpbmcodGhpcy5zZXR0aW5nc1dhdGNoZXJSZWYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Sb29tVmlld1N0b3JlVXBkYXRlID0gKHBheWxvYWQpID0+IHtcbiAgICAgICAgaWYgKFJvb21WaWV3U3RvcmUuZ2V0Um9vbUlkKCkgPT09IHRoaXMuc3RhdGUucm9vbUlkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgcm9vbUlkID0gUm9vbVZpZXdTdG9yZS5nZXRSb29tSWQoKTtcbiAgICAgICAgY29uc3QgW3ByaW1hcnlDYWxsLCBzZWNvbmRhcnlDYWxsc10gPSBnZXRQcmltYXJ5U2Vjb25kYXJ5Q2FsbHMoXG4gICAgICAgICAgICBDYWxsSGFuZGxlci5zaGFyZWRJbnN0YW5jZSgpLmdldEFsbEFjdGl2ZUNhbGxzTm90SW5Sb29tKHJvb21JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByb29tSWQsXG4gICAgICAgICAgICBwcmltYXJ5Q2FsbDogcHJpbWFyeUNhbGwsXG4gICAgICAgICAgICBzZWNvbmRhcnlDYWxsOiBzZWNvbmRhcnlDYWxsc1swXSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BY3Rpb24gPSAocGF5bG9hZDogQWN0aW9uUGF5bG9hZCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHBheWxvYWQuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGNhbGwgc3RhdGUgY2hhbmdlcyB0byBwcm9kIHRoZSByZW5kZXIgbWV0aG9kLCB3aGljaFxuICAgICAgICAgICAgLy8gbWF5IGhpZGUgdGhlIGdsb2JhbCBDYWxsVmlldyBpZiB0aGUgY2FsbCBpdCBpcyB0cmFja2luZyBpcyBkZWFkXG4gICAgICAgICAgICBjYXNlICdjYWxsX3N0YXRlJzoge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FsbHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhbGxzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBbcHJpbWFyeUNhbGwsIHNlY29uZGFyeUNhbGxzXSA9IGdldFByaW1hcnlTZWNvbmRhcnlDYWxscyhcbiAgICAgICAgICAgIENhbGxIYW5kbGVyLnNoYXJlZEluc3RhbmNlKCkuZ2V0QWxsQWN0aXZlQ2FsbHNOb3RJblJvb20odGhpcy5zdGF0ZS5yb29tSWQpLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcHJpbWFyeUNhbGw6IHByaW1hcnlDYWxsLFxuICAgICAgICAgICAgc2Vjb25kYXJ5Q2FsbDogc2Vjb25kYXJ5Q2FsbHNbMF0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ2FsbFJlbW90ZUhvbGQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IFtwcmltYXJ5Q2FsbCwgc2Vjb25kYXJ5Q2FsbHNdID0gZ2V0UHJpbWFyeVNlY29uZGFyeUNhbGxzKFxuICAgICAgICAgICAgQ2FsbEhhbmRsZXIuc2hhcmVkSW5zdGFuY2UoKS5nZXRBbGxBY3RpdmVDYWxsc05vdEluUm9vbSh0aGlzLnN0YXRlLnJvb21JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwcmltYXJ5Q2FsbDogcHJpbWFyeUNhbGwsXG4gICAgICAgICAgICBzZWNvbmRhcnlDYWxsOiBzZWNvbmRhcnlDYWxsc1swXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucHJpbWFyeUNhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPENhbGxWaWV3IGNhbGw9e3RoaXMuc3RhdGUucHJpbWFyeUNhbGx9IHNlY29uZGFyeUNhbGw9e3RoaXMuc3RhdGUuc2Vjb25kYXJ5Q2FsbH0gcGlwTW9kZT17dHJ1ZX0gLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPFBlcnNpc3RlbnRBcHAgLz47XG4gICAgfVxufVxuXG4iXX0=