UNPKG

@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

193 lines 21.7 kB
import { from, Subject } from "rxjs"; import { IllegalArgumentException } from "../util/exception/IllegalArgumentException"; /** * This class provides a skeletal implementation of the Collection interface, to minimize the effort required to implement this interface. */ export class AbstractCollection { constructor() { this.contentChanged$ = new Subject(); } /** * Returns an observable object of the collection changes */ get contentChanged() { return this.contentChanged$.asObservable(); } ; /** * Returns an iterator over the elements contained in this collection */ get iterator() { return this[Symbol.iterator](); } /** * Returns the number of elements in this collection. */ get length() { return this.size; } /** * Returns the number of elements in this collection */ get size() { return this.toArray().length; } /** * Ensures that this collection contains the specified element. * @param value Element whose presence in this collection is to be ensured * @returns `this` Object reference * @throws `IllegalArgumentException` if the argument's value is _undefined_ * @description This method was defined for JavaScript's `Set` interface compatibility. */ add(value) { if (value === undefined) { throw new IllegalArgumentException(`Method add(): Illegal argument value '${value}'`); } this.append(value); return this; } /** * Appends all the elements in the specified collection to this collection * @param collection Collection containing elements to be added to this collection * @returns _true_ if this collection changed as a result of the call */ appendAll(collection) { let count = 0; if (collection) { for (const elem of collection) { if (this.append(elem)) { count++; } } } return count > 0; } /** * Returns _true_ if this collection contains all the elements in the specified collection * @param coll Collection to be checked for containment in this collection * @returns _true_ if this collection contains all the elements in the specified collection */ containsAll(coll) { if (coll && coll.length > 0) { for (const elem of coll) { if (!this.contains(elem)) { return false; } } return true; } return false; } /** * Compares the specified object with this collection for equality * @param value Object to be compared for equality with this collection * @returns _true_ if the specified `value` is equal to this collection */ equals(value) { return (value && value === this); } /** * Returns the first element in the provided array that satisfies the provided testing function. * If no values satisfy the testing function, _undefined_ is returned. * @param test The testing function * @returns The first element in the collection that satisfies the provided testing function. Otherwise, _undefined_ is returned. */ find(test) { let resultElem = undefined; for (const elem of this) { if (test(elem)) { resultElem = elem; break; } } return resultElem; } /** * Performs the specified action for each element in the collection * @param action {Consumer} The action to be performed for each element * @throws `IllegalArgumentException`, if the specified `action` is null */ forEach(action) { if (!action) { throw new IllegalArgumentException("action is required parameter"); } for (let elem of this) { action(elem); } } /** * Returns _true_ if this collection contains no elements */ isEmpty() { return this.size == 0; } /** * Removes all of this collection's elements that are also contained in the specified collection * @param collection Collection containing elements to be removed from this collection * @returns _true_ if this collection changed as a result of the call */ removeAll(collection) { let nCount = 0; if (collection) { for (const elem of collection) { if (this.remove(elem)) { nCount++; } } } return nCount > 0; } /** * Retains only the elements in this collection that are contained in the specified collection * @param collection Collection containing elements to be retained in this collection * @returns _true_ if this collection changed as a result of the call */ retainAll(collection) { let count = 0; if (collection) { if (Array.isArray(collection)) { for (const elem of this) { if (collection.indexOf(elem) == 0 && this.remove(elem)) { count++; } } } else { for (const elem of this) { if (!collection.contains(elem) && this.remove(elem)) { count++; } } } } return count > 0; } /** * Removes all the elements of this collection that satisfy the given predicate * @param p A predicate which returns true for elements to be removed * @returns _true_ if any elements were removed, _false_ otherwise */ removeIf(p) { let nCount = 0; for (const elem of this) { if (p(elem) && this.remove(elem)) { nCount++; } } return nCount > 0; } /** * Returns a sequential `Observable` object with this collection as its source * @since 0.5.0 */ stream() { return from(this); } /** * Returns a JSON representation of this collection */ toJSON() { return this.toArray(); } /** * Returns a string representation of this collection */ toString() { return this.toArray().toString(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RDb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvY29sbGVjdGlvbnMvQWJzdHJhY3RDb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBS3RGOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixrQkFBa0I7SUFBeEM7UUFDa0Isb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBa054RCxDQUFDO0lBN01DOztPQUVHO0lBQ0gsSUFBSSxjQUFjLEtBQXNCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQSxDQUFBLENBQUM7SUFBQSxDQUFDO0lBQ3BGOztPQUVHO0lBQ0gsSUFBSSxRQUFRLEtBQTBCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFBLENBQUEsQ0FBQztJQUNyRTs7T0FFRztJQUNILElBQUksTUFBTSxLQUFZLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUM7SUFDeEM7O09BRUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUNEOzs7Ozs7T0FNRztJQUNILEdBQUcsQ0FBQyxLQUFpQjtRQUNuQixJQUFLLEtBQUssS0FBSyxTQUFTLEVBQUc7WUFDekIsTUFBTSxJQUFJLHdCQUF3QixDQUFDLHlDQUF5QyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZGO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFPRDs7OztPQUlH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LEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLENBQXdCO1FBQy9CLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU0sRUFBRSxDQUFDO2FBQ1Y7U0FDRjtRQUNELE9BQU8sTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFLQTs7TUFFRTtJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBQ0Q7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtmcm9tLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfSBmcm9tIFwiLi4vdXRpbC9leGNlcHRpb24vSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXCI7XHJcbmltcG9ydCB7IENvbnN1bWVyIH0gZnJvbSBcIi4uL3V0aWwvZnVuY3Rpb24vQ29uc3VtZXJcIjtcclxuaW1wb3J0IHsgUHJlZGljYXRlIH0gZnJvbSBcIi4uL3V0aWwvZnVuY3Rpb24vUHJlZGljYXRlXCI7XHJcbmltcG9ydCB7IENvbGxlY3Rpb24sIEVsZW1lbnQgfSBmcm9tIFwiLi9Db2xsZWN0aW9uXCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNrZWxldGFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb2xsZWN0aW9uIGludGVyZmFjZSwgdG8gbWluaW1pemUgdGhlIGVmZm9ydCByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uPFQ+IGltcGxlbWVudHMgQ29sbGVjdGlvbjxUPiB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRlbnRDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGFic3RyYWN0IFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8RWxlbWVudDxUPj47XHJcbiAgYWJzdHJhY3QgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIG9iamVjdCBvZiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VzXHJcbiAgICovXHJcbiAgZ2V0IGNvbnRlbnRDaGFuZ2VkKCk6IE9ic2VydmFibGU8dm9pZD4ge3JldHVybiB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5hc09ic2VydmFibGUoKX07XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBlbGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBjb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgZ2V0IGl0ZXJhdG9yKCk6IEl0ZXJhdG9yPEVsZW1lbnQ8VD4+IHtyZXR1cm4gdGhpc1tTeW1ib2wuaXRlcmF0b3JdKCl9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgY29sbGVjdGlvbi5cclxuICAgKi9cclxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7cmV0dXJuIHRoaXMuc2l6ZTt9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50b0FycmF5KCkubGVuZ3RoO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBFbnN1cmVzIHRoYXQgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cclxuICAgKiBAcGFyYW0gdmFsdWUgRWxlbWVudCB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIGNvbGxlY3Rpb24gaXMgdG8gYmUgZW5zdXJlZFxyXG4gICAqIEByZXR1cm5zIGB0aGlzYCBPYmplY3QgcmVmZXJlbmNlXHJcbiAgICogQHRocm93cyBgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uYCBpZiB0aGUgYXJndW1lbnQncyB2YWx1ZSBpcyBfdW5kZWZpbmVkX1xyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCB3YXMgZGVmaW5lZCBmb3IgSmF2YVNjcmlwdCdzIGBTZXRgIGludGVyZmFjZSBjb21wYXRpYmlsaXR5LlxyXG4gICAqL1xyXG4gIGFkZCh2YWx1ZTogRWxlbWVudDxUPik6IHRoaXMge1xyXG4gICAgaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xyXG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGBNZXRob2QgYWRkKCk6IElsbGVnYWwgYXJndW1lbnQgdmFsdWUgJyR7dmFsdWV9J2ApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBlbmQodmFsdWUpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEVuc3VyZXMgdGhhdCB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50XHJcbiAgICogQHBhcmFtIHZhbHVlIEVsZW1lbnQgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBjb2xsZWN0aW9uIGlzIHRvIGJlIGVuc3VyZWRcclxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwsIF9mYWxzZV8gb3RoZXJ3aXNlXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgYXBwZW5kKHZhbHVlOiBFbGVtZW50PFQ+KTogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBBcHBlbmRzIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRvIHRoaXMgY29sbGVjdGlvblxyXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gY29udGFpbmluZyBlbGVtZW50cyB0byBiZSBhZGRlZCB0byB0aGlzIGNvbGxlY3Rpb25cclxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGxcclxuICAgKi9cclxuICBhcHBlbmRBbGw8RSBleHRlbmRzIFQ+KGNvbGxlY3Rpb246IENvbGxlY3Rpb248RT58QXJyYXk8RT4pOiBib29sZWFuIHtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBpZiAoY29sbGVjdGlvbikge1xyXG4gICAgICBmb3IgKGNvbnN0IGVsZW0gb2YgY29sbGVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLmFwcGVuZChlbGVtKSkge1xyXG4gICAgICAgICAgY291bnQrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb3VudCA+IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNsZWFyKCk6IHZvaWQ7XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBfdHJ1ZV8gaWYgdGhpcyBjb2xsZWN0aW9uIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudFxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNvbnRhaW5zKHZhbHVlOiBFbGVtZW50PFQ+KTogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBSZXR1cm5zIF90cnVlXyBpZiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25cclxuICAgKiBAcGFyYW0gY29sbCBDb2xsZWN0aW9uIHRvIGJlIGNoZWNrZWQgZm9yIGNvbnRhaW5tZW50IGluIHRoaXMgY29sbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25cclxuICAgKi9cclxuICBjb250YWluc0FsbDxFIGV4dGVuZHMgVD4oY29sbDogQ29sbGVjdGlvbjxFPnxBcnJheTxUPik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNvbGwgJiYgY29sbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZWxlbSBvZiBjb2xsKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zKGVsZW0pKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgY29sbGVjdGlvbiBmb3IgZXF1YWxpdHlcclxuICAgKiBAcGFyYW0gdmFsdWUgIE9iamVjdCB0byBiZSBjb21wYXJlZCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzIGNvbGxlY3Rpb25cclxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhlIHNwZWNpZmllZCBgdmFsdWVgIGlzIGVxdWFsIHRvIHRoaXMgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIGVxdWFscyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlID09PSB0aGlzKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcHJvdmlkZWQgYXJyYXkgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uXHJcbiAgICogSWYgbm8gdmFsdWVzIHNhdGlzZnkgdGhlIHRlc3RpbmcgZnVuY3Rpb24sIF91bmRlZmluZWRfIGlzIHJldHVybmVkLlxyXG4gICAqIEBwYXJhbSB0ZXN0IFRoZSB0ZXN0aW5nIGZ1bmN0aW9uXHJcbiAgICogQHJldHVybnMgVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIE90aGVyd2lzZSwgX3VuZGVmaW5lZF8gaXMgcmV0dXJuZWQuXHJcbiAgICovXHJcbiAgZmluZCh0ZXN0OiBQcmVkaWNhdGU8RWxlbWVudDxUPj4pOiBFbGVtZW50PFQ+IHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCByZXN1bHRFbGVtID0gdW5kZWZpbmVkO1xyXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRoaXMpIHtcclxuICAgICAgaWYgKHRlc3QoZWxlbSkpIHtcclxuICAgICAgICByZXN1bHRFbGVtID0gZWxlbTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdEVsZW07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb25cclxuICAgKiBAcGFyYW0gYWN0aW9uIHtDb25zdW1lcn0gVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgZm9yIGVhY2ggZWxlbWVudFxyXG4gICAqIEB0aHJvd3MgYElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbmAsIGlmIHRoZSBzcGVjaWZpZWQgYGFjdGlvbmAgaXMgbnVsbFxyXG4gICAqL1xyXG4gIGZvckVhY2goYWN0aW9uOiBDb25zdW1lcjxFbGVtZW50PFQ+Pik6IHZvaWQge1xyXG4gICAgaWYgKCFhY3Rpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcImFjdGlvbiBpcyByZXF1aXJlZCBwYXJhbWV0ZXJcIik7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBlbGVtIG9mIHRoaXMpIHtcclxuICAgICAgYWN0aW9uKGVsZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIF90cnVlXyBpZiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgbm8gZWxlbWVudHNcclxuICAgKi9cclxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PSAwO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoaXMgY29sbGVjdGlvbiwgaWYgaXQgaXMgcHJlc2VudFxyXG4gICAqIEBwYXJhbSB2YWx1ZSAgRWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBjb2xsZWN0aW9uLCBpZiBwcmVzZW50XHJcbiAgICogQHJldHVybnMgX3RydWVfIGlmIGFuIGVsZW1lbnQgd2FzIHJlbW92ZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBjYWxsXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgcmVtb3ZlKHZhbHVlOiBFbGVtZW50PFQ+KTogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFsbCBvZiB0aGlzIGNvbGxlY3Rpb24ncyBlbGVtZW50cyB0aGF0IGFyZSBhbHNvIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb25cclxuICAgKiBAcGFyYW0gY29sbGVjdGlvbiBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgZWxlbWVudHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgY29sbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGlzIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbFxyXG4gICAqL1xyXG4gIHJlbW92ZUFsbChjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPFQ+fEFycmF5PFQ+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbkNvdW50ID0gMDtcclxuICAgIGlmIChjb2xsZWN0aW9uKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZWxlbSBvZiBjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlKGVsZW0pKSB7XHJcbiAgICAgICAgICBuQ291bnQrKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuQ291bnQgPiAwO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXRhaW5zIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoaXMgY29sbGVjdGlvbiB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uXHJcbiAgICogQHBhcmFtIGNvbGxlY3Rpb24gQ29sbGVjdGlvbiBjb250YWluaW5nIGVsZW1lbnRzIHRvIGJlIHJldGFpbmVkIGluIHRoaXMgY29sbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGlzIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbFxyXG4gICAqL1xyXG4gIHJldGFpbkFsbChjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPFQ+fEFycmF5PFQ+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgaWYgKGNvbGxlY3Rpb24pIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdGhpcykge1xyXG4gICAgICAgICAgaWYgKGNvbGxlY3Rpb24uaW5kZXhPZihlbGVtISk9PTAgJiYgdGhpcy5yZW1vdmUoZWxlbSkpIHtcclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHRoaXMpIHtcclxuICAgICAgICAgIGlmICghY29sbGVjdGlvbi5jb250YWlucyhlbGVtKSAmJiB0aGlzLnJlbW92ZShlbGVtKSkge1xyXG4gICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvdW50ID4gMDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoaXMgY29sbGVjdGlvbiB0aGF0IHNhdGlzZnkgdGhlIGdpdmVuIHByZWRpY2F0ZVxyXG4gICAqIEBwYXJhbSBwIEEgcHJlZGljYXRlIHdoaWNoIHJldHVybnMgdHJ1ZSBmb3IgZWxlbWVudHMgdG8gYmUgcmVtb3ZlZFxyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiBhbnkgZWxlbWVudHMgd2VyZSByZW1vdmVkLCBfZmFsc2VfIG90aGVyd2lzZVxyXG4gICAqL1xyXG4gIHJlbW92ZUlmKHA6IFByZWRpY2F0ZTxFbGVtZW50PFQ+Pik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG5Db3VudCA9IDA7XHJcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdGhpcykge1xyXG4gICAgICBpZiAocChlbGVtKSAmJiB0aGlzLnJlbW92ZShlbGVtKSkge1xyXG4gICAgICAgIG5Db3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbkNvdW50ID4gMDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHNlcXVlbnRpYWwgYE9ic2VydmFibGVgIG9iamVjdCB3aXRoIHRoaXMgY29sbGVjdGlvbiBhcyBpdHMgc291cmNlXHJcbiAgICogQHNpbmNlIDAuNS4wXHJcbiAgICovXHJcbiAgc3RyZWFtKCk6IE9ic2VydmFibGU8RWxlbWVudDxUPj4ge1xyXG4gICAgcmV0dXJuIGZyb20odGhpcyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoaXMgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIGFic3RyYWN0IHRvQXJyYXkoKTogQXJyYXk8RWxlbWVudDxUPj47XHJcbiAgIC8qKlxyXG4gICAqIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sbGVjdGlvblxyXG4gICAqL1xyXG4gIHRvSlNPTigpOiBBcnJheTxFbGVtZW50PFQ+PiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0FycmF5KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19