matrix-react-sdk
Version:
SDK for matrix.org using React
194 lines (161 loc) • 16.1 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"));
/*
Copyright 2019 New Vector Ltd
Copyright 2019 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*:: export interface ICallback {
replaceParts?: Part[];
close?: boolean;
}*/
/*:: export type UpdateCallback = (data: ICallback) => void;*/
/*:: export type GetAutocompleterComponent = () => Autocomplete;*/
/*:: export type UpdateQuery = (test: string) => Promise<void>;*/
class AutocompleteWrapperModel {
constructor(updateCallback
/*: UpdateCallback*/
, getAutocompleterComponent
/*: GetAutocompleterComponent*/
, updateQuery
/*: UpdateQuery*/
, partCreator
/*: PartCreator | CommandPartCreator*/
) {
this.updateCallback
/*:: */
= updateCallback
/*:: */
;
this.getAutocompleterComponent
/*:: */
= getAutocompleterComponent
/*:: */
;
this.updateQuery
/*:: */
= updateQuery
/*:: */
;
this.partCreator
/*:: */
= partCreator
/*:: */
;
(0, _defineProperty2.default)(this, "queryPart", void 0);
(0, _defineProperty2.default)(this, "partIndex", void 0);
}
onEscape(e
/*: KeyboardEvent*/
) {
this.getAutocompleterComponent().onEscape(e);
this.updateCallback({
replaceParts: [this.partCreator.plain(this.queryPart.text)],
close: true
});
}
close() {
this.updateCallback({
close: true
});
}
hasSelection() {
return this.getAutocompleterComponent().hasSelection();
}
hasCompletions() {
const ac = this.getAutocompleterComponent();
return ac && ac.countCompletions() > 0;
}
onEnter() {
this.updateCallback({
close: true
});
}
/**
* If there is no current autocompletion, start one and move to the first selection.
*/
async startSelection() {
const acComponent = this.getAutocompleterComponent();
if (acComponent.countCompletions() === 0) {
// Force completions to show for the text currently entered
await acComponent.forceComplete(); // Select the first item by moving "down"
await acComponent.moveSelection(+1);
}
}
selectPreviousSelection() {
this.getAutocompleterComponent().moveSelection(-1);
}
selectNextSelection() {
this.getAutocompleterComponent().moveSelection(+1);
}
onPartUpdate(part
/*: Part*/
, pos
/*: DocumentPosition*/
) {
// cache the typed value and caret here
// so we can restore it in onComponentSelectionChange when the value is undefined (meaning it should be the typed text)
this.queryPart = part;
this.partIndex = pos.index;
return this.updateQuery(part.text);
}
onComponentSelectionChange(completion
/*: ICompletion*/
) {
if (!completion) {
this.updateCallback({
replaceParts: [this.queryPart]
});
} else {
this.updateCallback({
replaceParts: this.partForCompletion(completion)
});
}
}
onComponentConfirm(completion
/*: ICompletion*/
) {
this.updateCallback({
replaceParts: this.partForCompletion(completion),
close: true
});
}
partForCompletion(completion
/*: ICompletion*/
) {
const {
completionId
} = completion;
const text = completion.completion;
switch (completion.type) {
case "room":
return [this.partCreator.roomPill(text, completionId), this.partCreator.plain(completion.suffix)];
case "at-room":
return [this.partCreator.atRoomPill(completionId), this.partCreator.plain(completion.suffix)];
case "user":
// Insert suffix only if the pill is the part with index 0 - we are at the start of the composer
return this.partCreator.createMentionParts(this.partIndex === 0, text, completionId);
case "command":
// command needs special handling for auto complete, but also renders as plain texts
return [this.partCreator.command(text)];
default:
// used for emoji and other plain text completion replacement
return [this.partCreator.plain(text)];
}
}
}
exports.default = AutocompleteWrapperModel;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0b3IvYXV0b2NvbXBsZXRlLnRzIl0sIm5hbWVzIjpbIkF1dG9jb21wbGV0ZVdyYXBwZXJNb2RlbCIsImNvbnN0cnVjdG9yIiwidXBkYXRlQ2FsbGJhY2siLCJnZXRBdXRvY29tcGxldGVyQ29tcG9uZW50IiwidXBkYXRlUXVlcnkiLCJwYXJ0Q3JlYXRvciIsIm9uRXNjYXBlIiwiZSIsInJlcGxhY2VQYXJ0cyIsInBsYWluIiwicXVlcnlQYXJ0IiwidGV4dCIsImNsb3NlIiwiaGFzU2VsZWN0aW9uIiwiaGFzQ29tcGxldGlvbnMiLCJhYyIsImNvdW50Q29tcGxldGlvbnMiLCJvbkVudGVyIiwic3RhcnRTZWxlY3Rpb24iLCJhY0NvbXBvbmVudCIsImZvcmNlQ29tcGxldGUiLCJtb3ZlU2VsZWN0aW9uIiwic2VsZWN0UHJldmlvdXNTZWxlY3Rpb24iLCJzZWxlY3ROZXh0U2VsZWN0aW9uIiwib25QYXJ0VXBkYXRlIiwicGFydCIsInBvcyIsInBhcnRJbmRleCIsImluZGV4Iiwib25Db21wb25lbnRTZWxlY3Rpb25DaGFuZ2UiLCJjb21wbGV0aW9uIiwicGFydEZvckNvbXBsZXRpb24iLCJvbkNvbXBvbmVudENvbmZpcm0iLCJjb21wbGV0aW9uSWQiLCJ0eXBlIiwicm9vbVBpbGwiLCJzdWZmaXgiLCJhdFJvb21QaWxsIiwiY3JlYXRlTWVudGlvblBhcnRzIiwiY29tbWFuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBZkE7QUFDQTtBQUNBOzs7Ozs7O0FBK0JlLE1BQU1BLHdCQUFOLENBQStCO0FBSTFDQyxFQUFBQSxXQUFXLENBQ0NDO0FBREQ7QUFBQSxJQUVDQztBQUZEO0FBQUEsSUFHQ0M7QUFIRDtBQUFBLElBSUNDO0FBSkQ7QUFBQSxJQUtUO0FBQUEsU0FKVUg7QUFJVjtBQUFBLE1BSlVBO0FBSVY7QUFBQTtBQUFBLFNBSFVDO0FBR1Y7QUFBQSxNQUhVQTtBQUdWO0FBQUE7QUFBQSxTQUZVQztBQUVWO0FBQUEsTUFGVUE7QUFFVjtBQUFBO0FBQUEsU0FEVUM7QUFDVjtBQUFBLE1BRFVBO0FBQ1Y7QUFBQTtBQUFBO0FBQUE7QUFDRDs7QUFFTUMsRUFBQUEsUUFBUCxDQUFnQkM7QUFBaEI7QUFBQSxJQUFrQztBQUM5QixTQUFLSix5QkFBTCxHQUFpQ0csUUFBakMsQ0FBMENDLENBQTFDO0FBQ0EsU0FBS0wsY0FBTCxDQUFvQjtBQUNoQk0sTUFBQUEsWUFBWSxFQUFFLENBQUMsS0FBS0gsV0FBTCxDQUFpQkksS0FBakIsQ0FBdUIsS0FBS0MsU0FBTCxDQUFlQyxJQUF0QyxDQUFELENBREU7QUFFaEJDLE1BQUFBLEtBQUssRUFBRTtBQUZTLEtBQXBCO0FBSUg7O0FBRU1BLEVBQUFBLEtBQVAsR0FBZTtBQUNYLFNBQUtWLGNBQUwsQ0FBb0I7QUFBQ1UsTUFBQUEsS0FBSyxFQUFFO0FBQVIsS0FBcEI7QUFDSDs7QUFFTUMsRUFBQUEsWUFBUCxHQUFzQjtBQUNsQixXQUFPLEtBQUtWLHlCQUFMLEdBQWlDVSxZQUFqQyxFQUFQO0FBQ0g7O0FBRU1DLEVBQUFBLGNBQVAsR0FBd0I7QUFDcEIsVUFBTUMsRUFBRSxHQUFHLEtBQUtaLHlCQUFMLEVBQVg7QUFDQSxXQUFPWSxFQUFFLElBQUlBLEVBQUUsQ0FBQ0MsZ0JBQUgsS0FBd0IsQ0FBckM7QUFDSDs7QUFFTUMsRUFBQUEsT0FBUCxHQUFpQjtBQUNiLFNBQUtmLGNBQUwsQ0FBb0I7QUFBQ1UsTUFBQUEsS0FBSyxFQUFFO0FBQVIsS0FBcEI7QUFDSDtBQUVEO0FBQ0o7QUFDQTs7O0FBQ0ksUUFBYU0sY0FBYixHQUE4QjtBQUMxQixVQUFNQyxXQUFXLEdBQUcsS0FBS2hCLHlCQUFMLEVBQXBCOztBQUNBLFFBQUlnQixXQUFXLENBQUNILGdCQUFaLE9BQW1DLENBQXZDLEVBQTBDO0FBQ3RDO0FBQ0EsWUFBTUcsV0FBVyxDQUFDQyxhQUFaLEVBQU4sQ0FGc0MsQ0FHdEM7O0FBQ0EsWUFBTUQsV0FBVyxDQUFDRSxhQUFaLENBQTBCLENBQUMsQ0FBM0IsQ0FBTjtBQUNIO0FBQ0o7O0FBRU1DLEVBQUFBLHVCQUFQLEdBQWlDO0FBQzdCLFNBQUtuQix5QkFBTCxHQUFpQ2tCLGFBQWpDLENBQStDLENBQUMsQ0FBaEQ7QUFDSDs7QUFFTUUsRUFBQUEsbUJBQVAsR0FBNkI7QUFDekIsU0FBS3BCLHlCQUFMLEdBQWlDa0IsYUFBakMsQ0FBK0MsQ0FBQyxDQUFoRDtBQUNIOztBQUVNRyxFQUFBQSxZQUFQLENBQW9CQztBQUFwQjtBQUFBLElBQWdDQztBQUFoQztBQUFBLElBQXVEO0FBQ25EO0FBQ0E7QUFDQSxTQUFLaEIsU0FBTCxHQUFpQmUsSUFBakI7QUFDQSxTQUFLRSxTQUFMLEdBQWlCRCxHQUFHLENBQUNFLEtBQXJCO0FBQ0EsV0FBTyxLQUFLeEIsV0FBTCxDQUFpQnFCLElBQUksQ0FBQ2QsSUFBdEIsQ0FBUDtBQUNIOztBQUVNa0IsRUFBQUEsMEJBQVAsQ0FBa0NDO0FBQWxDO0FBQUEsSUFBMkQ7QUFDdkQsUUFBSSxDQUFDQSxVQUFMLEVBQWlCO0FBQ2IsV0FBSzVCLGNBQUwsQ0FBb0I7QUFDaEJNLFFBQUFBLFlBQVksRUFBRSxDQUFDLEtBQUtFLFNBQU47QUFERSxPQUFwQjtBQUdILEtBSkQsTUFJTztBQUNILFdBQUtSLGNBQUwsQ0FBb0I7QUFDaEJNLFFBQUFBLFlBQVksRUFBRSxLQUFLdUIsaUJBQUwsQ0FBdUJELFVBQXZCO0FBREUsT0FBcEI7QUFHSDtBQUNKOztBQUVNRSxFQUFBQSxrQkFBUCxDQUEwQkY7QUFBMUI7QUFBQSxJQUFtRDtBQUMvQyxTQUFLNUIsY0FBTCxDQUFvQjtBQUNoQk0sTUFBQUEsWUFBWSxFQUFFLEtBQUt1QixpQkFBTCxDQUF1QkQsVUFBdkIsQ0FERTtBQUVoQmxCLE1BQUFBLEtBQUssRUFBRTtBQUZTLEtBQXBCO0FBSUg7O0FBRU9tQixFQUFBQSxpQkFBUixDQUEwQkQ7QUFBMUI7QUFBQSxJQUFtRDtBQUMvQyxVQUFNO0FBQUNHLE1BQUFBO0FBQUQsUUFBaUJILFVBQXZCO0FBQ0EsVUFBTW5CLElBQUksR0FBR21CLFVBQVUsQ0FBQ0EsVUFBeEI7O0FBQ0EsWUFBUUEsVUFBVSxDQUFDSSxJQUFuQjtBQUNJLFdBQUssTUFBTDtBQUNJLGVBQU8sQ0FBQyxLQUFLN0IsV0FBTCxDQUFpQjhCLFFBQWpCLENBQTBCeEIsSUFBMUIsRUFBZ0NzQixZQUFoQyxDQUFELEVBQWdELEtBQUs1QixXQUFMLENBQWlCSSxLQUFqQixDQUF1QnFCLFVBQVUsQ0FBQ00sTUFBbEMsQ0FBaEQsQ0FBUDs7QUFDSixXQUFLLFNBQUw7QUFDSSxlQUFPLENBQUMsS0FBSy9CLFdBQUwsQ0FBaUJnQyxVQUFqQixDQUE0QkosWUFBNUIsQ0FBRCxFQUE0QyxLQUFLNUIsV0FBTCxDQUFpQkksS0FBakIsQ0FBdUJxQixVQUFVLENBQUNNLE1BQWxDLENBQTVDLENBQVA7O0FBQ0osV0FBSyxNQUFMO0FBQ0k7QUFDQSxlQUFPLEtBQUsvQixXQUFMLENBQWlCaUMsa0JBQWpCLENBQW9DLEtBQUtYLFNBQUwsS0FBbUIsQ0FBdkQsRUFBMERoQixJQUExRCxFQUFnRXNCLFlBQWhFLENBQVA7O0FBQ0osV0FBSyxTQUFMO0FBQ0k7QUFDQSxlQUFPLENBQUUsS0FBSzVCLFdBQU4sQ0FBeUNrQyxPQUF6QyxDQUFpRDVCLElBQWpELENBQUQsQ0FBUDs7QUFDSjtBQUNJO0FBQ0EsZUFBTyxDQUFDLEtBQUtOLFdBQUwsQ0FBaUJJLEtBQWpCLENBQXVCRSxJQUF2QixDQUFELENBQVA7QUFiUjtBQWVIOztBQXZHeUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IHtLZXlib2FyZEV2ZW50fSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHtQYXJ0LCBDb21tYW5kUGFydENyZWF0b3IsIFBhcnRDcmVhdG9yfSBmcm9tIFwiLi9wYXJ0c1wiO1xuaW1wb3J0IERvY3VtZW50UG9zaXRpb24gZnJvbSBcIi4vcG9zaXRpb25cIjtcbmltcG9ydCB7SUNvbXBsZXRpb259IGZyb20gXCIuLi9hdXRvY29tcGxldGUvQXV0b2NvbXBsZXRlclwiO1xuaW1wb3J0IEF1dG9jb21wbGV0ZSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9yb29tcy9BdXRvY29tcGxldGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2FsbGJhY2sge1xuICAgIHJlcGxhY2VQYXJ0cz86IFBhcnRbXTtcbiAgICBjbG9zZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZUNhbGxiYWNrID0gKGRhdGE6IElDYWxsYmFjaykgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEdldEF1dG9jb21wbGV0ZXJDb21wb25lbnQgPSAoKSA9PiBBdXRvY29tcGxldGU7XG5leHBvcnQgdHlwZSBVcGRhdGVRdWVyeSA9ICh0ZXN0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9jb21wbGV0ZVdyYXBwZXJNb2RlbCB7XG4gICAgcHJpdmF0ZSBxdWVyeVBhcnQ6IFBhcnQ7XG4gICAgcHJpdmF0ZSBwYXJ0SW5kZXg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHVwZGF0ZUNhbGxiYWNrOiBVcGRhdGVDYWxsYmFjayxcbiAgICAgICAgcHJpdmF0ZSBnZXRBdXRvY29tcGxldGVyQ29tcG9uZW50OiBHZXRBdXRvY29tcGxldGVyQ29tcG9uZW50LFxuICAgICAgICBwcml2YXRlIHVwZGF0ZVF1ZXJ5OiBVcGRhdGVRdWVyeSxcbiAgICAgICAgcHJpdmF0ZSBwYXJ0Q3JlYXRvcjogUGFydENyZWF0b3IgfCBDb21tYW5kUGFydENyZWF0b3IsXG4gICAgKSB7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRXNjYXBlKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5nZXRBdXRvY29tcGxldGVyQ29tcG9uZW50KCkub25Fc2NhcGUoZSk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsbGJhY2soe1xuICAgICAgICAgICAgcmVwbGFjZVBhcnRzOiBbdGhpcy5wYXJ0Q3JlYXRvci5wbGFpbih0aGlzLnF1ZXJ5UGFydC50ZXh0KV0sXG4gICAgICAgICAgICBjbG9zZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHtjbG9zZTogdHJ1ZX0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF1dG9jb21wbGV0ZXJDb21wb25lbnQoKS5oYXNTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQ29tcGxldGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGFjID0gdGhpcy5nZXRBdXRvY29tcGxldGVyQ29tcG9uZW50KCk7XG4gICAgICAgIHJldHVybiBhYyAmJiBhYy5jb3VudENvbXBsZXRpb25zKCkgPiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkVudGVyKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHtjbG9zZTogdHJ1ZX0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgYXV0b2NvbXBsZXRpb24sIHN0YXJ0IG9uZSBhbmQgbW92ZSB0byB0aGUgZmlyc3Qgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzdGFydFNlbGVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgYWNDb21wb25lbnQgPSB0aGlzLmdldEF1dG9jb21wbGV0ZXJDb21wb25lbnQoKTtcbiAgICAgICAgaWYgKGFjQ29tcG9uZW50LmNvdW50Q29tcGxldGlvbnMoKSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gRm9yY2UgY29tcGxldGlvbnMgdG8gc2hvdyBmb3IgdGhlIHRleHQgY3VycmVudGx5IGVudGVyZWRcbiAgICAgICAgICAgIGF3YWl0IGFjQ29tcG9uZW50LmZvcmNlQ29tcGxldGUoKTtcbiAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgZmlyc3QgaXRlbSBieSBtb3ZpbmcgXCJkb3duXCJcbiAgICAgICAgICAgIGF3YWl0IGFjQ29tcG9uZW50Lm1vdmVTZWxlY3Rpb24oKzEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdFByZXZpb3VzU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLmdldEF1dG9jb21wbGV0ZXJDb21wb25lbnQoKS5tb3ZlU2VsZWN0aW9uKC0xKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0TmV4dFNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5nZXRBdXRvY29tcGxldGVyQ29tcG9uZW50KCkubW92ZVNlbGVjdGlvbigrMSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUGFydFVwZGF0ZShwYXJ0OiBQYXJ0LCBwb3M6IERvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgLy8gY2FjaGUgdGhlIHR5cGVkIHZhbHVlIGFuZCBjYXJldCBoZXJlXG4gICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIGl0IGluIG9uQ29tcG9uZW50U2VsZWN0aW9uQ2hhbmdlIHdoZW4gdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCAobWVhbmluZyBpdCBzaG91bGQgYmUgdGhlIHR5cGVkIHRleHQpXG4gICAgICAgIHRoaXMucXVlcnlQYXJ0ID0gcGFydDtcbiAgICAgICAgdGhpcy5wYXJ0SW5kZXggPSBwb3MuaW5kZXg7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVF1ZXJ5KHBhcnQudGV4dCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29tcG9uZW50U2VsZWN0aW9uQ2hhbmdlKGNvbXBsZXRpb246IElDb21wbGV0aW9uKSB7XG4gICAgICAgIGlmICghY29tcGxldGlvbikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgcmVwbGFjZVBhcnRzOiBbdGhpcy5xdWVyeVBhcnRdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICByZXBsYWNlUGFydHM6IHRoaXMucGFydEZvckNvbXBsZXRpb24oY29tcGxldGlvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbXBvbmVudENvbmZpcm0oY29tcGxldGlvbjogSUNvbXBsZXRpb24pIHtcbiAgICAgICAgdGhpcy51cGRhdGVDYWxsYmFjayh7XG4gICAgICAgICAgICByZXBsYWNlUGFydHM6IHRoaXMucGFydEZvckNvbXBsZXRpb24oY29tcGxldGlvbiksXG4gICAgICAgICAgICBjbG9zZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJ0Rm9yQ29tcGxldGlvbihjb21wbGV0aW9uOiBJQ29tcGxldGlvbikge1xuICAgICAgICBjb25zdCB7Y29tcGxldGlvbklkfSA9IGNvbXBsZXRpb247XG4gICAgICAgIGNvbnN0IHRleHQgPSBjb21wbGV0aW9uLmNvbXBsZXRpb247XG4gICAgICAgIHN3aXRjaCAoY29tcGxldGlvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwicm9vbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy5wYXJ0Q3JlYXRvci5yb29tUGlsbCh0ZXh0LCBjb21wbGV0aW9uSWQpLCB0aGlzLnBhcnRDcmVhdG9yLnBsYWluKGNvbXBsZXRpb24uc3VmZml4KV07XG4gICAgICAgICAgICBjYXNlIFwiYXQtcm9vbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy5wYXJ0Q3JlYXRvci5hdFJvb21QaWxsKGNvbXBsZXRpb25JZCksIHRoaXMucGFydENyZWF0b3IucGxhaW4oY29tcGxldGlvbi5zdWZmaXgpXTtcbiAgICAgICAgICAgIGNhc2UgXCJ1c2VyXCI6XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHN1ZmZpeCBvbmx5IGlmIHRoZSBwaWxsIGlzIHRoZSBwYXJ0IHdpdGggaW5kZXggMCAtIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGNvbXBvc2VyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFydENyZWF0b3IuY3JlYXRlTWVudGlvblBhcnRzKHRoaXMucGFydEluZGV4ID09PSAwLCB0ZXh0LCBjb21wbGV0aW9uSWQpO1xuICAgICAgICAgICAgY2FzZSBcImNvbW1hbmRcIjpcbiAgICAgICAgICAgICAgICAvLyBjb21tYW5kIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGF1dG8gY29tcGxldGUsIGJ1dCBhbHNvIHJlbmRlcnMgYXMgcGxhaW4gdGV4dHNcbiAgICAgICAgICAgICAgICByZXR1cm4gWyh0aGlzLnBhcnRDcmVhdG9yIGFzIENvbW1hbmRQYXJ0Q3JlYXRvcikuY29tbWFuZCh0ZXh0KV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIGVtb2ppIGFuZCBvdGhlciBwbGFpbiB0ZXh0IGNvbXBsZXRpb24gcmVwbGFjZW1lbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMucGFydENyZWF0b3IucGxhaW4odGV4dCldO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19