matrix-react-sdk
Version:
SDK for matrix.org using React
104 lines (100 loc) • 20.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.scorePassword = scorePassword;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _core = require("@zxcvbn-ts/core");
var zxcvbnCommonPackage = _interopRequireWildcard(require("@zxcvbn-ts/language-common"));
var zxcvbnEnPackage = _interopRequireWildcard(require("@zxcvbn-ts/language-en"));
var _languageHandler = require("../languageHandler");
var _SdkConfig = _interopRequireDefault(require("../SdkConfig"));
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; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /*
Copyright 2018-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
_core.zxcvbnOptions.setOptions({
dictionary: _objectSpread(_objectSpread(_objectSpread({}, zxcvbnCommonPackage.dictionary), zxcvbnEnPackage.dictionary), {}, {
userInputs: ["riot", "matrix", "element", _SdkConfig.default.get().brand]
}),
graphs: zxcvbnCommonPackage.adjacencyGraphs,
useLevenshteinDistance: true
});
function getTranslations() {
return {
warnings: {
straightRow: (0, _languageHandler._t)("zxcvbn|warnings|straightRow"),
keyPattern: (0, _languageHandler._t)("zxcvbn|warnings|keyPattern"),
simpleRepeat: (0, _languageHandler._t)("zxcvbn|warnings|simpleRepeat"),
extendedRepeat: (0, _languageHandler._t)("zxcvbn|warnings|extendedRepeat"),
sequences: (0, _languageHandler._t)("zxcvbn|warnings|sequences"),
recentYears: (0, _languageHandler._t)("zxcvbn|warnings|recentYears"),
dates: (0, _languageHandler._t)("zxcvbn|warnings|dates"),
topTen: (0, _languageHandler._t)("zxcvbn|warnings|topTen"),
topHundred: (0, _languageHandler._t)("zxcvbn|warnings|topHundred"),
common: (0, _languageHandler._t)("zxcvbn|warnings|common"),
similarToCommon: (0, _languageHandler._t)("zxcvbn|warnings|similarToCommon"),
wordByItself: (0, _languageHandler._t)("zxcvbn|warnings|wordByItself"),
namesByThemselves: (0, _languageHandler._t)("zxcvbn|warnings|namesByThemselves"),
commonNames: (0, _languageHandler._t)("zxcvbn|warnings|commonNames"),
userInputs: (0, _languageHandler._t)("zxcvbn|warnings|userInputs"),
pwned: (0, _languageHandler._t)("zxcvbn|warnings|pwned")
},
suggestions: {
l33t: (0, _languageHandler._t)("zxcvbn|suggestions|l33t"),
reverseWords: (0, _languageHandler._t)("zxcvbn|suggestions|reverseWords"),
allUppercase: (0, _languageHandler._t)("zxcvbn|suggestions|allUppercase"),
capitalization: (0, _languageHandler._t)("zxcvbn|suggestions|capitalization"),
dates: (0, _languageHandler._t)("zxcvbn|suggestions|dates"),
recentYears: (0, _languageHandler._t)("zxcvbn|suggestions|recentYears"),
associatedYears: (0, _languageHandler._t)("zxcvbn|suggestions|associatedYears"),
sequences: (0, _languageHandler._t)("zxcvbn|suggestions|sequences"),
repeated: (0, _languageHandler._t)("zxcvbn|suggestions|repeated"),
longerKeyboardPattern: (0, _languageHandler._t)("zxcvbn|suggestions|longerKeyboardPattern"),
anotherWord: (0, _languageHandler._t)("zxcvbn|suggestions|anotherWord"),
useWords: (0, _languageHandler._t)("zxcvbn|suggestions|useWords"),
noNeed: (0, _languageHandler._t)("zxcvbn|suggestions|noNeed"),
pwned: (0, _languageHandler._t)("zxcvbn|suggestions|pwned")
},
// We don't utilise the time estimation at this time so just pass through the English translations here
timeEstimation: zxcvbnEnPackage.translations.timeEstimation
};
}
/**
* Wrapper around zxcvbn password strength estimation
* Include this only from async components: it pulls in zxcvbn
* (obviously) which is large.
*
* @param {string} password Password to score
* @param matrixClient the client of the logged-in user, if any
* @param userInputs additional strings such as the user's name which should be considered a bad password component
* @returns {object} Score result with `score` and `feedback` properties
*/
function scorePassword(matrixClient, password, userInputs = []) {
if (password.length === 0) return null;
// copy the supplied array before modifying it
const inputs = [...userInputs];
if (matrixClient) {
inputs.push(matrixClient.getUserIdLocalpart());
try {
const domain = matrixClient.getDomain();
inputs.push(domain);
} catch {
// This is fine
}
}
_core.zxcvbnOptions.setTranslations(getTranslations());
let zxcvbnResult = (0, _core.zxcvbn)(password, inputs);
// Work around https://github.com/dropbox/zxcvbn/issues/216
if (password.includes(" ")) {
const resultNoSpaces = (0, _core.zxcvbn)(password.replace(/ /g, ""), inputs);
if (resultNoSpaces.score < zxcvbnResult.score) zxcvbnResult = resultNoSpaces;
}
return zxcvbnResult;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJ6eGN2Ym5Db21tb25QYWNrYWdlIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJ6eGN2Ym5FblBhY2thZ2UiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1Nka0NvbmZpZyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJ6eGN2Ym5PcHRpb25zIiwic2V0T3B0aW9ucyIsImRpY3Rpb25hcnkiLCJ1c2VySW5wdXRzIiwiU2RrQ29uZmlnIiwiYnJhbmQiLCJncmFwaHMiLCJhZGphY2VuY3lHcmFwaHMiLCJ1c2VMZXZlbnNodGVpbkRpc3RhbmNlIiwiZ2V0VHJhbnNsYXRpb25zIiwid2FybmluZ3MiLCJzdHJhaWdodFJvdyIsIl90Iiwia2V5UGF0dGVybiIsInNpbXBsZVJlcGVhdCIsImV4dGVuZGVkUmVwZWF0Iiwic2VxdWVuY2VzIiwicmVjZW50WWVhcnMiLCJkYXRlcyIsInRvcFRlbiIsInRvcEh1bmRyZWQiLCJjb21tb24iLCJzaW1pbGFyVG9Db21tb24iLCJ3b3JkQnlJdHNlbGYiLCJuYW1lc0J5VGhlbXNlbHZlcyIsImNvbW1vbk5hbWVzIiwicHduZWQiLCJzdWdnZXN0aW9ucyIsImwzM3QiLCJyZXZlcnNlV29yZHMiLCJhbGxVcHBlcmNhc2UiLCJjYXBpdGFsaXphdGlvbiIsImFzc29jaWF0ZWRZZWFycyIsInJlcGVhdGVkIiwibG9uZ2VyS2V5Ym9hcmRQYXR0ZXJuIiwiYW5vdGhlcldvcmQiLCJ1c2VXb3JkcyIsIm5vTmVlZCIsInRpbWVFc3RpbWF0aW9uIiwidHJhbnNsYXRpb25zIiwic2NvcmVQYXNzd29yZCIsIm1hdHJpeENsaWVudCIsInBhc3N3b3JkIiwiaW5wdXRzIiwiZ2V0VXNlcklkTG9jYWxwYXJ0IiwiZG9tYWluIiwiZ2V0RG9tYWluIiwic2V0VHJhbnNsYXRpb25zIiwienhjdmJuUmVzdWx0IiwienhjdmJuIiwiaW5jbHVkZXMiLCJyZXN1bHROb1NwYWNlcyIsInJlcGxhY2UiLCJzY29yZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9QYXNzd29yZFNjb3Jlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTgtMjAyNCBOZXcgVmVjdG9yIEx0ZC5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgenhjdmJuLCB6eGN2Ym5PcHRpb25zLCBaeGN2Ym5SZXN1bHQsIFRyYW5zbGF0aW9uS2V5cyB9IGZyb20gXCJAenhjdmJuLXRzL2NvcmVcIjtcbmltcG9ydCAqIGFzIHp4Y3ZibkNvbW1vblBhY2thZ2UgZnJvbSBcIkB6eGN2Ym4tdHMvbGFuZ3VhZ2UtY29tbW9uXCI7XG5pbXBvcnQgKiBhcyB6eGN2Ym5FblBhY2thZ2UgZnJvbSBcIkB6eGN2Ym4tdHMvbGFuZ3VhZ2UtZW5cIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi9TZGtDb25maWdcIjtcblxuenhjdmJuT3B0aW9ucy5zZXRPcHRpb25zKHtcbiAgICBkaWN0aW9uYXJ5OiB7XG4gICAgICAgIC4uLnp4Y3ZibkNvbW1vblBhY2thZ2UuZGljdGlvbmFyeSxcbiAgICAgICAgLi4uenhjdmJuRW5QYWNrYWdlLmRpY3Rpb25hcnksXG4gICAgICAgIHVzZXJJbnB1dHM6IFtcInJpb3RcIiwgXCJtYXRyaXhcIiwgXCJlbGVtZW50XCIsIFNka0NvbmZpZy5nZXQoKS5icmFuZF0sXG4gICAgfSxcbiAgICBncmFwaHM6IHp4Y3ZibkNvbW1vblBhY2thZ2UuYWRqYWNlbmN5R3JhcGhzLFxuICAgIHVzZUxldmVuc2h0ZWluRGlzdGFuY2U6IHRydWUsXG59KTtcblxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zKCk6IFRyYW5zbGF0aW9uS2V5cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgd2FybmluZ3M6IHtcbiAgICAgICAgICAgIHN0cmFpZ2h0Um93OiBfdChcInp4Y3Zibnx3YXJuaW5nc3xzdHJhaWdodFJvd1wiKSxcbiAgICAgICAgICAgIGtleVBhdHRlcm46IF90KFwienhjdmJufHdhcm5pbmdzfGtleVBhdHRlcm5cIiksXG4gICAgICAgICAgICBzaW1wbGVSZXBlYXQ6IF90KFwienhjdmJufHdhcm5pbmdzfHNpbXBsZVJlcGVhdFwiKSxcbiAgICAgICAgICAgIGV4dGVuZGVkUmVwZWF0OiBfdChcInp4Y3Zibnx3YXJuaW5nc3xleHRlbmRlZFJlcGVhdFwiKSxcbiAgICAgICAgICAgIHNlcXVlbmNlczogX3QoXCJ6eGN2Ym58d2FybmluZ3N8c2VxdWVuY2VzXCIpLFxuICAgICAgICAgICAgcmVjZW50WWVhcnM6IF90KFwienhjdmJufHdhcm5pbmdzfHJlY2VudFllYXJzXCIpLFxuICAgICAgICAgICAgZGF0ZXM6IF90KFwienhjdmJufHdhcm5pbmdzfGRhdGVzXCIpLFxuICAgICAgICAgICAgdG9wVGVuOiBfdChcInp4Y3Zibnx3YXJuaW5nc3x0b3BUZW5cIiksXG4gICAgICAgICAgICB0b3BIdW5kcmVkOiBfdChcInp4Y3Zibnx3YXJuaW5nc3x0b3BIdW5kcmVkXCIpLFxuICAgICAgICAgICAgY29tbW9uOiBfdChcInp4Y3Zibnx3YXJuaW5nc3xjb21tb25cIiksXG4gICAgICAgICAgICBzaW1pbGFyVG9Db21tb246IF90KFwienhjdmJufHdhcm5pbmdzfHNpbWlsYXJUb0NvbW1vblwiKSxcbiAgICAgICAgICAgIHdvcmRCeUl0c2VsZjogX3QoXCJ6eGN2Ym58d2FybmluZ3N8d29yZEJ5SXRzZWxmXCIpLFxuICAgICAgICAgICAgbmFtZXNCeVRoZW1zZWx2ZXM6IF90KFwienhjdmJufHdhcm5pbmdzfG5hbWVzQnlUaGVtc2VsdmVzXCIpLFxuICAgICAgICAgICAgY29tbW9uTmFtZXM6IF90KFwienhjdmJufHdhcm5pbmdzfGNvbW1vbk5hbWVzXCIpLFxuICAgICAgICAgICAgdXNlcklucHV0czogX3QoXCJ6eGN2Ym58d2FybmluZ3N8dXNlcklucHV0c1wiKSxcbiAgICAgICAgICAgIHB3bmVkOiBfdChcInp4Y3Zibnx3YXJuaW5nc3xwd25lZFwiKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3VnZ2VzdGlvbnM6IHtcbiAgICAgICAgICAgIGwzM3Q6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfGwzM3RcIiksXG4gICAgICAgICAgICByZXZlcnNlV29yZHM6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfHJldmVyc2VXb3Jkc1wiKSxcbiAgICAgICAgICAgIGFsbFVwcGVyY2FzZTogX3QoXCJ6eGN2Ym58c3VnZ2VzdGlvbnN8YWxsVXBwZXJjYXNlXCIpLFxuICAgICAgICAgICAgY2FwaXRhbGl6YXRpb246IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfGNhcGl0YWxpemF0aW9uXCIpLFxuICAgICAgICAgICAgZGF0ZXM6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfGRhdGVzXCIpLFxuICAgICAgICAgICAgcmVjZW50WWVhcnM6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfHJlY2VudFllYXJzXCIpLFxuICAgICAgICAgICAgYXNzb2NpYXRlZFllYXJzOiBfdChcInp4Y3ZibnxzdWdnZXN0aW9uc3xhc3NvY2lhdGVkWWVhcnNcIiksXG4gICAgICAgICAgICBzZXF1ZW5jZXM6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfHNlcXVlbmNlc1wiKSxcbiAgICAgICAgICAgIHJlcGVhdGVkOiBfdChcInp4Y3ZibnxzdWdnZXN0aW9uc3xyZXBlYXRlZFwiKSxcbiAgICAgICAgICAgIGxvbmdlcktleWJvYXJkUGF0dGVybjogX3QoXCJ6eGN2Ym58c3VnZ2VzdGlvbnN8bG9uZ2VyS2V5Ym9hcmRQYXR0ZXJuXCIpLFxuICAgICAgICAgICAgYW5vdGhlcldvcmQ6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfGFub3RoZXJXb3JkXCIpLFxuICAgICAgICAgICAgdXNlV29yZHM6IF90KFwienhjdmJufHN1Z2dlc3Rpb25zfHVzZVdvcmRzXCIpLFxuICAgICAgICAgICAgbm9OZWVkOiBfdChcInp4Y3ZibnxzdWdnZXN0aW9uc3xub05lZWRcIiksXG4gICAgICAgICAgICBwd25lZDogX3QoXCJ6eGN2Ym58c3VnZ2VzdGlvbnN8cHduZWRcIiksXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFdlIGRvbid0IHV0aWxpc2UgdGhlIHRpbWUgZXN0aW1hdGlvbiBhdCB0aGlzIHRpbWUgc28ganVzdCBwYXNzIHRocm91Z2ggdGhlIEVuZ2xpc2ggdHJhbnNsYXRpb25zIGhlcmVcbiAgICAgICAgdGltZUVzdGltYXRpb246IHp4Y3ZibkVuUGFja2FnZS50cmFuc2xhdGlvbnMudGltZUVzdGltYXRpb24sXG4gICAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCB6eGN2Ym4gcGFzc3dvcmQgc3RyZW5ndGggZXN0aW1hdGlvblxuICogSW5jbHVkZSB0aGlzIG9ubHkgZnJvbSBhc3luYyBjb21wb25lbnRzOiBpdCBwdWxscyBpbiB6eGN2Ym5cbiAqIChvYnZpb3VzbHkpIHdoaWNoIGlzIGxhcmdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBQYXNzd29yZCB0byBzY29yZVxuICogQHBhcmFtIG1hdHJpeENsaWVudCB0aGUgY2xpZW50IG9mIHRoZSBsb2dnZWQtaW4gdXNlciwgaWYgYW55XG4gKiBAcGFyYW0gdXNlcklucHV0cyBhZGRpdGlvbmFsIHN0cmluZ3Mgc3VjaCBhcyB0aGUgdXNlcidzIG5hbWUgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBiYWQgcGFzc3dvcmQgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7b2JqZWN0fSBTY29yZSByZXN1bHQgd2l0aCBgc2NvcmVgIGFuZCBgZmVlZGJhY2tgIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjb3JlUGFzc3dvcmQoXG4gICAgbWF0cml4Q2xpZW50OiBNYXRyaXhDbGllbnQgfCBudWxsLFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgdXNlcklucHV0czogc3RyaW5nW10gPSBbXSxcbik6IFp4Y3ZiblJlc3VsdCB8IG51bGwge1xuICAgIGlmIChwYXNzd29yZC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgLy8gY29weSB0aGUgc3VwcGxpZWQgYXJyYXkgYmVmb3JlIG1vZGlmeWluZyBpdFxuICAgIGNvbnN0IGlucHV0cyA9IFsuLi51c2VySW5wdXRzXTtcblxuICAgIGlmIChtYXRyaXhDbGllbnQpIHtcbiAgICAgICAgaW5wdXRzLnB1c2gobWF0cml4Q2xpZW50LmdldFVzZXJJZExvY2FscGFydCgpISk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IG1hdHJpeENsaWVudC5nZXREb21haW4oKSE7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChkb21haW4pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZmluZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgenhjdmJuT3B0aW9ucy5zZXRUcmFuc2xhdGlvbnMoZ2V0VHJhbnNsYXRpb25zKCkpO1xuXG4gICAgbGV0IHp4Y3ZiblJlc3VsdCA9IHp4Y3ZibihwYXNzd29yZCwgaW5wdXRzKTtcbiAgICAvLyBXb3JrIGFyb3VuZCBodHRwczovL2dpdGh1Yi5jb20vZHJvcGJveC96eGN2Ym4vaXNzdWVzLzIxNlxuICAgIGlmIChwYXNzd29yZC5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0Tm9TcGFjZXMgPSB6eGN2Ym4ocGFzc3dvcmQucmVwbGFjZSgvIC9nLCBcIlwiKSwgaW5wdXRzKTtcbiAgICAgICAgaWYgKHJlc3VsdE5vU3BhY2VzLnNjb3JlIDwgenhjdmJuUmVzdWx0LnNjb3JlKSB6eGN2Ym5SZXN1bHQgPSByZXN1bHROb1NwYWNlcztcbiAgICB9XG5cbiAgICByZXR1cm4genhjdmJuUmVzdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQU9BLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLG1CQUFBLEdBQUFDLHVCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxlQUFBLEdBQUFELHVCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBSSxnQkFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBQyxzQkFBQSxDQUFBTixPQUFBO0FBQXFDLFNBQUFPLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFOLHdCQUFBTSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENB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