matrix-react-sdk
Version:
SDK for matrix.org using React
181 lines (170 loc) • 20 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.defaultDispatcher = exports.default = exports.MatrixDispatcher = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _payloads = require("./payloads");
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
Copyright 2017 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.
*/
function invariant(cond, error) {
if (!cond) throw new Error(error);
}
/**
* A dispatcher for ActionPayloads (the default within the SDK).
* Based on the old Flux dispatcher https://github.com/facebook/flux/blob/main/src/Dispatcher.js
*/
class MatrixDispatcher {
constructor() {
(0, _defineProperty2.default)(this, "callbacks", new Map());
(0, _defineProperty2.default)(this, "isHandled", new Map());
(0, _defineProperty2.default)(this, "isPending", new Map());
(0, _defineProperty2.default)(this, "pendingPayload", void 0);
(0, _defineProperty2.default)(this, "lastId", 1);
/**
* Dispatches a payload to all registered callbacks.
*/
// eslint-disable-next-line @typescript-eslint/naming-convention
(0, _defineProperty2.default)(this, "_dispatch", payload => {
invariant(!this.isDispatching(), "Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.");
this.startDispatching(payload);
try {
for (const [id] of this.callbacks) {
if (this.isPending.get(id)) {
continue;
}
this.invokeCallback(id);
}
} finally {
this.stopDispatching();
}
});
}
/**
* Registers a callback to be invoked with every dispatched payload. Returns
* a token that can be used with `waitFor()`.
*/
register(callback) {
const id = "ID_" + this.lastId++;
this.callbacks.set(id, callback);
if (this.isDispatching()) {
// If there is a dispatch happening right now then the newly registered callback should be skipped
this.isPending.set(id, true);
this.isHandled.set(id, true);
}
return id;
}
/**
* Removes a callback based on its token.
*/
unregister(id) {
invariant(this.callbacks.has(id), `Dispatcher.unregister(...): '${id}' does not map to a registered callback.`);
this.callbacks.delete(id);
}
/**
* Waits for the callbacks specified to be invoked before continuing execution
* of the current callback. This method should only be used by a callback in
* response to a dispatched payload.
*/
waitFor(ids) {
invariant(this.isDispatching(), "Dispatcher.waitFor(...): Must be invoked while dispatching.");
for (const id of ids) {
if (this.isPending.get(id)) {
invariant(this.isHandled.get(id), `Dispatcher.waitFor(...): Circular dependency detected while waiting for '${id}'.`);
continue;
}
invariant(this.callbacks.get(id), `Dispatcher.waitFor(...): '${id}' does not map to a registered callback.`);
this.invokeCallback(id);
}
}
/**
* Is this Dispatcher currently dispatching.
*/
isDispatching() {
return !!this.pendingPayload;
}
/**
* Call the callback stored with the given id. Also do some internal
* bookkeeping.
*
* Must only be called with an id which has a callback and pendingPayload set
* @internal
*/
invokeCallback(id) {
this.isPending.set(id, true);
this.callbacks.get(id)(this.pendingPayload);
this.isHandled.set(id, true);
}
/**
* Set up bookkeeping needed when dispatching.
*
* @internal
*/
startDispatching(payload) {
for (const [id] of this.callbacks) {
this.isPending.set(id, false);
this.isHandled.set(id, false);
}
this.pendingPayload = payload;
}
/**
* Clear bookkeeping used for dispatching.
*
* @internal
*/
stopDispatching() {
this.pendingPayload = undefined;
}
/**
* Dispatches an event on the dispatcher's event bus.
* @param {ActionPayload} payload Required. The payload to dispatch.
* @param {boolean=false} sync Optional. Pass true to dispatch
* synchronously. This is useful for anything triggering
* an operation that the browser requires user interaction
* for. Default false (async).
*/
dispatch(payload, sync = false) {
if (payload instanceof _payloads.AsyncActionPayload) {
payload.fn(action => {
this.dispatch(action, sync);
});
return;
}
if (sync) {
this._dispatch(payload);
} else {
// Unless the caller explicitly asked for us to dispatch synchronously,
// we always set a timeout to do this: The flux dispatcher complains
// if you dispatch from within a dispatch, so rather than action
// handlers having to worry about not calling anything that might
// then dispatch, we just do dispatches asynchronously.
window.setTimeout(this._dispatch, 0, payload);
}
}
/**
* Shorthand for dispatch({action: Action.WHATEVER}, sync). No additional
* properties can be included with this version.
* @param {Action} action The action to dispatch.
* @param {boolean=false} sync Whether the dispatch should be sync or not.
* @see dispatch(action: ActionPayload, sync: boolean)
*/
fire(action, sync = false) {
this.dispatch({
action
}, sync);
}
}
exports.MatrixDispatcher = MatrixDispatcher;
const defaultDispatcher = exports.defaultDispatcher = new MatrixDispatcher();
if (!window.mxDispatcher) {
window.mxDispatcher = defaultDispatcher;
}
var _default = exports.default = defaultDispatcher;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF5bG9hZHMiLCJyZXF1aXJlIiwiaW52YXJpYW50IiwiY29uZCIsImVycm9yIiwiRXJyb3IiLCJNYXRyaXhEaXNwYXRjaGVyIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIk1hcCIsInBheWxvYWQiLCJpc0Rpc3BhdGNoaW5nIiwic3RhcnREaXNwYXRjaGluZyIsImlkIiwiY2FsbGJhY2tzIiwiaXNQZW5kaW5nIiwiZ2V0IiwiaW52b2tlQ2FsbGJhY2siLCJzdG9wRGlzcGF0Y2hpbmciLCJyZWdpc3RlciIsImNhbGxiYWNrIiwibGFzdElkIiwic2V0IiwiaXNIYW5kbGVkIiwidW5yZWdpc3RlciIsImhhcyIsImRlbGV0ZSIsIndhaXRGb3IiLCJpZHMiLCJwZW5kaW5nUGF5bG9hZCIsInVuZGVmaW5lZCIsImRpc3BhdGNoIiwic3luYyIsIkFzeW5jQWN0aW9uUGF5bG9hZCIsImZuIiwiYWN0aW9uIiwiX2Rpc3BhdGNoIiwid2luZG93Iiwic2V0VGltZW91dCIsImZpcmUiLCJleHBvcnRzIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJteERpc3BhdGNoZXIiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaXNwYXRjaGVyL2Rpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE3IE5ldyBWZWN0b3IgTHRkXG5Db3B5cmlnaHQgMjAxNSwgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBBY3Rpb25QYXlsb2FkLCBBc3luY0FjdGlvblBheWxvYWQgfSBmcm9tIFwiLi9wYXlsb2Fkc1wiO1xuXG50eXBlIERpc3BhdGNoVG9rZW4gPSBzdHJpbmc7XG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kOiBhbnksIGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbmQpIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG59XG5cbi8qKlxuICogQSBkaXNwYXRjaGVyIGZvciBBY3Rpb25QYXlsb2FkcyAodGhlIGRlZmF1bHQgd2l0aGluIHRoZSBTREspLlxuICogQmFzZWQgb24gdGhlIG9sZCBGbHV4IGRpc3BhdGNoZXIgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2ZsdXgvYmxvYi9tYWluL3NyYy9EaXNwYXRjaGVyLmpzXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXhEaXNwYXRjaGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrcyA9IG5ldyBNYXA8RGlzcGF0Y2hUb2tlbiwgKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IHZvaWQ+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpc0hhbmRsZWQgPSBuZXcgTWFwPERpc3BhdGNoVG9rZW4sIGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpc1BlbmRpbmcgPSBuZXcgTWFwPERpc3BhdGNoVG9rZW4sIGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBwZW5kaW5nUGF5bG9hZD86IEFjdGlvblBheWxvYWQ7XG4gICAgcHJpdmF0ZSBsYXN0SWQgPSAxO1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aXRoIGV2ZXJ5IGRpc3BhdGNoZWQgcGF5bG9hZC4gUmV0dXJuc1xuICAgICAqIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGB3YWl0Rm9yKClgLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlcihjYWxsYmFjazogKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpID0+IHZvaWQpOiBEaXNwYXRjaFRva2VuIHtcbiAgICAgICAgY29uc3QgaWQgPSBcIklEX1wiICsgdGhpcy5sYXN0SWQrKztcbiAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGF0Y2hpbmcoKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkaXNwYXRjaCBoYXBwZW5pbmcgcmlnaHQgbm93IHRoZW4gdGhlIG5ld2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgc2hvdWxkIGJlIHNraXBwZWRcbiAgICAgICAgICAgIHRoaXMuaXNQZW5kaW5nLnNldChpZCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmlzSGFuZGxlZC5zZXQoaWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgYmFzZWQgb24gaXRzIHRva2VuLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bnJlZ2lzdGVyKGlkOiBEaXNwYXRjaFRva2VuKTogdm9pZCB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmNhbGxiYWNrcy5oYXMoaWQpLCBgRGlzcGF0Y2hlci51bnJlZ2lzdGVyKC4uLik6ICcke2lkfScgZG9lcyBub3QgbWFwIHRvIGEgcmVnaXN0ZXJlZCBjYWxsYmFjay5gKTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYWl0cyBmb3IgdGhlIGNhbGxiYWNrcyBzcGVjaWZpZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgY29udGludWluZyBleGVjdXRpb25cbiAgICAgKiBvZiB0aGUgY3VycmVudCBjYWxsYmFjay4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBhIGNhbGxiYWNrIGluXG4gICAgICogcmVzcG9uc2UgdG8gYSBkaXNwYXRjaGVkIHBheWxvYWQuXG4gICAgICovXG4gICAgcHVibGljIHdhaXRGb3IoaWRzOiBEaXNwYXRjaFRva2VuW10pOiB2b2lkIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNEaXNwYXRjaGluZygpLCBcIkRpc3BhdGNoZXIud2FpdEZvciguLi4pOiBNdXN0IGJlIGludm9rZWQgd2hpbGUgZGlzcGF0Y2hpbmcuXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNQZW5kaW5nLmdldChpZCkpIHtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNIYW5kbGVkLmdldChpZCksXG4gICAgICAgICAgICAgICAgICAgIGBEaXNwYXRjaGVyLndhaXRGb3IoLi4uKTogQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCB3aGlsZSB3YWl0aW5nIGZvciAnJHtpZH0nLmAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5nZXQoaWQpLFxuICAgICAgICAgICAgICAgIGBEaXNwYXRjaGVyLndhaXRGb3IoLi4uKTogJyR7aWR9JyBkb2VzIG5vdCBtYXAgdG8gYSByZWdpc3RlcmVkIGNhbGxiYWNrLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VDYWxsYmFjayhpZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgcGF5bG9hZCB0byBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIHByaXZhdGUgX2Rpc3BhdGNoID0gKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpOiB2b2lkID0+IHtcbiAgICAgICAgaW52YXJpYW50KCF0aGlzLmlzRGlzcGF0Y2hpbmcoKSwgXCJEaXNwYXRjaC5kaXNwYXRjaCguLi4pOiBDYW5ub3QgZGlzcGF0Y2ggaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlwiKTtcbiAgICAgICAgdGhpcy5zdGFydERpc3BhdGNoaW5nKHBheWxvYWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaWRdIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQZW5kaW5nLmdldChpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlQ2FsbGJhY2soaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zdG9wRGlzcGF0Y2hpbmcoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIERpc3BhdGNoZXIgY3VycmVudGx5IGRpc3BhdGNoaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc3BhdGNoaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnBlbmRpbmdQYXlsb2FkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGNhbGxiYWNrIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBpZC4gQWxzbyBkbyBzb21lIGludGVybmFsXG4gICAgICogYm9va2tlZXBpbmcuXG4gICAgICpcbiAgICAgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYW4gaWQgd2hpY2ggaGFzIGEgY2FsbGJhY2sgYW5kIHBlbmRpbmdQYXlsb2FkIHNldFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgaW52b2tlQ2FsbGJhY2soaWQ6IERpc3BhdGNoVG9rZW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGlkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuZ2V0KGlkKSEodGhpcy5wZW5kaW5nUGF5bG9hZCEpO1xuICAgICAgICB0aGlzLmlzSGFuZGxlZC5zZXQoaWQsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB1cCBib29ra2VlcGluZyBuZWVkZWQgd2hlbiBkaXNwYXRjaGluZy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhcnREaXNwYXRjaGluZyhwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkXSBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5pc1BlbmRpbmcuc2V0KGlkLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmlzSGFuZGxlZC5zZXQoaWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmdQYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBib29ra2VlcGluZyB1c2VkIGZvciBkaXNwYXRjaGluZy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RvcERpc3BhdGNoaW5nKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBlbmRpbmdQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgb24gdGhlIGRpc3BhdGNoZXIncyBldmVudCBidXMuXG4gICAgICogQHBhcmFtIHtBY3Rpb25QYXlsb2FkfSBwYXlsb2FkIFJlcXVpcmVkLiBUaGUgcGF5bG9hZCB0byBkaXNwYXRjaC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49ZmFsc2V9IHN5bmMgT3B0aW9uYWwuIFBhc3MgdHJ1ZSB0byBkaXNwYXRjaFxuICAgICAqICAgICAgICBzeW5jaHJvbm91c2x5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYW55dGhpbmcgdHJpZ2dlcmluZ1xuICAgICAqICAgICAgICBhbiBvcGVyYXRpb24gdGhhdCB0aGUgYnJvd3NlciByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uXG4gICAgICogICAgICAgIGZvci4gRGVmYXVsdCBmYWxzZSAoYXN5bmMpLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNwYXRjaDxUIGV4dGVuZHMgQWN0aW9uUGF5bG9hZD4ocGF5bG9hZDogVCwgc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgQXN5bmNBY3Rpb25QYXlsb2FkKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmZuKChhY3Rpb246IEFjdGlvblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGFjdGlvbiwgc3luYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaChwYXlsb2FkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVubGVzcyB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIHVzIHRvIGRpc3BhdGNoIHN5bmNocm9ub3VzbHksXG4gICAgICAgICAgICAvLyB3ZSBhbHdheXMgc2V0IGEgdGltZW91dCB0byBkbyB0aGlzOiBUaGUgZmx1eCBkaXNwYXRjaGVyIGNvbXBsYWluc1xuICAgICAgICAgICAgLy8gaWYgeW91IGRpc3BhdGNoIGZyb20gd2l0aGluIGEgZGlzcGF0Y2gsIHNvIHJhdGhlciB0aGFuIGFjdGlvblxuICAgICAgICAgICAgLy8gaGFuZGxlcnMgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IG5vdCBjYWxsaW5nIGFueXRoaW5nIHRoYXQgbWlnaHRcbiAgICAgICAgICAgIC8vIHRoZW4gZGlzcGF0Y2gsIHdlIGp1c3QgZG8gZGlzcGF0Y2hlcyBhc3luY2hyb25vdXNseS5cbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2Rpc3BhdGNoLCAwLCBwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3J0aGFuZCBmb3IgZGlzcGF0Y2goe2FjdGlvbjogQWN0aW9uLldIQVRFVkVSfSwgc3luYykuIE5vIGFkZGl0aW9uYWxcbiAgICAgKiBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0ge0FjdGlvbn0gYWN0aW9uIFRoZSBhY3Rpb24gdG8gZGlzcGF0Y2guXG4gICAgICogQHBhcmFtIHtib29sZWFuPWZhbHNlfSBzeW5jIFdoZXRoZXIgdGhlIGRpc3BhdGNoIHNob3VsZCBiZSBzeW5jIG9yIG5vdC5cbiAgICAgKiBAc2VlIGRpc3BhdGNoKGFjdGlvbjogQWN0aW9uUGF5bG9hZCwgc3luYzogYm9vbGVhbilcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlyZShhY3Rpb246IEFjdGlvbiwgc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyBhY3Rpb24gfSwgc3luYyk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpc3BhdGNoZXIgPSBuZXcgTWF0cml4RGlzcGF0Y2hlcigpO1xuXG5pZiAoIXdpbmRvdy5teERpc3BhdGNoZXIpIHtcbiAgICB3aW5kb3cubXhEaXNwYXRjaGVyID0gZGVmYXVsdERpc3BhdGNoZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHREaXNwYXRjaGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVdBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFPQSxTQUFTQyxTQUFTQSxDQUFD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