matrix-react-sdk
Version:
SDK for matrix.org using React
171 lines (164 loc) • 24.9 kB
JavaScript
"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 _lodash = require("lodash");
/*
Copyright 2024 New Vector Ltd.
Copyright 2018-2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class Resizer {
// TODO move vertical/horizontal to config option/container class
// as it doesn't make sense to mix them within one container/Resizer
constructor(container, distributorCtor, config) {
(0, _defineProperty2.default)(this, "classNames", void 0);
(0, _defineProperty2.default)(this, "onMouseDown", event => {
const LEFT_MOUSE_BUTTON = 0;
if (event.button !== LEFT_MOUSE_BUTTON) {
return;
}
// use closest in case the resize handle contains
// child dom nodes that can be the target
const resizeHandle = event.target && event.target.closest(`.${this.classNames.handle}`);
const hasHandler = this?.config?.handler;
// prevent that stacked resizer's are both activated with one mouse event
// (this is possible because the mouse events are connected to the containers not the handles)
if (!resizeHandle ||
// if no resizeHandle exist / mouse event hit the container not the handle
!hasHandler && resizeHandle.parentElement !== this.container ||
// no handler from config -> check if the containers match
hasHandler && resizeHandle !== hasHandler) {
// handler from config -> check if the handlers match
return;
}
// prevent starting a drag operation
event.preventDefault();
// mark as currently resizing
if (this.classNames.resizing) {
this.container?.classList?.add(this.classNames.resizing);
}
this.config?.onResizeStart?.();
const {
sizer,
distributor
} = this.createSizerAndDistributor(resizeHandle);
distributor.start();
const onMouseMove = event => {
const offset = sizer.offsetFromEvent(event);
distributor.resizeFromContainerOffset(offset);
};
const body = document.body;
const finishResize = () => {
if (this.classNames.resizing) {
this.container?.classList?.remove(this.classNames.resizing);
}
distributor.finish();
this.config?.onResizeStop?.();
body.removeEventListener("mouseup", finishResize, false);
document.removeEventListener("mouseleave", finishResize, false);
body.removeEventListener("mousemove", onMouseMove, false);
};
body.addEventListener("mouseup", finishResize, false);
document.addEventListener("mouseleave", finishResize, false);
body.addEventListener("mousemove", onMouseMove, false);
});
(0, _defineProperty2.default)(this, "onResize", (0, _lodash.throttle)(() => {
const distributors = this.getDistributors();
// relax all items if they had any overconstrained flexboxes
distributors.forEach(d => d.start());
distributors.forEach(d => d.finish());
}, 100, {
trailing: true,
leading: true
}));
(0, _defineProperty2.default)(this, "getDistributors", () => {
return this.getResizeHandles().map(handle => {
const {
distributor
} = this.createSizerAndDistributor(handle);
return distributor;
});
});
this.container = container;
this.distributorCtor = distributorCtor;
this.config = config;
this.classNames = {
handle: "resizer-handle",
reverse: "resizer-reverse",
vertical: "resizer-vertical",
resizing: "resizer-resizing"
};
}
setClassNames(classNames) {
this.classNames = classNames;
}
attach() {
const attachment = this?.config?.handler?.parentElement ?? this.container;
attachment?.addEventListener("mousedown", this.onMouseDown, false);
window.addEventListener("resize", this.onResize);
}
detach() {
const attachment = this?.config?.handler?.parentElement ?? this.container;
attachment?.removeEventListener("mousedown", this.onMouseDown, false);
window.removeEventListener("resize", this.onResize);
}
/**
Gives the distributor for a specific resize handle, as if you would have started
to drag that handle. Can be used to manipulate the size of an item programmatically.
@param {number} handleIndex the index of the resize handle in the container
@return {FixedDistributor} a new distributor for the given handle
*/
forHandleAt(handleIndex) {
const handles = this.getResizeHandles();
const handle = handles[handleIndex];
if (handle) {
const {
distributor
} = this.createSizerAndDistributor(handle);
return distributor;
}
}
forHandleWithId(id) {
const handles = this.getResizeHandles();
const handle = handles.find(h => h.getAttribute("data-id") === id);
if (handle) {
const {
distributor
} = this.createSizerAndDistributor(handle);
return distributor;
}
}
isReverseResizeHandle(el) {
return el.classList.contains(this.classNames.reverse);
}
isResizeHandle(el) {
return el.classList.contains(this.classNames.handle);
}
createSizerAndDistributor(resizeHandle) {
const vertical = resizeHandle.classList.contains(this.classNames.vertical);
const reverse = this.isReverseResizeHandle(resizeHandle);
const Distributor = this.distributorCtor;
const useItemContainer = this.config?.handler ? this.container : undefined;
const sizer = Distributor.createSizer(this.container, vertical, reverse);
const item = Distributor.createItem(resizeHandle, this, sizer, useItemContainer ?? undefined);
const distributor = new Distributor(item);
return {
sizer,
distributor
};
}
getResizeHandles() {
if (this?.config?.handler) {
return [this.config.handler];
}
if (!this.container?.children) return [];
return Array.from(this.container.querySelectorAll(`.${this.classNames.handle}`));
}
}
exports.default = Resizer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIlJlc2l6ZXIiLCJjb25zdHJ1Y3RvciIsImNvbnRhaW5lciIsImRpc3RyaWJ1dG9yQ3RvciIsImNvbmZpZyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZXZlbnQiLCJMRUZUX01PVVNFX0JVVFRPTiIsImJ1dHRvbiIsInJlc2l6ZUhhbmRsZSIsInRhcmdldCIsImNsb3Nlc3QiLCJjbGFzc05hbWVzIiwiaGFuZGxlIiwiaGFzSGFuZGxlciIsImhhbmRsZXIiLCJwYXJlbnRFbGVtZW50IiwicHJldmVudERlZmF1bHQiLCJyZXNpemluZyIsImNsYXNzTGlzdCIsImFkZCIsIm9uUmVzaXplU3RhcnQiLCJzaXplciIsImRpc3RyaWJ1dG9yIiwiY3JlYXRlU2l6ZXJBbmREaXN0cmlidXRvciIsInN0YXJ0Iiwib25Nb3VzZU1vdmUiLCJvZmZzZXQiLCJvZmZzZXRGcm9tRXZlbnQiLCJyZXNpemVGcm9tQ29udGFpbmVyT2Zmc2V0IiwiYm9keSIsImRvY3VtZW50IiwiZmluaXNoUmVzaXplIiwicmVtb3ZlIiwiZmluaXNoIiwib25SZXNpemVTdG9wIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0aHJvdHRsZSIsImRpc3RyaWJ1dG9ycyIsImdldERpc3RyaWJ1dG9ycyIsImZvckVhY2giLCJkIiwidHJhaWxpbmciLCJsZWFkaW5nIiwiZ2V0UmVzaXplSGFuZGxlcyIsIm1hcCIsInJldmVyc2UiLCJ2ZXJ0aWNhbCIsInNldENsYXNzTmFtZXMiLCJhdHRhY2giLCJhdHRhY2htZW50Iiwib25Nb3VzZURvd24iLCJ3aW5kb3ciLCJvblJlc2l6ZSIsImRldGFjaCIsImZvckhhbmRsZUF0IiwiaGFuZGxlSW5kZXgiLCJoYW5kbGVzIiwiZm9ySGFuZGxlV2l0aElkIiwiaWQiLCJmaW5kIiwiaCIsImdldEF0dHJpYnV0ZSIsImlzUmV2ZXJzZVJlc2l6ZUhhbmRsZSIsImVsIiwiY29udGFpbnMiLCJpc1Jlc2l6ZUhhbmRsZSIsIkRpc3RyaWJ1dG9yIiwidXNlSXRlbUNvbnRhaW5lciIsInVuZGVmaW5lZCIsImNyZWF0ZVNpemVyIiwiaXRlbSIsImNyZWF0ZUl0ZW0iLCJjaGlsZHJlbiIsIkFycmF5IiwiZnJvbSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jlc2l6ZXIvcmVzaXplci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOC0yMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IHRocm90dGxlIH0gZnJvbSBcImxvZGFzaFwiO1xuXG5pbXBvcnQgRml4ZWREaXN0cmlidXRvciBmcm9tIFwiLi9kaXN0cmlidXRvcnMvZml4ZWRcIjtcbmltcG9ydCBSZXNpemVJdGVtIGZyb20gXCIuL2l0ZW1cIjtcbmltcG9ydCBTaXplciBmcm9tIFwiLi9zaXplclwiO1xuXG5pbnRlcmZhY2UgSUNsYXNzTmFtZXMge1xuICAgIC8vIGNsYXNzIG9uIHJlc2l6ZS1oYW5kbGVcbiAgICBoYW5kbGU/OiBzdHJpbmc7XG4gICAgLy8gY2xhc3Mgb24gcmVzaXplLWhhbmRsZVxuICAgIHJldmVyc2U/OiBzdHJpbmc7XG4gICAgLy8gY2xhc3Mgb24gcmVzaXplLWhhbmRsZVxuICAgIHZlcnRpY2FsPzogc3RyaW5nO1xuICAgIC8vIGNsYXNzIG9uIGNvbnRhaW5lclxuICAgIHJlc2l6aW5nPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb25maWcge1xuICAgIG9uUmVzaXplU3RhcnQ/KCk6IHZvaWQ7XG4gICAgb25SZXNpemVTdG9wPygpOiB2b2lkO1xuICAgIG9uUmVzaXplZD8oc2l6ZTogbnVtYmVyIHwgbnVsbCwgaWQ6IHN0cmluZyB8IG51bGwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZDtcbiAgICBoYW5kbGVyPzogSFRNTERpdkVsZW1lbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc2l6ZXI8QyBleHRlbmRzIElDb25maWcsIEkgZXh0ZW5kcyBSZXNpemVJdGVtPEM+ID0gUmVzaXplSXRlbTxDPj4ge1xuICAgIHByaXZhdGUgY2xhc3NOYW1lczogSUNsYXNzTmFtZXM7XG5cbiAgICAvLyBUT0RPIG1vdmUgdmVydGljYWwvaG9yaXpvbnRhbCB0byBjb25maWcgb3B0aW9uL2NvbnRhaW5lciBjbGFzc1xuICAgIC8vIGFzIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtaXggdGhlbSB3aXRoaW4gb25lIGNvbnRhaW5lci9SZXNpemVyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzdHJpYnV0b3JDdG9yOiB7XG4gICAgICAgICAgICBuZXcgKGl0ZW06IEkpOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+O1xuICAgICAgICAgICAgY3JlYXRlSXRlbShyZXNpemVIYW5kbGU6IEhUTUxEaXZFbGVtZW50LCByZXNpemVyOiBSZXNpemVyPEMsIEk+LCBzaXplcjogU2l6ZXIsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogSTtcbiAgICAgICAgICAgIGNyZWF0ZVNpemVyKGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCwgdmVydGljYWw6IGJvb2xlYW4sIHJldmVyc2U6IGJvb2xlYW4pOiBTaXplcjtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZz86IEMsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lcyA9IHtcbiAgICAgICAgICAgIGhhbmRsZTogXCJyZXNpemVyLWhhbmRsZVwiLFxuICAgICAgICAgICAgcmV2ZXJzZTogXCJyZXNpemVyLXJldmVyc2VcIixcbiAgICAgICAgICAgIHZlcnRpY2FsOiBcInJlc2l6ZXItdmVydGljYWxcIixcbiAgICAgICAgICAgIHJlc2l6aW5nOiBcInJlc2l6ZXItcmVzaXppbmdcIixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzOiBJQ2xhc3NOYW1lcyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhdHRhY2goKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzPy5jb25maWc/LmhhbmRsZXI/LnBhcmVudEVsZW1lbnQgPz8gdGhpcy5jb250YWluZXI7XG4gICAgICAgIGF0dGFjaG1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5vbk1vdXNlRG93biwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uUmVzaXplKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gdGhpcz8uY29uZmlnPy5oYW5kbGVyPy5wYXJlbnRFbGVtZW50ID8/IHRoaXMuY29udGFpbmVyO1xuICAgICAgICBhdHRhY2htZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMub25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgR2l2ZXMgdGhlIGRpc3RyaWJ1dG9yIGZvciBhIHNwZWNpZmljIHJlc2l6ZSBoYW5kbGUsIGFzIGlmIHlvdSB3b3VsZCBoYXZlIHN0YXJ0ZWRcbiAgICB0byBkcmFnIHRoYXQgaGFuZGxlLiBDYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzaXplIG9mIGFuIGl0ZW0gcHJvZ3JhbW1hdGljYWxseS5cbiAgICBAcGFyYW0ge251bWJlcn0gaGFuZGxlSW5kZXggdGhlIGluZGV4IG9mIHRoZSByZXNpemUgaGFuZGxlIGluIHRoZSBjb250YWluZXJcbiAgICBAcmV0dXJuIHtGaXhlZERpc3RyaWJ1dG9yfSBhIG5ldyBkaXN0cmlidXRvciBmb3IgdGhlIGdpdmVuIGhhbmRsZVxuICAgICovXG4gICAgcHVibGljIGZvckhhbmRsZUF0KGhhbmRsZUluZGV4OiBudW1iZXIpOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMuZ2V0UmVzaXplSGFuZGxlcygpO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSBoYW5kbGVzW2hhbmRsZUluZGV4XTtcbiAgICAgICAgaWYgKGhhbmRsZSkge1xuICAgICAgICAgICAgY29uc3QgeyBkaXN0cmlidXRvciB9ID0gdGhpcy5jcmVhdGVTaXplckFuZERpc3RyaWJ1dG9yKDxIVE1MRGl2RWxlbWVudD5oYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZvckhhbmRsZVdpdGhJZChpZDogc3RyaW5nKTogRml4ZWREaXN0cmlidXRvcjxDLCBJPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXMgPSB0aGlzLmdldFJlc2l6ZUhhbmRsZXMoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gaGFuZGxlcy5maW5kKChoKSA9PiBoLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikgPT09IGlkKTtcbiAgICAgICAgaWYgKGhhbmRsZSkge1xuICAgICAgICAgICAgY29uc3QgeyBkaXN0cmlidXRvciB9ID0gdGhpcy5jcmVhdGVTaXplckFuZERpc3RyaWJ1dG9yKDxIVE1MRGl2RWxlbWVudD5oYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dG9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmV2ZXJzZVJlc2l6ZUhhbmRsZShlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmNsYXNzTmFtZXMucmV2ZXJzZSEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jlc2l6ZUhhbmRsZShlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLmNsYXNzTmFtZXMuaGFuZGxlISk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1vdXNlRG93biA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBMRUZUX01PVVNFX0JVVFRPTiA9IDA7XG4gICAgICAgIGlmIChldmVudC5idXR0b24gIT09IExFRlRfTU9VU0VfQlVUVE9OKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIGNsb3Nlc3QgaW4gY2FzZSB0aGUgcmVzaXplIGhhbmRsZSBjb250YWluc1xuICAgICAgICAvLyBjaGlsZCBkb20gbm9kZXMgdGhhdCBjYW4gYmUgdGhlIHRhcmdldFxuICAgICAgICBjb25zdCByZXNpemVIYW5kbGUgPSBldmVudC50YXJnZXQgJiYgKDxIVE1MRGl2RWxlbWVudD5ldmVudC50YXJnZXQpLmNsb3Nlc3QoYC4ke3RoaXMuY2xhc3NOYW1lcy5oYW5kbGV9YCk7XG4gICAgICAgIGNvbnN0IGhhc0hhbmRsZXIgPSB0aGlzPy5jb25maWc/LmhhbmRsZXI7XG4gICAgICAgIC8vIHByZXZlbnQgdGhhdCBzdGFja2VkIHJlc2l6ZXIncyBhcmUgYm90aCBhY3RpdmF0ZWQgd2l0aCBvbmUgbW91c2UgZXZlbnRcbiAgICAgICAgLy8gKHRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSB0aGUgbW91c2UgZXZlbnRzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIGNvbnRhaW5lcnMgbm90IHRoZSBoYW5kbGVzKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcmVzaXplSGFuZGxlIHx8IC8vIGlmIG5vIHJlc2l6ZUhhbmRsZSBleGlzdCAvIG1vdXNlIGV2ZW50IGhpdCB0aGUgY29udGFpbmVyIG5vdCB0aGUgaGFuZGxlXG4gICAgICAgICAgICAoIWhhc0hhbmRsZXIgJiYgcmVzaXplSGFuZGxlLnBhcmVudEVsZW1lbnQgIT09IHRoaXMuY29udGFpbmVyKSB8fCAvLyBubyBoYW5kbGVyIGZyb20gY29uZmlnIC0+IGNoZWNrIGlmIHRoZSBjb250YWluZXJzIG1hdGNoXG4gICAgICAgICAgICAoaGFzSGFuZGxlciAmJiByZXNpemVIYW5kbGUgIT09IGhhc0hhbmRsZXIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gaGFuZGxlciBmcm9tIGNvbmZpZyAtPiBjaGVjayBpZiB0aGUgaGFuZGxlcnMgbWF0Y2hcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnQgc3RhcnRpbmcgYSBkcmFnIG9wZXJhdGlvblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8vIG1hcmsgYXMgY3VycmVudGx5IHJlc2l6aW5nXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZXMucmVzaXppbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyPy5jbGFzc0xpc3Q/LmFkZCh0aGlzLmNsYXNzTmFtZXMucmVzaXppbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnPy5vblJlc2l6ZVN0YXJ0Py4oKTtcblxuICAgICAgICBjb25zdCB7IHNpemVyLCBkaXN0cmlidXRvciB9ID0gdGhpcy5jcmVhdGVTaXplckFuZERpc3RyaWJ1dG9yKDxIVE1MRGl2RWxlbWVudD5yZXNpemVIYW5kbGUpO1xuICAgICAgICBkaXN0cmlidXRvci5zdGFydCgpO1xuXG4gICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzaXplci5vZmZzZXRGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgZGlzdHJpYnV0b3IucmVzaXplRnJvbUNvbnRhaW5lck9mZnNldChvZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICBjb25zdCBmaW5pc2hSZXNpemUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWVzLnJlc2l6aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXI/LmNsYXNzTGlzdD8ucmVtb3ZlKHRoaXMuY2xhc3NOYW1lcy5yZXNpemluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0cmlidXRvci5maW5pc2goKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnPy5vblJlc2l6ZVN0b3A/LigpO1xuICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBmaW5pc2hSZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGZpbmlzaFJlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZmluaXNoUmVzaXplLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGZpbmlzaFJlc2l6ZSwgZmFsc2UpO1xuICAgICAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJlc2l6ZSA9IHRocm90dGxlKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaXN0cmlidXRvcnMgPSB0aGlzLmdldERpc3RyaWJ1dG9ycygpO1xuXG4gICAgICAgICAgICAvLyByZWxheCBhbGwgaXRlbXMgaWYgdGhleSBoYWQgYW55IG92ZXJjb25zdHJhaW5lZCBmbGV4Ym94ZXNcbiAgICAgICAgICAgIGRpc3RyaWJ1dG9ycy5mb3JFYWNoKChkKSA9PiBkLnN0YXJ0KCkpO1xuICAgICAgICAgICAgZGlzdHJpYnV0b3JzLmZvckVhY2goKGQpID0+IGQuZmluaXNoKCkpO1xuICAgICAgICB9LFxuICAgICAgICAxMDAsXG4gICAgICAgIHsgdHJhaWxpbmc6IHRydWUsIGxlYWRpbmc6IHRydWUgfSxcbiAgICApO1xuXG4gICAgcHVibGljIGdldERpc3RyaWJ1dG9ycyA9ICgpOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+W10gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXNpemVIYW5kbGVzKCkubWFwKChoYW5kbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGlzdHJpYnV0b3IgfSA9IHRoaXMuY3JlYXRlU2l6ZXJBbmREaXN0cmlidXRvcig8SFRNTERpdkVsZW1lbnQ+aGFuZGxlKTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0cmlidXRvcjtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY3JlYXRlU2l6ZXJBbmREaXN0cmlidXRvcihyZXNpemVIYW5kbGU6IEhUTUxEaXZFbGVtZW50KToge1xuICAgICAgICBzaXplcjogU2l6ZXI7XG4gICAgICAgIGRpc3RyaWJ1dG9yOiBGaXhlZERpc3RyaWJ1dG9yPEMsIEk+O1xuICAgIH0ge1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHJlc2l6ZUhhbmRsZS5jbGFzc0xpc3QuY29udGFpbnModGhpcy5jbGFzc05hbWVzLnZlcnRpY2FsISk7XG4gICAgICAgIGNvbnN0IHJldmVyc2UgPSB0aGlzLmlzUmV2ZXJzZVJlc2l6ZUhhbmRsZShyZXNpemVIYW5kbGUpO1xuICAgICAgICBjb25zdCBEaXN0cmlidXRvciA9IHRoaXMuZGlzdHJpYnV0b3JDdG9yO1xuICAgICAgICBjb25zdCB1c2VJdGVtQ29udGFpbmVyID0gdGhpcy5jb25maWc/LmhhbmRsZXIgPyB0aGlzLmNvbnRhaW5lciA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2l6ZXIgPSBEaXN0cmlidXRvci5jcmVhdGVTaXplcih0aGlzLmNvbnRhaW5lciwgdmVydGljYWwsIHJldmVyc2UpO1xuICAgICAgICBjb25zdCBpdGVtID0gRGlzdHJpYnV0b3IuY3JlYXRlSXRlbShyZXNpemVIYW5kbGUsIHRoaXMsIHNpemVyLCB1c2VJdGVtQ29udGFpbmVyID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRpc3RyaWJ1dG9yID0gbmV3IERpc3RyaWJ1dG9yKGl0ZW0pO1xuICAgICAgICByZXR1cm4geyBzaXplciwgZGlzdHJpYnV0b3IgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJlc2l6ZUhhbmRsZXMoKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzPy5jb25maWc/LmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5jb25maWcuaGFuZGxlcl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcj8uY2hpbGRyZW4pIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChgLiR7dGhpcy5jbGFzc05hbWVzLmhhbmRsZX1gKSk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFB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