UNPKG

ngx-base-state

Version:

Base classes for creation state service via Rxjs observable

208 lines 20 kB
import { __decorate } from "tslib"; import { ɵAction as Action } from '../decorators'; import { BaseState } from './base.state'; /** * @class * @abstract * @classdes Array state class. Implementing base array functionality. */ export class ArrayState extends BaseState { /** * Return item by quired index. * @public * @param {Number} index - Quired index * @deprecated use `this.data[index]` instead * @return {Generic} quired item. */ getByIndex(index) { const items = this.data; return items[index]; } /** * Unshift item to array in state. * @public * @param {Generic} item - Item needs to unshift. */ unshiftItem(item) { const items = this.data; items.unshift(item); this.setNewValue(items); } /** * Shift array in state. * @public */ shift() { const items = this.data; items.shift(); this.setNewValue(items); } /** * Pop array in state. * @public */ pop() { const items = this.data; items.pop(); this.setNewValue(items); } /** * Concat current state with another array. * @param {T[]} array - Another array to concat with the current state. * @public */ concatWith(array) { const items = this.data; const newItems = items.concat(array); this.setNewValue(newItems); } /** * Push item to array in state. * @public * @param {Generic} item - Item needs to push */ pushItem(item) { const items = this.data; items.push(item); this.setNewValue(items); } /** * Insert item in array by index. * @public * @param {number} index - Index where to insert new item. * @param {Generic} item - Item need to insert. */ insertItemByIndex(index, item) { const items = this.data; items.splice(index, 0, item); this.setNewValue(items); } /** * Remove item in array by item identify param (using `compareItems` method). * @public * @param {Generic} itemId - Id of item you want to remove. */ removeItem(item) { const index = this.data.findIndex((_item) => this.compareItems(item, _item)); return this.removeItemByIndex(index); } /** * Remove item in array by item id (using `getItemId` method). * @public * @param {Generic} itemId - Id of item you want to remove. */ removeItemById(itemId) { const index = this.data.findIndex((_item) => itemId === this.getItemId(_item)); return this.removeItemByIndex(index); } /** * Remove item in array by index. * @public * @param {number} index - Index of item you want to remove. */ removeItemByIndex(index) { const items = this.data; const removedItem = this.data[index]; items.splice(index, 1); this.setNewValue(items); return removedItem; } /** * Update item in array by item identify param (using `compareItems` method). * @public * @param {Generic} itemToUpdate - item that will be update. */ updateItem(itemToUpdate) { const items = this.data; const newItemToUpdate = { ...itemToUpdate }; const itemIndex = items.findIndex((_currentItem) => this.compareItems(_currentItem, newItemToUpdate)); items[itemIndex] = newItemToUpdate; this.setNewValue(items); } /** * Update item in array by index. * @public * @param {Generic} itemToUpdate - item that will be update. * @param {Generic} index - index of item that need to update. */ updateItemByIndex(itemToUpdate, index) { const items = this.data; items[index] = itemToUpdate; this.setNewValue(items); } setNewValue(value) { if (value) { this.validateDataType(value); super.setNewValue([...value]); } else { super.setNewValue(null); } } catchError(error, actionName) { if (error instanceof TypeError) { throw new Error(`\n${this.constructor.name} [${actionName}]: ` + `Firstly set Array.\n\n${error.message}`); } super.catchError(error, actionName); } /** * Must return identify param of item. * Method must be filled in child classes. * Used for compare two any items. * @protected * @param {Generic} item - item of your state. * @return {any} identify param of item. */ getItemId(item) { return item; } validateDataType(data) { if (!Array.isArray(data)) { throw new Error(`${this.constructor.name}: Expected data in Array format!`); } } /** * Compare two items via `getItemId` * @private * @param {Generic} itemToUpdate - item that will be update. * @return {boolean} result of comparing two items via `getItemId`. */ compareItems(firstItem, secondItem) { return (this.getItemId(firstItem) === this.getItemId(secondItem)); } } __decorate([ Action ], ArrayState.prototype, "unshiftItem", null); __decorate([ Action ], ArrayState.prototype, "shift", null); __decorate([ Action ], ArrayState.prototype, "pop", null); __decorate([ Action ], ArrayState.prototype, "concatWith", null); __decorate([ Action ], ArrayState.prototype, "pushItem", null); __decorate([ Action ], ArrayState.prototype, "insertItemByIndex", null); __decorate([ Action ], ArrayState.prototype, "removeItem", null); __decorate([ Action ], ArrayState.prototype, "removeItemById", null); __decorate([ Action ], ArrayState.prototype, "removeItemByIndex", null); __decorate([ Action ], ArrayState.prototype, "updateItem", null); __decorate([ Action ], ArrayState.prototype, "updateItemByIndex", null); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWJyYXJ5L3NyYy9saWIvc3RhdGVzL2FycmF5LnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQWdCLFVBQWMsU0FBUSxTQUFjO0lBQ3REOzs7Ozs7T0FNRztJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsT0FBTyxLQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFFSSxXQUFXLENBQUMsSUFBTztRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXhCLEtBQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBRUksS0FBSztRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsS0FBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBRUksR0FBRztRQUNOLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsS0FBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUVJLFVBQVUsQ0FBQyxLQUFV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Q0FPTjtBQVFEO0lBREMsTUFBTTtnREFPTjtBQVFEO0lBREMsTUFBTTttREFVTjtBQVFEO0lBREMsTUFBTTs0Q0FZTjtBQVNEO0lBREMsTUFBTTttREFPTiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IMm1QWN0aW9uIGFzIEFjdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlU3RhdGUgfSBmcm9tICcuL2Jhc2Uuc3RhdGUnO1xyXG5cclxuLyoqXHJcbiAqXHRAY2xhc3NcclxuICpcdEBhYnN0cmFjdFxyXG4gKlx0QGNsYXNzZGVzIEFycmF5IHN0YXRlIGNsYXNzLiBJbXBsZW1lbnRpbmcgYmFzZSBhcnJheSBmdW5jdGlvbmFsaXR5LlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFycmF5U3RhdGU8VD4gZXh0ZW5kcyBCYXNlU3RhdGU8VFtdPiB7XHJcbiAgICAvKipcclxuICAgICAqIFx0UmV0dXJuIGl0ZW0gYnkgcXVpcmVkIGluZGV4LlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqXHRAcGFyYW0ge051bWJlcn0gaW5kZXggLSBRdWlyZWQgaW5kZXhcclxuICAgICAqICBAZGVwcmVjYXRlZCB1c2UgYHRoaXMuZGF0YVtpbmRleF1gIGluc3RlYWRcclxuICAgICAqXHRAcmV0dXJuIHtHZW5lcmljfSBxdWlyZWQgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kYXRhO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXMhW2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0VW5zaGlmdCBpdGVtIHRvIGFycmF5IGluIHN0YXRlLlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGl0ZW0gLSBJdGVtIG5lZWRzIHRvIHVuc2hpZnQuXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyB1bnNoaWZ0SXRlbShpdGVtOiBUKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIS51bnNoaWZ0KGl0ZW0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0U2hpZnQgYXJyYXkgaW4gc3RhdGUuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgc2hpZnQoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIS5zaGlmdCgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0UG9wIGFycmF5IGluIHN0YXRlLlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgQEFjdGlvblxyXG4gICAgcHVibGljIHBvcCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICAgICAgaXRlbXMhLnBvcCgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0Q29uY2F0IGN1cnJlbnQgc3RhdGUgd2l0aCBhbm90aGVyIGFycmF5LlxyXG4gICAgICpcdEBwYXJhbSB7VFtdfSBhcnJheSAtIEFub3RoZXIgYXJyYXkgdG8gY29uY2F0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgY29uY2F0V2l0aChhcnJheTogVFtdKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcyEuY29uY2F0KGFycmF5KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShuZXdJdGVtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFB1c2ggaXRlbSB0byBhcnJheSBpbiBzdGF0ZS5cclxuICAgICAqXHRAcHVibGljXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtIC0gSXRlbSBuZWVkcyB0byBwdXNoXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyBwdXNoSXRlbShpdGVtOiBUKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIS5wdXNoKGl0ZW0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0SW5zZXJ0IGl0ZW0gaW4gYXJyYXkgYnkgaW5kZXguXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICpcdEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIEluZGV4IHdoZXJlIHRvIGluc2VydCBuZXcgaXRlbS5cclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGl0ZW0gLSBJdGVtIG5lZWQgdG8gaW5zZXJ0LlxyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgaW5zZXJ0SXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kYXRhO1xyXG5cclxuICAgICAgICBpdGVtcyEuc3BsaWNlKGluZGV4LCAwLCBpdGVtKTtcclxuICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFx0UmVtb3ZlIGl0ZW0gaW4gYXJyYXkgYnkgaXRlbSBpZGVudGlmeSBwYXJhbSAodXNpbmcgYGNvbXBhcmVJdGVtc2AgbWV0aG9kKS5cclxuICAgICAqXHRAcHVibGljXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtSWQgLSBJZCBvZiBpdGVtIHlvdSB3YW50IHRvIHJlbW92ZS5cclxuICAgICAqL1xyXG4gICAgQEFjdGlvblxyXG4gICAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogVCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhIS5maW5kSW5kZXgoKF9pdGVtKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVJdGVtcyhpdGVtLCBfaXRlbSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtQnlJbmRleChpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFJlbW92ZSBpdGVtIGluIGFycmF5IGJ5IGl0ZW0gaWQgKHVzaW5nIGBnZXRJdGVtSWRgIG1ldGhvZCkuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgICpcdEBwYXJhbSB7R2VuZXJpY30gaXRlbUlkIC0gSWQgb2YgaXRlbSB5b3Ugd2FudCB0byByZW1vdmUuXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyByZW1vdmVJdGVtQnlJZChpdGVtSWQ6IHVua25vd24pOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YSEuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAoX2l0ZW0pID0+IGl0ZW1JZCA9PT0gdGhpcy5nZXRJdGVtSWQoX2l0ZW0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUJ5SW5kZXgoaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHRSZW1vdmUgaXRlbSBpbiBhcnJheSBieSBpbmRleC5cclxuICAgICAqXHRAcHVibGljXHJcbiAgICAgKlx0QHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gSW5kZXggb2YgaXRlbSB5b3Ugd2FudCB0byByZW1vdmUuXHJcbiAgICAgKi9cclxuICAgIEBBY3Rpb25cclxuICAgIHB1YmxpYyByZW1vdmVJdGVtQnlJbmRleChpbmRleDogbnVtYmVyKTogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW0gPSB0aGlzLmRhdGEhW2luZGV4XTtcclxuXHJcbiAgICAgICAgaXRlbXMhLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWUoaXRlbXMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVtb3ZlZEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFVwZGF0ZSBpdGVtIGluIGFycmF5IGJ5IGl0ZW0gaWRlbnRpZnkgcGFyYW0gKHVzaW5nIGBjb21wYXJlSXRlbXNgIG1ldGhvZCkuXHJcbiAgICAgKlx0QHB1YmxpY1xyXG4gICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtVG9VcGRhdGUgLSBpdGVtIHRoYXQgd2lsbCBiZSB1cGRhdGUuXHJcbiAgICAqL1xyXG4gICAgQEFjdGlvblxyXG4gICAgcHVibGljIHVwZGF0ZUl0ZW0oaXRlbVRvVXBkYXRlOiBUKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbVRvVXBkYXRlID0geyAuLi5pdGVtVG9VcGRhdGUgfTtcclxuXHJcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gaXRlbXMhLmZpbmRJbmRleCgoX2N1cnJlbnRJdGVtKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVJdGVtcyhfY3VycmVudEl0ZW0sIG5ld0l0ZW1Ub1VwZGF0ZSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpdGVtcyFbaXRlbUluZGV4XSA9IG5ld0l0ZW1Ub1VwZGF0ZTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShpdGVtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdFVwZGF0ZSBpdGVtIGluIGFycmF5IGJ5IGluZGV4LlxyXG4gICAgICpcdEBwdWJsaWNcclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGl0ZW1Ub1VwZGF0ZSAtIGl0ZW0gdGhhdCB3aWxsIGJlIHVwZGF0ZS5cclxuICAgICAqXHRAcGFyYW0ge0dlbmVyaWN9IGluZGV4IC0gaW5kZXggb2YgaXRlbSB0aGF0IG5lZWQgdG8gdXBkYXRlLlxyXG4gICAgICovXHJcbiAgICBAQWN0aW9uXHJcbiAgICBwdWJsaWMgdXBkYXRlSXRlbUJ5SW5kZXgoaXRlbVRvVXBkYXRlOiBULCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICAgIGl0ZW1zIVtpbmRleF0gPSBpdGVtVG9VcGRhdGU7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWUoaXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXROZXdWYWx1ZSh2YWx1ZTogVFtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlRGF0YVR5cGUodmFsdWUpO1xyXG4gICAgICAgICAgICBzdXBlci5zZXROZXdWYWx1ZShbLi4udmFsdWVdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdXBlci5zZXROZXdWYWx1ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGNhdGNoRXJyb3IoZXJyb3I6IEVycm9yIHwgVHlwZUVycm9yLCBhY3Rpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYFxcbiR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBbJHthY3Rpb25OYW1lfV06IGAgK1xyXG4gICAgICAgICAgICAgICAgYEZpcnN0bHkgc2V0IEFycmF5LlxcblxcbiR7ZXJyb3IubWVzc2FnZX1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5jYXRjaEVycm9yKGVycm9yLCBhY3Rpb25OYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHRNdXN0IHJldHVybiBpZGVudGlmeSBwYXJhbSBvZiBpdGVtLlxyXG4gICAgICpcdE1ldGhvZCBtdXN0IGJlIGZpbGxlZCBpbiBjaGlsZCBjbGFzc2VzLlxyXG4gICAgICpcdFVzZWQgZm9yIGNvbXBhcmUgdHdvIGFueSBpdGVtcy5cclxuICAgICAqICBAcHJvdGVjdGVkXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtIC0gaXRlbSBvZiB5b3VyIHN0YXRlLlxyXG4gICAgICpcdEByZXR1cm4ge2FueX0gaWRlbnRpZnkgcGFyYW0gb2YgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEl0ZW1JZChpdGVtOiBUKTogYW55IHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdmFsaWRhdGVEYXRhVHlwZShkYXRhOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBFeHBlY3RlZCBkYXRhIGluIEFycmF5IGZvcm1hdCFgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcdENvbXBhcmUgdHdvIGl0ZW1zIHZpYSBgZ2V0SXRlbUlkYFxyXG4gICAgICpcdEBwcml2YXRlXHJcbiAgICAgKlx0QHBhcmFtIHtHZW5lcmljfSBpdGVtVG9VcGRhdGUgLSBpdGVtIHRoYXQgd2lsbCBiZSB1cGRhdGUuXHJcbiAgICAgKlx0QHJldHVybiB7Ym9vbGVhbn0gcmVzdWx0IG9mIGNvbXBhcmluZyB0d28gaXRlbXMgdmlhIGBnZXRJdGVtSWRgLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbXBhcmVJdGVtcyhmaXJzdEl0ZW06IFQsIHNlY29uZEl0ZW06IFQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0SXRlbUlkKGZpcnN0SXRlbSkgPT09IHRoaXMuZ2V0SXRlbUlkKHNlY29uZEl0ZW0pKTtcclxuICAgIH1cclxufVxyXG4iXX0=