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

151 lines 18.7 kB
import { Comparator } from "./Comparator"; import { NullPointerException } from "./exception/NullPointerException"; import { HashSet } from "../collections/HashSet"; import { ArrayList } from "../collections/ArrayList"; import { HashMap } from "../collections/HashMap"; /** * This class consists exclusively of static methods that operate on or return collections. */ export class Collections { /** * Adds all of the specified elements to the specified collection * @param c Collection object * @param elements Elements to add to the collection `c` * @returns _true_ if the collection changed as a result of this call, or _false_ otherwise */ static addAll(c, ...elements) { if (!c) { throw new NullPointerException(); } let nCount = 0; for (let el of elements) { if (c.add(el)) { nCount++; } } return nCount > 0; } /** * Returns the number of elements in the specified collection equal to the specified object * @param c The collection in which to determine the frequency of o * @param o The object whose frequency is to be determined * @returns The number of elements in c equal to o */ static frequency(c, o) { let nCount = 0; for (const elem of c) { if (Object.is(elem, o)) { nCount++; } } return nCount; } /** * Returns the maximum element of the given collection, according to the _natural ordering_ of its elements or to the order induced by the specified comparator * @param c The collection whose maximum element is to be determined * @param comparator The comparator with which to determine the maximum element. An _undefined_ value indicates that the elements' natural ordering should be used. * @returns The maximum element of the given collection, according to the specified comparator. Returns _undefined_ if the collection `c` is empty. */ static max(c, comparator) { let maxElem = undefined; if (c && c.size > 0) { comparator = comparator ?? Comparator.getInstance(); for (const elem of c) { if (maxElem === undefined) { maxElem = elem; } else if (comparator.greaterThan(elem, maxElem)) { maxElem = elem; } } } return maxElem; } /** * Returns the minimum element of the given collection, according to the _natural ordering_ of its elements or to the order induced by the specified comparator * @param c The collection whose minimum element is to be determined * @param comparator The comparator with which to determine the minimum element. An _undefined_ value indicates that the elements' natural ordering should be used. * @returns The minimum element of the given collection, according to the specified comparator. Returns _undefined_ if the collection `c` is empty. */ static min(c, comparator) { let minElem = undefined; if (c && c.size > 0) { comparator = comparator ?? Comparator.getInstance(); for (const elem of c) { if (minElem === undefined) { minElem = elem; } else if (comparator.lessThan(elem, minElem)) { minElem = elem; } } } return minElem; } /** * Replaces all occurrences of one specified value in a list with another * @param list The list in which replacement is to occur * @param oldVal The old value to be replaced * @param newVal The new value with which `oldVal` is to be replaced * @returns _true_ if the `list` was changed, _false_ otherwise */ static replaceAll(list, oldVal, newVal) { let nCount = 0; if (list && oldVal !== newVal) { list.every((value, index) => { if (value === oldVal) { nCount++; list.set(index, newVal); } return true; }); } return nCount > 0; } /** * Reverses the order of the elements in the specified list * @param list The list whose elements are to be reversed * @returns The list argument itself */ static reverse(list) { if (list && list.size > 0) { const arr = list.toArray().reverse(); for (let i = 0; i < arr.length; i++) { list.set(i, arr[i]); } } return list; } /** * Returns an immutable set containing only the specified object * @param object The sole object to be stored in the returned set * @returns An immutable set containing only the specified object * @since 0.5.0 */ static singleton(object) { const set = new HashSet([object]); return set; } /** * Returns an immutable list containing only the specified object. * @param object The sole object to be stored in the returned list * @returns An immutable list containing only the specified object * @since 0.5.0 */ static singletonList(object) { const list = new ArrayList([object]); return list; } /** * Returns an _immutable_ map, mapping only the specified key to the specified value. * @param key The sole key to be stored in the returned map * @param value The value to which the returned map maps key * @returns An immutable map containing only the specified key-value mapping * @since 0.5.0 */ static singletonMap(key, value) { const map = new HashMap([[key, value]]); return map; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jdXRlLWNvcmUvc3JjL2xpYi91dGlsL0NvbGxlY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFeEUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHL0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUN0Qjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUksQ0FBZ0IsRUFBRSxHQUFHLFFBQXNCO1FBQzFELElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDTixNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQztTQUNsQztRQUNELElBQUksTUFBTSxHQUFDLENBQUMsQ0FBQztRQUNiLEtBQUssSUFBSSxFQUFFLElBQUksUUFBUSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDYixNQUFNLEVBQUUsQ0FBQzthQUNWO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUNEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBSSxDQUFnQixFQUFFLENBQWE7UUFDakQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBSyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRztnQkFDeEIsTUFBTSxFQUFF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YSxDQUFZLE1BQVM7UUFDdkMsTUFBTSxJQUFJLEdBQVksSUFBSSxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE9BQTBCLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBQ0Q7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBTSxHQUFNLEVBQUUsS0FBTztRQUN0QyxNQUFNLEdBQUcsR0FBaUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBMkIsR0FBRyxDQUFDO0lBQ2pDLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbGxlY3Rpb24sIEVsZW1lbnQgfSBmcm9tIFwiLi4vY29sbGVjdGlvbnMvQ29sbGVjdGlvblwiO1xyXG5pbXBvcnQge0ltbXV0YWJsZUxpc3QsIExpc3R9IGZyb20gXCIuLi9jb2xsZWN0aW9ucy9MaXN0XCI7XHJcbmltcG9ydCB7IENvbXBhcmF0b3IgfSBmcm9tIFwiLi9Db21wYXJhdG9yXCI7XHJcbmltcG9ydCB7IE51bGxQb2ludGVyRXhjZXB0aW9uIH0gZnJvbSBcIi4vZXhjZXB0aW9uL051bGxQb2ludGVyRXhjZXB0aW9uXCI7XHJcbmltcG9ydCB7SW1tdXRhYmxlU2V0fSBmcm9tIFwiLi4vY29sbGVjdGlvbnMvQWJzdHJhY3RTZXRcIjtcclxuaW1wb3J0IHtIYXNoU2V0fSBmcm9tIFwiLi4vY29sbGVjdGlvbnMvSGFzaFNldFwiO1xyXG5pbXBvcnQge0FycmF5TGlzdH0gZnJvbSBcIi4uL2NvbGxlY3Rpb25zL0FycmF5TGlzdFwiO1xyXG5pbXBvcnQge0hhc2hNYXB9IGZyb20gXCIuLi9jb2xsZWN0aW9ucy9IYXNoTWFwXCI7XHJcbmltcG9ydCB7SW1tdXRhYmxlTWFwfSBmcm9tIFwiLi4vY29sbGVjdGlvbnMvQWJzdHJhY3RNYXBcIjtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNvbnNpc3RzIGV4Y2x1c2l2ZWx5IG9mIHN0YXRpYyBtZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBvciByZXR1cm4gY29sbGVjdGlvbnMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIEFkZHMgYWxsIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uXHJcbiAgICogQHBhcmFtIGMgQ29sbGVjdGlvbiBvYmplY3RcclxuICAgKiBAcGFyYW0gZWxlbWVudHMgRWxlbWVudHMgdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uIGBjYFxyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoaXMgY2FsbCwgb3IgX2ZhbHNlXyBvdGhlcndpc2VcclxuICAgKi9cclxuICBzdGF0aWMgYWRkQWxsPFQ+KGM6IENvbGxlY3Rpb248VD4sIC4uLmVsZW1lbnRzOiBFbGVtZW50PFQ+W10pOiBib29sZWFuIHtcclxuICAgIGlmICghYykge1xyXG4gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcclxuICAgIH1cclxuICAgIGxldCBuQ291bnQ9MDtcclxuICAgIGZvciAobGV0IGVsIG9mIGVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChjLmFkZChlbCkpIHtcclxuICAgICAgICBuQ291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5Db3VudCA+IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RcclxuICAgKiBAcGFyYW0gYyBUaGUgY29sbGVjdGlvbiBpbiB3aGljaCB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jeSBvZiBvXHJcbiAgICogQHBhcmFtIG8gVGhlIG9iamVjdCB3aG9zZSBmcmVxdWVuY3kgaXMgdG8gYmUgZGV0ZXJtaW5lZFxyXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYyBlcXVhbCB0byBvXHJcbiAgICovXHJcbiAgc3RhdGljIGZyZXF1ZW5jeTxUPihjOiBDb2xsZWN0aW9uPFQ+LCBvOiBFbGVtZW50PFQ+KTogbnVtYmVyIHtcclxuICAgIGxldCBuQ291bnQgPSAwO1xyXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIGMpIHtcclxuICAgICAgaWYgKCBPYmplY3QuaXMoZWxlbSwgbykgKSB7XHJcbiAgICAgICAgbkNvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuQ291bnQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG1heGltdW0gZWxlbWVudCBvZiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiwgYWNjb3JkaW5nIHRvIHRoZSBfbmF0dXJhbCBvcmRlcmluZ18gb2YgaXRzIGVsZW1lbnRzIG9yIHRvIHRoZSBvcmRlciBpbmR1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvclxyXG4gICAqIEBwYXJhbSBjIFRoZSBjb2xsZWN0aW9uIHdob3NlIG1heGltdW0gZWxlbWVudCBpcyB0byBiZSBkZXRlcm1pbmVkXHJcbiAgICogQHBhcmFtIGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3Igd2l0aCB3aGljaCB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gZWxlbWVudC4gQW4gX3VuZGVmaW5lZF8gdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGVsZW1lbnRzJyBuYXR1cmFsIG9yZGVyaW5nIHNob3VsZCBiZSB1c2VkLlxyXG4gICAqIEByZXR1cm5zIFRoZSBtYXhpbXVtIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24sIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuIFJldHVybnMgX3VuZGVmaW5lZF8gaWYgdGhlIGNvbGxlY3Rpb24gYGNgIGlzIGVtcHR5LlxyXG4gICAqL1xyXG4gIHN0YXRpYyBtYXg8VD4oYzogQ29sbGVjdGlvbjxUPiwgY29tcGFyYXRvcj86IENvbXBhcmF0b3I8VD4pOiBFbGVtZW50PFQ+IHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBtYXhFbGVtOiBFbGVtZW50PFQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKGMgJiYgYy5zaXplID4gMCkge1xyXG4gICAgICBjb21wYXJhdG9yID0gY29tcGFyYXRvciA/PyBDb21wYXJhdG9yLmdldEluc3RhbmNlKCk7XHJcbiAgICAgIGZvciAoY29uc3QgZWxlbSBvZiBjKSB7XHJcbiAgICAgICAgaWYgKG1heEVsZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbWF4RWxlbSA9IGVsZW07XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb21wYXJhdG9yLmdyZWF0ZXJUaGFuKGVsZW0sIG1heEVsZW0pKSB7XHJcbiAgICAgICAgICBtYXhFbGVtID0gZWxlbTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtYXhFbGVtO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGVsZW1lbnQgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24sIGFjY29yZGluZyB0byB0aGUgX25hdHVyYWwgb3JkZXJpbmdfIG9mIGl0cyBlbGVtZW50cyBvciB0byB0aGUgb3JkZXIgaW5kdWNlZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3JcclxuICAgKiBAcGFyYW0gYyBUaGUgY29sbGVjdGlvbiB3aG9zZSBtaW5pbXVtIGVsZW1lbnQgaXMgdG8gYmUgZGV0ZXJtaW5lZFxyXG4gICAqIEBwYXJhbSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHdpdGggd2hpY2ggdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGVsZW1lbnQuIEFuIF91bmRlZmluZWRfIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBlbGVtZW50cycgbmF0dXJhbCBvcmRlcmluZyBzaG91bGQgYmUgdXNlZC5cclxuICAgKiBAcmV0dXJucyBUaGUgbWluaW11bSBlbGVtZW50IG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLiBSZXR1cm5zIF91bmRlZmluZWRfIGlmIHRoZSBjb2xsZWN0aW9uIGBjYCBpcyBlbXB0eS5cclxuICAgKi9cclxuICBzdGF0aWMgbWluPFQ+KGM6IENvbGxlY3Rpb248VD4sIGNvbXBhcmF0b3I/OiBDb21wYXJhdG9yPFQ+KTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgbWluRWxlbTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIGlmIChjICYmIGMuc2l6ZSA+IDApIHtcclxuICAgICAgY29tcGFyYXRvciA9IGNvbXBhcmF0b3IgPz8gQ29tcGFyYXRvci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICBmb3IgKGNvbnN0IGVsZW0gb2YgYykge1xyXG4gICAgICAgIGlmIChtaW5FbGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG1pbkVsZW0gPSBlbGVtO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29tcGFyYXRvci5sZXNzVGhhbihlbGVtLCBtaW5FbGVtKSkge1xyXG4gICAgICAgICAgbWluRWxlbSA9IGVsZW07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWluRWxlbTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIG9uZSBzcGVjaWZpZWQgdmFsdWUgaW4gYSBsaXN0IHdpdGggYW5vdGhlclxyXG4gICAqIEBwYXJhbSBsaXN0IFRoZSBsaXN0IGluIHdoaWNoIHJlcGxhY2VtZW50IGlzIHRvIG9jY3VyXHJcbiAgICogQHBhcmFtIG9sZFZhbCBUaGUgb2xkIHZhbHVlIHRvIGJlIHJlcGxhY2VkXHJcbiAgICogQHBhcmFtIG5ld1ZhbCBUaGUgbmV3IHZhbHVlIHdpdGggd2hpY2ggYG9sZFZhbGAgaXMgdG8gYmUgcmVwbGFjZWRcclxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhlIGBsaXN0YCB3YXMgY2hhbmdlZCwgX2ZhbHNlXyBvdGhlcndpc2VcclxuICAgKi9cclxuICBzdGF0aWMgcmVwbGFjZUFsbDxUPihsaXN0OiBMaXN0PFQ+LCBvbGRWYWw6IEVsZW1lbnQ8VD4sIG5ld1ZhbDogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG5Db3VudCA9IDA7XHJcbiAgICBpZiAobGlzdCAmJiBvbGRWYWwgIT09IG5ld1ZhbCkge1xyXG4gICAgICBsaXN0LmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IG9sZFZhbCkge1xyXG4gICAgICAgICAgbkNvdW50Kys7XHJcbiAgICAgICAgICBsaXN0LnNldChpbmRleCwgbmV3VmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5Db3VudCA+IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0XHJcbiAgICogQHBhcmFtIGxpc3QgVGhlIGxpc3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIHJldmVyc2VkXHJcbiAgICogQHJldHVybnMgVGhlIGxpc3QgYXJndW1lbnQgaXRzZWxmXHJcbiAgICovXHJcbiAgc3RhdGljIHJldmVyc2U8VD4obGlzdDogTGlzdDxUPik6IExpc3Q8VD4ge1xyXG4gICAgaWYgKGxpc3QgJiYgbGlzdC5zaXplID4gMCkge1xyXG4gICAgICBjb25zdCBhcnIgPSBsaXN0LnRvQXJyYXkoKS5yZXZlcnNlKCk7XHJcbiAgICAgIGZvciAobGV0IGk9MDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxpc3Quc2V0KGksIGFycltpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBzZXQgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgb2JqZWN0XHJcbiAgICogQHBhcmFtIG9iamVjdCBUaGUgc29sZSBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSByZXR1cm5lZCBzZXRcclxuICAgKiBAcmV0dXJucyBBbiBpbW11dGFibGUgc2V0IGNvbnRhaW5pbmcgb25seSB0aGUgc3BlY2lmaWVkIG9iamVjdFxyXG4gICAqIEBzaW5jZSAwLjUuMFxyXG4gICAqL1xyXG4gIHN0YXRpYyBzaW5nbGV0b248VD11bmtub3duPihvYmplY3Q6IFQpOiBJbW11dGFibGVTZXQ8VD4ge1xyXG4gICAgY29uc3Qgc2V0OiBIYXNoU2V0PFQ+ID0gbmV3IEhhc2hTZXQoW29iamVjdF0pO1xyXG4gICAgcmV0dXJuIDxJbW11dGFibGVTZXQ8VD4+IHNldDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBpbW11dGFibGUgbGlzdCBjb250YWluaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBvYmplY3QuXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaGUgc29sZSBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSByZXR1cm5lZCBsaXN0XHJcbiAgICogQHJldHVybnMgQW4gaW1tdXRhYmxlIGxpc3QgY29udGFpbmluZyBvbmx5IHRoZSBzcGVjaWZpZWQgb2JqZWN0XHJcbiAgICogQHNpbmNlIDAuNS4wXHJcbiAgICovXHJcbiAgc3RhdGljIHNpbmdsZXRvbkxpc3Q8VD11bmtub3duPihvYmplY3Q6IFQpOiBJbW11dGFibGVMaXN0PFQ+IHtcclxuICAgIGNvbnN0IGxpc3Q6IExpc3Q8VD4gPSBuZXcgQXJyYXlMaXN0KFtvYmplY3RdKTtcclxuICAgIHJldHVybiA8SW1tdXRhYmxlTGlzdDxUPj4gbGlzdDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBfaW1tdXRhYmxlXyBtYXAsIG1hcHBpbmcgb25seSB0aGUgc3BlY2lmaWVkIGtleSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIHNvbGUga2V5IHRvIGJlIHN0b3JlZCBpbiB0aGUgcmV0dXJuZWQgbWFwXHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgcmV0dXJuZWQgbWFwIG1hcHMga2V5XHJcbiAgICogQHJldHVybnMgQW4gaW1tdXRhYmxlIG1hcCBjb250YWluaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBrZXktdmFsdWUgbWFwcGluZ1xyXG4gICAqIEBzaW5jZSAwLjUuMFxyXG4gICAqL1xyXG4gIHN0YXRpYyBzaW5nbGV0b25NYXA8SyxWPihrZXk6IEssIHZhbHVlOlYpOiBJbW11dGFibGVNYXA8SyxWPiB7XHJcbiAgICBjb25zdCBtYXA6IEhhc2hNYXA8SyxWPiA9IG5ldyBIYXNoTWFwKFtba2V5LCB2YWx1ZV1dKTtcclxuICAgIHJldHVybiA8SW1tdXRhYmxlTWFwPEssVj4+IG1hcDtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==