UNPKG

matrix-react-sdk

Version:
260 lines (216 loc) 29.8 kB
"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 _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var sdk = _interopRequireWildcard(require("../../../index")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _languageHandler = require("../../../languageHandler"); var _Modal = _interopRequireDefault(require("../../../Modal")); var _InteractiveAuthEntryComponents = require("../auth/InteractiveAuthEntryComponents"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class; let DevicesPanel = (_dec = (0, _replaceableComponent.replaceableComponent)("views.settings.DevicesPanel"), _dec(_class = class DevicesPanel extends _react.default.Component { constructor(props) { super(props); this.state = { devices: undefined, deviceLoadError: undefined, selectedDevices: [], deleting: false }; this._unmounted = false; this._renderDevice = this._renderDevice.bind(this); this._onDeviceSelectionToggled = this._onDeviceSelectionToggled.bind(this); this._onDeleteClick = this._onDeleteClick.bind(this); } componentDidMount() { this._loadDevices(); } componentWillUnmount() { this._unmounted = true; } _loadDevices() { _MatrixClientPeg.MatrixClientPeg.get().getDevices().then(resp => { if (this._unmounted) { return; } this.setState({ devices: resp.devices || [] }); }, error => { if (this._unmounted) { return; } let errtxt; if (error.httpStatus == 404) { // 404 probably means the HS doesn't yet support the API. errtxt = (0, _languageHandler._t)("Your homeserver does not support session management."); } else { console.error("Error loading sessions:", error); errtxt = (0, _languageHandler._t)("Unable to load session list"); } this.setState({ deviceLoadError: errtxt }); }); } /* * compare two devices, sorting from most-recently-seen to least-recently-seen * (and then, for stability, by device id) */ _deviceCompare(a, b) { // return < 0 if a comes before b, > 0 if a comes after b. const lastSeenDelta = (b.last_seen_ts || 0) - (a.last_seen_ts || 0); if (lastSeenDelta !== 0) { return lastSeenDelta; } const idA = a.device_id; const idB = b.device_id; return idA < idB ? -1 : idA > idB ? 1 : 0; } _onDeviceSelectionToggled(device) { if (this._unmounted) { return; } const deviceId = device.device_id; this.setState((state, props) => { // Make a copy of the selected devices, then add or remove the device const selectedDevices = state.selectedDevices.slice(); const i = selectedDevices.indexOf(deviceId); if (i === -1) { selectedDevices.push(deviceId); } else { selectedDevices.splice(i, 1); } return { selectedDevices }; }); } _onDeleteClick() { this.setState({ deleting: true }); this._makeDeleteRequest(null).catch(error => { if (this._unmounted) { return; } if (error.httpStatus !== 401 || !error.data || !error.data.flows) { // doesn't look like an interactive-auth failure throw error; } // pop up an interactive auth dialog const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); const numDevices = this.state.selectedDevices.length; const dialogAesthetics = { [_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_PREAUTH]: { title: (0, _languageHandler._t)("Use Single Sign On to continue"), body: (0, _languageHandler._t)("Confirm deleting these sessions by using Single Sign On to prove your identity.", { count: numDevices }), continueText: (0, _languageHandler._t)("Single Sign On"), continueKind: "primary" }, [_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_POSTAUTH]: { title: (0, _languageHandler._t)("Confirm deleting these sessions"), body: (0, _languageHandler._t)("Click the button below to confirm deleting these sessions.", { count: numDevices }), continueText: (0, _languageHandler._t)("Delete sessions", { count: numDevices }), continueKind: "danger" } }; _Modal.default.createTrackedDialog('Delete Device Dialog', '', InteractiveAuthDialog, { title: (0, _languageHandler._t)("Authentication"), matrixClient: _MatrixClientPeg.MatrixClientPeg.get(), authData: error.data, makeRequest: this._makeDeleteRequest.bind(this), aestheticsForStagePhases: { [_InteractiveAuthEntryComponents.SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics, [_InteractiveAuthEntryComponents.SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics } }); }).catch(e => { console.error("Error deleting sessions", e); if (this._unmounted) { return; } }).finally(() => { this.setState({ deleting: false }); }); } _makeDeleteRequest(auth) { return _MatrixClientPeg.MatrixClientPeg.get().deleteMultipleDevices(this.state.selectedDevices, auth).then(() => { // Remove the deleted devices from `devices`, reset selection to [] this.setState({ devices: this.state.devices.filter(d => !this.state.selectedDevices.includes(d.device_id)), selectedDevices: [] }); }); } _renderDevice(device) { const DevicesPanelEntry = sdk.getComponent('settings.DevicesPanelEntry'); return /*#__PURE__*/_react.default.createElement(DevicesPanelEntry, { key: device.device_id, device: device, selected: this.state.selectedDevices.includes(device.device_id), onDeviceToggled: this._onDeviceSelectionToggled }); } render() { const Spinner = sdk.getComponent("elements.Spinner"); const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); if (this.state.deviceLoadError !== undefined) { const classes = (0, _classnames.default)(this.props.className, "error"); return /*#__PURE__*/_react.default.createElement("div", { className: classes }, this.state.deviceLoadError); } const devices = this.state.devices; if (devices === undefined) { // still loading const classes = this.props.className; return /*#__PURE__*/_react.default.createElement(Spinner, { className: classes }); } devices.sort(this._deviceCompare); const deleteButton = this.state.deleting ? /*#__PURE__*/_react.default.createElement(Spinner, { w: 22, h: 22 }) : /*#__PURE__*/_react.default.createElement(AccessibleButton, { onClick: this._onDeleteClick, kind: "danger_sm" }, (0, _languageHandler._t)("Delete %(count)s sessions", { count: this.state.selectedDevices.length })); const classes = (0, _classnames.default)(this.props.className, "mx_DevicesPanel"); return /*#__PURE__*/_react.default.createElement("div", { className: classes }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_DevicesPanel_header" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_DevicesPanel_deviceId" }, (0, _languageHandler._t)("ID")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_DevicesPanel_deviceName" }, (0, _languageHandler._t)("Public Name")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_DevicesPanel_deviceLastSeen" }, (0, _languageHandler._t)("Last seen")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_DevicesPanel_deviceButtons" }, this.state.selectedDevices.length > 0 ? deleteButton : null)), devices.map(this._renderDevice)); } }) || _class); exports.default = DevicesPanel; DevicesPanel.propTypes = { className: _propTypes.default.string }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL0RldmljZXNQYW5lbC5qcyJdLCJuYW1lcyI6WyJEZXZpY2VzUGFuZWwiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJzdGF0ZSIsImRldmljZXMiLCJ1bmRlZmluZWQiLCJkZXZpY2VMb2FkRXJyb3IiLCJzZWxlY3RlZERldmljZXMiLCJkZWxldGluZyIsIl91bm1vdW50ZWQiLCJfcmVuZGVyRGV2aWNlIiwiYmluZCIsIl9vbkRldmljZVNlbGVjdGlvblRvZ2dsZWQiLCJfb25EZWxldGVDbGljayIsImNvbXBvbmVudERpZE1vdW50IiwiX2xvYWREZXZpY2VzIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJnZXREZXZpY2VzIiwidGhlbiIsInJlc3AiLCJzZXRTdGF0ZSIsImVycm9yIiwiZXJydHh0IiwiaHR0cFN0YXR1cyIsImNvbnNvbGUiLCJfZGV2aWNlQ29tcGFyZSIsImEiLCJiIiwibGFzdFNlZW5EZWx0YSIsImxhc3Rfc2Vlbl90cyIsImlkQSIsImRldmljZV9pZCIsImlkQiIsImRldmljZSIsImRldmljZUlkIiwic2xpY2UiLCJpIiwiaW5kZXhPZiIsInB1c2giLCJzcGxpY2UiLCJfbWFrZURlbGV0ZVJlcXVlc3QiLCJjYXRjaCIsImRhdGEiLCJmbG93cyIsIkludGVyYWN0aXZlQXV0aERpYWxvZyIsInNkayIsImdldENvbXBvbmVudCIsIm51bURldmljZXMiLCJsZW5ndGgiLCJkaWFsb2dBZXN0aGV0aWNzIiwiU1NPQXV0aEVudHJ5IiwiUEhBU0VfUFJFQVVUSCIsInRpdGxlIiwiYm9keSIsImNvdW50IiwiY29udGludWVUZXh0IiwiY29udGludWVLaW5kIiwiUEhBU0VfUE9TVEFVVEgiLCJNb2RhbCIsImNyZWF0ZVRyYWNrZWREaWFsb2ciLCJtYXRyaXhDbGllbnQiLCJhdXRoRGF0YSIsIm1ha2VSZXF1ZXN0IiwiYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzIiwiTE9HSU5fVFlQRSIsIlVOU1RBQkxFX0xPR0lOX1RZUEUiLCJlIiwiZmluYWxseSIsImF1dGgiLCJkZWxldGVNdWx0aXBsZURldmljZXMiLCJmaWx0ZXIiLCJkIiwiaW5jbHVkZXMiLCJEZXZpY2VzUGFuZWxFbnRyeSIsInJlbmRlciIsIlNwaW5uZXIiLCJBY2Nlc3NpYmxlQnV0dG9uIiwiY2xhc3NlcyIsImNsYXNzTmFtZSIsInNvcnQiLCJkZWxldGVCdXR0b24iLCJtYXAiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBaUJBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBR3FCQSxZLFdBRHBCLGdEQUFxQiw2QkFBckIsQyxnQkFBRCxNQUNxQkEsWUFEckIsU0FDMENDLGVBQU1DLFNBRGhELENBQzBEO0FBQ3REQyxFQUFBQSxXQUFXLENBQUNDLEtBQUQsRUFBUTtBQUNmLFVBQU1BLEtBQU47QUFFQSxTQUFLQyxLQUFMLEdBQWE7QUFDVEMsTUFBQUEsT0FBTyxFQUFFQyxTQURBO0FBRVRDLE1BQUFBLGVBQWUsRUFBRUQsU0FGUjtBQUlURSxNQUFBQSxlQUFlLEVBQUUsRUFKUjtBQUtUQyxNQUFBQSxRQUFRLEVBQUU7QUFMRCxLQUFiO0FBUUEsU0FBS0MsVUFBTCxHQUFrQixLQUFsQjtBQUVBLFNBQUtDLGFBQUwsR0FBcUIsS0FBS0EsYUFBTCxDQUFtQkMsSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBckI7QUFDQSxTQUFLQyx5QkFBTCxHQUFpQyxLQUFLQSx5QkFBTCxDQUErQkQsSUFBL0IsQ0FBb0MsSUFBcEMsQ0FBakM7QUFDQSxTQUFLRSxjQUFMLEdBQXNCLEtBQUtBLGNBQUwsQ0FBb0JGLElBQXBCLENBQXlCLElBQXpCLENBQXRCO0FBQ0g7O0FBRURHLEVBQUFBLGlCQUFpQixHQUFHO0FBQ2hCLFNBQUtDLFlBQUw7QUFDSDs7QUFF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LE1BRGlCLGdCQUVqQiw2QkFBQyxnQkFBRDtBQUFrQixNQUFBLE9BQU8sRUFBRSxLQUFLSyxjQUFoQztBQUFnRCxNQUFBLElBQUksRUFBQztBQUFyRCxPQUNNLHlCQUFHLDJCQUFILEVBQWdDO0FBQUMyQyxNQUFBQSxLQUFLLEVBQUUsS0FBS3JELEtBQUwsQ0FBV0ksZUFBWCxDQUEyQjJDO0FBQW5DLEtBQWhDLENBRE4sQ0FGSjtBQU1BLFVBQU02QixPQUFPLEdBQUcseUJBQVcsS0FBSzdFLEtBQUwsQ0FBVzhFLFNBQXRCLEVBQWlDLGlCQUFqQyxDQUFoQjtBQUNBLHdCQUNJO0FBQUssTUFBQSxTQUFTLEVBQUVEO0FBQWhCLG9CQUNJO0FBQUssTUFBQSxTQUFTLEVBQUM7QUFBZixvQkFDSTtBQUFLLE1BQUEsU0FBUyxFQUFDO0FBQWYsT0FBNEMseUJBQUcsSUFBSCxDQUE1QyxDQURKLGVBRUk7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLE9BQThDLHlCQUFHLGFBQUgsQ0FBOUMsQ0FGSixlQUdJO0FBQUssTUFBQSxTQUFTLEVBQUM7QUFBZixPQUFrRCx5QkFBRyxXQUFILENBQWxELENBSEosZUFJSTtBQUFLLE1BQUEsU0FBUyxFQUFDO0FBQWYsT0FDTSxLQUFLNUUsS0FBTCxDQUFXSSxlQUFYLENBQTJCMkMsTUFBM0IsR0FBb0MsQ0FBcEMsR0FBd0NnQyxZQUF4QyxHQUF1RCxJQUQ3RCxDQUpKLENBREosRUFTTTlFLE9BQU8sQ0FBQytFLEdBQVIsQ0FBWSxLQUFLekUsYUFBakIsQ0FUTixDQURKO0FBYUg7O0FBNU1xRCxDOztBQStNMURaLFlBQVksQ0FBQ3NGLFNBQWIsR0FBeUI7QUFDckJKLEVBQUFBLFNBQVMsRUFBRUssbUJBQVVDO0FBREEsQ0FBekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTYgT3Blbk1hcmtldCBMdGRcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0ICogYXMgc2RrIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tICcuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4uLy4uLy4uL01vZGFsJztcbmltcG9ydCB7U1NPQXV0aEVudHJ5fSBmcm9tIFwiLi4vYXV0aC9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHNcIjtcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5zZXR0aW5ncy5EZXZpY2VzUGFuZWxcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERldmljZXNQYW5lbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkZXZpY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZXZpY2VMb2FkRXJyb3I6IHVuZGVmaW5lZCxcblxuICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VzOiBbXSxcbiAgICAgICAgICAgIGRlbGV0aW5nOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl91bm1vdW50ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJEZXZpY2UgPSB0aGlzLl9yZW5kZXJEZXZpY2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25EZXZpY2VTZWxlY3Rpb25Ub2dnbGVkID0gdGhpcy5fb25EZXZpY2VTZWxlY3Rpb25Ub2dnbGVkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX29uRGVsZXRlQ2xpY2sgPSB0aGlzLl9vbkRlbGV0ZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuX2xvYWREZXZpY2VzKCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2xvYWREZXZpY2VzKCkge1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0RGV2aWNlcygpLnRoZW4oXG4gICAgICAgICAgICAocmVzcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZGV2aWNlczogcmVzcC5kZXZpY2VzIHx8IFtdfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VubW91bnRlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBsZXQgZXJydHh0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5odHRwU3RhdHVzID09IDQwNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyA0MDQgcHJvYmFibHkgbWVhbnMgdGhlIEhTIGRvZXNuJ3QgeWV0IHN1cHBvcnQgdGhlIEFQSS5cbiAgICAgICAgICAgICAgICAgICAgZXJydHh0ID0gX3QoXCJZb3VyIGhvbWVzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBsb2FkaW5nIHNlc3Npb25zOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGVycnR4dCA9IF90KFwiVW5hYmxlIHRvIGxvYWQgc2Vzc2lvbiBsaXN0XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtkZXZpY2VMb2FkRXJyb3I6IGVycnR4dH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIC8qXG4gICAgICogY29tcGFyZSB0d28gZGV2aWNlcywgc29ydGluZyBmcm9tIG1vc3QtcmVjZW50bHktc2VlbiB0byBsZWFzdC1yZWNlbnRseS1zZWVuXG4gICAgICogKGFuZCB0aGVuLCBmb3Igc3RhYmlsaXR5LCBieSBkZXZpY2UgaWQpXG4gICAgICovXG4gICAgX2RldmljZUNvbXBhcmUoYSwgYikge1xuICAgICAgICAvLyByZXR1cm4gPCAwIGlmIGEgY29tZXMgYmVmb3JlIGIsID4gMCBpZiBhIGNvbWVzIGFmdGVyIGIuXG4gICAgICAgIGNvbnN0IGxhc3RTZWVuRGVsdGEgPVxuICAgICAgICAgICAgICAoYi5sYXN0X3NlZW5fdHMgfHwgMCkgLSAoYS5sYXN0X3NlZW5fdHMgfHwgMCk7XG5cbiAgICAgICAgaWYgKGxhc3RTZWVuRGVsdGEgIT09IDApIHsgcmV0dXJuIGxhc3RTZWVuRGVsdGE7IH1cblxuICAgICAgICBjb25zdCBpZEEgPSBhLmRldmljZV9pZDtcbiAgICAgICAgY29uc3QgaWRCID0gYi5kZXZpY2VfaWQ7XG4gICAgICAgIHJldHVybiAoaWRBIDwgaWRCKSA/IC0xIDogKGlkQSA+IGlkQikgPyAxIDogMDtcbiAgICB9XG5cbiAgICBfb25EZXZpY2VTZWxlY3Rpb25Ub2dnbGVkKGRldmljZSkge1xuICAgICAgICBpZiAodGhpcy5fdW5tb3VudGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gZGV2aWNlLmRldmljZV9pZDtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUsIHByb3BzKSA9PiB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlcywgdGhlbiBhZGQgb3IgcmVtb3ZlIHRoZSBkZXZpY2VcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGV2aWNlcyA9IHN0YXRlLnNlbGVjdGVkRGV2aWNlcy5zbGljZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBpID0gc2VsZWN0ZWREZXZpY2VzLmluZGV4T2YoZGV2aWNlSWQpO1xuICAgICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VzLnB1c2goZGV2aWNlSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge3NlbGVjdGVkRGV2aWNlc307XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbkRlbGV0ZUNsaWNrKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGRlbGV0aW5nOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9tYWtlRGVsZXRlUmVxdWVzdChudWxsKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoZXJyb3IuaHR0cFN0YXR1cyAhPT0gNDAxIHx8ICFlcnJvci5kYXRhIHx8ICFlcnJvci5kYXRhLmZsb3dzKSB7XG4gICAgICAgICAgICAgICAgLy8gZG9lc24ndCBsb29rIGxpa2UgYW4gaW50ZXJhY3RpdmUtYXV0aCBmYWlsdXJlXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHBvcCB1cCBhbiBpbnRlcmFjdGl2ZSBhdXRoIGRpYWxvZ1xuICAgICAgICAgICAgY29uc3QgSW50ZXJhY3RpdmVBdXRoRGlhbG9nID0gc2RrLmdldENvbXBvbmVudChcImRpYWxvZ3MuSW50ZXJhY3RpdmVBdXRoRGlhbG9nXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBudW1EZXZpY2VzID0gdGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nQWVzdGhldGljcyA9IHtcbiAgICAgICAgICAgICAgICBbU1NPQXV0aEVudHJ5LlBIQVNFX1BSRUFVVEhdOiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcIlVzZSBTaW5nbGUgU2lnbiBPbiB0byBjb250aW51ZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogX3QoXCJDb25maXJtIGRlbGV0aW5nIHRoZXNlIHNlc3Npb25zIGJ5IHVzaW5nIFNpbmdsZSBTaWduIE9uIHRvIHByb3ZlIHlvdXIgaWRlbnRpdHkuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1EZXZpY2VzLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVUZXh0OiBfdChcIlNpbmdsZSBTaWduIE9uXCIpLFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ6IFwicHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5QSEFTRV9QT1NUQVVUSF06IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiQ29uZmlybSBkZWxldGluZyB0aGVzZSBzZXNzaW9uc1wiKSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogX3QoXCJDbGljayB0aGUgYnV0dG9uIGJlbG93IHRvIGNvbmZpcm0gZGVsZXRpbmcgdGhlc2Ugc2Vzc2lvbnMuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1EZXZpY2VzLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVUZXh0OiBfdChcIkRlbGV0ZSBzZXNzaW9uc1wiLCB7Y291bnQ6IG51bURldmljZXN9KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcImRhbmdlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlVHJhY2tlZERpYWxvZygnRGVsZXRlIERldmljZSBEaWFsb2cnLCAnJywgSW50ZXJhY3RpdmVBdXRoRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiQXV0aGVudGljYXRpb25cIiksXG4gICAgICAgICAgICAgICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnRQZWcuZ2V0KCksXG4gICAgICAgICAgICAgICAgYXV0aERhdGE6IGVycm9yLmRhdGEsXG4gICAgICAgICAgICAgICAgbWFrZVJlcXVlc3Q6IHRoaXMuX21ha2VEZWxldGVSZXF1ZXN0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIFtTU09BdXRoRW50cnkuTE9HSU5fVFlQRV06IGRpYWxvZ0Flc3RoZXRpY3MsXG4gICAgICAgICAgICAgICAgICAgIFtTU09BdXRoRW50cnkuVU5TVEFCTEVfTE9HSU5fVFlQRV06IGRpYWxvZ0Flc3RoZXRpY3MsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRlbGV0aW5nIHNlc3Npb25zXCIsIGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3VubW91bnRlZCkgeyByZXR1cm47IH1cbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBkZWxldGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21ha2VEZWxldGVSZXF1ZXN0KGF1dGgpIHtcbiAgICAgICAgcmV0dXJuIE1hdHJpeENsaWVudFBlZy5nZXQoKS5kZWxldGVNdWx0aXBsZURldmljZXModGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMsIGF1dGgpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkZWxldGVkIGRldmljZXMgZnJvbSBgZGV2aWNlc2AsIHJlc2V0IHNlbGVjdGlvbiB0byBbXVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VzOiB0aGlzLnN0YXRlLmRldmljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGQpID0+ICF0aGlzLnN0YXRlLnNlbGVjdGVkRGV2aWNlcy5pbmNsdWRlcyhkLmRldmljZV9pZCksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlczogW10sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9yZW5kZXJEZXZpY2UoZGV2aWNlKSB7XG4gICAgICAgIGNvbnN0IERldmljZXNQYW5lbEVudHJ5ID0gc2RrLmdldENvbXBvbmVudCgnc2V0dGluZ3MuRGV2aWNlc1BhbmVsRW50cnknKTtcbiAgICAgICAgcmV0dXJuIDxEZXZpY2VzUGFuZWxFbnRyeVxuICAgICAgICAgICAga2V5PXtkZXZpY2UuZGV2aWNlX2lkfVxuICAgICAgICAgICAgZGV2aWNlPXtkZXZpY2V9XG4gICAgICAgICAgICBzZWxlY3RlZD17dGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMuaW5jbHVkZXMoZGV2aWNlLmRldmljZV9pZCl9XG4gICAgICAgICAgICBvbkRldmljZVRvZ2dsZWQ9e3RoaXMuX29uRGV2aWNlU2VsZWN0aW9uVG9nZ2xlZH1cbiAgICAgICAgLz47XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBTcGlubmVyID0gc2RrLmdldENvbXBvbmVudChcImVsZW1lbnRzLlNwaW5uZXJcIik7XG4gICAgICAgIGNvbnN0IEFjY2Vzc2libGVCdXR0b24gPSBzZGsuZ2V0Q29tcG9uZW50KFwiZWxlbWVudHMuQWNjZXNzaWJsZUJ1dHRvblwiKTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5kZXZpY2VMb2FkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXModGhpcy5wcm9wcy5jbGFzc05hbWUsIFwiZXJyb3JcIik7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzfT5cbiAgICAgICAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLmRldmljZUxvYWRFcnJvciB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGV2aWNlcyA9IHRoaXMuc3RhdGUuZGV2aWNlcztcbiAgICAgICAgaWYgKGRldmljZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc3RpbGwgbG9hZGluZ1xuICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IHRoaXMucHJvcHMuY2xhc3NOYW1lO1xuICAgICAgICAgICAgcmV0dXJuIDxTcGlubmVyIGNsYXNzTmFtZT17Y2xhc3Nlc30gLz47XG4gICAgICAgIH1cblxuICAgICAgICBkZXZpY2VzLnNvcnQodGhpcy5fZGV2aWNlQ29tcGFyZSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gdGhpcy5zdGF0ZS5kZWxldGluZyA/XG4gICAgICAgICAgICA8U3Bpbm5lciB3PXsyMn0gaD17MjJ9IC8+IDpcbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMuX29uRGVsZXRlQ2xpY2t9IGtpbmQ9XCJkYW5nZXJfc21cIj5cbiAgICAgICAgICAgICAgICB7IF90KFwiRGVsZXRlICUoY291bnQpcyBzZXNzaW9uc1wiLCB7Y291bnQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWREZXZpY2VzLmxlbmd0aH0pfVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPjtcblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyh0aGlzLnByb3BzLmNsYXNzTmFtZSwgXCJteF9EZXZpY2VzUGFuZWxcIik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EZXZpY2VzUGFuZWxfaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGV2aWNlc1BhbmVsX2RldmljZUlkXCI+eyBfdChcIklEXCIpIH08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EZXZpY2VzUGFuZWxfZGV2aWNlTmFtZVwiPnsgX3QoXCJQdWJsaWMgTmFtZVwiKSB9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGV2aWNlc1BhbmVsX2RldmljZUxhc3RTZWVuXCI+eyBfdChcIkxhc3Qgc2VlblwiKSB9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGV2aWNlc1BhbmVsX2RldmljZUJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5zZWxlY3RlZERldmljZXMubGVuZ3RoID4gMCA/IGRlbGV0ZUJ1dHRvbiA6IG51bGwgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7IGRldmljZXMubWFwKHRoaXMuX3JlbmRlckRldmljZSkgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5EZXZpY2VzUGFuZWwucHJvcFR5cGVzID0ge1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbn07XG4iXX0=