UNPKG

matrix-react-sdk

Version:
426 lines (358 loc) 52.7 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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _EditableItemList = _interopRequireDefault(require("../elements/EditableItemList")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var sdk = _interopRequireWildcard(require("../../../index")); var _languageHandler = require("../../../languageHandler"); var _Field = _interopRequireDefault(require("../elements/Field")); var _ErrorDialog = _interopRequireDefault(require("../dialogs/ErrorDialog")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _Modal = _interopRequireDefault(require("../../../Modal")); var _RoomPublishSetting = _interopRequireDefault(require("./RoomPublishSetting")); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _class2, _temp; class EditableAliasesList extends _EditableItemList.default { constructor(props) { super(props); (0, _defineProperty2.default)(this, "_onAliasAdded", async () => { await this._aliasField.current.validate({ allowEmpty: false }); if (this._aliasField.current.isValid) { if (this.props.onItemAdded) this.props.onItemAdded(this.props.newItem); return; } this._aliasField.current.focus(); this._aliasField.current.validate({ allowEmpty: false, focused: true }); }); this._aliasField = /*#__PURE__*/(0, _react.createRef)(); } _renderNewItemField() { // if we don't need the RoomAliasField, // we don't need to overriden version of _renderNewItemField if (!this.props.domain) { return super._renderNewItemField(); } const RoomAliasField = sdk.getComponent('views.elements.RoomAliasField'); const onChange = alias => this._onNewItemChanged({ target: { value: alias } }); return /*#__PURE__*/_react.default.createElement("form", { onSubmit: this._onAliasAdded, autoComplete: "off", noValidate: true, className: "mx_EditableItemList_newItem" }, /*#__PURE__*/_react.default.createElement(RoomAliasField, { ref: this._aliasField, onChange: onChange, value: this.props.newItem || "", domain: this.props.domain }), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this._onAliasAdded, kind: "primary" }, (0, _languageHandler._t)("Add"))); } } let AliasSettings = (_dec = (0, _replaceableComponent.replaceableComponent)("views.room_settings.AliasSettings"), _dec(_class = (_temp = _class2 = class AliasSettings extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "onNewAliasChanged", value => { this.setState({ newAlias: value }); }); (0, _defineProperty2.default)(this, "onLocalAliasAdded", alias => { if (!alias || alias.length === 0) return; // ignore attempts to create blank aliases const localDomain = _MatrixClientPeg.MatrixClientPeg.get().getDomain(); if (!alias.includes(':')) alias += ':' + localDomain; _MatrixClientPeg.MatrixClientPeg.get().createAlias(alias, this.props.roomId).then(() => { this.setState({ localAliases: this.state.localAliases.concat(alias), newAlias: null }); if (!this.state.canonicalAlias) { this.changeCanonicalAlias(alias); } }).catch(err => { console.error(err); _Modal.default.createTrackedDialog('Error creating address', '', _ErrorDialog.default, { title: (0, _languageHandler._t)("Error creating address"), description: (0, _languageHandler._t)("There was an error creating that address. It may not be allowed by the server " + "or a temporary failure occurred.") }); }); }); (0, _defineProperty2.default)(this, "onLocalAliasDeleted", index => { const alias = this.state.localAliases[index]; // TODO: In future, we should probably be making sure that the alias actually belongs // to this room. See https://github.com/vector-im/element-web/issues/7353 _MatrixClientPeg.MatrixClientPeg.get().deleteAlias(alias).then(() => { const localAliases = this.state.localAliases.filter(a => a !== alias); this.setState({ localAliases }); if (this.state.canonicalAlias === alias) { this.changeCanonicalAlias(null); } }).catch(err => { console.error(err); let description; if (err.errcode === "M_FORBIDDEN") { description = (0, _languageHandler._t)("You don't have permission to delete the address."); } else { description = (0, _languageHandler._t)("There was an error removing that address. It may no longer exist or a temporary " + "error occurred."); } _Modal.default.createTrackedDialog('Error removing address', '', _ErrorDialog.default, { title: (0, _languageHandler._t)("Error removing address"), description }); }); }); (0, _defineProperty2.default)(this, "onLocalAliasesToggled", event => { // expanded if (event.target.open) { // if local aliases haven't been preloaded yet at component mount if (!this.props.canSetCanonicalAlias && this.state.localAliases.length === 0) { this.loadLocalAliases(); } } this.setState({ detailsOpen: event.target.open }); }); (0, _defineProperty2.default)(this, "onCanonicalAliasChange", event => { this.changeCanonicalAlias(event.target.value); }); (0, _defineProperty2.default)(this, "onNewAltAliasChanged", value => { this.setState({ newAltAlias: value }); }); (0, _defineProperty2.default)(this, "onAltAliasAdded", alias => { const altAliases = this.state.altAliases.slice(); if (!altAliases.some(a => a.trim() === alias.trim())) { altAliases.push(alias.trim()); this.changeAltAliases(altAliases); this.setState({ newAltAlias: "" }); } }); (0, _defineProperty2.default)(this, "onAltAliasDeleted", index => { const altAliases = this.state.altAliases.slice(); altAliases.splice(index, 1); this.changeAltAliases(altAliases); }); const state = { altAliases: [], // [ #alias:domain.tld, ... ] localAliases: [], // [ #alias:my-hs.tld, ... ] canonicalAlias: null, // #canonical:domain.tld updatingCanonicalAlias: false, localAliasesLoading: false, detailsOpen: false }; if (props.canonicalAliasEvent) { const content = props.canonicalAliasEvent.getContent(); const altAliases = content.alt_aliases; if (Array.isArray(altAliases)) { state.altAliases = altAliases.slice(); } state.canonicalAlias = content.alias; } this.state = state; } componentDidMount() { if (this.props.canSetCanonicalAlias) { // load local aliases for providing recommendations // for the canonical alias and alt_aliases this.loadLocalAliases(); } } async loadLocalAliases() { this.setState({ localAliasesLoading: true }); try { const cli = _MatrixClientPeg.MatrixClientPeg.get(); let localAliases = []; if (await cli.doesServerSupportUnstableFeature("org.matrix.msc2432")) { const response = await cli.unstableGetLocalAliases(this.props.roomId); if (Array.isArray(response.aliases)) { localAliases = response.aliases; } } this.setState({ localAliases }); } finally { this.setState({ localAliasesLoading: false }); } } changeCanonicalAlias(alias) { if (!this.props.canSetCanonicalAlias) return; const oldAlias = this.state.canonicalAlias; this.setState({ canonicalAlias: alias, updatingCanonicalAlias: true }); const eventContent = { alt_aliases: this.state.altAliases }; if (alias) eventContent["alias"] = alias; _MatrixClientPeg.MatrixClientPeg.get().sendStateEvent(this.props.roomId, "m.room.canonical_alias", eventContent, "").catch(err => { console.error(err); _Modal.default.createTrackedDialog('Error updating main address', '', _ErrorDialog.default, { title: (0, _languageHandler._t)("Error updating main address"), description: (0, _languageHandler._t)("There was an error updating the room's main address. It may not be allowed by the server " + "or a temporary failure occurred.") }); this.setState({ canonicalAlias: oldAlias }); }).finally(() => { this.setState({ updatingCanonicalAlias: false }); }); } changeAltAliases(altAliases) { if (!this.props.canSetCanonicalAlias) return; this.setState({ updatingCanonicalAlias: true, altAliases }); const eventContent = {}; if (this.state.canonicalAlias) { eventContent.alias = this.state.canonicalAlias; } if (altAliases) { eventContent["alt_aliases"] = altAliases; } _MatrixClientPeg.MatrixClientPeg.get().sendStateEvent(this.props.roomId, "m.room.canonical_alias", eventContent, "").catch(err => { console.error(err); _Modal.default.createTrackedDialog('Error updating alternative addresses', '', _ErrorDialog.default, { title: (0, _languageHandler._t)("Error updating main address"), description: (0, _languageHandler._t)("There was an error updating the room's alternative addresses. " + "It may not be allowed by the server or a temporary failure occurred.") }); }).finally(() => { this.setState({ updatingCanonicalAlias: false }); }); } _getAliases() { return this.state.altAliases.concat(this._getLocalNonAltAliases()); } _getLocalNonAltAliases() { const { altAliases } = this.state; return this.state.localAliases.filter(alias => !altAliases.includes(alias)); } render() { const localDomain = _MatrixClientPeg.MatrixClientPeg.get().getDomain(); let found = false; const canonicalValue = this.state.canonicalAlias || ""; const canonicalAliasSection = /*#__PURE__*/_react.default.createElement(_Field.default, { onChange: this.onCanonicalAliasChange, value: canonicalValue, disabled: this.state.updatingCanonicalAlias || !this.props.canSetCanonicalAlias, element: "select", id: "canonicalAlias", label: (0, _languageHandler._t)('Main address') }, /*#__PURE__*/_react.default.createElement("option", { value: "", key: "unset" }, (0, _languageHandler._t)('not specified')), this._getAliases().map((alias, i) => { if (alias === this.state.canonicalAlias) found = true; return /*#__PURE__*/_react.default.createElement("option", { value: alias, key: i }, alias); }), found || !this.state.canonicalAlias ? '' : /*#__PURE__*/_react.default.createElement("option", { value: this.state.canonicalAlias, key: "arbitrary" }, this.state.canonicalAlias)); let localAliasesList; if (this.state.localAliasesLoading) { const Spinner = sdk.getComponent("elements.Spinner"); localAliasesList = /*#__PURE__*/_react.default.createElement(Spinner, null); } else { localAliasesList = /*#__PURE__*/_react.default.createElement(EditableAliasesList, { id: "roomAliases", className: "mx_RoomSettings_localAliases", items: this.state.localAliases, newItem: this.state.newAlias, onNewItemChanged: this.onNewAliasChanged, canRemove: this.props.canSetAliases, canEdit: this.props.canSetAliases, onItemAdded: this.onLocalAliasAdded, onItemRemoved: this.onLocalAliasDeleted, noItemsLabel: (0, _languageHandler._t)('This room has no local addresses'), placeholder: (0, _languageHandler._t)('Local address'), domain: localDomain }); } return /*#__PURE__*/_react.default.createElement("div", { className: "mx_AliasSettings" }, /*#__PURE__*/_react.default.createElement("span", { className: "mx_SettingsTab_subheading" }, (0, _languageHandler._t)("Published Addresses")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Published addresses can be used by anyone on any server to join your room. " + "To publish an address, it needs to be set as a local address first.")), canonicalAliasSection, /*#__PURE__*/_react.default.createElement(_RoomPublishSetting.default, { roomId: this.props.roomId, canSetCanonicalAlias: this.props.canSetCanonicalAlias }), /*#__PURE__*/_react.default.createElement("datalist", { id: "mx_AliasSettings_altRecommendations" }, this._getLocalNonAltAliases().map(alias => { return /*#__PURE__*/_react.default.createElement("option", { value: alias, key: alias }); }), ";"), /*#__PURE__*/_react.default.createElement(EditableAliasesList, { id: "roomAltAliases", className: "mx_RoomSettings_altAliases", items: this.state.altAliases, newItem: this.state.newAltAlias, onNewItemChanged: this.onNewAltAliasChanged, canRemove: this.props.canSetCanonicalAlias, canEdit: this.props.canSetCanonicalAlias, onItemAdded: this.onAltAliasAdded, onItemRemoved: this.onAltAliasDeleted, suggestionsListId: "mx_AliasSettings_altRecommendations", itemsLabel: (0, _languageHandler._t)('Other published addresses:'), noItemsLabel: (0, _languageHandler._t)('No other published addresses yet, add one below'), placeholder: (0, _languageHandler._t)('New published address (e.g. #alias:server)') }), /*#__PURE__*/_react.default.createElement("span", { className: "mx_SettingsTab_subheading mx_AliasSettings_localAliasHeader" }, (0, _languageHandler._t)("Local Addresses")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)", { localDomain })), /*#__PURE__*/_react.default.createElement("details", { onToggle: this.onLocalAliasesToggled }, /*#__PURE__*/_react.default.createElement("summary", null, this.state.detailsOpen ? (0, _languageHandler._t)('Show less') : (0, _languageHandler._t)("Show more")), localAliasesList)); } }, (0, _defineProperty2.default)(_class2, "propTypes", { roomId: _propTypes.default.string.isRequired, canSetCanonicalAlias: _propTypes.default.bool.isRequired, canSetAliases: _propTypes.default.bool.isRequired, canonicalAliasEvent: _propTypes.default.object // MatrixEvent }), (0, _defineProperty2.default)(_class2, "defaultProps", { canSetAliases: false, canSetCanonicalAlias: false, aliasEvents: [] }), _temp)) || _class); exports.default = AliasSettings; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21fc2V0dGluZ3MvQWxpYXNTZXR0aW5ncy5qcyJdLCJuYW1lcyI6WyJFZGl0YWJsZUFsaWFzZXNMaXN0IiwiRWRpdGFibGVJdGVtTGlzdCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfYWxpYXNGaWVsZCIsImN1cnJlbnQiLCJ2YWxpZGF0ZSIsImFsbG93RW1wdHkiLCJpc1ZhbGlkIiwib25JdGVtQWRkZWQiLCJuZXdJdGVtIiwiZm9jdXMiLCJmb2N1c2VkIiwiX3JlbmRlck5ld0l0ZW1GaWVsZCIsImRvbWFpbiIsIlJvb21BbGlhc0ZpZWxkIiwic2RrIiwiZ2V0Q29tcG9uZW50Iiwib25DaGFuZ2UiLCJhbGlhcyIsIl9vbk5ld0l0ZW1DaGFuZ2VkIiwidGFyZ2V0IiwidmFsdWUiLCJfb25BbGlhc0FkZGVkIiwiQWxpYXNTZXR0aW5ncyIsIlJlYWN0IiwiQ29tcG9uZW50Iiwic2V0U3RhdGUiLCJuZXdBbGlhcyIsImxlbmd0aCIsImxvY2FsRG9tYWluIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZ2V0RG9tYWluIiwiaW5jbHVkZXMiLCJjcmVhdGVBbGlhcyIsInJvb21JZCIsInRoZW4iLCJsb2NhbEFsaWFzZXMiLCJzdGF0ZSIsImNvbmNhdCIsImNhbm9uaWNhbEFsaWFzIiwiY2hhbmdlQ2Fub25pY2FsQWxpYXMiLCJjYXRjaCIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsIk1vZGFsIiwiY3JlYXRlVHJhY2tlZERpYWxvZyIsIkVycm9yRGlhbG9nIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsImluZGV4IiwiZGVsZXRlQWxpYXMiLCJmaWx0ZXIiLCJhIiwiZXJyY29kZSIsImV2ZW50Iiwib3BlbiIsImNhblNldENhbm9uaWNhbEFsaWFzIiwibG9hZExvY2FsQWxpYXNlcyIsImRldGFpbHNPcGVuIiwibmV3QWx0QWxpYXMiLCJhbHRBbGlhc2VzIiwic2xpY2UiLCJzb21lIiwidHJpbSIsInB1c2giLCJjaGFuZ2VBbHRBbGlhc2VzIiwic3BsaWNlIiwidXBkYXRpbmdDYW5vbmljYWxBbGlhcyIsImxvY2FsQWxpYXNlc0xvYWRpbmciLCJjYW5vbmljYWxBbGlhc0V2ZW50IiwiY29udGVudCIsImdldENvbnRlbnQiLCJhbHRfYWxpYXNlcyIsIkFycmF5IiwiaXNBcnJheSIsImNvbXBvbmVudERpZE1vdW50IiwiY2xpIiwiZG9lc1NlcnZlclN1cHBvcnRVbnN0YWJsZUZlYXR1cmUiLCJyZXNwb25zZSIsInVuc3RhYmxlR2V0TG9jYWxBbGlhc2VzIiwiYWxpYXNlcyIsIm9sZEFsaWFzIiwiZXZlbnRDb250ZW50Iiwic2VuZFN0YXRlRXZlbnQiLCJmaW5hbGx5IiwiX2dldEFsaWFzZXMiLCJfZ2V0TG9jYWxOb25BbHRBbGlhc2VzIiwicmVuZGVyIiwiZm91bmQiLCJjYW5vbmljYWxWYWx1ZSIsImNhbm9uaWNhbEFsaWFzU2VjdGlvbiIsIm9uQ2Fub25pY2FsQWxpYXNDaGFuZ2UiLCJtYXAiLCJpIiwibG9jYWxBbGlhc2VzTGlzdCIsIlNwaW5uZXIiLCJvbk5ld0FsaWFzQ2hhbmdlZCIsImNhblNldEFsaWFzZXMiLCJvbkxvY2FsQWxpYXNBZGRlZCIsIm9uTG9jYWxBbGlhc0RlbGV0ZWQiLCJvbk5ld0FsdEFsaWFzQ2hhbmdlZCIsIm9uQWx0QWxpYXNBZGRlZCIsIm9uQWx0QWxpYXNEZWxldGVkIiwib25Mb2NhbEFsaWFzZXNUb2dnbGVkIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImJvb2wiLCJvYmplY3QiLCJhbGlhc0V2ZW50cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLG1CQUFOLFNBQWtDQyx5QkFBbEMsQ0FBbUQ7QUFDL0NDLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2YsVUFBTUEsS0FBTjtBQURlLHlE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bkUsS0FBTCxDQUFXc0IsV0FBWCxHQUF5Qix5QkFBRyxXQUFILENBQXpCLEdBQTJDLHlCQUFHLFdBQUgsQ0FBdEQsQ0FESixFQUVLb0MsZ0JBRkwsQ0E1QkosQ0FESjtBQW1DSDs7QUE5VHNELEMsc0RBQ3BDO0FBQ2Y3RCxFQUFBQSxNQUFNLEVBQUV1RSxtQkFBVUMsTUFBVixDQUFpQkMsVUFEVjtBQUVmbEQsRUFBQUEsb0JBQW9CLEVBQUVnRCxtQkFBVUcsSUFBVixDQUFlRCxVQUZ0QjtBQUdmVCxFQUFBQSxhQUFhLEVBQUVPLG1CQUFVRyxJQUFWLENBQWVELFVBSGY7QUFJZnJDLEVBQUFBLG1CQUFtQixFQUFFbUMsbUJBQVVJLE1BSmhCLENBSXdCOztBQUp4QixDLDBEQU9HO0FBQ2xCWCxFQUFBQSxhQUFhLEVBQUUsS0FERztBQUVsQnpDLEVBQUFBLG9CQUFvQixFQUFFLEtBRko7QUFHbEJxRCxFQUFBQSxXQUFXLEVBQUU7QUFISyxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE2IE9wZW5NYXJrZXQgTHRkXG5Db3B5cmlnaHQgMjAxOCwgMjAxOSBOZXcgVmVjdG9yIEx0ZFxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBFZGl0YWJsZUl0ZW1MaXN0IGZyb20gXCIuLi9lbGVtZW50cy9FZGl0YWJsZUl0ZW1MaXN0XCI7XG5pbXBvcnQgUmVhY3QsIHtjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0ICogYXMgc2RrIGZyb20gXCIuLi8uLi8uLi9pbmRleFwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi9lbGVtZW50cy9GaWVsZFwiO1xuaW1wb3J0IEVycm9yRGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL0Vycm9yRGlhbG9nXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFJvb21QdWJsaXNoU2V0dGluZyBmcm9tIFwiLi9Sb29tUHVibGlzaFNldHRpbmdcIjtcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5jbGFzcyBFZGl0YWJsZUFsaWFzZXNMaXN0IGV4dGVuZHMgRWRpdGFibGVJdGVtTGlzdCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuX2FsaWFzRmllbGQgPSBjcmVhdGVSZWYoKTtcbiAgICB9XG5cbiAgICBfb25BbGlhc0FkZGVkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9hbGlhc0ZpZWxkLmN1cnJlbnQudmFsaWRhdGUoeyBhbGxvd0VtcHR5OiBmYWxzZSB9KTtcblxuICAgICAgICBpZiAodGhpcy5fYWxpYXNGaWVsZC5jdXJyZW50LmlzVmFsaWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm9uSXRlbUFkZGVkKSB0aGlzLnByb3BzLm9uSXRlbUFkZGVkKHRoaXMucHJvcHMubmV3SXRlbSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hbGlhc0ZpZWxkLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5fYWxpYXNGaWVsZC5jdXJyZW50LnZhbGlkYXRlKHsgYWxsb3dFbXB0eTogZmFsc2UsIGZvY3VzZWQ6IHRydWUgfSk7XG4gICAgfTtcblxuICAgIF9yZW5kZXJOZXdJdGVtRmllbGQoKSB7XG4gICAgICAgIC8vIGlmIHdlIGRvbid0IG5lZWQgdGhlIFJvb21BbGlhc0ZpZWxkLFxuICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIG92ZXJyaWRlbiB2ZXJzaW9uIG9mIF9yZW5kZXJOZXdJdGVtRmllbGRcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLl9yZW5kZXJOZXdJdGVtRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBSb29tQWxpYXNGaWVsZCA9IHNkay5nZXRDb21wb25lbnQoJ3ZpZXdzLmVsZW1lbnRzLlJvb21BbGlhc0ZpZWxkJyk7XG4gICAgICAgIGNvbnN0IG9uQ2hhbmdlID0gKGFsaWFzKSA9PiB0aGlzLl9vbk5ld0l0ZW1DaGFuZ2VkKHt0YXJnZXQ6IHt2YWx1ZTogYWxpYXN9fSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgICAgIG9uU3VibWl0PXt0aGlzLl9vbkFsaWFzQWRkZWR9XG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICBub1ZhbGlkYXRlPXt0cnVlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0VkaXRhYmxlSXRlbUxpc3RfbmV3SXRlbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFJvb21BbGlhc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5fYWxpYXNGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy5uZXdJdGVtIHx8IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgIGRvbWFpbj17dGhpcy5wcm9wcy5kb21haW59IC8+XG4gICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gb25DbGljaz17dGhpcy5fb25BbGlhc0FkZGVkfSBraW5kPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICB7IF90KFwiQWRkXCIpIH1cbiAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5yb29tX3NldHRpbmdzLkFsaWFzU2V0dGluZ3NcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFsaWFzU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIHJvb21JZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgICBjYW5TZXRDYW5vbmljYWxBbGlhczogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICAgICAgY2FuU2V0QWxpYXNlczogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgICAgICAgY2Fub25pY2FsQWxpYXNFdmVudDogUHJvcFR5cGVzLm9iamVjdCwgLy8gTWF0cml4RXZlbnRcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY2FuU2V0QWxpYXNlczogZmFsc2UsXG4gICAgICAgIGNhblNldENhbm9uaWNhbEFsaWFzOiBmYWxzZSxcbiAgICAgICAgYWxpYXNFdmVudHM6IFtdLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBhbHRBbGlhc2VzOiBbXSwgLy8gWyAjYWxpYXM6ZG9tYWluLnRsZCwgLi4uIF1cbiAgICAgICAgICAgIGxvY2FsQWxpYXNlczogW10sIC8vIFsgI2FsaWFzOm15LWhzLnRsZCwgLi4uIF1cbiAgICAgICAgICAgIGNhbm9uaWNhbEFsaWFzOiBudWxsLCAvLyAjY2Fub25pY2FsOmRvbWFpbi50bGRcbiAgICAgICAgICAgIHVwZGF0aW5nQ2Fub25pY2FsQWxpYXM6IGZhbHNlLFxuICAgICAgICAgICAgbG9jYWxBbGlhc2VzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBkZXRhaWxzT3BlbjogZmFsc2UsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHByb3BzLmNhbm9uaWNhbEFsaWFzRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwcm9wcy5jYW5vbmljYWxBbGlhc0V2ZW50LmdldENvbnRlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGFsdEFsaWFzZXMgPSBjb250ZW50LmFsdF9hbGlhc2VzO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWx0QWxpYXNlcykpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5hbHRBbGlhc2VzID0gYWx0QWxpYXNlcy5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuY2Fub25pY2FsQWxpYXMgPSBjb250ZW50LmFsaWFzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5jYW5TZXRDYW5vbmljYWxBbGlhcykge1xuICAgICAgICAgICAgLy8gbG9hZCBsb2NhbCBhbGlhc2VzIGZvciBwcm92aWRpbmcgcmVjb21tZW5kYXRpb25zXG4gICAgICAgICAgICAvLyBmb3IgdGhlIGNhbm9uaWNhbCBhbGlhcyBhbmQgYWx0X2FsaWFzZXNcbiAgICAgICAgICAgIHRoaXMubG9hZExvY2FsQWxpYXNlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZExvY2FsQWxpYXNlcygpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvY2FsQWxpYXNlc0xvYWRpbmc6IHRydWUgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgICAgICBsZXQgbG9jYWxBbGlhc2VzID0gW107XG4gICAgICAgICAgICBpZiAoYXdhaXQgY2xpLmRvZXNTZXJ2ZXJTdXBwb3J0VW5zdGFibGVGZWF0dXJlKFwib3JnLm1hdHJpeC5tc2MyNDMyXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGkudW5zdGFibGVHZXRMb2NhbEFsaWFzZXModGhpcy5wcm9wcy5yb29tSWQpO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmFsaWFzZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsQWxpYXNlcyA9IHJlc3BvbnNlLmFsaWFzZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvY2FsQWxpYXNlcyB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBsb2NhbEFsaWFzZXNMb2FkaW5nOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNoYW5nZUNhbm9uaWNhbEFsaWFzKGFsaWFzKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5jYW5TZXRDYW5vbmljYWxBbGlhcykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG9sZEFsaWFzID0gdGhpcy5zdGF0ZS5jYW5vbmljYWxBbGlhcztcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBjYW5vbmljYWxBbGlhczogYWxpYXMsXG4gICAgICAgICAgICB1cGRhdGluZ0Nhbm9uaWNhbEFsaWFzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSB7XG4gICAgICAgICAgICBhbHRfYWxpYXNlczogdGhpcy5zdGF0ZS5hbHRBbGlhc2VzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhbGlhcykgZXZlbnRDb250ZW50W1wiYWxpYXNcIl0gPSBhbGlhcztcblxuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2VuZFN0YXRlRXZlbnQodGhpcy5wcm9wcy5yb29tSWQsIFwibS5yb29tLmNhbm9uaWNhbF9hbGlhc1wiLFxuICAgICAgICAgICAgZXZlbnRDb250ZW50LCBcIlwiKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVUcmFja2VkRGlhbG9nKCdFcnJvciB1cGRhdGluZyBtYWluIGFkZHJlc3MnLCAnJywgRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJFcnJvciB1cGRhdGluZyBtYWluIGFkZHJlc3NcIiksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFxuICAgICAgICAgICAgICAgICAgICBcIlRoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgcm9vbSdzIG1haW4gYWRkcmVzcy4gSXQgbWF5IG5vdCBiZSBhbGxvd2VkIGJ5IHRoZSBzZXJ2ZXIgXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIm9yIGEgdGVtcG9yYXJ5IGZhaWx1cmUgb2NjdXJyZWQuXCIsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2Fub25pY2FsQWxpYXM6IG9sZEFsaWFzfSk7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7dXBkYXRpbmdDYW5vbmljYWxBbGlhczogZmFsc2V9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hhbmdlQWx0QWxpYXNlcyhhbHRBbGlhc2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5jYW5TZXRDYW5vbmljYWxBbGlhcykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdXBkYXRpbmdDYW5vbmljYWxBbGlhczogdHJ1ZSxcbiAgICAgICAgICAgIGFsdEFsaWFzZXMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmNhbm9uaWNhbEFsaWFzKSB7XG4gICAgICAgICAgICBldmVudENvbnRlbnQuYWxpYXMgPSB0aGlzLnN0YXRlLmNhbm9uaWNhbEFsaWFzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbHRBbGlhc2VzKSB7XG4gICAgICAgICAgICBldmVudENvbnRlbnRbXCJhbHRfYWxpYXNlc1wiXSA9IGFsdEFsaWFzZXM7XG4gICAgICAgIH1cblxuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2VuZFN0YXRlRXZlbnQodGhpcy5wcm9wcy5yb29tSWQsIFwibS5yb29tLmNhbm9uaWNhbF9hbGlhc1wiLFxuICAgICAgICAgICAgZXZlbnRDb250ZW50LCBcIlwiKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVUcmFja2VkRGlhbG9nKCdFcnJvciB1cGRhdGluZyBhbHRlcm5hdGl2ZSBhZGRyZXNzZXMnLCAnJywgRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJFcnJvciB1cGRhdGluZyBtYWluIGFkZHJlc3NcIiksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFxuICAgICAgICAgICAgICAgICAgICBcIlRoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgcm9vbSdzIGFsdGVybmF0aXZlIGFkZHJlc3Nlcy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICBcIkl0IG1heSBub3QgYmUgYWxsb3dlZCBieSB0aGUgc2VydmVyIG9yIGEgdGVtcG9yYXJ5IGZhaWx1cmUgb2NjdXJyZWQuXCIsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3VwZGF0aW5nQ2Fub25pY2FsQWxpYXM6IGZhbHNlfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTmV3QWxpYXNDaGFuZ2VkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe25ld0FsaWFzOiB2YWx1ZX0pO1xuICAgIH07XG5cbiAgICBvbkxvY2FsQWxpYXNBZGRlZCA9IChhbGlhcykgPT4ge1xuICAgICAgICBpZiAoIWFsaWFzIHx8IGFsaWFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOyAvLyBpZ25vcmUgYXR0ZW1wdHMgdG8gY3JlYXRlIGJsYW5rIGFsaWFzZXNcblxuICAgICAgICBjb25zdCBsb2NhbERvbWFpbiA9IE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXREb21haW4oKTtcbiAgICAgICAgaWYgKCFhbGlhcy5pbmNsdWRlcygnOicpKSBhbGlhcyArPSAnOicgKyBsb2NhbERvbWFpbjtcblxuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuY3JlYXRlQWxpYXMoYWxpYXMsIHRoaXMucHJvcHMucm9vbUlkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGxvY2FsQWxpYXNlczogdGhpcy5zdGF0ZS5sb2NhbEFsaWFzZXMuY29uY2F0KGFsaWFzKSxcbiAgICAgICAgICAgICAgICBuZXdBbGlhczogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmNhbm9uaWNhbEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDYW5vbmljYWxBbGlhcyhhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZVRyYWNrZWREaWFsb2coJ0Vycm9yIGNyZWF0aW5nIGFkZHJlc3MnLCAnJywgRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJFcnJvciBjcmVhdGluZyBhZGRyZXNzXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBfdChcbiAgICAgICAgICAgICAgICAgICAgXCJUaGVyZSB3YXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhhdCBhZGRyZXNzLiBJdCBtYXkgbm90IGJlIGFsbG93ZWQgYnkgdGhlIHNlcnZlciBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwib3IgYSB0ZW1wb3JhcnkgZmFpbHVyZSBvY2N1cnJlZC5cIixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvbkxvY2FsQWxpYXNEZWxldGVkID0gKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5zdGF0ZS5sb2NhbEFsaWFzZXNbaW5kZXhdO1xuICAgICAgICAvLyBUT0RPOiBJbiBmdXR1cmUsIHdlIHNob3VsZCBwcm9iYWJseSBiZSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBhbGlhcyBhY3R1YWxseSBiZWxvbmdzXG4gICAgICAgIC8vIHRvIHRoaXMgcm9vbS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWN0b3ItaW0vZWxlbWVudC13ZWIvaXNzdWVzLzczNTNcbiAgICAgICAgTWF0cml4Q2xpZW50UGVnLmdldCgpLmRlbGV0ZUFsaWFzKGFsaWFzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsQWxpYXNlcyA9IHRoaXMuc3RhdGUubG9jYWxBbGlhc2VzLmZpbHRlcihhID0+IGEgIT09IGFsaWFzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2xvY2FsQWxpYXNlc30pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5jYW5vbmljYWxBbGlhcyA9PT0gYWxpYXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNhbm9uaWNhbEFsaWFzKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICBsZXQgZGVzY3JpcHRpb247XG4gICAgICAgICAgICBpZiAoZXJyLmVycmNvZGUgPT09IFwiTV9GT1JCSURERU5cIikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gX3QoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgYWRkcmVzcy5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gX3QoXG4gICAgICAgICAgICAgICAgICAgIFwiVGhlcmUgd2FzIGFuIGVycm9yIHJlbW92aW5nIHRoYXQgYWRkcmVzcy4gSXQgbWF5IG5vIGxvbmdlciBleGlzdCBvciBhIHRlbXBvcmFyeSBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3Igb2NjdXJyZWQuXCIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE1vZGFsLmNyZWF0ZVRyYWNrZWREaWFsb2coJ0Vycm9yIHJlbW92aW5nIGFkZHJlc3MnLCAnJywgRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJFcnJvciByZW1vdmluZyBhZGRyZXNzXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvbkxvY2FsQWxpYXNlc1RvZ2dsZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gZXhwYW5kZWRcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5vcGVuKSB7XG4gICAgICAgICAgICAvLyBpZiBsb2NhbCBhbGlhc2VzIGhhdmVuJ3QgYmVlbiBwcmVsb2FkZWQgeWV0IGF0IGNvbXBvbmVudCBtb3VudFxuICAgICAgICAgICAgaWYgKCF0aGlzLnByb3BzLmNhblNldENhbm9uaWNhbEFsaWFzICYmIHRoaXMuc3RhdGUubG9jYWxBbGlhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZExvY2FsQWxpYXNlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2RldGFpbHNPcGVuOiBldmVudC50YXJnZXQub3Blbn0pO1xuICAgIH07XG5cbiAgICBvbkNhbm9uaWNhbEFsaWFzQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlQ2Fub25pY2FsQWxpYXMoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9O1xuXG4gICAgb25OZXdBbHRBbGlhc0NoYW5nZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7bmV3QWx0QWxpYXM6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgb25BbHRBbGlhc0FkZGVkID0gKGFsaWFzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsdEFsaWFzZXMgPSB0aGlzLnN0YXRlLmFsdEFsaWFzZXMuc2xpY2UoKTtcbiAgICAgICAgaWYgKCFhbHRBbGlhc2VzLnNvbWUoYSA9PiBhLnRyaW0oKSA9PT0gYWxpYXMudHJpbSgpKSkge1xuICAgICAgICAgICAgYWx0QWxpYXNlcy5wdXNoKGFsaWFzLnRyaW0oKSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUFsdEFsaWFzZXMoYWx0QWxpYXNlcyk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtuZXdBbHRBbGlhczogXCJcIn0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25BbHRBbGlhc0RlbGV0ZWQgPSAoaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYWx0QWxpYXNlcyA9IHRoaXMuc3RhdGUuYWx0QWxpYXNlcy5zbGljZSgpO1xuICAgICAgICBhbHRBbGlhc2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuY2hhbmdlQWx0QWxpYXNlcyhhbHRBbGlhc2VzKTtcbiAgICB9XG5cbiAgICBfZ2V0QWxpYXNlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWx0QWxpYXNlcy5jb25jYXQodGhpcy5fZ2V0TG9jYWxOb25BbHRBbGlhc2VzKCkpO1xuICAgIH1cblxuICAgIF9nZXRMb2NhbE5vbkFsdEFsaWFzZXMoKSB7XG4gICAgICAgIGNvbnN0IHthbHRBbGlhc2VzfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmxvY2FsQWxpYXNlcy5maWx0ZXIoYWxpYXMgPT4gIWFsdEFsaWFzZXMuaW5jbHVkZXMoYWxpYXMpKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsRG9tYWluID0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldERvbWFpbigpO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjYW5vbmljYWxWYWx1ZSA9IHRoaXMuc3RhdGUuY2Fub25pY2FsQWxpYXMgfHwgXCJcIjtcbiAgICAgICAgY29uc3QgY2Fub25pY2FsQWxpYXNTZWN0aW9uID0gKFxuICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25DYW5vbmljYWxBbGlhc0NoYW5nZX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17Y2Fub25pY2FsVmFsdWV9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUudXBkYXRpbmdDYW5vbmljYWxBbGlhcyB8fCAhdGhpcy5wcm9wcy5jYW5TZXRDYW5vbmljYWxBbGlhc31cbiAgICAgICAgICAgICAgICBlbGVtZW50PSdzZWxlY3QnXG4gICAgICAgICAgICAgICAgaWQ9J2Nhbm9uaWNhbEFsaWFzJ1xuICAgICAgICAgICAgICAgIGxhYmVsPXtfdCgnTWFpbiBhZGRyZXNzJyl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIGtleT1cInVuc2V0XCI+eyBfdCgnbm90IHNwZWNpZmllZCcpIH08L29wdGlvbj5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dldEFsaWFzZXMoKS5tYXAoKGFsaWFzLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXMgPT09IHRoaXMuc3RhdGUuY2Fub25pY2FsQWxpYXMpIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17YWxpYXN9IGtleT17aX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYWxpYXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCB8fCAhdGhpcy5zdGF0ZS5jYW5vbmljYWxBbGlhcyA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9eyB0aGlzLnN0YXRlLmNhbm9uaWNhbEFsaWFzIH0ga2V5PSdhcmJpdHJhcnknPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGhpcy5zdGF0ZS5jYW5vbmljYWxBbGlhcyB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBsb2NhbEFsaWFzZXNMaXN0O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5sb2NhbEFsaWFzZXNMb2FkaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBTcGlubmVyID0gc2RrLmdldENvbXBvbmVudChcImVsZW1lbnRzLlNwaW5uZXJcIik7XG4gICAgICAgICAgICBsb2NhbEFsaWFzZXNMaXN0ID0gPFNwaW5uZXIgLz47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2NhbEFsaWFzZXNMaXN0ID0gKDxFZGl0YWJsZUFsaWFzZXNMaXN0XG4gICAgICAgICAgICAgICAgaWQ9XCJyb29tQWxpYXNlc1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcIm14X1Jvb21TZXR0aW5nc19sb2NhbEFsaWFzZXNcIn1cbiAgICAgICAgICAgICAgICBpdGVtcz17dGhpcy5zdGF0ZS5sb2NhbEFsaWFzZXN9XG4gICAgICAgICAgICAgICAgbmV3SXRlbT17dGhpcy5zdGF0ZS5uZXdBbGlhc31cbiAgICAgICAgICAgICAgICBvbk5ld0l0ZW1DaGFuZ2VkPXt0aGlzLm9uTmV3QWxpYXNDaGFuZ2VkfVxuICAgICAgICAgICAgICAgIGNhblJlbW92ZT17dGhpcy5wcm9wcy5jYW5TZXRBbGlhc2VzfVxuICAgICAgICAgICAgICAgIGNhbkVkaXQ9e3RoaXMucHJvcHMuY2FuU2V0QWxpYXNlc31cbiAgICAgICAgICAgICAgICBvbkl0ZW1BZGRlZD17dGhpcy5vbkxvY2FsQWxpYXNBZGRlZH1cbiAgICAgICAgICAgICAgICBvbkl0ZW1SZW1vdmVkPXt0aGlzLm9uTG9jYWxBbGlhc0RlbGV0ZWR9XG4gICAgICAgICAgICAgICAgbm9JdGVtc0xhYmVsPXtfdCgnVGhpcyByb29tIGhhcyBubyBsb2NhbCBhZGRyZXNzZXMnKX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17X3QoJ0xvY2FsIGFkZHJlc3MnKX1cbiAgICAgICAgICAgICAgICBkb21haW49e2xvY2FsRG9tYWlufVxuICAgICAgICAgICAgLz4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdteF9BbGlhc1NldHRpbmdzJz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J214X1NldHRpbmdzVGFiX3N1YmhlYWRpbmcnPntfdChcIlB1Ymxpc2hlZCBBZGRyZXNzZXNcIil9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxwPntfdChcIlB1Ymxpc2hlZCBhZGRyZXNzZXMgY2FuIGJlIHV