UNPKG

matrix-react-sdk

Version:
189 lines (182 loc) 33.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _languageHandler = require("../../../languageHandler"); var _InteractiveAuth = _interopRequireWildcard(require("../../structures/InteractiveAuth")); var _InteractiveAuthEntryComponents = require("../auth/InteractiveAuthEntryComponents"); var _StyledCheckbox = _interopRequireDefault(require("../elements/StyledCheckbox")); var _BaseDialog = _interopRequireDefault(require("./BaseDialog")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _actions = require("../../../dispatcher/actions"); 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 2019, 2020 The Matrix.org Foundation C.I.C. Copyright 2016 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class DeactivateAccountDialog extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "onStagePhaseChange", (stage, phase) => { const dialogAesthetics = { [_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_PREAUTH]: { body: (0, _languageHandler._t)("settings|general|deactivate_confirm_body_sso"), continueText: (0, _languageHandler._t)("auth|sso"), continueKind: "danger" }, [_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_POSTAUTH]: { body: (0, _languageHandler._t)("settings|general|deactivate_confirm_body"), continueText: (0, _languageHandler._t)("settings|general|deactivate_confirm_continue"), continueKind: "danger" } }; // This is the same as aestheticsForStagePhases in InteractiveAuthDialog minus the `title` const DEACTIVATE_AESTHETICS = { [_InteractiveAuthEntryComponents.SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics, [_InteractiveAuthEntryComponents.SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics }; const aesthetics = DEACTIVATE_AESTHETICS[stage]; let bodyText; let continueText; let continueKind; if (aesthetics) { const phaseAesthetics = aesthetics[phase]; if (phaseAesthetics) { if (phaseAesthetics.body) bodyText = phaseAesthetics.body; if (phaseAesthetics.continueText) continueText = phaseAesthetics.continueText; if (phaseAesthetics.continueKind) continueKind = phaseAesthetics.continueKind; } } this.setState({ bodyText, continueText, continueKind }); }); (0, _defineProperty2.default)(this, "onUIAuthFinished", async (success, result) => { if (success) return; // great! makeRequest() will be called too. if (result === _InteractiveAuth.ERROR_USER_CANCELLED) { this.onCancel(); return; } _logger.logger.error("Error during UI Auth:", { result }); this.setState({ errStr: (0, _languageHandler._t)("settings|general|error_deactivate_communication") }); }); (0, _defineProperty2.default)(this, "onUIAuthComplete", auth => { // XXX: this should be returning a promise to maintain the state inside the state machine correct // but given that a deactivation is followed by a local logout and all object instances being thrown away // this isn't done. _MatrixClientPeg.MatrixClientPeg.safeGet().deactivateAccount(auth ?? undefined, this.state.shouldErase).then(r => { // Deactivation worked - logout & close this dialog _dispatcher.default.fire(_actions.Action.TriggerLogout); this.props.onFinished(true); }).catch(e => { _logger.logger.error(e); this.setState({ errStr: (0, _languageHandler._t)("settings|general|error_deactivate_communication") }); }); }); (0, _defineProperty2.default)(this, "onEraseFieldChange", ev => { this.setState({ shouldErase: ev.currentTarget.checked, // Disable the auth form because we're going to have to reinitialize the auth // information. We do this because we can't modify the parameters in the UIA // session, and the user will have selected something which changes the request. // Therefore, we throw away the last auth session and try a new one. authEnabled: false }); // As mentioned above, set up for auth again to get updated UIA session info this.initAuth( /* shouldErase= */ev.currentTarget.checked); }); this.state = { shouldErase: false, errStr: null, authData: null, // for UIA authEnabled: true // see usages for information }; this.initAuth( /* shouldErase= */false); } onCancel() { this.props.onFinished(false); } initAuth(shouldErase) { _MatrixClientPeg.MatrixClientPeg.safeGet().deactivateAccount(undefined, shouldErase).then(r => { // If we got here, oops. The server didn't require any auth. // Our application lifecycle will catch the error and do the logout bits. // We'll try to log something in an vain attempt to record what happened (storage // is also obliterated on logout). _logger.logger.warn("User's account got deactivated without confirmation: Server had no auth"); this.setState({ errStr: (0, _languageHandler._t)("settings|general|error_deactivate_no_auth") }); }).catch(e => { if (e && e.httpStatus === 401 && e.data) { // Valid UIA response this.setState({ authData: e.data, authEnabled: true }); } else { this.setState({ errStr: (0, _languageHandler._t)("settings|general|error_deactivate_invalid_auth") }); } }); } render() { let error; if (this.state.errStr) { error = /*#__PURE__*/_react.default.createElement("div", { className: "error" }, this.state.errStr); } let auth = /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("common|loading")); if (this.state.authData && this.state.authEnabled) { auth = /*#__PURE__*/_react.default.createElement("div", null, this.state.bodyText, /*#__PURE__*/_react.default.createElement(_InteractiveAuth.default, { matrixClient: _MatrixClientPeg.MatrixClientPeg.safeGet(), authData: this.state.authData // XXX: onUIAuthComplete breaches the expected method contract, it gets away with it because it // knows the entire app is about to die as a result of the account deactivation. , makeRequest: this.onUIAuthComplete, onAuthFinished: this.onUIAuthFinished, onStagePhaseChange: this.onStagePhaseChange, continueText: this.state.continueText, continueKind: this.state.continueKind })); } // this is on purpose not a <form /> to prevent Enter triggering submission, to further prevent accidents return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { className: "mx_DeactivateAccountDialog", onFinished: this.props.onFinished, titleClass: "danger", title: (0, _languageHandler._t)("settings|general|deactivate_section"), screenName: "DeactivateAccount" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_Dialog_content" }, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content")), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_1")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_2")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_3")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_4")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_5"))), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_6")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_DeactivateAccountDialog_input_section" }, /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, { checked: this.state.shouldErase, onChange: this.onEraseFieldChange }, (0, _languageHandler._t)("settings|general|deactivate_confirm_erase_label"))), error, auth))); } } exports.default = DeactivateAccountDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfTWF0cml4Q2xpZW50UGVnIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9JbnRlcmFjdGl2ZUF1dGgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHMiLCJfU3R5bGVkQ2hlY2tib3giLCJfQmFzZURpYWxvZyIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJEZWFjdGl2YXRlQWNjb3VudERpYWxvZyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJzdGFnZSIsInBoYXNlIiwiZGlhbG9nQWVzdGhldGljcyIsIlNTT0F1dGhFbnRyeSIsIlBIQVNFX1BSRUFVVEgiLCJib2R5IiwiX3QiLCJjb250aW51ZVRleHQiLCJjb250aW51ZUtpbmQiLCJQSEFTRV9QT1NUQVVUSCIsIkRFQUNUSVZBVEVfQUVTVEhFVElDUyIsIkxPR0lOX1RZUEUiLCJVTlNUQUJMRV9MT0dJTl9UWVBFIiwiYWVzdGhldGljcyIsImJvZHlUZXh0IiwicGhhc2VBZXN0aGV0aWNzIiwic2V0U3RhdGUiLCJzdWNjZXNzIiwicmVzdWx0IiwiRVJST1JfVVNFUl9DQU5DRUxMRUQiLCJvbkNhbmNlbCIsImxvZ2dlciIsImVycm9yIiwiZXJyU3RyIiwiYXV0aCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJkZWFjdGl2YXRlQWNjb3VudCIsInVuZGVmaW5lZCIsInN0YXRlIiwic2hvdWxkRXJhc2UiLCJ0aGVuIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJmaXJlIiwiQWN0aW9uIiwiVHJpZ2dlckxvZ291dCIsIm9uRmluaXNoZWQiLCJjYXRjaCIsImV2IiwiY3VycmVudFRhcmdldCIsImNoZWNrZWQiLCJhdXRoRW5hYmxlZCIsImluaXRBdXRoIiwiYXV0aERhdGEiLCJ3YXJuIiwiaHR0cFN0YXR1cyIsImRhdGEiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwibWF0cml4Q2xpZW50IiwibWFrZVJlcXVlc3QiLCJvblVJQXV0aENvbXBsZXRlIiwib25BdXRoRmluaXNoZWQiLCJvblVJQXV0aEZpbmlzaGVkIiwib25TdGFnZVBoYXNlQ2hhbmdlIiwidGl0bGVDbGFzcyIsInRpdGxlIiwic2NyZWVuTmFtZSIsIm9uQ2hhbmdlIiwib25FcmFzZUZpZWxkQ2hhbmdlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvRGVhY3RpdmF0ZUFjY291bnREaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBBdXRoVHlwZSwgSUF1dGhEYXRhIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2ludGVyYWN0aXZlLWF1dGhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgSW50ZXJhY3RpdmVBdXRoLCB7IEVSUk9SX1VTRVJfQ0FOQ0VMTEVELCBJbnRlcmFjdGl2ZUF1dGhDYWxsYmFjayB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL0ludGVyYWN0aXZlQXV0aFwiO1xuaW1wb3J0IHsgQ29udGludWVLaW5kLCBTU09BdXRoRW50cnkgfSBmcm9tIFwiLi4vYXV0aC9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHNcIjtcbmltcG9ydCBTdHlsZWRDaGVja2JveCBmcm9tIFwiLi4vZWxlbWVudHMvU3R5bGVkQ2hlY2tib3hcIjtcbmltcG9ydCBCYXNlRGlhbG9nIGZyb20gXCIuL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5cbnR5cGUgRGlhbG9nQWVzdGhldGljcyA9IFBhcnRpYWw8e1xuICAgIFt4IGluIEF1dGhUeXBlXToge1xuICAgICAgICBbeDogbnVtYmVyXToge1xuICAgICAgICAgICAgYm9keTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGludWVUZXh0Pzogc3RyaW5nO1xuICAgICAgICAgICAgY29udGludWVLaW5kPzogQ29udGludWVLaW5kO1xuICAgICAgICB9O1xuICAgIH07XG59PjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgb25GaW5pc2hlZDogKHN1Y2Nlc3M/OiBib29sZWFuKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBzaG91bGRFcmFzZTogYm9vbGVhbjtcbiAgICBlcnJTdHI6IHN0cmluZyB8IG51bGw7XG4gICAgYXV0aERhdGE6IGFueTsgLy8gZm9yIFVJQVxuICAgIGF1dGhFbmFibGVkOiBib29sZWFuOyAvLyBzZWUgdXNhZ2VzIGZvciBpbmZvcm1hdGlvblxuXG4gICAgLy8gQSBmZXcgc3RyaW5ncyB0aGF0IGFyZSBwYXNzZWQgdG8gSW50ZXJhY3RpdmVBdXRoIGZvciBkZXNpZ24gb3IgYXJlIGRpc3BsYXllZFxuICAgIC8vIG5leHQgdG8gdGhlIEludGVyYWN0aXZlQXV0aCBjb21wb25lbnQuXG4gICAgYm9keVRleHQ/OiBzdHJpbmc7XG4gICAgY29udGludWVUZXh0Pzogc3RyaW5nO1xuICAgIGNvbnRpbnVlS2luZD86IENvbnRpbnVlS2luZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVhY3RpdmF0ZUFjY291bnREaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNob3VsZEVyYXNlOiBmYWxzZSxcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIGF1dGhEYXRhOiBudWxsLCAvLyBmb3IgVUlBXG4gICAgICAgICAgICBhdXRoRW5hYmxlZDogdHJ1ZSwgLy8gc2VlIHVzYWdlcyBmb3IgaW5mb3JtYXRpb25cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmluaXRBdXRoKC8qIHNob3VsZEVyYXNlPSAqLyBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblN0YWdlUGhhc2VDaGFuZ2UgPSAoc3RhZ2U6IEF1dGhUeXBlLCBwaGFzZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0Flc3RoZXRpY3MgPSB7XG4gICAgICAgICAgICBbU1NPQXV0aEVudHJ5LlBIQVNFX1BSRUFVVEhdOiB7XG4gICAgICAgICAgICAgICAgYm9keTogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9ib2R5X3Nzb1wiKSxcbiAgICAgICAgICAgICAgICBjb250aW51ZVRleHQ6IF90KFwiYXV0aHxzc29cIiksXG4gICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcImRhbmdlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtTU09BdXRoRW50cnkuUEhBU0VfUE9TVEFVVEhdOiB7XG4gICAgICAgICAgICAgICAgYm9keTogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9ib2R5XCIpLFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlVGV4dDogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9jb250aW51ZVwiKSxcbiAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ6IFwiZGFuZ2VyXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzIGluIEludGVyYWN0aXZlQXV0aERpYWxvZyBtaW51cyB0aGUgYHRpdGxlYFxuICAgICAgICBjb25zdCBERUFDVElWQVRFX0FFU1RIRVRJQ1M6IERpYWxvZ0Flc3RoZXRpY3MgPSB7XG4gICAgICAgICAgICBbU1NPQXV0aEVudHJ5LkxPR0lOX1RZUEVdOiBkaWFsb2dBZXN0aGV0aWNzLFxuICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5VTlNUQUJMRV9MT0dJTl9UWVBFXTogZGlhbG9nQWVzdGhldGljcyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhZXN0aGV0aWNzID0gREVBQ1RJVkFURV9BRVNUSEVUSUNTW3N0YWdlXTtcbiAgICAgICAgbGV0IGJvZHlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBjb250aW51ZVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNvbnRpbnVlS2luZDogQ29udGludWVLaW5kIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoYWVzdGhldGljcykge1xuICAgICAgICAgICAgY29uc3QgcGhhc2VBZXN0aGV0aWNzID0gYWVzdGhldGljc1twaGFzZV07XG4gICAgICAgICAgICBpZiAocGhhc2VBZXN0aGV0aWNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBoYXNlQWVzdGhldGljcy5ib2R5KSBib2R5VGV4dCA9IHBoYXNlQWVzdGhldGljcy5ib2R5O1xuICAgICAgICAgICAgICAgIGlmIChwaGFzZUFlc3RoZXRpY3MuY29udGludWVUZXh0KSBjb250aW51ZVRleHQgPSBwaGFzZUFlc3RoZXRpY3MuY29udGludWVUZXh0O1xuICAgICAgICAgICAgICAgIGlmIChwaGFzZUFlc3RoZXRpY3MuY29udGludWVLaW5kKSBjb250aW51ZUtpbmQgPSBwaGFzZUFlc3RoZXRpY3MuY29udGludWVLaW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBib2R5VGV4dCwgY29udGludWVUZXh0LCBjb250aW51ZUtpbmQgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25VSUF1dGhGaW5pc2hlZDogSW50ZXJhY3RpdmVBdXRoQ2FsbGJhY2s8QXdhaXRlZDxSZXR1cm5UeXBlPE1hdHJpeENsaWVudFtcImRlYWN0aXZhdGVBY2NvdW50XCJdPj4+ID0gYXN5bmMgKFxuICAgICAgICBzdWNjZXNzLFxuICAgICAgICByZXN1bHQsXG4gICAgKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSByZXR1cm47IC8vIGdyZWF0ISBtYWtlUmVxdWVzdCgpIHdpbGwgYmUgY2FsbGVkIHRvby5cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBFUlJPUl9VU0VSX0NBTkNFTExFRCkge1xuICAgICAgICAgICAgdGhpcy5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIFVJIEF1dGg6XCIsIHsgcmVzdWx0IH0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyU3RyOiBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfZGVhY3RpdmF0ZV9jb21tdW5pY2F0aW9uXCIpIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVUlBdXRoQ29tcGxldGUgPSAoYXV0aDogSUF1dGhEYXRhIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBYWFg6IHRoaXMgc2hvdWxkIGJlIHJldHVybmluZyBhIHByb21pc2UgdG8gbWFpbnRhaW4gdGhlIHN0YXRlIGluc2lkZSB0aGUgc3RhdGUgbWFjaGluZSBjb3JyZWN0XG4gICAgICAgIC8vIGJ1dCBnaXZlbiB0aGF0IGEgZGVhY3RpdmF0aW9uIGlzIGZvbGxvd2VkIGJ5IGEgbG9jYWwgbG9nb3V0IGFuZCBhbGwgb2JqZWN0IGluc3RhbmNlcyBiZWluZyB0aHJvd24gYXdheVxuICAgICAgICAvLyB0aGlzIGlzbid0IGRvbmUuXG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KClcbiAgICAgICAgICAgIC5kZWFjdGl2YXRlQWNjb3VudChhdXRoID8/IHVuZGVmaW5lZCwgdGhpcy5zdGF0ZS5zaG91bGRFcmFzZSlcbiAgICAgICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRGVhY3RpdmF0aW9uIHdvcmtlZCAtIGxvZ291dCAmIGNsb3NlIHRoaXMgZGlhbG9nXG4gICAgICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZmlyZShBY3Rpb24uVHJpZ2dlckxvZ291dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyU3RyOiBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfZGVhY3RpdmF0ZV9jb21tdW5pY2F0aW9uXCIpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25FcmFzZUZpZWxkQ2hhbmdlID0gKGV2OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzaG91bGRFcmFzZTogZXYuY3VycmVudFRhcmdldC5jaGVja2VkLFxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBhdXRoIGZvcm0gYmVjYXVzZSB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYXV0aFxuICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24uIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCBtb2RpZnkgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIFVJQVxuICAgICAgICAgICAgLy8gc2Vzc2lvbiwgYW5kIHRoZSB1c2VyIHdpbGwgaGF2ZSBzZWxlY3RlZCBzb21ldGhpbmcgd2hpY2ggY2hhbmdlcyB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgdGhyb3cgYXdheSB0aGUgbGFzdCBhdXRoIHNlc3Npb24gYW5kIHRyeSBhIG5ldyBvbmUuXG4gICAgICAgICAgICBhdXRoRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFzIG1lbnRpb25lZCBhYm92ZSwgc2V0IHVwIGZvciBhdXRoIGFnYWluIHRvIGdldCB1cGRhdGVkIFVJQSBzZXNzaW9uIGluZm9cbiAgICAgICAgdGhpcy5pbml0QXV0aCgvKiBzaG91bGRFcmFzZT0gKi8gZXYuY3VycmVudFRhcmdldC5jaGVja2VkKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRBdXRoKHNob3VsZEVyYXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KClcbiAgICAgICAgICAgIC5kZWFjdGl2YXRlQWNjb3VudCh1bmRlZmluZWQsIHNob3VsZEVyYXNlKVxuICAgICAgICAgICAgLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgb29wcy4gVGhlIHNlcnZlciBkaWRuJ3QgcmVxdWlyZSBhbnkgYXV0aC5cbiAgICAgICAgICAgICAgICAvLyBPdXIgYXBwbGljYXRpb24gbGlmZWN5Y2xlIHdpbGwgY2F0Y2ggdGhlIGVycm9yIGFuZCBkbyB0aGUgbG9nb3V0IGJpdHMuXG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgdHJ5IHRvIGxvZyBzb21ldGhpbmcgaW4gYW4gdmFpbiBhdHRlbXB0IHRvIHJlY29yZCB3aGF0IGhhcHBlbmVkIChzdG9yYWdlXG4gICAgICAgICAgICAgICAgLy8gaXMgYWxzbyBvYmxpdGVyYXRlZCBvbiBsb2dvdXQpLlxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiVXNlcidzIGFjY291bnQgZ290IGRlYWN0aXZhdGVkIHdpdGhvdXQgY29uZmlybWF0aW9uOiBTZXJ2ZXIgaGFkIG5vIGF1dGhcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVyclN0cjogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGVycm9yX2RlYWN0aXZhdGVfbm9fYXV0aFwiKSB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmh0dHBTdGF0dXMgPT09IDQwMSAmJiBlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWQgVUlBIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBhdXRoRGF0YTogZS5kYXRhLCBhdXRoRW5hYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyU3RyOiBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfZGVhY3RpdmF0ZV9pbnZhbGlkX2F1dGhcIikgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgZXJyb3I6IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lcnJTdHIpIHtcbiAgICAgICAgICAgIGVycm9yID0gPGRpdiBjbGFzc05hbWU9XCJlcnJvclwiPnt0aGlzLnN0YXRlLmVyclN0cn08L2Rpdj47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXV0aCA9IDxkaXY+e190KFwiY29tbW9ufGxvYWRpbmdcIil9PC9kaXY+O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5hdXRoRGF0YSAmJiB0aGlzLnN0YXRlLmF1dGhFbmFibGVkKSB7XG4gICAgICAgICAgICBhdXRoID0gKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmJvZHlUZXh0fVxuICAgICAgICAgICAgICAgICAgICA8SW50ZXJhY3RpdmVBdXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhDbGllbnQ9e01hdHJpeENsaWVudFBlZy5zYWZlR2V0KCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRoRGF0YT17dGhpcy5zdGF0ZS5hdXRoRGF0YX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhYWDogb25VSUF1dGhDb21wbGV0ZSBicmVhY2hlcyB0aGUgZXhwZWN0ZWQgbWV0aG9kIGNvbnRyYWN0LCBpdCBnZXRzIGF3YXkgd2l0aCBpdCBiZWNhdXNlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrbm93cyB0aGUgZW50aXJlIGFwcCBpcyBhYm91dCB0byBkaWUgYXMgYSByZXN1bHQgb2YgdGhlIGFjY291bnQgZGVhY3RpdmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlcXVlc3Q9e3RoaXMub25VSUF1dGhDb21wbGV0ZSBhcyBhbnl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkF1dGhGaW5pc2hlZD17dGhpcy5vblVJQXV0aEZpbmlzaGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFnZVBoYXNlQ2hhbmdlPXt0aGlzLm9uU3RhZ2VQaGFzZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlVGV4dD17dGhpcy5zdGF0ZS5jb250aW51ZVRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ9e3RoaXMuc3RhdGUuY29udGludWVLaW5kfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMgaXMgb24gcHVycG9zZSBub3QgYSA8Zm9ybSAvPiB0byBwcmV2ZW50IEVudGVyIHRyaWdnZXJpbmcgc3VibWlzc2lvbiwgdG8gZnVydGhlciBwcmV2ZW50IGFjY2lkZW50c1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EZWFjdGl2YXRlQWNjb3VudERpYWxvZ1wiXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIHRpdGxlQ2xhc3M9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9zZWN0aW9uXCIpfVxuICAgICAgICAgICAgICAgIHNjcmVlbk5hbWU9XCJEZWFjdGl2YXRlQWNjb3VudFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8cD57X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9jb250ZW50XCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfMVwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfMlwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfM1wiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfNFwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfNVwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8cD57X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9jb250ZW50XzZcIil9PC9wPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGVhY3RpdmF0ZUFjY291bnREaWFsb2dfaW5wdXRfc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZENoZWNrYm94IGNoZWNrZWQ9e3RoaXMuc3RhdGUuc2hvdWxkRXJhc2V9IG9uQ2hhbmdlPXt0aGlzLm9uRXJhc2VGaWVsZENoYW5nZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2VyYXNlX2xhYmVsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICB7YXV0aH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUMsdUJBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLCtCQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxlQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxXQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxRQUFB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