matrix-react-sdk
Version:
SDK for matrix.org using React
125 lines (121 loc) • 18.6 kB
JavaScript
;
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 = _interopRequireWildcard(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../../../languageHandler");
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 2015, 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.
*/
const DIV_ID = "mx_recaptcha";
/**
* A pure UI component which displays a captcha form.
*/
class CaptchaForm extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "captchaWidgetId", void 0);
(0, _defineProperty2.default)(this, "recaptchaContainer", /*#__PURE__*/(0, _react.createRef)());
this.state = {
errorText: undefined
};
}
componentDidMount() {
// Just putting a script tag into the returned jsx doesn't work, annoyingly,
// so we do this instead.
if (this.isRecaptchaReady()) {
// already loaded
this.onCaptchaLoaded();
} else {
_logger.logger.log("Loading recaptcha script...");
window.mxOnRecaptchaLoaded = () => {
this.onCaptchaLoaded();
};
const scriptTag = document.createElement("script");
scriptTag.setAttribute("src", `https://www.recaptcha.net/recaptcha/api.js?onload=mxOnRecaptchaLoaded&render=explicit`);
this.recaptchaContainer.current?.appendChild(scriptTag);
}
}
componentWillUnmount() {
this.resetRecaptcha();
// Resettting the captcha does not clear the challenge overlay from the body in android webviews.
// Search for an iframe with the challenge src and remove it's topmost ancestor from the body.
// TODO: Remove this when the "mobile_register" page is retired.
const iframes = document.querySelectorAll("iframe");
for (const iframe of iframes) {
if (iframe.src.includes("https://www.recaptcha.net/recaptcha/api2/bframe")) {
let parentBeforeBody = iframe;
do {
parentBeforeBody = parentBeforeBody.parentElement;
} while (parentBeforeBody?.parentElement && parentBeforeBody.parentElement != document.body);
parentBeforeBody?.remove();
}
}
}
// Borrowed directly from: https://github.com/codeep/react-recaptcha-google/commit/e118fa5670fa268426969323b2e7fe77698376ba
isRecaptchaReady() {
return typeof window !== "undefined" && typeof global.grecaptcha !== "undefined" && typeof global.grecaptcha.render === "function";
}
renderRecaptcha(divId) {
if (!this.isRecaptchaReady()) {
_logger.logger.error("grecaptcha not loaded!");
throw new Error("Recaptcha did not load successfully");
}
const publicKey = this.props.sitePublicKey;
if (!publicKey) {
_logger.logger.error("No public key for recaptcha!");
throw new Error("This server has not supplied enough information for Recaptcha authentication");
}
_logger.logger.info(`Rendering to ${divId}`);
this.captchaWidgetId = global.grecaptcha?.render(divId, {
sitekey: publicKey,
callback: this.props.onCaptchaResponse
});
}
resetRecaptcha() {
if (this.captchaWidgetId) {
global?.grecaptcha?.reset(this.captchaWidgetId);
}
}
onCaptchaLoaded() {
_logger.logger.log("Loaded recaptcha script.");
try {
this.renderRecaptcha(DIV_ID);
// clear error if re-rendered
this.setState({
errorText: undefined
});
} catch (e) {
this.setState({
errorText: e instanceof Error ? e.message : String(e)
});
}
}
render() {
let error;
if (this.state.errorText) {
error = /*#__PURE__*/_react.default.createElement("div", {
className: "error"
}, this.state.errorText);
}
return /*#__PURE__*/_react.default.createElement("div", {
ref: this.recaptchaContainer
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("auth|captcha_description")), /*#__PURE__*/_react.default.createElement("div", {
id: DIV_ID
}), error);
}
}
exports.default = CaptchaForm;
(0, _defineProperty2.default)(CaptchaForm, "defaultProps", {
onCaptchaResponse: () => {}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkRJVl9JRCIsIkNhcHRjaGFGb3JtIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInN0YXRlIiwiZXJyb3JUZXh0IiwidW5kZWZpbmVkIiwiY29tcG9uZW50RGlkTW91bnQiLCJpc1JlY2FwdGNoYVJlYWR5Iiwib25DYXB0Y2hhTG9hZGVkIiwibG9nZ2VyIiwibG9nIiwid2luZG93IiwibXhPblJlY2FwdGNoYUxvYWRlZCIsInNjcmlwdFRhZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsInJlY2FwdGNoYUNvbnRhaW5lciIsImN1cnJlbnQiLCJhcHBlbmRDaGlsZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVzZXRSZWNhcHRjaGEiLCJpZnJhbWVzIiwicXVlcnlTZWxlY3RvckFsbCIsImlmcmFtZSIsInNyYyIsImluY2x1ZGVzIiwicGFyZW50QmVmb3JlQm9keSIsInBhcmVudEVsZW1lbnQiLCJib2R5IiwicmVtb3ZlIiwiZ2xvYmFsIiwiZ3JlY2FwdGNoYSIsInJlbmRlciIsInJlbmRlclJlY2FwdGNoYSIsImRpdklkIiwiZXJyb3IiLCJFcnJvciIsInB1YmxpY0tleSIsInNpdGVQdWJsaWNLZXkiLCJpbmZvIiwiY2FwdGNoYVdpZGdldElkIiwic2l0ZWtleSIsImNhbGxiYWNrIiwib25DYXB0Y2hhUmVzcG9uc2UiLCJyZXNldCIsInNldFN0YXRlIiwibWVzc2FnZSIsIlN0cmluZyIsImNsYXNzTmFtZSIsInJlZiIsIl90IiwiaWQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvYXV0aC9DYXB0Y2hhRm9ybS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTUsIDIwMTYgT3Blbk1hcmtldCBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcblxuY29uc3QgRElWX0lEID0gXCJteF9yZWNhcHRjaGFcIjtcblxuaW50ZXJmYWNlIElDYXB0Y2hhRm9ybVByb3BzIHtcbiAgICBzaXRlUHVibGljS2V5OiBzdHJpbmc7XG4gICAgb25DYXB0Y2hhUmVzcG9uc2U6IChyZXNwb25zZTogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSUNhcHRjaGFGb3JtU3RhdGUge1xuICAgIGVycm9yVGV4dD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHB1cmUgVUkgY29tcG9uZW50IHdoaWNoIGRpc3BsYXlzIGEgY2FwdGNoYSBmb3JtLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXB0Y2hhRm9ybSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJQ2FwdGNoYUZvcm1Qcm9wcywgSUNhcHRjaGFGb3JtU3RhdGU+IHtcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgb25DYXB0Y2hhUmVzcG9uc2U6ICgpID0+IHt9LFxuICAgIH07XG5cbiAgICBwcml2YXRlIGNhcHRjaGFXaWRnZXRJZD86IHN0cmluZztcbiAgICBwcml2YXRlIHJlY2FwdGNoYUNvbnRhaW5lciA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSUNhcHRjaGFGb3JtUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlcnJvclRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIC8vIEp1c3QgcHV0dGluZyBhIHNjcmlwdCB0YWcgaW50byB0aGUgcmV0dXJuZWQganN4IGRvZXNuJ3Qgd29yaywgYW5ub3lpbmdseSxcbiAgICAgICAgLy8gc28gd2UgZG8gdGhpcyBpbnN0ZWFkLlxuICAgICAgICBpZiAodGhpcy5pc1JlY2FwdGNoYVJlYWR5KCkpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICB0aGlzLm9uQ2FwdGNoYUxvYWRlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIkxvYWRpbmcgcmVjYXB0Y2hhIHNjcmlwdC4uLlwiKTtcbiAgICAgICAgICAgIHdpbmRvdy5teE9uUmVjYXB0Y2hhTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25DYXB0Y2hhTG9hZGVkKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdFRhZy5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJzcmNcIixcbiAgICAgICAgICAgICAgICBgaHR0cHM6Ly93d3cucmVjYXB0Y2hhLm5ldC9yZWNhcHRjaGEvYXBpLmpzP29ubG9hZD1teE9uUmVjYXB0Y2hhTG9hZGVkJnJlbmRlcj1leHBsaWNpdGAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5yZWNhcHRjaGFDb250YWluZXIuY3VycmVudD8uYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXNldFJlY2FwdGNoYSgpO1xuICAgICAgICAvLyBSZXNldHR0aW5nIHRoZSBjYXB0Y2hhIGRvZXMgbm90IGNsZWFyIHRoZSBjaGFsbGVuZ2Ugb3ZlcmxheSBmcm9tIHRoZSBib2R5IGluIGFuZHJvaWQgd2Vidmlld3MuXG4gICAgICAgIC8vIFNlYXJjaCBmb3IgYW4gaWZyYW1lIHdpdGggdGhlIGNoYWxsZW5nZSBzcmMgYW5kIHJlbW92ZSBpdCdzIHRvcG1vc3QgYW5jZXN0b3IgZnJvbSB0aGUgYm9keS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgXCJtb2JpbGVfcmVnaXN0ZXJcIiBwYWdlIGlzIHJldGlyZWQuXG4gICAgICAgIGNvbnN0IGlmcmFtZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiaWZyYW1lXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICAgICAgICBpZiAoaWZyYW1lLnNyYy5pbmNsdWRlcyhcImh0dHBzOi8vd3d3LnJlY2FwdGNoYS5uZXQvcmVjYXB0Y2hhL2FwaTIvYmZyYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEJlZm9yZUJvZHk6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGlmcmFtZTtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEJlZm9yZUJvZHkgPSBwYXJlbnRCZWZvcmVCb2R5LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAocGFyZW50QmVmb3JlQm9keT8ucGFyZW50RWxlbWVudCAmJiBwYXJlbnRCZWZvcmVCb2R5LnBhcmVudEVsZW1lbnQgIT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgcGFyZW50QmVmb3JlQm9keT8ucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3Jyb3dlZCBkaXJlY3RseSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY29kZWVwL3JlYWN0LXJlY2FwdGNoYS1nb29nbGUvY29tbWl0L2UxMThmYTU2NzBmYTI2ODQyNjk2OTMyM2IyZTdmZTc3Njk4Mzc2YmFcbiAgICBwcml2YXRlIGlzUmVjYXB0Y2hhUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsLmdyZWNhcHRjaGEgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwuZ3JlY2FwdGNoYS5yZW5kZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyUmVjYXB0Y2hhKGRpdklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVjYXB0Y2hhUmVhZHkoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiZ3JlY2FwdGNoYSBub3QgbG9hZGVkIVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlY2FwdGNoYSBkaWQgbm90IGxvYWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHVibGljS2V5ID0gdGhpcy5wcm9wcy5zaXRlUHVibGljS2V5O1xuICAgICAgICBpZiAoIXB1YmxpY0tleSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiTm8gcHVibGljIGtleSBmb3IgcmVjYXB0Y2hhIVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2VydmVyIGhhcyBub3Qgc3VwcGxpZWQgZW5vdWdoIGluZm9ybWF0aW9uIGZvciBSZWNhcHRjaGEgYXV0aGVudGljYXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuaW5mbyhgUmVuZGVyaW5nIHRvICR7ZGl2SWR9YCk7XG4gICAgICAgIHRoaXMuY2FwdGNoYVdpZGdldElkID0gZ2xvYmFsLmdyZWNhcHRjaGE/LnJlbmRlcihkaXZJZCwge1xuICAgICAgICAgICAgc2l0ZWtleTogcHVibGljS2V5LFxuICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMucHJvcHMub25DYXB0Y2hhUmVzcG9uc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRSZWNhcHRjaGEoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcHRjaGFXaWRnZXRJZCkge1xuICAgICAgICAgICAgZ2xvYmFsPy5ncmVjYXB0Y2hhPy5yZXNldCh0aGlzLmNhcHRjaGFXaWRnZXRJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2FwdGNoYUxvYWRlZCgpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmxvZyhcIkxvYWRlZCByZWNhcHRjaGEgc2NyaXB0LlwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUmVjYXB0Y2hhKERJVl9JRCk7XG4gICAgICAgICAgICAvLyBjbGVhciBlcnJvciBpZiByZS1yZW5kZXJlZFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZXJyb3JUZXh0OiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgbGV0IGVycm9yOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3JUZXh0KSB7XG4gICAgICAgICAgICBlcnJvciA9IDxkaXYgY2xhc3NOYW1lPVwiZXJyb3JcIj57dGhpcy5zdGF0ZS5lcnJvclRleHR9PC9kaXY+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgcmVmPXt0aGlzLnJlY2FwdGNoYUNvbnRhaW5lcn0+XG4gICAgICAgICAgICAgICAgPHA+e190KFwiYXV0aHxjYXB0Y2hhX2Rlc2NyaXB0aW9uXCIpfTwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2IGlkPXtESVZfSUR9IC8+XG4gICAgICAgICAgICAgICAge2Vycm9yfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFBOEMsU0FBQUcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBWDlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9BLE1BQU1XLE1BQU0sR0FBRyxjQUFjO0FBVzdCO0FBQ0E7QUFDQTtBQUNlLE1BQU1DLFdBQVcsU0FBU0MsY0FBSyxDQUFDQyxTQUFTLENBQXVDO0VBUXBGQyxXQUFXQSxDQUFDQyxLQUF3QixFQUFFO0lBQ3pDLEtBQUssQ0FBQ0EsS0FBSyxDQUFDO0lBQUMsSUFBQUMsZ0JBQUEsQ0FBQXBCLE9BQUE7SUFBQSxJQUFBb0IsZ0JBQUEsQ0FBQXBCLE9BQUEsMkNBSFksSUFBQXFCLGdCQUFTLEVBQWlCLENBQUM7SUFLcEQsSUFBSSxDQUFDQyxLQUFLLEdBQUc7TUFDVEMsU0FBUyxFQUFFQztJQUNmLENBQUM7RUFDTDtFQUVPQyxpQkFBaUJBLENBQUEsRUFBUztJQUM3QjtJQUNBO0lBQ0EsSUFBSSxJQUFJLENBQUNDLGdCQUFnQixDQUFDLENBQUMsRUFBRTtNQUN6QjtNQUNBLElBQUksQ0FBQ0MsZUFBZSxDQUFDLENBQUM7SUFDMUIsQ0FBQyxNQUFNO01BQ0hDLGNBQU0sQ0FBQ0MsR0FBRyxDQUFDLDZCQUE2QixDQUFDO01BQ3pDQyxNQUFNLENBQUNDLG1CQUFtQixHQUFHLE1BQU07UUFDL0IsSUFBSSxDQUFDSixlQUFlLENBQUMsQ0FBQztNQUMxQixDQUFDO01BQ0QsTUFBTUssU0FBUyxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUM7TUFDbERGLFNBQVMsQ0FBQ0csWUFBWSxDQUNsQixLQUFLLEVBQ0wsdUZBQ0osQ0FBQztNQUNELElBQUksQ0FBQ0Msa0JBQWtCLENBQUNDLE9BQU8sRUFBRUMsV0FBVyxDQUFDTixTQUFTLENBQUM7SUFDM0Q7RUFDSjtFQUVPTyxvQkFBb0JBLENBQUEsRUFBUztJQUNoQyxJQUFJLENBQUNDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JCO0lBQ0E7SUFDQTtJQUNBLE1BQU1DLE9BQU8sR0FBR1IsUUFBUSxDQUFDUyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7SUFDbkQsS0FBSyxNQUFNQyxNQUFNLElBQUlGLE9BQU8sRUFBRTtNQUMxQixJQUFJRSxNQUFNLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxDQUFDLGlEQUFpRCxDQUFDLEVBQUU7UUFDeEUsSUFBSUMsZ0JBQW9DLEdBQUdILE1BQU07UUFDakQsR0FBRztVQUNDRyxnQkFBZ0IsR0FBR0EsZ0JBQWdCLENBQUNDLGFBQWE7UUFDckQsQ0FBQyxRQUFRRCxnQkFBZ0IsRUFBRUMsYUFBYSxJQUFJRCxnQkFBZ0IsQ0FBQ0MsYUFBYSxJQUFJZCxRQUFRLENBQUNlLElBQUk7UUFDM0ZGLGdCQUFnQixFQUFFRyxNQUFNLENBQUMsQ0FBQztNQUM5QjtJQUNKO0VBQ0o7O0VBRUE7RUFDUXZCLGdCQUFnQkEsQ0FBQSxFQUFZO0lBQ2hDLE9BQ0ksT0FBT0ksTUFBTSxLQUFLLFdBQVcsSUFDN0IsT0FBT29CLE1BQU0sQ0FBQ0MsVUFBVSxLQUFLLFdBQVcsSUFDeEMsT0FBT0QsTUFBTSxDQUFDQyxVQUFVLENBQUNDLE1BQU0sS0FBSyxVQUFVO0VBRXREO0VBRVFDLGVBQWVBLENBQUNDLEtBQWEsRUFBUTtJQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDNUIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFO01BQzFCRSxjQUFNLENBQUMyQixLQUFLLENBQUMsd0JBQXdCLENBQUM7TUFDdEMsTUFBTSxJQUFJQyxLQUFLLENBQUMscUNBQXFDLENBQUM7SUFDMUQ7SUFFQSxNQUFNQyxTQUFTLEdBQUcsSUFBSSxDQUFDdEMsS0FBSyxDQUFDdUMsYUFBYTtJQUMxQyxJQUFJLENBQUNELFNBQVMsRUFBRTtNQUNaN0IsY0FBTSxDQUFDMkIsS0FBSyxDQUFDLDhCQUE4QixDQUFDO01BQzVDLE1BQU0sSUFBSUMsS0FBSyxDQUFDLDhFQUE4RSxDQUFDO0lBQ25HO0lBRUE1QixjQUFNLENBQUMrQixJQUFJLENBQUMsZ0JBQWdCTCxLQUFLLEVBQUUsQ0FBQztJQUNwQyxJQUFJLENBQUNNLGVBQWUsR0FBR1YsTUFBTSxDQUFDQyxVQUFVLEVBQUVDLE1BQU0sQ0FBQ0UsS0FBSyxFQUFFO01BQ3BETyxPQUFPLEVBQUVKLFNBQVM7TUFDbEJLLFFBQVEsRUFBRSxJQUFJLENBQUMzQyxLQUFLLENBQUM0QztJQUN6QixDQUFDLENBQUM7RUFDTjtFQUVRdkIsY0FBY0EsQ0FBQSxFQUFTO0lBQzNCLElBQUksSUFBSSxDQUFDb0IsZUFBZSxFQUFFO01BQ3RCVixNQUFNLEVBQUVDLFVBQVUsRUFBRWEsS0FBSyxDQUFDLElBQUksQ0FBQ0osZUFBZSxDQUFDO0lBQ25EO0VBQ0o7RUFFUWpDLGVBQWVBLENBQUEsRUFBUztJQUM1QkMsY0FBTSxDQUFDQyxHQUFHLENBQUMsMEJBQTBCLENBQUM7SUFDdEMsSUFBSTtNQUNBLElBQUksQ0FBQ3dCLGVBQWUsQ0FBQ3ZDLE1BQU0sQ0FBQztNQUM1QjtNQUNBLElBQUksQ0FBQ21ELFFBQVEsQ0FBQztRQUNWMUMsU0FBUyxFQUFFQztNQUNmLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxPQUFPN0IsQ0FBQyxFQUFFO01BQ1IsSUFBSSxDQUFDc0UsUUFBUSxDQUFDO1FBQ1YxQyxTQUFTLEVBQUU1QixDQUFDLFlBQVk2RCxLQUFLLEdBQUc3RCxDQUFDLENBQUN1RSxPQUFPLEdBQUdDLE1BQU0sQ0FBQ3hFLENBQUM7TUFDeEQsQ0FBQyxDQUFDO0lBQ047RUFDSjtFQUVPeUQsTUFBTUEsQ0FBQSxFQUFvQjtJQUM3QixJQUFJRyxLQUE4QjtJQUNsQyxJQUFJLElBQUksQ0FBQ2pDLEtBQUssQ0FBQ0MsU0FBUyxFQUFFO01BQ3RCZ0MsS0FBSyxnQkFBR2xFLE1BQUEsQ0FBQVcsT0FBQSxDQUFBa0MsYUFBQTtRQUFLa0MsU0FBUyxFQUFDO01BQU8sR0FBRSxJQUFJLENBQUM5QyxLQUFLLENBQUNDLFNBQWUsQ0FBQztJQUMvRDtJQUVBLG9CQUNJbEMsTUFBQSxDQUFBVyxPQUFBLENBQUFrQyxhQUFBO01BQUttQyxHQUFHLEVBQUUsSUFBSSxDQUFDakM7SUFBbUIsZ0JBQzlCL0MsTUFBQSxDQUFBVyxPQUFBLENBQUFrQyxhQUFBLFlBQUksSUFBQW9DLG1CQUFFLEVBQUMsMEJBQTBCLENBQUssQ0FBQyxlQUN2Q2pGLE1BQUEsQ0FBQVcsT0FBQSxDQUFBa0MsYUFBQTtNQUFLcUMsRUFBRSxFQUFFekQ7SUFBTyxDQUFFLENBQUMsRUFDbEJ5QyxLQUNBLENBQUM7RUFFZDtBQUNKO0FBQUNpQixPQUFBLENBQUF4RSxPQUFBLEdBQUFlLFdBQUE7QUFBQSxJQUFBSyxnQkFBQSxDQUFBcEIsT0FBQSxFQXBIb0JlLFdBQVcsa0JBQ0M7RUFDekJnRCxpQkFBaUIsRUFBRUEsQ0FBQSxLQUFNLENBQUM7QUFDOUIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==