@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
81 lines • 14 kB
JavaScript
import { AbstractCollection } from "./AbstractCollection";
/**
* This class provides a skeletal implementation of the `List` interface to minimize the effort required to implement this interface backed by a "random access" data store (such as an _array_).
*/
export class AbstractList extends AbstractCollection {
constructor() {
super(...arguments);
this._modCount = 0;
}
/** Modification counter. Must be overridden in the subclasses that implement `subList` method */
get modCount() { return this._modCount; }
/**
* Tests whether all elements in the list pass the test implemented by the provided function
* @param callbackFn The function is called
* @returns {boolean} _true_ if the `callbackFn` function returns a _truthy_ value for every list element. Otherwise, _false_.
*/
every(callbackFn) {
if (this.size > 0) {
let i = -1;
for (const elem of this) {
if (!callbackFn(elem, ++i, this)) {
return false;
}
}
return true;
}
return false;
}
/**
* Creates an array as a shallow copy of a portion of the current list, filtered down to just the elements from the current list that pass the test implemented by the provided function
* @param predicate A predicate function, to test each element of the list. Return a value that coerces to _true_ to keep the element, or to _false_ otherwise.
* @returns An array of a portion of the given list, filtered down to just the elements from the given list that pass the test implemented by the provided function. If no elements pass the test, an empty array will be returned.
*/
filter(predicate) {
let arr = [];
if (this.size > 0) {
for (const elem of this) {
if (predicate(elem)) {
arr.push(elem);
}
}
}
return arr;
}
/**
* Gets the parent list of the current list `view` object
*/
getParent() { return null; }
/**
* Gets the range of the `from` and `to` indexes related to the `view`'s parent list (if any)
* @returns
*/
getParentRange() { return [0, 0]; }
/**
* Tests whether all elements in the list pass the test implemented by the provided function
* @param callbackFn A function to test for each element
* @returns {boolean} _true_ if the `callbackFn` function returns a _truthy_ value for at least one element in the list. Otherwise, _false_.
*/
some(callbackFn) {
let i = -1;
for (const elem of this) {
if (callbackFn(elem, ++i, this)) {
return true;
}
}
return false;
}
/**
* Sorts this list according to the order induced by the specified `Compare` function
* @param compare The `Compare` function used to compare list elements. A _undefined_ value indicates that the elements' natural ordering should be used
*/
sort(compare) {
const arr = this.toArray();
const nLen = arr.length;
arr.sort(compare);
for (let i = 0; i < nLen; i++) {
this.set(i, arr[i]);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RMaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvY29sbGVjdGlvbnMvQWJzdHJhY3RMaXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3pEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixZQUFnQixTQUFRLGtCQUFxQjtJQUFuRTs7UUFDWSxjQUFTLEdBQVcsQ0FBQyxDQUFDO0lBaUlsQyxDQUFDO0lBL0hDLGlHQUFpRztJQUNqRyxJQUFJLFFBQVEsS0FBYSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsVUFBd0U7UUFDNUUsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsR0FBVyxDQUFDLENBQUMsQ0FBQztZQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2hDLE9BQU8sS0FBSyxDQUFDO2lCQUNkO2FBQ0Y7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxTQUFnQztRQUNyQyxJQUFJLEdBQUcsR0FBaUIsRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDakIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNoQjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFZRDs7T0FFRztJQUNILFNBQVMsS0FBNkIsT0FBTyxJQUFJLENBQUEsQ0FBQyxDQUFDO0lBQ25EOzs7T0FHRztJQUNILGNBQWMsS0FBdUIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUF1Q3JEOzs7O09BSUc7SUFDSCxJQUFJLENBQUMsVUFBd0U7UUFDM0UsSUFBSSxDQUFDLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDdkIsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUMvQixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRDs7O09BR0c7SUFDSCxJQUFJLENBQUMsT0FBNkI7UUFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztDQVNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGFyZSB9IGZyb20gXCIuLi91dGlsL2Z1bmN0aW9uL0NvbXBhcmVcIjtcclxuaW1wb3J0IHsgUHJlZGljYXRlIH0gZnJvbSBcIi4uL3V0aWwvZnVuY3Rpb24vUHJlZGljYXRlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29sbGVjdGlvbn0gZnJvbSBcIi4vQWJzdHJhY3RDb2xsZWN0aW9uXCI7XHJcbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tIFwiLi9Db2xsZWN0aW9uXCI7XHJcbmltcG9ydCB7IExpbmtlZExpc3ROb2RlIH0gZnJvbSBcIi4vTGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBMaXN0IH0gZnJvbSBcIi4vTGlzdFwiO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBza2VsZXRhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYExpc3RgIGludGVyZmFjZSB0byBtaW5pbWl6ZSB0aGUgZWZmb3J0IHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBiYWNrZWQgYnkgYSBcInJhbmRvbSBhY2Nlc3NcIiBkYXRhIHN0b3JlIChzdWNoIGFzIGFuIF9hcnJheV8pLlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlzdDxUPiBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxUPiBpbXBsZW1lbnRzIExpc3Q8VD4ge1xyXG4gIHByb3RlY3RlZCBfbW9kQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKiBNb2RpZmljYXRpb24gY291bnRlci4gTXVzdCBiZSBvdmVycmlkZGVuIGluIHRoZSBzdWJjbGFzc2VzIHRoYXQgaW1wbGVtZW50IGBzdWJMaXN0YCBtZXRob2QgKi9cclxuICBnZXQgbW9kQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX21vZENvdW50OyB9XHJcbiAgLyoqXHJcbiAgICogVGVzdHMgd2hldGhlciBhbGwgZWxlbWVudHMgaW4gdGhlIGxpc3QgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cclxuICAgKiBAcGFyYW0gY2FsbGJhY2tGbiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IF90cnVlXyBpZiB0aGUgYGNhbGxiYWNrRm5gIGZ1bmN0aW9uIHJldHVybnMgYSBfdHJ1dGh5XyB2YWx1ZSBmb3IgZXZlcnkgbGlzdCBlbGVtZW50LiBPdGhlcndpc2UsIF9mYWxzZV8uXHJcbiAgICovXHJcbiAgZXZlcnkoY2FsbGJhY2tGbjogKHZhbHVlOiBFbGVtZW50PFQ+LCBpbmRleDogbnVtYmVyLCBsaXN0OiBMaXN0PFQ+KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zaXplID4gMCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyID0gLTE7XHJcbiAgICAgIGZvciAoY29uc3QgZWxlbSBvZiB0aGlzKSB7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFja0ZuKGVsZW0sICsraSwgdGhpcykpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW4gYXJyYXkgYXMgYSBzaGFsbG93IGNvcHkgb2YgYSBwb3J0aW9uIG9mIHRoZSBjdXJyZW50IGxpc3QsIGZpbHRlcmVkIGRvd24gdG8ganVzdCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgY3VycmVudCBsaXN0IHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cclxuICAgKiBAcGFyYW0gcHJlZGljYXRlIEEgcHJlZGljYXRlIGZ1bmN0aW9uLCB0byB0ZXN0IGVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdC4gUmV0dXJuIGEgdmFsdWUgdGhhdCBjb2VyY2VzIHRvIF90cnVlXyB0byBrZWVwIHRoZSBlbGVtZW50LCBvciB0byBfZmFsc2VfIG90aGVyd2lzZS5cclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhIHBvcnRpb24gb2YgdGhlIGdpdmVuIGxpc3QsIGZpbHRlcmVkIGRvd24gdG8ganVzdCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gbGlzdCB0aGF0IHBhc3MgdGhlIHRlc3QgaW1wbGVtZW50ZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLiBJZiBubyBlbGVtZW50cyBwYXNzIHRoZSB0ZXN0LCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAqL1xyXG4gIGZpbHRlcihwcmVkaWNhdGU6IFByZWRpY2F0ZTxFbGVtZW50PFQ+Pik6IEFycmF5PEVsZW1lbnQ8VD4+IHtcclxuICAgIGxldCBhcnI6IEVsZW1lbnQ8VD5bXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2l6ZSA+IDApIHtcclxuICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHRoaXMpIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGVsZW0pKSB7XHJcbiAgICAgICAgICBhcnIucHVzaChlbGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcnI7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3RcclxuICAgKiBAcGFyYW0gaW5kZXhcclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQ7XHJcbiAgLyoqXHJcbiAgICogR2V0cyByZWFkIG9ubHkgbm9kZSdzIG9iamVjdCBieSBpdHMgaW5kZXhcclxuICAgKiBAcGFyYW0gaW5kZXhcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldE5vZGUoaW5kZXg6IG51bWJlcik6IFJlYWRvbmx5PExpbmtlZExpc3ROb2RlPFQ+PiB8IG51bGw7XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgcGFyZW50IGxpc3Qgb2YgdGhlIGN1cnJlbnQgbGlzdCBgdmlld2Agb2JqZWN0XHJcbiAgICovXHJcbiAgZ2V0UGFyZW50KCk6IEFic3RyYWN0TGlzdDxUPiB8IG51bGwgeyByZXR1cm4gbnVsbCB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgcmFuZ2Ugb2YgdGhlIGBmcm9tYCBhbmQgYHRvYCBpbmRleGVzIHJlbGF0ZWQgdG8gdGhlIGB2aWV3YCdzIHBhcmVudCBsaXN0IChpZiBhbnkpXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBnZXRQYXJlbnRSYW5nZSgpOiBbbnVtYmVyLCBudW1iZXJdIHsgcmV0dXJuIFswLCAwXTsgfVxyXG4gIC8qKlxyXG4gICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoaXMgbGlzdCwgb3IgLTEgaWYgdGhpcyBsaXN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGVsZW1lbnRcclxuICAqIEBwYXJhbSB2YWx1ZVxyXG4gICogQHBhcmFtIGZyb21JbmRleFxyXG4gICovXHJcbiAgYWJzdHJhY3QgaW5kZXhPZih2YWx1ZTogRWxlbWVudDxUPiwgZnJvbUluZGV4PzogbnVtYmVyKTogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3RcclxuICAqIEBwYXJhbSBpbmRleFxyXG4gICogQHBhcmFtIHZhbHVlXHJcbiAgKi9cclxuICBhYnN0cmFjdCBpbnNlcnQoaW5kZXg6IG51bWJlciwgdmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoaXMgbGlzdCwgb3IgLTEgaWYgdGhpcyBsaXN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGVsZW1lbnRcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKiBAcGFyYW0gZnJvbUluZGV4XHJcbiAgICovXHJcbiAgYWJzdHJhY3QgbGFzdEluZGV4T2YodmFsdWU6IEVsZW1lbnQ8VD4sIGZyb21JbmRleD86IG51bWJlcik6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0XHJcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBiZSByZW1vdmVkXHJcbiAgICogQHJldHVybnMgVGhlIGVsZW1lbnQgcHJldmlvdXNseSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQ7XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBmcm9tIHRoaXMgbGlzdCBhbGwgb2YgdGhlIGVsZW1lbnRzIHdob3NlIGluZGV4IGlzIGJldHdlZW4gYGZyb21JbmRleGAsIGluY2x1c2l2ZSwgYW5kIGB0b0luZGV4YCwgZXhjbHVzaXZlXHJcbiAgICogQHBhcmFtIGZyb21JbmRleCBJbmRleCBvZiBmaXJzdCBlbGVtZW50IHRvIGJlIHJlbW92ZWRcclxuICAgKiBAcGFyYW0gdG9JbmRleCBJbmRleCBhZnRlciBsYXN0IGVsZW1lbnQgdG8gYmUgcmVtb3ZlZFxyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGUgbGlzdCBpcyBjaGFuZ2VkLCBlbHNlIF9mYWxzZV9cclxuICAgKi9cclxuICBhYnN0cmFjdCByZW1vdmVSYW5nZShmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleD86IG51bWJlcik6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogUmVwbGFjZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcclxuICAgKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVwbGFjZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSBFbGVtZW50IHRvIGJlIHN0b3JlZCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uXHJcbiAgICogQHJldHVybnMgVGhlIGVsZW1lbnQgcHJldmlvdXNseSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgYWJzdHJhY3Qgc2V0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBFbGVtZW50PFQ+KTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZDtcclxuICAvKipcclxuICAgKiBUZXN0cyB3aGV0aGVyIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxyXG4gICAqIEBwYXJhbSBjYWxsYmFja0ZuIEEgZnVuY3Rpb24gdG8gdGVzdCBmb3IgZWFjaCBlbGVtZW50XHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IF90cnVlXyBpZiB0aGUgYGNhbGxiYWNrRm5gIGZ1bmN0aW9uIHJldHVybnMgYSBfdHJ1dGh5XyB2YWx1ZSBmb3IgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QuIE90aGVyd2lzZSwgX2ZhbHNlXy5cclxuICAgKi9cclxuICBzb21lKGNhbGxiYWNrRm46ICh2YWx1ZTogRWxlbWVudDxUPiwgaW5kZXg6IG51bWJlciwgbGlzdDogTGlzdDxUPikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IC0xO1xyXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRoaXMpIHtcclxuICAgICAgaWYgKGNhbGxiYWNrRm4oZWxlbSwgKytpLCB0aGlzKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNvcnRzIHRoaXMgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIGluZHVjZWQgYnkgdGhlIHNwZWNpZmllZCBgQ29tcGFyZWAgZnVuY3Rpb25cclxuICAgKiBAcGFyYW0gY29tcGFyZSBUaGUgYENvbXBhcmVgIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSBsaXN0IGVsZW1lbnRzLiBBIF91bmRlZmluZWRfIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBlbGVtZW50cycgbmF0dXJhbCBvcmRlcmluZyBzaG91bGQgYmUgdXNlZFxyXG4gICAqL1xyXG4gIHNvcnQoY29tcGFyZT86IENvbXBhcmU8RWxlbWVudDxUPj4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGFyciA9IHRoaXMudG9BcnJheSgpO1xyXG4gICAgY29uc3QgbkxlbiA9IGFyci5sZW5ndGg7XHJcbiAgICBhcnIuc29ydChjb21wYXJlKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkxlbjsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2V0KGksIGFycltpXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICogUmV0dXJucyBhIHZpZXcgb2YgdGhlIHBvcnRpb24gb2YgdGhpcyBsaXN0IGJldHdlZW4gdGhlIHNwZWNpZmllZCBgZnJvbUluZGV4YCwgaW5jbHVzaXZlLCBhbmQgYHRvSW5kZXhgLCBleGNsdXNpdmUuXHJcbiAgKiBAcGFyYW0gZnJvbUluZGV4IExvdyBlbmRwb2ludCAoaW5jbHVzaXZlKSBvZiB0aGUgc3ViTGlzdFxyXG4gICogQHBhcmFtIHRvSW5kZXggSGlnaCBlbmRwb2ludCAoZXhjbHVzaXZlKSBvZiB0aGUgc3ViTGlzdFxyXG4gICogQHJldHVybnMgQSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugd2l0aGluIHRoaXMgbGlzdFxyXG4gICovXHJcbiAgYWJzdHJhY3Qgc3ViTGlzdChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogTGlzdDxUPjtcclxuXHJcbn1cclxuIl19