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

261 lines 28.4 kB
var _a; import { ConcurrentModificationException } from "../../util/exception/ConcurrentModificationException"; import { AbstractList } from "../AbstractList"; /** * This class is denoted to work with a sub set of items in the parent collection */ export class ListView extends AbstractList { constructor(parent, fromIndex, toIndex) { super(); this._head = null; this._tail = null; this._ownerFromIndex = 0; this._ownerToIndex = 0; this._size = 0; this[_a] = "ListView"; this._parentFromIndex = Math.max(fromIndex, 0); this._parentToIndex = Math.min(toIndex, parent.size); this._ownerFromIndex = this._parentFromIndex; this._ownerToIndex = this._parentToIndex; this._parent = parent; this._owner = parent; let range; let p = parent; while (p) { this._owner = p; range = p.getParentRange(); this._ownerFromIndex += range[0]; p = p.getParent(); } this._ownerToIndex = this._ownerFromIndex + (toIndex - fromIndex); this._savedModCount = this._owner.modCount; if (this._parentFromIndex >= 0 && this._parentToIndex > 0 && this._parentFromIndex <= this._parentToIndex) { this._head = parent.getNode(this._parentFromIndex); this._tail = parent.getNode(this._parentToIndex - 1); if (this._head && this._tail) { this._size = 1; let node = this._head; while (node != this._tail) { this._size++; node = node.next; } } } } /** * @override */ get size() { return this._size; } /** * @private */ _checkModCount() { if (this._savedModCount != this._owner.modCount) { throw new ConcurrentModificationException(); } } *[Symbol.iterator]() { let nextNode; let isTail; let node = this._head; while (node) { nextNode = node.next; isTail = (node == this._tail); yield node.value; if (isTail) break; else node = nextNode; } } clone() { return new ListView(this._parent, this._parentFromIndex, this._parentToIndex); } /** * @override */ getNode(index) { return this._owner.getNode(this._ownerFromIndex + index); } /** * @override */ getParentRange() { return [this._parentFromIndex, this._parentToIndex]; } /** * @override */ getParent() { return this._parent; } /** * @override * @throws ConcurrentModificationException */ clear() { this._checkModCount(); if (this._owner.removeRange(this._ownerFromIndex, this._ownerToIndex)) { this._ownerToIndex = this._ownerFromIndex; this._head = this._tail = null; this._size = 0; this._savedModCount = this._owner.modCount; } } /** * @override * @throws ConcurrentModificationException */ get(index) { this._checkModCount(); return this._owner.get(this._ownerFromIndex + index); } /** * @override * @throws ConcurrentModificationException */ indexOf(value, fromIndex) { this._checkModCount(); return this._owner.indexOf(value, this._ownerFromIndex + (fromIndex ?? 0)); } /** * @override * @throws ConcurrentModificationException */ insert(index, value) { this._checkModCount(); if (this._owner.insert(this._ownerFromIndex + index, value)) { if (index == 0) { this._head = this._owner.getNode(this._ownerFromIndex); if (!this._tail) { this._tail = this._head; } } else if ((this._ownerFromIndex + index) > this._ownerToIndex) { this._tail = this._owner.getNode(this._ownerToIndex + 1); if (!this._head) { this._head = this._tail; } } this._size++; this._ownerToIndex++; this._savedModCount = this._owner.modCount; return true; } return false; } /** * @override * @throws ConcurrentModificationException */ lastIndexOf(value, fromIndex) { this._checkModCount(); return this._owner.lastIndexOf(value, this._ownerFromIndex + (fromIndex ?? 0)); } /** * @override */ removeRange(fromIndex, toIndex) { this._checkModCount(); return this._owner.removeRange(this._ownerFromIndex + fromIndex, this._ownerToIndex + (toIndex ?? this.size)); } /** * @override * @throws ConcurrentModificationException */ set(index, value) { this._checkModCount(); return this._owner.set(this._ownerFromIndex + index, value); } /** * @override * @throws ConcurrentModificationException */ subList(fromIndex, toIndex) { this._checkModCount(); return new ListView(this, fromIndex, toIndex); } /** * @override * @throws ConcurrentModificationException */ append(value) { this._checkModCount(); if (this._owner.insert(this._ownerToIndex, value)) { this._tail = this._owner.getNode(this._ownerToIndex); if (!this._head) this._head = this._tail; this._size++; return true; } return false; } /** * @override */ contains(value) { let node = this._head; while (node) { if (node.value === value) { return true; } if (node == this._tail) break; else node = node.next; } return false; } /** * @override */ toArray() { const vals = []; let currentNode = this._head; while (currentNode) { vals.push(currentNode.value); if (currentNode == this._tail) break; currentNode = currentNode.next; } return vals; } /** * @override * @throws ConcurrentModificationException */ remove(value) { const index = this.indexOf(value); if (index >= 0) { return (this.removeAt(index) !== undefined); } return false; } /** * @override * @throws ConcurrentModificationException */ removeAt(index) { this._checkModCount(); const node = this._owner.getNode(this._ownerFromIndex + index); let item = this._owner.removeAt(this._ownerFromIndex + index); if (!(item === undefined)) { if (this._head == this._tail && node == this._head) { this._head = this._tail = null; } else if (this._head && node == this._head) { this._head = this._head.next; } else if (this._tail && node == this._tail) { this._tail = this._tail.prev; } this._size--; this._ownerToIndex--; this._savedModCount = this._owner.modCount; return item; } return undefined; } } _a = Symbol.toStringTag; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlzdFZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jdXRlLWNvcmUvc3JjL2xpYi9jb2xsZWN0aW9ucy92aWV3L0xpc3RWaWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUV2RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJL0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBWSxTQUFRLFlBQWU7SUFZOUMsWUFBWSxNQUF1QixFQUFFLFNBQWlCLEVBQUUsT0FBZTtRQUNyRSxLQUFLLEVBQUUsQ0FBQztRQVZGLFVBQUssR0FBNkIsSUFBSSxDQUFDO1FBQ3ZDLFVBQUssR0FBNkIsSUFBSSxDQUFDO1FBSXZDLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLFVBQUssR0FBVyxDQUFDLENBQUM7UUFvRTFCLFFBQW9CLEdBQUcsVUFBVSxDQUFDO1FBaEVoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksS0FBdUIsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBMkIsTUFBTSxDQUFDO1FBQ3ZDLE9BQU8sQ0FB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QUFDLElBQUksS0FBSyxTQUFTLENBQUMsRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzthQUNoQztpQkFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDOUI7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFFM0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FFRjtLQTlMRSxNQUFNLENBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gfSBmcm9tIFwiLi4vLi4vdXRpbC9leGNlcHRpb24vQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblwiO1xyXG5pbXBvcnQgeyBDbG9uZWFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbC9pbnRlcmZhY2UvQ2xvbmVhYmxlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0TGlzdCB9IGZyb20gXCIuLi9BYnN0cmFjdExpc3RcIjtcclxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gXCIuLi9Db2xsZWN0aW9uXCI7XHJcbmltcG9ydCB7IExpbmtlZExpc3ROb2RlIH0gZnJvbSBcIi4uL0xpbmtlZExpc3RcIjtcclxuaW1wb3J0IHsgTGlzdCB9IGZyb20gXCIuLi9MaXN0XCI7XHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIGRlbm90ZWQgdG8gd29yayB3aXRoIGEgc3ViIHNldCBvZiBpdGVtcyBpbiB0aGUgcGFyZW50IGNvbGxlY3Rpb25cclxuICovXHJcbmV4cG9ydCBjbGFzcyBMaXN0VmlldzxUPiBleHRlbmRzIEFic3RyYWN0TGlzdDxUPiBpbXBsZW1lbnRzIENsb25lYWJsZSB7XHJcbiAgcHJpdmF0ZSBfb3duZXI6IEFic3RyYWN0TGlzdDxUPjtcclxuICBwcml2YXRlIF9wYXJlbnQ6IEFic3RyYWN0TGlzdDxUPjtcclxuICBwcml2YXRlIF9oZWFkOiBMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX3RhaWw6IExpbmtlZExpc3ROb2RlPFQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfc2F2ZWRNb2RDb3VudDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3BhcmVudEZyb21JbmRleDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3BhcmVudFRvSW5kZXg6IG51bWJlcjtcclxuICBwcml2YXRlIF9vd25lckZyb21JbmRleDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9vd25lclRvSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfc2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocGFyZW50OiBBYnN0cmFjdExpc3Q8VD4sIGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLl9wYXJlbnRGcm9tSW5kZXggPSBNYXRoLm1heChmcm9tSW5kZXgsIDApO1xyXG4gICAgdGhpcy5fcGFyZW50VG9JbmRleCA9IE1hdGgubWluKHRvSW5kZXgsIHBhcmVudC5zaXplKTtcclxuICAgIHRoaXMuX293bmVyRnJvbUluZGV4ID0gdGhpcy5fcGFyZW50RnJvbUluZGV4O1xyXG4gICAgdGhpcy5fb3duZXJUb0luZGV4ID0gdGhpcy5fcGFyZW50VG9JbmRleDtcclxuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuICAgIHRoaXMuX293bmVyID0gcGFyZW50O1xyXG5cclxuICAgIGxldCByYW5nZTogW251bWJlciwgbnVtYmVyXTtcclxuICAgIGxldCBwOiBBYnN0cmFjdExpc3Q8VD4gfCBudWxsID0gcGFyZW50O1xyXG4gICAgd2hpbGUgKHApIHtcclxuICAgICAgdGhpcy5fb3duZXIgPSBwO1xyXG4gICAgICByYW5nZSA9IHAuZ2V0UGFyZW50UmFuZ2UoKTtcclxuICAgICAgdGhpcy5fb3duZXJGcm9tSW5kZXggKz0gcmFuZ2VbMF07XHJcbiAgICAgIHAgPSBwLmdldFBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX293bmVyVG9JbmRleCA9IHRoaXMuX293bmVyRnJvbUluZGV4ICsgKHRvSW5kZXggLSBmcm9tSW5kZXgpO1xyXG5cclxuICAgIHRoaXMuX3NhdmVkTW9kQ291bnQgPSB0aGlzLl9vd25lci5tb2RDb3VudDtcclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50RnJvbUluZGV4ID49IDAgJiYgdGhpcy5fcGFyZW50VG9JbmRleCA+IDAgJiYgdGhpcy5fcGFyZW50RnJvbUluZGV4IDw9IHRoaXMuX3BhcmVudFRvSW5kZXgpIHtcclxuICAgICAgdGhpcy5faGVhZCA9IHBhcmVudC5nZXROb2RlKHRoaXMuX3BhcmVudEZyb21JbmRleCk7XHJcbiAgICAgIHRoaXMuX3RhaWwgPSBwYXJlbnQuZ2V0Tm9kZSh0aGlzLl9wYXJlbnRUb0luZGV4IC0gMSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5faGVhZCAmJiB0aGlzLl90YWlsKSB7XHJcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDE7XHJcbiAgICAgICAgbGV0IG5vZGU6IExpbmtlZExpc3ROb2RlPFQ+fG51bGwgPSB0aGlzLl9oZWFkO1xyXG4gICAgICAgIHdoaWxlKG5vZGUgIT0gdGhpcy5fdGFpbCkge1xyXG4gICAgICAgICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgICAgICAgbm9kZSA9IG5vZGUhLm5leHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIGdldCBzaXplKCk6IG51bWJlciB7cmV0dXJuIHRoaXMuX3NpemV9XHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9jaGVja01vZENvdW50KCkge1xyXG4gICAgaWYgKHRoaXMuX3NhdmVkTW9kQ291bnQgIT0gdGhpcy5fb3duZXIubW9kQ291bnQpIHtcclxuICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEVsZW1lbnQ8VD4+IHtcclxuICAgIGxldCBuZXh0Tm9kZTtcclxuICAgIGxldCBpc1RhaWw7XHJcbiAgICBsZXQgbm9kZSA9IHRoaXMuX2hlYWQ7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBuZXh0Tm9kZSA9IG5vZGUubmV4dDtcclxuICAgICAgaXNUYWlsID0gKG5vZGUgPT0gdGhpcy5fdGFpbCk7XHJcblxyXG4gICAgICB5aWVsZCBub2RlLnZhbHVlO1xyXG5cclxuICAgICAgaWYgKGlzVGFpbClcclxuICAgICAgICBicmVhaztcclxuICAgICAgZWxzZVxyXG4gICAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJMaXN0Vmlld1wiO1xyXG5cclxuICBjbG9uZSgpOiBMaXN0VmlldzxUPiB7XHJcbiAgICByZXR1cm4gbmV3IExpc3RWaWV3PFQ+KHRoaXMuX3BhcmVudCwgdGhpcy5fcGFyZW50RnJvbUluZGV4LCB0aGlzLl9wYXJlbnRUb0luZGV4KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgZ2V0Tm9kZShpbmRleDogbnVtYmVyKTogTGlua2VkTGlzdE5vZGU8VD4gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9vd25lci5nZXROb2RlKHRoaXMuX293bmVyRnJvbUluZGV4ICsgaW5kZXgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBnZXRQYXJlbnRSYW5nZSgpOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgIHJldHVybiBbdGhpcy5fcGFyZW50RnJvbUluZGV4LCB0aGlzLl9wYXJlbnRUb0luZGV4XTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgZ2V0UGFyZW50KCk6IEFic3RyYWN0TGlzdDxUPiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uXHJcbiAgICovXHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jaGVja01vZENvdW50KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX293bmVyLnJlbW92ZVJhbmdlKHRoaXMuX293bmVyRnJvbUluZGV4LCB0aGlzLl9vd25lclRvSW5kZXgpKSB7XHJcbiAgICAgIHRoaXMuX293bmVyVG9JbmRleCA9IHRoaXMuX293bmVyRnJvbUluZGV4O1xyXG4gICAgICB0aGlzLl9oZWFkID0gdGhpcy5fdGFpbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuX3NpemUgPSAwO1xyXG4gICAgICB0aGlzLl9zYXZlZE1vZENvdW50ID0gdGhpcy5fb3duZXIubW9kQ291bnQ7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqIEB0aHJvd3MgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblxyXG4gICAqL1xyXG4gIGdldChpbmRleDogbnVtYmVyKTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICB0aGlzLl9jaGVja01vZENvdW50KCk7XHJcbiAgICByZXR1cm4gdGhpcy5fb3duZXIuZ2V0KHRoaXMuX293bmVyRnJvbUluZGV4ICsgaW5kZXgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKiBAdGhyb3dzIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25cclxuICAgKi9cclxuICBpbmRleE9mKHZhbHVlOiBFbGVtZW50PFQ+LCBmcm9tSW5kZXg/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY2hlY2tNb2RDb3VudCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX293bmVyLmluZGV4T2YodmFsdWUsIHRoaXMuX293bmVyRnJvbUluZGV4ICsgKGZyb21JbmRleCA/PyAwKSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqIEB0aHJvd3MgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblxyXG4gICAqL1xyXG4gIGluc2VydChpbmRleDogbnVtYmVyLCB2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY2hlY2tNb2RDb3VudCgpO1xyXG4gICAgaWYgKHRoaXMuX293bmVyLmluc2VydCh0aGlzLl9vd25lckZyb21JbmRleCArIGluZGV4LCB2YWx1ZSkpIHtcclxuICAgICAgaWYgKGluZGV4ID09IDApIHtcclxuICAgICAgICB0aGlzLl9oZWFkID0gdGhpcy5fb3duZXIuZ2V0Tm9kZSh0aGlzLl9vd25lckZyb21JbmRleCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90YWlsKSB7XHJcbiAgICAgICAgICB0aGlzLl90YWlsID0gdGhpcy5faGVhZDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMuX293bmVyRnJvbUluZGV4ICsgaW5kZXgpID4gdGhpcy5fb3duZXJUb0luZGV4KSB7XHJcbiAgICAgICAgdGhpcy5fdGFpbCA9IHRoaXMuX293bmVyLmdldE5vZGUodGhpcy5fb3duZXJUb0luZGV4ICsgMSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9oZWFkKSB7XHJcbiAgICAgICAgICB0aGlzLl9oZWFkID0gdGhpcy5fdGFpbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgICB0aGlzLl9vd25lclRvSW5kZXgrKztcclxuICAgICAgdGhpcy5fc2F2ZWRNb2RDb3VudCA9IHRoaXMuX293bmVyLm1vZENvdW50O1xyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqIEB0aHJvd3MgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblxyXG4gICAqL1xyXG4gIGxhc3RJbmRleE9mKHZhbHVlOiBFbGVtZW50PFQ+LCBmcm9tSW5kZXg/OiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG4gICAgdGhpcy5fY2hlY2tNb2RDb3VudCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX293bmVyLmxhc3RJbmRleE9mKHZhbHVlLCB0aGlzLl9vd25lckZyb21JbmRleCArIChmcm9tSW5kZXggPz8gMCkpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICByZW1vdmVSYW5nZShmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleD86IG51bWJlciB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY2hlY2tNb2RDb3VudCgpO1xyXG4gICAgcmV0dXJuIHRoaXMuX293bmVyLnJlbW92ZVJhbmdlKHRoaXMuX293bmVyRnJvbUluZGV4K2Zyb21JbmRleCwgdGhpcy5fb3duZXJUb0luZGV4Kyh0b0luZGV4ID8/IHRoaXMuc2l6ZSkgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uXHJcbiAgICovXHJcbiAgc2V0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBFbGVtZW50PFQ+KTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICB0aGlzLl9jaGVja01vZENvdW50KCk7XHJcbiAgICByZXR1cm4gdGhpcy5fb3duZXIuc2V0KHRoaXMuX293bmVyRnJvbUluZGV4ICsgaW5kZXgsIHZhbHVlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uXHJcbiAgICovXHJcbiAgc3ViTGlzdChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogTGlzdDxUPiB7XHJcbiAgICB0aGlzLl9jaGVja01vZENvdW50KCk7XHJcbiAgICByZXR1cm4gbmV3IExpc3RWaWV3KHRoaXMsIGZyb21JbmRleCwgdG9JbmRleCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqIEB0aHJvd3MgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvblxyXG4gICAqL1xyXG4gIGFwcGVuZCh2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY2hlY2tNb2RDb3VudCgpO1xyXG4gICAgaWYgKHRoaXMuX293bmVyLmluc2VydCh0aGlzLl9vd25lclRvSW5kZXgsIHZhbHVlKSkge1xyXG4gICAgICB0aGlzLl90YWlsID0gdGhpcy5fb3duZXIuZ2V0Tm9kZSh0aGlzLl9vd25lclRvSW5kZXgpO1xyXG4gICAgICBpZiAoIXRoaXMuX2hlYWQpICB0aGlzLl9oZWFkID0gdGhpcy5fdGFpbDtcclxuICAgICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgY29udGFpbnModmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIGxldCBub2RlID0gdGhpcy5faGVhZDtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIGlmIChub2RlLnZhbHVlID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlID09IHRoaXMuX3RhaWwpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICB0b0FycmF5KCk6IEVsZW1lbnQ8VD5bXSB7XHJcbiAgICBjb25zdCB2YWxzOiBBcnJheTxFbGVtZW50PFQ+PiA9IFtdO1xyXG5cclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMuX2hlYWQ7XHJcbiAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgdmFscy5wdXNoKGN1cnJlbnROb2RlLnZhbHVlKTtcclxuICAgICAgaWYgKGN1cnJlbnROb2RlID09IHRoaXMuX3RhaWwpIGJyZWFrO1xyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFscztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uXHJcbiAgICovXHJcbiAgcmVtb3ZlKHZhbHVlOiBFbGVtZW50PFQ+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICByZXR1cm4gKHRoaXMucmVtb3ZlQXQoaW5kZXgpIT09dW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICogQHRocm93cyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uXHJcbiAgICovXHJcbiAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgdGhpcy5fY2hlY2tNb2RDb3VudCgpO1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX293bmVyLmdldE5vZGUodGhpcy5fb3duZXJGcm9tSW5kZXgraW5kZXgpO1xyXG4gICAgbGV0IGl0ZW06IEVsZW1lbnQ8VD58dW5kZWZpbmVkID0gdGhpcy5fb3duZXIucmVtb3ZlQXQodGhpcy5fb3duZXJGcm9tSW5kZXgraW5kZXgpO1xyXG4gICAgaWYgKCEoaXRlbSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICBpZiAodGhpcy5faGVhZD09dGhpcy5fdGFpbCAmJiBub2RlPT10aGlzLl9oZWFkKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hlYWQgJiYgbm9kZSA9PSB0aGlzLl9oZWFkKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX2hlYWQubmV4dDtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YWlsICYmIG5vZGUgPT0gdGhpcy5fdGFpbCkge1xyXG4gICAgICAgIHRoaXMuX3RhaWwgPSB0aGlzLl90YWlsLnByZXY7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fc2l6ZS0tO1xyXG4gICAgICB0aGlzLl9vd25lclRvSW5kZXgtLTtcclxuICAgICAgdGhpcy5fc2F2ZWRNb2RDb3VudCA9IHRoaXMuX293bmVyLm1vZENvdW50O1xyXG5cclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbn1cclxuIl19