@myrmidon/paged-data-browsers 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,11 +20,11 @@ export class LRUCache {
20
20
  * considered.
21
21
  */
22
22
  constructor(maxSize, considerSize = false) {
23
- this.maxSize = maxSize;
24
- this.totalSize = 0;
25
- this.considerSize = considerSize;
26
- this.cache = new Map();
27
- this.sizes = new Map();
23
+ this._maxSize = maxSize;
24
+ this._totalSize = 0;
25
+ this._considerSize = considerSize;
26
+ this._cache = new Map();
27
+ this._sizes = new Map();
28
28
  }
29
29
  /**
30
30
  * Get an item from the cache.
@@ -32,13 +32,21 @@ export class LRUCache {
32
32
  * @returns The item or undefined if the item is not in the cache.
33
33
  */
34
34
  get(key) {
35
- let item = this.cache.get(key);
35
+ let item = this._cache.get(key);
36
36
  if (item) {
37
- this.cache.delete(key);
38
- this.cache.set(key, item);
37
+ this._cache.delete(key);
38
+ this._cache.set(key, item);
39
39
  }
40
40
  return item;
41
41
  }
42
+ /**
43
+ * Check if an item is in the cache.
44
+ * @param key The key of the item to check.
45
+ * @returns True if the item is in cache.
46
+ */
47
+ has(key) {
48
+ return this._cache.has(key);
49
+ }
42
50
  /**
43
51
  * Put an item in the cache.
44
52
  * @param key The key of the item to put.
@@ -48,26 +56,26 @@ export class LRUCache {
48
56
  * considerSize is true.
49
57
  */
50
58
  put(key, item, size) {
51
- this.cache.delete(key);
52
- this.cache.set(key, item);
53
- this.sizes.set(key, size);
54
- if (this.considerSize) {
55
- this.totalSize += size;
56
- while (this.totalSize > this.maxSize) {
57
- const oldestKey = this.cache.keys().next().value;
58
- let oldestSize = this.sizes.get(oldestKey);
59
+ this._cache.delete(key);
60
+ this._cache.set(key, item);
61
+ this._sizes.set(key, size);
62
+ if (this._considerSize) {
63
+ this._totalSize += size;
64
+ while (this._totalSize > this._maxSize) {
65
+ const oldestKey = this._cache.keys().next().value;
66
+ let oldestSize = this._sizes.get(oldestKey);
59
67
  if (oldestSize) {
60
- this.totalSize -= oldestSize;
68
+ this._totalSize -= oldestSize;
61
69
  }
62
- this.cache.delete(oldestKey);
63
- this.sizes.delete(oldestKey);
70
+ this._cache.delete(oldestKey);
71
+ this._sizes.delete(oldestKey);
64
72
  }
65
73
  }
66
74
  else {
67
- while (this.cache.size > this.maxSize) {
68
- const oldestKey = this.cache.keys().next().value;
69
- this.cache.delete(oldestKey);
70
- this.sizes.delete(oldestKey);
75
+ while (this._cache.size > this._maxSize) {
76
+ const oldestKey = this._cache.keys().next().value;
77
+ this._cache.delete(oldestKey);
78
+ this._sizes.delete(oldestKey);
71
79
  }
72
80
  }
73
81
  }
@@ -75,9 +83,9 @@ export class LRUCache {
75
83
  * Clear the cache.
76
84
  */
77
85
  clear() {
78
- this.cache.clear();
79
- this.sizes.clear();
80
- this.totalSize = 0;
86
+ this._cache.clear();
87
+ this._sizes.clear();
88
+ this._totalSize = 0;
81
89
  }
82
90
  /**
83
91
  * Estimate the size of an object in bytes.
@@ -108,4 +116,4 @@ export class LRUCache {
108
116
  return totalSize;
109
117
  }
110
118
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJ1LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL3NlcnZpY2VzL2xydS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLE9BQWUsRUFBRSxlQUF3QixLQUFLO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRyxDQUFDLEdBQVc7UUFDcEIsSUFBSSxJQUFJLEdBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEdBQUcsQ0FBQyxHQUFXLEVBQUUsSUFBTyxFQUFFLElBQVk7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNqRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7aUJBQzlCO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM5QjtTQUNGO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDOUI7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBUTtRQUN4QyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3BCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDN0IsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUNwQyxTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2hCO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQyxTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2hCO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ3RELFNBQVMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUM7U0FDRjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBBIExlYXN0IFJlY2VudGx5IFVzZWQgY2FjaGUgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhbnkgdHlwZSBvZiBvYmplY3QuXHJcbiAqIFRoZSBjYWNoZSB3b3JrcyBpbiB0d28gbW9kZXM6IGNvbnNpZGVyaW5nIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIG9yIG5vdC5cclxuICogSWYgdGhlIHNpemUgaXMgY29uc2lkZXJlZCwgdGhlIGNhY2hlIHdpbGwgaGF2ZSBhIG1heGltdW0gc2l6ZSBhbmQgd2lsbFxyXG4gKiByZW1vdmUgdGhlIG9sZGVzdCBvYmplY3RzIHdoZW4gdGhlIG1heGltdW0gc2l6ZSBpcyByZWFjaGVkLiBOb3RlIHRoYXRcclxuICogdGhlIHNpemUgaXMgb25seSByb3VnaGx5IGVzdGltYXRlZC4gVGhpcyBhdm9pZHMgcmVtb3ZpbmcgdG9vIG1hbnlcclxuICogZW50cmllcyBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZSBtYXhpbXVtIGlzIHJlYWNoZWQuXHJcbiAqIElmIHRoZSBzaXplIGlzIG5vdCBjb25zaWRlcmVkLCB0aGUgY2FjaGUgd2lsbCBoYXZlIGEgbWF4aW11bSBudW1iZXIgb2ZcclxuICogb2JqZWN0cyBhbmQgd2lsbCByZW1vdmUgdGhlIG9sZGVzdCBvYmplY3RzIHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIGlzXHJcbiAqIHJlYWNoZWQuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8VD4ge1xyXG4gIHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBjb25zaWRlclNpemU6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgVD47XHJcbiAgcHJpdmF0ZSBzaXplczogTWFwPHN0cmluZywgbnVtYmVyPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBjYWNoZS5cclxuICAgKiBAcGFyYW0gbWF4U2l6ZSBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyBpcyBlaXRoZXJcclxuICAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNhY2hlICh3aGVuIGNvbnNpZGVyU2l6ZVxyXG4gICAqIGlzIGZhbHNlKSBvciB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyBpbiB0aGVcclxuICAgKiBjYWNoZSBpbiBieXRlcyAod2hlbiBjb25zaWRlclNpemUgaXMgdHJ1ZSkuXHJcbiAgICogQHBhcmFtIGNvbnNpZGVyU2l6ZSBUcnVlIGlmIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIHNob3VsZCBiZVxyXG4gICAqIGNvbnNpZGVyZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyLCBjb25zaWRlclNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTtcclxuICAgIHRoaXMudG90YWxTaXplID0gMDtcclxuICAgIHRoaXMuY29uc2lkZXJTaXplID0gY29uc2lkZXJTaXplO1xyXG4gICAgdGhpcy5jYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xyXG4gICAgdGhpcy5zaXplcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYW4gaXRlbSBmcm9tIHRoZSBjYWNoZS5cclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gZ2V0LlxyXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtIG9yIHVuZGVmaW5lZCBpZiB0aGUgaXRlbSBpcyBub3QgaW4gdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBpdGVtOiBUIHwgdW5kZWZpbmVkID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XHJcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgaXRlbSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dCBhbiBpdGVtIGluIHRoZSBjYWNoZS5cclxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gcHV0LlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIHB1dC5cclxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgZXN0aW1hdGVkIHNpemUgb2YgdGhlIGl0ZW0gaW4gYnl0ZXMuXHJcbiAgICogVGhpcyBtdXN0IGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGNhbGxlciBidXQgb25seSB3aGVuXHJcbiAgICogY29uc2lkZXJTaXplIGlzIHRydWUuXHJcbiAgICovXHJcbiAgcHVibGljIHB1dChrZXk6IHN0cmluZywgaXRlbTogVCwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBpdGVtKTtcclxuICAgIHRoaXMuc2l6ZXMuc2V0KGtleSwgc2l6ZSk7XHJcbiAgICBpZiAodGhpcy5jb25zaWRlclNpemUpIHtcclxuICAgICAgdGhpcy50b3RhbFNpemUgKz0gc2l6ZTtcclxuICAgICAgd2hpbGUgKHRoaXMudG90YWxTaXplID4gdGhpcy5tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgICAgIGxldCBvbGRlc3RTaXplID0gdGhpcy5zaXplcy5nZXQob2xkZXN0S2V5KTtcclxuICAgICAgICBpZiAob2xkZXN0U2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy50b3RhbFNpemUgLT0gb2xkZXN0U2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUob2xkZXN0S2V5KTtcclxuICAgICAgICB0aGlzLnNpemVzLmRlbGV0ZShvbGRlc3RLZXkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aGlsZSAodGhpcy5jYWNoZS5zaXplID4gdGhpcy5tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5zaXplcy5kZWxldGUob2xkZXN0S2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcclxuICAgIHRoaXMuc2l6ZXMuY2xlYXIoKTtcclxuICAgIHRoaXMudG90YWxTaXplID0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzdGltYXRlIHRoZSBzaXplIG9mIGFuIG9iamVjdCBpbiBieXRlcy5cclxuICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mLlxyXG4gICAqIEByZXR1cm5zIFRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIGJ5dGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlT2JqZWN0U2l6ZShvYmo6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGxldCB0b3RhbFNpemUgPSAwO1xyXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xyXG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcclxuICAgICAgbGV0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdG90YWxTaXplICs9IHZhbHVlLmxlbmd0aCAqIDI7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSA4O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgdG90YWxTaXplICs9IDQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSB0aGlzLmNhbGN1bGF0ZU9iamVjdFNpemUodmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG90YWxTaXplO1xyXG4gIH1cclxufVxyXG4iXX0=
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJ1LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL3NlcnZpY2VzL2xydS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLE9BQWUsRUFBRSxlQUF3QixLQUFLO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRyxDQUFDLEdBQVc7UUFDcEIsSUFBSSxJQUFJLEdBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxHQUFHLENBQUMsR0FBVyxFQUFFLElBQU8sRUFBRSxJQUFZO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVDLElBQUksVUFBVSxFQUFFO29CQUNkLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDO2lCQUMvQjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0I7U0FDRjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVE7UUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNwQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzdCLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUMvQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDcEMsU0FBUyxJQUFJLENBQUMsQ0FBQzthQUNoQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDckMsU0FBUyxJQUFJLENBQUMsQ0FBQzthQUNoQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUN0RCxTQUFTLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBMZWFzdCBSZWNlbnRseSBVc2VkIGNhY2hlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYW55IHR5cGUgb2Ygb2JqZWN0LlxyXG4gKiBUaGUgY2FjaGUgd29ya3MgaW4gdHdvIG1vZGVzOiBjb25zaWRlcmluZyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBvciBub3QuXHJcbiAqIElmIHRoZSBzaXplIGlzIGNvbnNpZGVyZWQsIHRoZSBjYWNoZSB3aWxsIGhhdmUgYSBtYXhpbXVtIHNpemUgYW5kIHdpbGxcclxuICogcmVtb3ZlIHRoZSBvbGRlc3Qgb2JqZWN0cyB3aGVuIHRoZSBtYXhpbXVtIHNpemUgaXMgcmVhY2hlZC4gTm90ZSB0aGF0XHJcbiAqIHRoZSBzaXplIGlzIG9ubHkgcm91Z2hseSBlc3RpbWF0ZWQuIFRoaXMgYXZvaWRzIHJlbW92aW5nIHRvbyBtYW55XHJcbiAqIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgbWF4aW11bSBpcyByZWFjaGVkLlxyXG4gKiBJZiB0aGUgc2l6ZSBpcyBub3QgY29uc2lkZXJlZCwgdGhlIGNhY2hlIHdpbGwgaGF2ZSBhIG1heGltdW0gbnVtYmVyIG9mXHJcbiAqIG9iamVjdHMgYW5kIHdpbGwgcmVtb3ZlIHRoZSBvbGRlc3Qgb2JqZWN0cyB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBpc1xyXG4gKiByZWFjaGVkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExSVUNhY2hlPFQ+IHtcclxuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfdG90YWxTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfY29uc2lkZXJTaXplOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2NhY2hlOiBNYXA8c3RyaW5nLCBUPjtcclxuICBwcml2YXRlIF9zaXplczogTWFwPHN0cmluZywgbnVtYmVyPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBjYWNoZS5cclxuICAgKiBAcGFyYW0gbWF4U2l6ZSBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyBpcyBlaXRoZXJcclxuICAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNhY2hlICh3aGVuIGNvbnNpZGVyU2l6ZVxyXG4gICAqIGlzIGZhbHNlKSBvciB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyBpbiB0aGVcclxuICAgKiBjYWNoZSBpbiBieXRlcyAod2hlbiBjb25zaWRlclNpemUgaXMgdHJ1ZSkuXHJcbiAgICogQHBhcmFtIGNvbnNpZGVyU2l6ZSBUcnVlIGlmIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIHNob3VsZCBiZVxyXG4gICAqIGNvbnNpZGVyZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyLCBjb25zaWRlclNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XHJcbiAgICB0aGlzLl90b3RhbFNpemUgPSAwO1xyXG4gICAgdGhpcy5fY29uc2lkZXJTaXplID0gY29uc2lkZXJTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcclxuICAgIHRoaXMuX3NpemVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBpdGVtIGZyb20gdGhlIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgaXRlbSB0byBnZXQuXHJcbiAgICogQHJldHVybnMgVGhlIGl0ZW0gb3IgdW5kZWZpbmVkIGlmIHRoZSBpdGVtIGlzIG5vdCBpbiB0aGUgY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGl0ZW06IFQgfCB1bmRlZmluZWQgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgICB0aGlzLl9jYWNoZS5zZXQoa2V5LCBpdGVtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBpbiB0aGUgY2FjaGUuXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBpdGVtIHRvIGNoZWNrLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGl0ZW0gaXMgaW4gY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLmhhcyhrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHV0IGFuIGl0ZW0gaW4gdGhlIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgaXRlbSB0byBwdXQuXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gcHV0LlxyXG4gICAqIEBwYXJhbSBzaXplIFRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgaXRlbSBpbiBieXRlcy5cclxuICAgKiBUaGlzIG11c3QgYmUgY2FsY3VsYXRlZCBieSB0aGUgY2FsbGVyIGJ1dCBvbmx5IHdoZW5cclxuICAgKiBjb25zaWRlclNpemUgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBwdWJsaWMgcHV0KGtleTogc3RyaW5nLCBpdGVtOiBULCBzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgaXRlbSk7XHJcbiAgICB0aGlzLl9zaXplcy5zZXQoa2V5LCBzaXplKTtcclxuICAgIGlmICh0aGlzLl9jb25zaWRlclNpemUpIHtcclxuICAgICAgdGhpcy5fdG90YWxTaXplICs9IHNpemU7XHJcbiAgICAgIHdoaWxlICh0aGlzLl90b3RhbFNpemUgPiB0aGlzLl9tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5fY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcclxuICAgICAgICBsZXQgb2xkZXN0U2l6ZSA9IHRoaXMuX3NpemVzLmdldChvbGRlc3RLZXkpO1xyXG4gICAgICAgIGlmIChvbGRlc3RTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLl90b3RhbFNpemUgLT0gb2xkZXN0U2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5fc2l6ZXMuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLl9jYWNoZS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IG9sZGVzdEtleSA9IHRoaXMuX2NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5fc2l6ZXMuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gICAgdGhpcy5fc2l6ZXMuY2xlYXIoKTtcclxuICAgIHRoaXMuX3RvdGFsU2l6ZSA9IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhbiBvYmplY3QgaW4gYnl0ZXMuXHJcbiAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZi5cclxuICAgKiBAcmV0dXJucyBUaGUgZXN0aW1hdGVkIHNpemUgb2YgdGhlIG9iamVjdCBpbiBieXRlcy5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZU9iamVjdFNpemUob2JqOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBsZXQgdG90YWxTaXplID0gMDtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcclxuICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSB2YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICB0b3RhbFNpemUgKz0gODtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSA0O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICB0b3RhbFNpemUgKz0gdGhpcy5jYWxjdWxhdGVPYmplY3RTaXplKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsU2l6ZTtcclxuICB9XHJcbn1cclxuIl19
@@ -138,5 +138,21 @@ export class PagedListStore {
138
138
  this._cache.clear();
139
139
  return this.setFilter({});
140
140
  }
141
+ /**
142
+ * Clear the cache.
143
+ */
144
+ clearCache() {
145
+ this._cache.clear();
146
+ }
147
+ /**
148
+ * Check if the page with the given number and filter is in cache.
149
+ * @param pageNumber The page number.
150
+ * @param filter The filter.
151
+ * @returns True if the page is in cache, false otherwise.
152
+ */
153
+ hasCachedPage(pageNumber, filter) {
154
+ const key = this.buildCacheKey(pageNumber, filter);
155
+ return this._cache.has(key);
156
+ }
141
157
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtbGlzdC5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC1saXN0LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXlCdkM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBMEI7SUFDckUsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFtQkY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFvQnpCOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFDVSxRQUFxQyxFQUM3QyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7UUFHN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQWMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE9BQU87UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFjO1lBQzdDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUyxFQUFF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RUQ7OztPQUdHO0lBQ0ksU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IERhdGFQYWdlIH0gZnJvbSAnQG15cm1pZG9uL25nLXRvb2xzJztcclxuXHJcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi9scnUtY2FjaGUnO1xyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIHRoZSBwYWdlZCBsaXN0IHN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZExpc3RTdG9yZU9wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIFRoZSBzaXplIG9mIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBzaXplIG9mIHRoZSBjYWNoZSBmb3IgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIGNhY2hlU2l6ZTogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBBIGN1c3RvbSBmdW5jdGlvbiBmb3IgYnVpbGRpbmcgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyXHJcbiAgICogYW5kIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIGJ1aWxkQ2FjaGVLZXk/OiAocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IGFueSkgPT4gc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OUzogUGFnZWRMaXN0U3RvcmVPcHRpb25zID0ge1xyXG4gIHBhZ2VTaXplOiAyMCxcclxuICBjYWNoZVNpemU6IDUwLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBpbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZpY2UgdXNlZCBieSBQYWdlZExpc3RTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRMaXN0U3RvcmVTZXJ2aWNlPEYsIEU+IHtcclxuICAvKipcclxuICAgKiBMb2FkIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gbG9hZC5cclxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHNpemUgb2YgdGhlIHBhZ2UgdG8gbG9hZC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXHJcbiAgICovXHJcbiAgbG9hZFBhZ2UoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyLFxyXG4gICAgZmlsdGVyOiBGXHJcbiAgKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxFPj47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgcGFnZWQgbGlzdCBzdG9yZSB1c2luZyBhIGZpbHRlciBvYmplY3Qgb2YgdHlwZSBGXHJcbiAqIGFuZCBhIGxpc3Qgb2YgZWxlbWVudHMgb2YgdHlwZSBFLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBhZ2VkTGlzdFN0b3JlPEYsIEU+IHtcclxuICBwcml2YXRlIF9wYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1c3RvbUNhY2hlS2V5QnVpbGRlcj86IChcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIGZpbHRlcjogYW55XHJcbiAgKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcGFnZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRhUGFnZTxFPj47XHJcbiAgcHJpdmF0ZSBfZmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PEY+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlOiBMUlVDYWNoZTxEYXRhUGFnZTxFPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBwYWdlLiBJdCBpcyB1cGRhdGVkIHdoZW4gdGhlIHBhZ2UgaXMgY2hhbmdlZCBvciB0aGUgZmlsdGVyIGlzIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHBhZ2UkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PERhdGFQYWdlPEU+Pj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmaWx0ZXIuIEl0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgZmlsdGVyIGlzIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8UmVhZG9ubHk8Rj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBub2RlcyBwYWdlcyBpbiB0aGlzIHN0b3JlLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGUgc3RvcmVcclxuICAgKiBpcyByZXNldC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9wYWdlU2l6ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIG5ldyBwYWdlZCBsaXN0IHN0b3JlLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBwYWdlZCBsaXN0IHN0b3JlLlxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2VydmljZTogUGFnZWRMaXN0U3RvcmVTZXJ2aWNlPEYsIEU+LFxyXG4gICAgb3B0aW9uczogUGFnZWRMaXN0U3RvcmVPcHRpb25zID0gREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlNcclxuICApIHtcclxuICAgIHRoaXMuX3BhZ2VTaXplID0gb3B0aW9ucy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuX2NhY2hlID0gbmV3IExSVUNhY2hlPERhdGFQYWdlPEU+PihvcHRpb25zLmNhY2hlU2l6ZSk7XHJcbiAgICAvLyBwYWdlXHJcbiAgICB0aGlzLl9wYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YVBhZ2U8RT4+KHtcclxuICAgICAgcGFnZU51bWJlcjogMCxcclxuICAgICAgcGFnZUNvdW50OiAwLFxyXG4gICAgICBwYWdlU2l6ZTogMCxcclxuICAgICAgdG90YWw6IDAsXHJcbiAgICAgIGl0ZW1zOiBbXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5wYWdlJCA9IHRoaXMuX3BhZ2UkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgLy8gZmlsdGVyXHJcbiAgICB0aGlzLl9maWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGPih7fSBhcyBGKTtcclxuICAgIHRoaXMuZmlsdGVyJCA9IHRoaXMuX2ZpbHRlciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0b3JlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RvcmUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlJC52YWx1ZS5pdGVtcy5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXIgYW5kIGZpbHRlci5cclxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgYSBzdHJpbmdpZmllZCBvYmplY3RcclxuICAgKiBjb250YWluaW5nIHRoZSBwYWdlIG51bWJlciBhbmQgdGhlIGZpbHRlci4gWW91IG1heSBvdmVycmlkZVxyXG4gICAqIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgYSBjdXN0b20gY2FjaGUga2V5LlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgdGhlIHBhZ2UgbnVtYmVyIHRvIGxvYWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPERhdGFQYWdlPEU+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VydmljZS5sb2FkUGFnZShcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgdGhpcy5fcGFnZVNpemUsXHJcbiAgICAgIHRoaXMuX2ZpbHRlciQudmFsdWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNldFBhZ2UocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplICE9PSB0aGlzLl9wYWdlU2l6ZSkge1xyXG4gICAgICB0aGlzLl9wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gaWYgcGFnZSBpcyBpbiBjYWNoZSwgcmV0dXJuIGl0XHJcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyLCB0aGlzLl9maWx0ZXIkLnZhbHVlKTtcclxuICAgICAgY29uc3QgY2FjaGVkUGFnZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG4gICAgICBpZiAoY2FjaGVkUGFnZSkge1xyXG4gICAgICAgIHRoaXMuX3BhZ2UkLm5leHQoY2FjaGVkUGFnZSk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZWxzZSBsb2FkIHBhZ2VcclxuICAgICAgdGhpcy5sb2FkUGFnZShwYWdlTnVtYmVyKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChwYWdlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9wYWdlJC5uZXh0KHBhZ2UpO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFBhZ2UoKTogRGF0YVBhZ2U8RT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIGdpdmVuIGZpbHRlciBhbmQgbG9hZCB0aGUgZmlyc3QgcGFnZS5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZC5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyKGZpbHRlcjogRik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICAgIHRoaXMuc2V0UGFnZSgxKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWx0ZXIoKTogRiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBmaWx0ZXIgYW5kIGxvYWQgdGhlIGZpcnN0IHBhZ2UuIFRoZSBjYWNoZSBpcyBjbGVhcmVkLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIHJldHVybiB0aGlzLnNldEZpbHRlcih7fSBhcyBGKTtcclxuICB9XHJcbn1cclxuIl19
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtbGlzdC5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC1saXN0LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXlCdkM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBMEI7SUFDckUsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFtQkY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFvQnpCOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFDVSxRQUFxQyxFQUM3QyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7UUFHN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQWMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE9BQU87UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFjO1lBQzdDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUyxFQUFF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RUQ7OztPQUdHO0lBQ0ksU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRMaXN0U3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlM6IFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyA9IHtcclxuICBwYWdlU2l6ZTogMjAsXHJcbiAgY2FjaGVTaXplOiA1MCxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgUGFnZWRMaXN0U3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkTGlzdFN0b3JlU2VydmljZTxGLCBFPiB7XHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyIHRvIGxvYWQuXHJcbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBzaXplIG9mIHRoZSBwYWdlIHRvIGxvYWQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIGFwcGx5LlxyXG4gICAqL1xyXG4gIGxvYWRQYWdlKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgcGFnZVNpemU6IG51bWJlcixcclxuICAgIGZpbHRlcjogRlxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8RT4+O1xyXG59XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIHBhZ2VkIGxpc3Qgc3RvcmUgdXNpbmcgYSBmaWx0ZXIgb2JqZWN0IG9mIHR5cGUgRlxyXG4gKiBhbmQgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIHR5cGUgRS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZExpc3RTdG9yZTxGLCBFPiB7XHJcbiAgcHJpdmF0ZSBfcGFnZVNpemU6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgX3BhZ2UkOiBCZWhhdmlvclN1YmplY3Q8RGF0YVBhZ2U8RT4+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZTogTFJVQ2FjaGU8RGF0YVBhZ2U8RT4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGFnZS4gSXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBwYWdlIGlzIGNoYW5nZWQgb3IgdGhlIGZpbHRlciBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlJDogT2JzZXJ2YWJsZTxSZWFkb25seTxEYXRhUGFnZTxFPj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyLiBJdCBpcyB1cGRhdGVkIHdoZW4gdGhlIGZpbHRlciBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgcGFnZWQgbGlzdCBzdG9yZS5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkTGlzdFN0b3JlU2VydmljZTxGLCBFPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxFPj4ob3B0aW9ucy5jYWNoZVNpemUpO1xyXG4gICAgLy8gcGFnZVxyXG4gICAgdGhpcy5fcGFnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFQYWdlPEU+Pih7XHJcbiAgICAgIHBhZ2VOdW1iZXI6IDAsXHJcbiAgICAgIHBhZ2VDb3VudDogMCxcclxuICAgICAgcGFnZVNpemU6IDAsXHJcbiAgICAgIHRvdGFsOiAwLFxyXG4gICAgICBpdGVtczogW10sXHJcbiAgICB9KTtcclxuICAgIHRoaXMucGFnZSQgPSB0aGlzLl9wYWdlJC5hc09ic2VydmFibGUoKTtcclxuICAgIC8vIGZpbHRlclxyXG4gICAgdGhpcy5fZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rj4oe30gYXMgRik7XHJcbiAgICB0aGlzLmZpbHRlciQgPSB0aGlzLl9maWx0ZXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdG9yZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHN0b3JlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZSQudmFsdWUuaXRlbXMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgdGhlIHBhZ2UgbnVtYmVyIHRvIGxvYWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPERhdGFQYWdlPEU+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VydmljZS5sb2FkUGFnZShcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgdGhpcy5fcGFnZVNpemUsXHJcbiAgICAgIHRoaXMuX2ZpbHRlciQudmFsdWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNldFBhZ2UocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplICE9PSB0aGlzLl9wYWdlU2l6ZSkge1xyXG4gICAgICB0aGlzLl9wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gaWYgcGFnZSBpcyBpbiBjYWNoZSwgcmV0dXJuIGl0XHJcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyLCB0aGlzLl9maWx0ZXIkLnZhbHVlKTtcclxuICAgICAgY29uc3QgY2FjaGVkUGFnZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG4gICAgICBpZiAoY2FjaGVkUGFnZSkge1xyXG4gICAgICAgIHRoaXMuX3BhZ2UkLm5leHQoY2FjaGVkUGFnZSk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZWxzZSBsb2FkIHBhZ2VcclxuICAgICAgdGhpcy5sb2FkUGFnZShwYWdlTnVtYmVyKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChwYWdlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9wYWdlJC5uZXh0KHBhZ2UpO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFBhZ2UoKTogRGF0YVBhZ2U8RT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIGdpdmVuIGZpbHRlciBhbmQgbG9hZCB0aGUgZmlyc3QgcGFnZS5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZC5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyKGZpbHRlcjogRik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICAgIHRoaXMuc2V0UGFnZSgxKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWx0ZXIoKTogRiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBmaWx0ZXIgYW5kIGxvYWQgdGhlIGZpcnN0IHBhZ2UuIFRoZSBjYWNoZSBpcyBjbGVhcmVkLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIHJldHVybiB0aGlzLnNldEZpbHRlcih7fSBhcyBGKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgYW5kIGZpbHRlciBpcyBpbiBjYWNoZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHBhZ2UgaXMgaW4gY2FjaGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgaGFzQ2FjaGVkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGUuaGFzKGtleSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -415,5 +415,21 @@ export class PagedTreeStore {
415
415
  collapseAll() {
416
416
  this._nodes$.next([this._radix, ...this._roots]);
417
417
  }
418
+ /**
419
+ * Clear the cache.
420
+ */
421
+ clearCache() {
422
+ this._cache.clear();
423
+ }
424
+ /**
425
+ * Check if the page with the given number and filter is in cache.
426
+ * @param pageNumber The page number.
427
+ * @param filter The filter.
428
+ * @returns True if the page is in cache, false otherwise.
429
+ */
430
+ hasCachedPage(pageNumber, filter) {
431
+ const key = this.buildCacheKey(pageNumber, filter);
432
+ return this._cache.has(key);
433
+ }
418
434
  }
419
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFDRixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWdHdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQW9DekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFDVSxRQUFrQyxFQUMxQyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFHMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQXFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGFB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QUcsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUksU0FBaUIsQ0FBQyxDQUFDO29CQUM5QyxxQ0FBcUM7b0JBQ3JDLFVBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2Y7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIGZvcmtKb2luLFxyXG4gIG9mLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YXAsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuaW1wb3J0IHsgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlMgfSBmcm9tICcuL3BhZ2VkLWxpc3Quc3RvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlLiBZb3VyIGRhdGEgc2VydmljZSBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiB0aGVzZSBub2Rlc1xyXG4gKiBvciBvZiBhbnkgdHlwZSBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB4OiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbiAgaGFzQ2hpbGRyZW4/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBmaWx0ZXIgZm9yIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlRmlsdGVyIHtcclxuICB0YWdzPzogc3RyaW5nW107XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYWdpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFnZWQgdHJlZSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmdJbmZvIHtcclxuICBwYWdlTnVtYmVyOiBudW1iZXI7XHJcbiAgcGFnZUNvdW50OiBudW1iZXI7XHJcbiAgdG90YWw6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlIHdpdGggcGFnaW5nIGluZm9ybWF0aW9uLCB1c2VkIGluIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZU5vZGU8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiBleHRlbmRzIFRyZWVOb2RlIHtcclxuICBwYWdpbmc6IFBhZ2luZ0luZm87XHJcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gIGZpbHRlcj86IEY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgTm9kZUJyb3dzZXJTdG9yZVxyXG4gKiB0byBsb2FkIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiB7XHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCB0aGUgcm9vdCBub2Rlcywgb3IganVzdCB0aGUgb25lcyBoYXZpbmcgb25lIG9mIHRoZSBzcGVjaWZpZWRcclxuICAgKiB0YWdzLlxyXG4gICAqIEBwYXJhbSB0YWdzIFRoZSBvcHRpb25hbCB0YWdzIHRvIGZpbHRlciB0aGUgcm9vdCBub2Rlcy5cclxuICAgKi9cclxuICBnZXRSb290Tm9kZXModGFncz86IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxUcmVlTm9kZVtdPjtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2Rlcy5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqL1xyXG4gIGdldE5vZGVzKFxyXG4gICAgZmlsdGVyOiBGLFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgcGFnZVNpemU6IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VHJlZU5vZGU+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsaXN0IG9mIHVuaXF1ZSBub2RlIHRhZ3MuIEVhY2ggdGFnIGNvcnJlc3BvbmRzIHRvIGEgdHJlZSxcclxuICAgKiBhcyBub2RlcyBhcmUgdmlydHVhbGx5IGdyb3VwZWQgYnkgdGhlaXIgdGFnLlxyXG4gICAqL1xyXG4gIGdldFRhZ3MoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3RvcmUgZm9yIHRoZSBub2RlIGJyb3dzZXIgY29tcG9uZW50LiBUaGlzIHN0b3JlIGlzIHVzZWQgdG8ga2VlcCBhXHJcbiAqIGxpc3Qgb2Ygbm9kZXMsIGFuZCB0byBsb2FkIHRoZW0gZnJvbSB0aGUgQVBJLiBJdCBhbHNvIGtlZXBzIHRoZSByb290XHJcbiAqIG5vZGUuIEV2ZXJ5IHRyZWUgbm9kZSBpbiB0aGUgbGlzdCBpcyBleHRlbmRlZCB3aXRoIHBhZ2UgbnVtYmVyLFxyXG4gKiBwYWdlIGNvdW50IGFuZCB0b3RhbCBpdGVtcywgcGx1cyBleHBhbnNpb24tcmVsYXRlZCBtZXRhZGF0YS5cclxuICogVGhlIHN0b3JlIGtlZXBzIGEgZmxhdCBsaXN0IG9mIHRoZXNlIHRyZWUgbm9kZXMsIGFsbG93aW5nIHVzZXJzIHRvXHJcbiAqIGV4cGFuZCBhbmQgY29sbGFwc2UgdGhlbS5cclxuICogRiBpcyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIG9iamVjdCwgRSBpcyB0aGUgdHlwZSBvZiB0aGUgcGFnZWQgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZFRyZWVTdG9yZTxcclxuICBFIGV4dGVuZHMgUGFnZWRUcmVlTm9kZTxGPixcclxuICBGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXJcclxuPiB7XHJcbiAgcHJpdmF0ZSBfcmFkaXg/OiBFO1xyXG4gIHByaXZhdGUgX3JhZGl4TGFiZWw6IHN0cmluZztcclxuICBwcml2YXRlIF9yb290czogRVtdO1xyXG4gIHByaXZhdGUgX25vZGVzJDogQmVoYXZpb3JTdWJqZWN0PEVbXT47XHJcbiAgcHJpdmF0ZSBfdGFncyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT47XHJcbiAgcHJpdmF0ZSBfZmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PEY+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1c3RvbUNhY2hlS2V5QnVpbGRlcj86IChcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIGZpbHRlcjogYW55XHJcbiAgKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGU6IExSVUNhY2hlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcblxyXG4gIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XHJcbiAgLy8gZGlydHkgc3RhdGU6IHRoaXMgaXMgcmVzZXQgd2hlbiB0aGUgc3RvcmUgaXMgcmVzZXQsIGFuZCBzZXQgdG8gdHJ1ZVxyXG4gIC8vIHdoZW4gdGhlIHN0b3JlIGlzIGNoYW5nZWRcclxuICBwcml2YXRlIF9kaXJ0eT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmbGF0IGxpc3Qgb2YgcGFnZWQgbm9kZXMgaW4gdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgbm9kZXMkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEVbXT4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbGlzdCBvZiB0cmVlIHRhZ3MgaW4gdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgdGFncyQ6IE9ic2VydmFibGU8UmVhZG9ubHk8c3RyaW5nW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGdsb2JhbCBub2RlcyBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8UmVhZG9ubHk8Rj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBub2RlcyBwYWdlcyBpbiB0aGlzIHN0b3JlLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGUgc3RvcmVcclxuICAgKiBpcyByZXNldC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9wYWdlU2l6ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVzZXQodGhpcy5fcmFkaXg/LmxhYmVsIHx8IHRoaXMuX3JhZGl4TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzdG9yZS5cclxuICAgKiBAcGFyYW0gX3NlcnZpY2UgVGhlIHNlcnZpY2UgdXNlZCB0byBsb2FkIG5vZGVzLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGlzIHN0b3JlLlxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2VydmljZTogUGFnZWRUcmVlU3RvcmVTZXJ2aWNlPEY+LFxyXG4gICAgb3B0aW9uczogUGFnZWRUcmVlU3RvcmVPcHRpb25zID0gREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlNcclxuICApIHtcclxuICAgIHRoaXMuX3BhZ2VTaXplID0gb3B0aW9ucy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuX2NhY2hlID0gbmV3IExSVUNhY2hlPERhdGFQYWdlPFRyZWVOb2RlPj4ob3B0aW9ucy5jYWNoZVNpemUpO1xyXG4gICAgdGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyID0gb3B0aW9ucy5idWlsZENhY2hlS2V5O1xyXG4gICAgdGhpcy5fcmFkaXhMYWJlbCA9ICcocm9vdCknO1xyXG4gICAgdGhpcy5fcm9vdHMgPSBbXTtcclxuICAgIHRoaXMuX25vZGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPihbXSk7XHJcbiAgICB0aGlzLm5vZGVzJCA9IHRoaXMuX25vZGVzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX3RhZ3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xyXG4gICAgdGhpcy50YWdzJCA9IHRoaXMuX3RhZ3MkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rj4oe30gYXMgRik7XHJcbiAgICB0aGlzLmZpbHRlciQgPSB0aGlzLl9maWx0ZXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVUYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2aWNlLmdldFRhZ3MoKS5zdWJzY3JpYmUoKHRhZ3MpID0+IHtcclxuICAgICAgdGhpcy5fdGFncyQubmV4dCh0YWdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ2xvYmFsIGZpbHRlciwgZXZlbnR1YWxseSBvdmVycmlkZGVuIHdpdGggdmFsdWVzXHJcbiAgICogZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUncyBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIG9wdGlvbmFsIG5vZGUuXHJcbiAgICogQHJldHVybnMgVGhlIGZpbHRlci5cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcihub2RlPzogUGFnZWRUcmVlTm9kZTxGPik6IEYge1xyXG4gICAgcmV0dXJuIG5vZGU/LmZpbHRlclxyXG4gICAgICA/IHtcclxuICAgICAgICAgIC4uLnRoaXMuX2ZpbHRlciQudmFsdWUsXHJcbiAgICAgICAgICAuLi5ub2RlLmZpbHRlcixcclxuICAgICAgICB9XHJcbiAgICAgIDogdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICogQHJldHVybnMgVGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXROb2RlcygpOiBSZWFkb25seTxQYWdlZFRyZWVOb2RlPEY+W10+IHtcclxuICAgIHJldHVybiB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIG5vZGVzIHRhZ3MuXHJcbiAgICogQHJldHVybnMgVGhlIHRhZ3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFRhZ3MoKTogUmVhZG9ubHk8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiB0aGlzLl90YWdzJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlciBhbmQgZmlsdGVyLlxyXG4gICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBhIHN0cmluZ2lmaWVkIG9iamVjdFxyXG4gICAqIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbnVtYmVyIGFuZCB0aGUgZmlsdGVyLiBZb3UgbWF5IG92ZXJyaWRlXHJcbiAgICogdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYWNoZSBrZXkuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IEYpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBwYWdlTnVtYmVyLCAuLi5maWx0ZXIgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VHJlZU5vZGU+PiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIGNvbnN0IHBhZ2VJbkNhY2hlID0gdGhpcy5fY2FjaGUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKHBhZ2VJbkNhY2hlKSB7XHJcbiAgICAgIHJldHVybiBvZihwYWdlSW5DYWNoZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmljZS5nZXROb2RlcyhmaWx0ZXIsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VTaXplKS5waXBlKFxyXG4gICAgICAgIHRhcCgocGFnZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IFBhZ2VkVHJlZU5vZGU8Rj5bXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGZpbHRlciBmb3IgdGhpcyBzdG9yZS4gV2hlbmV2ZXIgdGhlIGZpbHRlciBpcyBzZXQsXHJcbiAgICogdGhlIHN0b3JlIGlzIHJlc2V0LlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcmFkaXhMYWJlbCBUaGUgbGFiZWwgb2YgdGhlIHJhZGl4IG5vZGUsIGlmIHRoaXMgbmVlZHMgdG8gYmUgc2V0LlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGLCByYWRpeExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCh0aGlzLl9yYWRpeD8ubGFiZWwgfHwgcmFkaXhMYWJlbCB8fCB0aGlzLl9yYWRpeExhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBzdG9yZSwgbG9hZGluZyB0aGUgcm9vdCBub2RlcyBhbmQgdGhlaXIgY2hpbGRyZW4uXHJcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvZiB0aGUgcmFkaXggbm9kZS5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQobGFiZWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCF0aGlzLl9kaXJ0eSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9maWx0ZXIkLnZhbHVlO1xyXG4gICAgdGhpcy5fcmFkaXggPSB7XHJcbiAgICAgIGlkOiAwLFxyXG4gICAgICB5OiAwLFxyXG4gICAgICB4OiAxLFxyXG4gICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgIHBhZ2VOdW1iZXI6IDAsXHJcbiAgICAgICAgcGFnZUNvdW50OiAwLFxyXG4gICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICB9LFxyXG4gICAgfSBhcyBFO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Um9vdE5vZGVzKGZpbHRlci50YWdzKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChub2RlcykgPT4ge1xyXG4gICAgICAgICAgICAvLyBubyByb290cywgY2xlYXIgYW5kIHJldHVybiBlbXB0eSBzZXRcclxuICAgICAgICAgICAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cyA9IFtdO1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gZ290IHJvb3RzLCBzZXQgdGhlbSBhbmQgZ2V0IHRoZWlyIGNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdHMgPSBub2Rlcy5tYXAoXHJcbiAgICAgICAgICAgICAgICAobm9kZSkgPT5cclxuICAgICAgICAgICAgICAgICAgKHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogMSxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgRSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIGZldGNoIGNoaWxkcmVuIGZvciBlYWNoIHJvb3Qgbm9kZVxyXG4gICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RzLm1hcCgocm9vdCkgPT5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5maWx0ZXIsIHBhcmVudElkOiByb290LmlkIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocGFnZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHBhZ2VzLnNvbWUoKHBhZ2UpID0+IHBhZ2UudG90YWwpKSB7XHJcbiAgICAgICAgICAgICAgLy8gcmFkaXhcclxuICAgICAgICAgICAgICB0aGlzLl9yYWRpeCEuaGFzQ2hpbGRyZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JhZGl4IS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmFkaXghLnBhZ2luZyA9IHtcclxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlQ291bnQ6IDEsXHJcbiAgICAgICAgICAgICAgICB0b3RhbDogcGFnZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgLy8gcm9vdHNcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cy5mb3JFYWNoKChyb290LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb290Lmhhc0NoaWxkcmVuID0gISFwYWdlc1tpXS50b3RhbDtcclxuICAgICAgICAgICAgICAgIHJvb3QuZXhwYW5kZWQgPSAhIXBhZ2VzW2ldLnRvdGFsO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fcm9vdHMuZmxhdE1hcCgocm9vdCwgaSkgPT4gW1xyXG4gICAgICAgICAgICAgICAgcm9vdCxcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2VzW2ldKSxcclxuICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dChbdGhpcy5fcmFkaXghLCAuLi4obm9kZXMgYXMgRVtdKV0pO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdHMuZm9yRWFjaCgocm9vdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcm9vdC5oYXNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcm9vdC5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KFt0aGlzLl9yYWRpeCEsIC4uLnRoaXMuX3Jvb3RzXSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbm9kZSBmaWx0ZXIgZm9yIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC5cclxuICAgKiBAcGFyYW0gaWQgVGhlIG5vZGUgSUQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHNldC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiBmaWx0ZXIgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXROb2RlRmlsdGVyKGlkOiBudW1iZXIsIGZpbHRlcj86IEYgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgIHJlamVjdChgTm9kZSBJRCAke2lkfSBub3QgZm91bmQgaW4gc3RvcmVgKTtcclxuICAgICAgfVxyXG4gICAgICBub2RlIS5maWx0ZXIgPSBmaWx0ZXIgfHwgdW5kZWZpbmVkO1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGFuZ2VQYWdlKGlkLCAxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwYW5kIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBleHBhbmRlZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBleHBhbmQuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIG5vZGUgd2FzIGV4cGFuZGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGV4cGFuZChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSB8fCBub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKFxyXG4gICAgICAgIHsgLi4udGhpcy5nZXRGaWx0ZXIobm9kZSksIHBhcmVudElkOiBpZCB9LFxyXG4gICAgICAgIDFcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBubyBjaGlsZHJlbiwgc2V0IGhhc0NoaWxkcmVuIHRvIGZhbHNlXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgIC8vIGluc2VydCBwYWdlIG5vZGVzIGFmdGVyIHRoZSBjdXJyZW50IG5vZGVcclxuICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUhKTtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcGFnZU5vZGVzID0gdGhpcy5jcmVhdGVQYWdlTm9kZXMocGFnZSk7XHJcbiAgICAgICAgICAgIG5vZGVzLnNwbGljZShpbmRleCArIDEsIDAsIC4uLihwYWdlTm9kZXMgYXMgRVtdKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgICAgbm9kZSEuaGFzQ2hpbGRyZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBub2RlIS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4cGFuZEFsbChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gZ2V0IHRoZSBwYXJlbnQgbm9kZSB0byBzdGFydCBmcm9tXHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKG5vZGVJbmRleCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29sbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgSURzXHJcbiAgICBsZXQgaSA9IG5vZGVJbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZXNbbm9kZUluZGV4XS55KSB7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzVG9FeHBhbmQgPSBub2Rlcy5zbGljZShub2RlSW5kZXgsIGkpLm1hcCgobikgPT4gbi5pZCk7XHJcblxyXG4gICAgLy8gZXhwYW5kIGFsbCB0aGUgZGVzY2VuZGFudCBub2Rlc1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbm9kZXNUb0V4cGFuZC5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kKGlkKTtcclxuICAgICAgICB0aGlzLmV4cGFuZEFsbChpZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hpbGRyZW4oaWQ6IG51bWJlcik6IEVbXSB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgIGNvbnN0IGluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2hpbGRyZW46IEVbXSA9IFtdO1xyXG4gICAgbGV0IGkgPSBpbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZS55KSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZXNbaV0pO1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURlc2NlbmRhbnRzKFxyXG4gICAgbm9kZXM6IFBhZ2VkVHJlZU5vZGU8Rj5bXSxcclxuICAgIG5vZGVJbmRleDogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICBsZXQgaSA9IG5vZGVJbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZXNbbm9kZUluZGV4XS55KSB7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIG5vZGVzLnNwbGljZShub2RlSW5kZXggKyAxLCBpIC0gbm9kZUluZGV4IC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuIElmIHRoZSBub2RlIGlzIG5vdCBleHBhbmRhYmxlLFxyXG4gICAqIG9yIGl0IGlzIGFscmVhZHkgY29sbGFwc2VkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY29sbGFwc2UuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIG5vZGUgd2FzIGNvbGxhcHNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb2xsYXBzZShpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSB8fCAhbm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzIGFmdGVyIHRoZSBjdXJyZW50IG5vZGVcclxuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHJlamVjdChgTm9kZSBJRCAke2lkfSBub3QgZm91bmQgaW4gc3RvcmVgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVEZXNjZW5kYW50cyhub2Rlcywgbm9kZUluZGV4KTtcclxuICAgICAgICB0aGlzLl9ub2RlcyQubmV4dChub2Rlcyk7XHJcbiAgICAgICAgbm9kZSEuZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgcGFnZSBpbmNsdWRpbmcgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBwYXJlbnQgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgaW5zaWRlIHRoZSBwYWdlIHlvdSB3YW50IHRvIGNoYW5nZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgbmV3IHBhZ2UgbnVtYmVyLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIHRoZSBwYWdlIHdhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2UocGFyZW50SWQ6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IHBhcmVudElkKTtcclxuICAgICAgaWYgKCFwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihwYXJlbnROb2RlKSwgcGFyZW50SWQgfSxcclxuICAgICAgICBwYWdlTnVtYmVyXHJcbiAgICAgICkuc3Vic2NyaWJlKChwYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gaWYgcGFnZSBpcyBlbXB0eSBkbyBub3RoaW5nXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHNhbWUgcGFnZSBvZiBub2RlXHJcbiAgICAgICAgICAvLyB3aXRoIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKHBhcmVudE5vZGUhKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlXHJcbiAgICAgICAgICBsZXQgc3RhcnQgPSBub2RlSW5kZXg7XHJcbiAgICAgICAgICBjb25zdCBvbGRQYWdlTnIgPSBub2Rlc1tzdGFydF0ucGFnaW5nLnBhZ2VOdW1iZXI7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIHN0YXJ0ID4gMCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tzdGFydCAtIDFdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tzdGFydCAtIDFdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzdGFydC0tO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZmluZCB0aGUgbGFzdCBub2RlIG9mIHRoZSBub2RlJ3MgcGFnZSxcclxuICAgICAgICAgIC8vIGluY2x1ZGluZyBhbGwgdGhlaXIgZGVzY2VuZGFudHNcclxuICAgICAgICAgIGxldCBlbmQgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgICAgICAgd2hpbGUgKFxyXG4gICAgICAgICAgICBlbmQgPCBub2Rlcy5sZW5ndGggJiZcclxuICAgICAgICAgICAgbm9kZXNbZW5kXS5wYXJlbnRJZCA9PT0gcGFyZW50SWQgJiZcclxuICAgICAgICAgICAgbm9kZXNbZW5kXS5wYWdpbmcucGFnZU51bWJlciA9PT0gb2xkUGFnZU5yXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZW5kKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyByZXBsYWNlIGFsbCB0aGVzZSBub2RlcyB3aXRoIHRoZSBuZXcgb25lc1xyXG4gICAgICAgICAgbm9kZXMuc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIDAsIC4uLihwYWdlTm9kZXMgYXMgRVtdKSk7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhcmVudCBub2RlIHBhZ2luZyBpbmZvXHJcbiAgICAgICAgICBwYXJlbnROb2RlIS5wYWdpbmcucGFnZU51bWJlciA9IHBhZ2UucGFnZU51bWJlcjtcclxuICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbm9kZXMkLm5leHQoW3RoaXMuX3JhZGl4ISwgLi4udGhpcy5fcm9vdHNdKTtcclxuICB9XHJcbn1cclxuIl19
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFDRixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWdHdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQW9DekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFDVSxRQUFrQyxFQUMxQyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFHMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQXFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGFB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QUcsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUksU0FBaUIsQ0FBQyxDQUFDO29CQUM5QyxxQ0FBcUM7b0JBQ3JDLFVBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2Y7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBCZWhhdmlvclN1YmplY3QsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBmb3JrSm9pbixcclxuICBvZixcclxuICBzd2l0Y2hNYXAsXHJcbiAgdGFwLFxyXG59IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuL2xydS1jYWNoZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TIH0gZnJvbSAnLi9wYWdlZC1saXN0LnN0b3JlJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyZWUgbm9kZS4gWW91ciBkYXRhIHNlcnZpY2Ugc2hvdWxkIHJldHVybiBhIGxpc3Qgb2YgdGhlc2Ugbm9kZXNcclxuICogb3Igb2YgYW55IHR5cGUgZXh0ZW5kaW5nIHRoaXMgaW50ZXJmYWNlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUcmVlTm9kZSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBwYXJlbnRJZD86IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbiAgeDogbnVtYmVyO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdGFnPzogc3RyaW5nO1xyXG4gIGhhc0NoaWxkcmVuPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZmlsdGVyIGZvciB0cmVlIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUcmVlTm9kZUZpbHRlciB7XHJcbiAgdGFncz86IHN0cmluZ1tdO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogUGFnaW5nIGluZm9ybWF0aW9uIGZvciBhIHBhZ2VkIHRyZWUgbm9kZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5nSW5mbyB7XHJcbiAgcGFnZU51bWJlcjogbnVtYmVyO1xyXG4gIHBhZ2VDb3VudDogbnVtYmVyO1xyXG4gIHRvdGFsOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHRyZWUgbm9kZSB3aXRoIHBhZ2luZyBpbmZvcm1hdGlvbiwgdXNlZCBpbiBOb2RlQnJvd3NlclN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVOb2RlPEYgZXh0ZW5kcyBUcmVlTm9kZUZpbHRlcj4gZXh0ZW5kcyBUcmVlTm9kZSB7XHJcbiAgcGFnaW5nOiBQYWdpbmdJbmZvO1xyXG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcclxuICBmaWx0ZXI/OiBGO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc2VydmljZSB1c2VkIGJ5IE5vZGVCcm93c2VyU3RvcmVcclxuICogdG8gbG9hZCBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVTZXJ2aWNlPEYgZXh0ZW5kcyBUcmVlTm9kZUZpbHRlcj4ge1xyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgdGhlIHJvb3Qgbm9kZXMsIG9yIGp1c3QgdGhlIG9uZXMgaGF2aW5nIG9uZSBvZiB0aGUgc3BlY2lmaWVkXHJcbiAgICogdGFncy5cclxuICAgKiBAcGFyYW0gdGFncyBUaGUgb3B0aW9uYWwgdGFncyB0byBmaWx0ZXIgdGhlIHJvb3Qgbm9kZXMuXHJcbiAgICovXHJcbiAgZ2V0Um9vdE5vZGVzKHRhZ3M/OiBzdHJpbmdbXSk6IE9ic2VydmFibGU8VHJlZU5vZGVbXT47XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBhZ2Ugb2Ygbm9kZXMuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHBhZ2Ugc2l6ZS5cclxuICAgKi9cclxuICBnZXROb2RlcyhcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXJcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbGlzdCBvZiB1bmlxdWUgbm9kZSB0YWdzLiBFYWNoIHRhZyBjb3JyZXNwb25kcyB0byBhIHRyZWUsXHJcbiAgICogYXMgbm9kZXMgYXJlIHZpcnR1YWxseSBncm91cGVkIGJ5IHRoZWlyIHRhZy5cclxuICAgKi9cclxuICBnZXRUYWdzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+O1xyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGZvciBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgY2FjaGVTaXplOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY3VzdG9tIGZ1bmN0aW9uIGZvciBidWlsZGluZyB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXJcclxuICAgKiBhbmQgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgYnVpbGRDYWNoZUtleT86IChwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogYW55KSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHN0b3JlIGZvciB0aGUgbm9kZSBicm93c2VyIGNvbXBvbmVudC4gVGhpcyBzdG9yZSBpcyB1c2VkIHRvIGtlZXAgYVxyXG4gKiBsaXN0IG9mIG5vZGVzLCBhbmQgdG8gbG9hZCB0aGVtIGZyb20gdGhlIEFQSS4gSXQgYWxzbyBrZWVwcyB0aGUgcm9vdFxyXG4gKiBub2RlLiBFdmVyeSB0cmVlIG5vZGUgaW4gdGhlIGxpc3QgaXMgZXh0ZW5kZWQgd2l0aCBwYWdlIG51bWJlcixcclxuICogcGFnZSBjb3VudCBhbmQgdG90YWwgaXRlbXMsIHBsdXMgZXhwYW5zaW9uLXJlbGF0ZWQgbWV0YWRhdGEuXHJcbiAqIFRoZSBzdG9yZSBrZWVwcyBhIGZsYXQgbGlzdCBvZiB0aGVzZSB0cmVlIG5vZGVzLCBhbGxvd2luZyB1c2VycyB0b1xyXG4gKiBleHBhbmQgYW5kIGNvbGxhcHNlIHRoZW0uXHJcbiAqIEYgaXMgdGhlIHR5cGUgb2YgdGhlIGZpbHRlciBvYmplY3QsIEUgaXMgdGhlIHR5cGUgb2YgdGhlIHBhZ2VkIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGFnZWRUcmVlU3RvcmU8XHJcbiAgRSBleHRlbmRzIFBhZ2VkVHJlZU5vZGU8Rj4sXHJcbiAgRiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyXHJcbj4ge1xyXG4gIHByaXZhdGUgX3JhZGl4PzogRTtcclxuICBwcml2YXRlIF9yYWRpeExhYmVsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcm9vdHM6IEVbXTtcclxuICBwcml2YXRlIF9ub2RlcyQ6IEJlaGF2aW9yU3ViamVjdDxFW10+O1xyXG4gIHByaXZhdGUgX3RhZ3MkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlOiBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+O1xyXG5cclxuICBwcml2YXRlIF9wYWdlU2l6ZTogbnVtYmVyO1xyXG4gIC8vIGRpcnR5IHN0YXRlOiB0aGlzIGlzIHJlc2V0IHdoZW4gdGhlIHN0b3JlIGlzIHJlc2V0LCBhbmQgc2V0IHRvIHRydWVcclxuICAvLyB3aGVuIHRoZSBzdG9yZSBpcyBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBfZGlydHk/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIHBhZ2VkIG5vZGVzIGluIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIG5vZGVzJDogT2JzZXJ2YWJsZTxSZWFkb25seTxFW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGxpc3Qgb2YgdHJlZSB0YWdzIGluIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIHRhZ3MkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PHN0cmluZ1tdPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnbG9iYWwgbm9kZXMgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KHRoaXMuX3JhZGl4Py5sYWJlbCB8fCB0aGlzLl9yYWRpeExhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3RvcmUuXHJcbiAgICogQHBhcmFtIF9zZXJ2aWNlIFRoZSBzZXJ2aWNlIHVzZWQgdG8gbG9hZCBub2Rlcy5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBjb25maWd1cmUgdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkVHJlZVN0b3JlU2VydmljZTxGPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+KG9wdGlvbnMuY2FjaGVTaXplKTtcclxuICAgIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlciA9IG9wdGlvbnMuYnVpbGRDYWNoZUtleTtcclxuICAgIHRoaXMuX3JhZGl4TGFiZWwgPSAnKHJvb3QpJztcclxuICAgIHRoaXMuX3Jvb3RzID0gW107XHJcbiAgICB0aGlzLl9ub2RlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVbXT4oW10pO1xyXG4gICAgdGhpcy5ub2RlcyQgPSB0aGlzLl9ub2RlcyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLl90YWdzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcclxuICAgIHRoaXMudGFncyQgPSB0aGlzLl90YWdzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEY+KHt9IGFzIEYpO1xyXG4gICAgdGhpcy5maWx0ZXIkID0gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgIHRoaXMudXBkYXRlVGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VydmljZS5nZXRUYWdzKCkuc3Vic2NyaWJlKCh0YWdzKSA9PiB7XHJcbiAgICAgIHRoaXMuX3RhZ3MkLm5leHQodGFncyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdsb2JhbCBmaWx0ZXIsIGV2ZW50dWFsbHkgb3ZlcnJpZGRlbiB3aXRoIHZhbHVlc1xyXG4gICAqIGZyb20gdGhlIHNwZWNpZmllZCBub2RlJ3MgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBvcHRpb25hbCBub2RlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIobm9kZT86IFBhZ2VkVHJlZU5vZGU8Rj4pOiBGIHtcclxuICAgIHJldHVybiBub2RlPy5maWx0ZXJcclxuICAgICAgPyB7XHJcbiAgICAgICAgICAuLi50aGlzLl9maWx0ZXIkLnZhbHVlLFxyXG4gICAgICAgICAgLi4ubm9kZS5maWx0ZXIsXHJcbiAgICAgICAgfVxyXG4gICAgICA6IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBub2Rlcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Tm9kZXMoKTogUmVhZG9ubHk8UGFnZWRUcmVlTm9kZTxGPltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBub2RlcyB0YWdzLlxyXG4gICAqIEByZXR1cm5zIFRoZSB0YWdzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRUYWdzKCk6IFJlYWRvbmx5PHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFncyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXIgYW5kIGZpbHRlci5cclxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgYSBzdHJpbmdpZmllZCBvYmplY3RcclxuICAgKiBjb250YWluaW5nIHRoZSBwYWdlIG51bWJlciBhbmQgdGhlIGZpbHRlci4gWW91IG1heSBvdmVycmlkZVxyXG4gICAqIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgYSBjdXN0b20gY2FjaGUga2V5LlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgcHVibGljIGJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IEYpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBwYWdlTnVtYmVyLCAuLi5maWx0ZXIgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VHJlZU5vZGU+PiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIGNvbnN0IHBhZ2VJbkNhY2hlID0gdGhpcy5fY2FjaGUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKHBhZ2VJbkNhY2hlKSB7XHJcbiAgICAgIHJldHVybiBvZihwYWdlSW5DYWNoZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmljZS5nZXROb2RlcyhmaWx0ZXIsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VTaXplKS5waXBlKFxyXG4gICAgICAgIHRhcCgocGFnZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IFBhZ2VkVHJlZU5vZGU8Rj5bXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGZpbHRlciBmb3IgdGhpcyBzdG9yZS4gV2hlbmV2ZXIgdGhlIGZpbHRlciBpcyBzZXQsXHJcbiAgICogdGhlIHN0b3JlIGlzIHJlc2V0LlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcmFkaXhMYWJlbCBUaGUgbGFiZWwgb2YgdGhlIHJhZGl4IG5vZGUsIGlmIHRoaXMgbmVlZHMgdG8gYmUgc2V0LlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGLCByYWRpeExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCh0aGlzLl9yYWRpeD8ubGFiZWwgfHwgcmFkaXhMYWJlbCB8fCB0aGlzLl9yYWRpeExhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBzdG9yZSwgbG9hZGluZyB0aGUgcm9vdCBub2RlcyBhbmQgdGhlaXIgY2hpbGRyZW4uXHJcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvZiB0aGUgcmFkaXggbm9kZS5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQobGFiZWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCF0aGlzLl9kaXJ0eSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9maWx0ZXIkLnZhbHVlO1xyXG4gICAgdGhpcy5fcmFkaXggPSB7XHJcbiAgICAgIGlkOiAwLFxyXG4gICAgICB5OiAwLFxyXG4gICAgICB4OiAxLFxyXG4gICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgIHBhZ2VOdW1iZXI6IDAsXHJcbiAgICAgICAgcGFnZUNvdW50OiAwLFxyXG4gICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICB9LFxyXG4gICAgfSBhcyBFO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Um9vdE5vZGVzKGZpbHRlci50YWdzKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChub2RlcykgPT4ge1xyXG4gICAgICAgICAgICAvLyBubyByb290cywgY2xlYXIgYW5kIHJldHVybiBlbXB0eSBzZXRcclxuICAgICAgICAgICAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cyA9IFtdO1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gZ290IHJvb3RzLCBzZXQgdGhlbSBhbmQgZ2V0IHRoZWlyIGNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdHMgPSBub2Rlcy5tYXAoXHJcbiAgICAgICAgICAgICAgICAobm9kZSkgPT5cclxuICAgICAgICAgICAgICAgICAgKHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogMSxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgRSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIGZldGNoIGNoaWxkcmVuIGZvciBlYWNoIHJvb3Qgbm9kZVxyXG4gICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RzLm1hcCgocm9vdCkgPT5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5maWx0ZXIsIHBhcmVudElkOiByb290LmlkIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocGFnZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHBhZ2VzLnNvbWUoKHBhZ2UpID0+IHBhZ2UudG90YWwpKSB7XHJcbiAgICAgICAgICAgICAgLy8gcmFkaXhcclxuICAgICAgICAgICAgICB0aGlzLl9yYWRpeCEuaGFzQ2hpbGRyZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JhZGl4IS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmFkaXghLnBhZ2luZyA9IHtcclxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlQ291bnQ6IDEsXHJcbiAgICAgICAgICAgICAgICB0b3RhbDogcGFnZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgLy8gcm9vdHNcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cy5mb3JFYWNoKChyb290LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb290Lmhhc0NoaWxkcmVuID0gISFwYWdlc1tpXS50b3RhbDtcclxuICAgICAgICAgICAgICAgIHJvb3QuZXhwYW5kZWQgPSAhIXBhZ2VzW2ldLnRvdGFsO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fcm9vdHMuZmxhdE1hcCgocm9vdCwgaSkgPT4gW1xyXG4gICAgICAgICAgICAgICAgcm9vdCxcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2VzW2ldKSxcclxuICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dChbdGhpcy5fcmFkaXghLCAuLi4obm9kZXMgYXMgRVtdKV0pO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdHMuZm9yRWFjaCgocm9vdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcm9vdC5oYXNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcm9vdC5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KFt0aGlzLl9yYWRpeCEsIC4uLnRoaXMuX3Jvb3RzXSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbm9kZSBmaWx0ZXIgZm9yIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC5cclxuICAgKiBAcGFyYW0gaWQgVGhlIG5vZGUgSUQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHNldC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiBmaWx0ZXIgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXROb2RlRmlsdGVyKGlkOiBudW1iZXIsIGZpbHRlcj86IEYgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgIHJlamVjdChgTm9kZSBJRCAke2lkfSBub3QgZm91bmQgaW4gc3RvcmVgKTtcclxuICAgICAgfVxyXG4gICAgICBub2RlIS5maWx0ZXIgPSBmaWx0ZXIgfHwgdW5kZWZpbmVkO1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGFuZ2VQYWdlKGlkLCAxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwYW5kIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBleHBhbmRlZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBleHBhbmQuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIG5vZGUgd2FzIGV4cGFuZGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGV4cGFuZChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSB8fCBub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKFxyXG4gICAgICAgIHsgLi4udGhpcy5nZXRGaWx0ZXIobm9kZSksIHBhcmVudElkOiBpZCB9LFxyXG4gICAgICAgIDFcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBubyBjaGlsZHJlbiwgc2V0IGhhc0NoaWxkcmVuIHRvIGZhbHNlXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgIC8vIGluc2VydCBwYWdlIG5vZGVzIGFmdGVyIHRoZSBjdXJyZW50IG5vZGVcclxuICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUhKTtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcGFnZU5vZGVzID0gdGhpcy5jcmVhdGVQYWdlTm9kZXMocGFnZSk7XHJcbiAgICAgICAgICAgIG5vZGVzLnNwbGljZShpbmRleCArIDEsIDAsIC4uLihwYWdlTm9kZXMgYXMgRVtdKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgICAgbm9kZSEuaGFzQ2hpbGRyZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBub2RlIS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4cGFuZEFsbChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gZ2V0IHRoZSBwYXJlbnQgbm9kZSB0byBzdGFydCBmcm9tXHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKG5vZGVJbmRleCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29sbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgSURzXHJcbiAgICBsZXQgaSA9IG5vZGVJbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZXNbbm9kZUluZGV4XS55KSB7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzVG9FeHBhbmQgPSBub2Rlcy5zbGljZShub2RlSW5kZXgsIGkpLm1hcCgobikgPT4gbi5pZCk7XHJcblxyXG4gICAgLy8gZXhwYW5kIGFsbCB0aGUgZGVzY2VuZGFudCBub2Rlc1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbm9kZXNUb0V4cGFuZC5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kKGlkKTtcclxuICAgICAgICB0aGlzLmV4cGFuZEFsbChpZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hpbGRyZW4oaWQ6IG51bWJlcik6IEVbXSB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgIGNvbnN0IGluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2hpbGRyZW46IEVbXSA9IFtdO1xyXG4gICAgbGV0IGkgPSBpbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZS55KSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZXNbaV0pO1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURlc2NlbmRhbnRzKFxyXG4gICAgbm9kZXM6IFBhZ2VkVHJlZU5vZGU8Rj5bXSxcclxuICAgIG5vZGVJbmRleDogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICBsZXQgaSA9IG5vZGVJbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZXNbbm9kZUluZGV4XS55KSB7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIG5vZGVzLnNwbGljZShub2RlSW5kZXggKyAxLCBpIC0gbm9kZUluZGV4IC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuIElmIHRoZSBub2RlIGlzIG5vdCBleHBhbmRhYmxlLFxyXG4gICAqIG9yIGl0IGlzIGFscmVhZHkgY29sbGFwc2VkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY29sbGFwc2UuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIG5vZGUgd2FzIGNvbGxhcHNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb2xsYXBzZShpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSB8fCAhbm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzIGFmdGVyIHRoZSBjdXJyZW50IG5vZGVcclxuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHJlamVjdChgTm9kZSBJRCAke2lkfSBub3QgZm91bmQgaW4gc3RvcmVgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVEZXNjZW5kYW50cyhub2Rlcywgbm9kZUluZGV4KTtcclxuICAgICAgICB0aGlzLl9ub2RlcyQubmV4dChub2Rlcyk7XHJcbiAgICAgICAgbm9kZSEuZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgcGFnZSBpbmNsdWRpbmcgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBwYXJlbnQgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgaW5zaWRlIHRoZSBwYWdlIHlvdSB3YW50IHRvIGNoYW5nZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgbmV3IHBhZ2UgbnVtYmVyLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIHRoZSBwYWdlIHdhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2UocGFyZW50SWQ6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IHBhcmVudElkKTtcclxuICAgICAgaWYgKCFwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihwYXJlbnROb2RlKSwgcGFyZW50SWQgfSxcclxuICAgICAgICBwYWdlTnVtYmVyXHJcbiAgICAgICkuc3Vic2NyaWJlKChwYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gaWYgcGFnZSBpcyBlbXB0eSBkbyBub3RoaW5nXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHNhbWUgcGFnZSBvZiBub2RlXHJcbiAgICAgICAgICAvLyB3aXRoIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKHBhcmVudE5vZGUhKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlXHJcbiAgICAgICAgICBsZXQgc3RhcnQgPSBub2RlSW5kZXg7XHJcbiAgICAgICAgICBjb25zdCBvbGRQYWdlTnIgPSBub2Rlc1tzdGFydF0ucGFnaW5nLnBhZ2VOdW1iZXI7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIHN0YXJ0ID4gMCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tzdGFydCAtIDFdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tzdGFydCAtIDFdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzdGFydC0tO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZmluZCB0aGUgbGFzdCBub2RlIG9mIHRoZSBub2RlJ3MgcGFnZSxcclxuICAgICAgICAgIC8vIGluY2x1ZGluZyBhbGwgdGhlaXIgZGVzY2VuZGFudHNcclxuICAgICAgICAgIGxldCBlbmQgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgICAgICAgd2hpbGUgKFxyXG4gICAgICAgICAgICBlbmQgPCBub2Rlcy5sZW5ndGggJiZcclxuICAgICAgICAgICAgbm9kZXNbZW5kXS5wYXJlbnRJZCA9PT0gcGFyZW50SWQgJiZcclxuICAgICAgICAgICAgbm9kZXNbZW5kXS5wYWdpbmcucGFnZU51bWJlciA9PT0gb2xkUGFnZU5yXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZW5kKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyByZXBsYWNlIGFsbCB0aGVzZSBub2RlcyB3aXRoIHRoZSBuZXcgb25lc1xyXG4gICAgICAgICAgbm9kZXMuc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIDAsIC4uLihwYWdlTm9kZXMgYXMgRVtdKSk7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhcmVudCBub2RlIHBhZ2luZyBpbmZvXHJcbiAgICAgICAgICBwYXJlbnROb2RlIS5wYWdpbmcucGFnZU51bWJlciA9IHBhZ2UucGFnZU51bWJlcjtcclxuICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbm9kZXMkLm5leHQoW3RoaXMuX3JhZGl4ISwgLi4udGhpcy5fcm9vdHNdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgYW5kIGZpbHRlciBpcyBpbiBjYWNoZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHBhZ2UgaXMgaW4gY2FjaGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgaGFzQ2FjaGVkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGUuaGFzKGtleSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -186,11 +186,11 @@ class LRUCache {
186
186
  * considered.
187
187
  */
188
188
  constructor(maxSize, considerSize = false) {
189
- this.maxSize = maxSize;
190
- this.totalSize = 0;
191
- this.considerSize = considerSize;
192
- this.cache = new Map();
193
- this.sizes = new Map();
189
+ this._maxSize = maxSize;
190
+ this._totalSize = 0;
191
+ this._considerSize = considerSize;
192
+ this._cache = new Map();
193
+ this._sizes = new Map();
194
194
  }
195
195
  /**
196
196
  * Get an item from the cache.
@@ -198,13 +198,21 @@ class LRUCache {
198
198
  * @returns The item or undefined if the item is not in the cache.
199
199
  */
200
200
  get(key) {
201
- let item = this.cache.get(key);
201
+ let item = this._cache.get(key);
202
202
  if (item) {
203
- this.cache.delete(key);
204
- this.cache.set(key, item);
203
+ this._cache.delete(key);
204
+ this._cache.set(key, item);
205
205
  }
206
206
  return item;
207
207
  }
208
+ /**
209
+ * Check if an item is in the cache.
210
+ * @param key The key of the item to check.
211
+ * @returns True if the item is in cache.
212
+ */
213
+ has(key) {
214
+ return this._cache.has(key);
215
+ }
208
216
  /**
209
217
  * Put an item in the cache.
210
218
  * @param key The key of the item to put.
@@ -214,26 +222,26 @@ class LRUCache {
214
222
  * considerSize is true.
215
223
  */
216
224
  put(key, item, size) {
217
- this.cache.delete(key);
218
- this.cache.set(key, item);
219
- this.sizes.set(key, size);
220
- if (this.considerSize) {
221
- this.totalSize += size;
222
- while (this.totalSize > this.maxSize) {
223
- const oldestKey = this.cache.keys().next().value;
224
- let oldestSize = this.sizes.get(oldestKey);
225
+ this._cache.delete(key);
226
+ this._cache.set(key, item);
227
+ this._sizes.set(key, size);
228
+ if (this._considerSize) {
229
+ this._totalSize += size;
230
+ while (this._totalSize > this._maxSize) {
231
+ const oldestKey = this._cache.keys().next().value;
232
+ let oldestSize = this._sizes.get(oldestKey);
225
233
  if (oldestSize) {
226
- this.totalSize -= oldestSize;
234
+ this._totalSize -= oldestSize;
227
235
  }
228
- this.cache.delete(oldestKey);
229
- this.sizes.delete(oldestKey);
236
+ this._cache.delete(oldestKey);
237
+ this._sizes.delete(oldestKey);
230
238
  }
231
239
  }
232
240
  else {
233
- while (this.cache.size > this.maxSize) {
234
- const oldestKey = this.cache.keys().next().value;
235
- this.cache.delete(oldestKey);
236
- this.sizes.delete(oldestKey);
241
+ while (this._cache.size > this._maxSize) {
242
+ const oldestKey = this._cache.keys().next().value;
243
+ this._cache.delete(oldestKey);
244
+ this._sizes.delete(oldestKey);
237
245
  }
238
246
  }
239
247
  }
@@ -241,9 +249,9 @@ class LRUCache {
241
249
  * Clear the cache.
242
250
  */
243
251
  clear() {
244
- this.cache.clear();
245
- this.sizes.clear();
246
- this.totalSize = 0;
252
+ this._cache.clear();
253
+ this._sizes.clear();
254
+ this._totalSize = 0;
247
255
  }
248
256
  /**
249
257
  * Estimate the size of an object in bytes.
@@ -413,6 +421,22 @@ class PagedListStore {
413
421
  this._cache.clear();
414
422
  return this.setFilter({});
415
423
  }
424
+ /**
425
+ * Clear the cache.
426
+ */
427
+ clearCache() {
428
+ this._cache.clear();
429
+ }
430
+ /**
431
+ * Check if the page with the given number and filter is in cache.
432
+ * @param pageNumber The page number.
433
+ * @param filter The filter.
434
+ * @returns True if the page is in cache, false otherwise.
435
+ */
436
+ hasCachedPage(pageNumber, filter) {
437
+ const key = this.buildCacheKey(pageNumber, filter);
438
+ return this._cache.has(key);
439
+ }
416
440
  }
417
441
 
418
442
  /**
@@ -829,6 +853,22 @@ class PagedTreeStore {
829
853
  collapseAll() {
830
854
  this._nodes$.next([this._radix, ...this._roots]);
831
855
  }
856
+ /**
857
+ * Clear the cache.
858
+ */
859
+ clearCache() {
860
+ this._cache.clear();
861
+ }
862
+ /**
863
+ * Check if the page with the given number and filter is in cache.
864
+ * @param pageNumber The page number.
865
+ * @param filter The filter.
866
+ * @returns True if the page is in cache, false otherwise.
867
+ */
868
+ hasCachedPage(pageNumber, filter) {
869
+ const key = this.buildCacheKey(pageNumber, filter);
870
+ return this._cache.has(key);
871
+ }
832
872
  }
833
873
 
834
874
  class PagedDataBrowsersModule {
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-paged-data-browsers.mjs","sources":["../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/lru-cache.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-list.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-tree.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/paged-data-browsers.module.ts","../../../../projects/myrmidon/paged-data-browsers/src/public-api.ts","../../../../projects/myrmidon/paged-data-browsers/src/myrmidon-paged-data-browsers.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagingInfo } from '../../services/paged-tree.store';\n\n@Component({\n selector: 'pdb-compact-pager',\n templateUrl: './compact-pager.component.html',\n styleUrls: ['./compact-pager.component.scss'],\n})\nexport class CompactPagerComponent {\n @Input()\n public paging: PagingInfo;\n\n @Output()\n public pagingChange: EventEmitter<PagingInfo>;\n\n constructor() {\n this.paging = {\n pageNumber: 0,\n pageCount: 0,\n total: 0,\n };\n this.pagingChange = new EventEmitter<PagingInfo>();\n }\n\n public onFirst(): void {\n this.paging = { ...this.paging, pageNumber: 1 };\n this.pagingChange.emit(this.paging);\n }\n\n public onPrevious(): void {\n if (this.paging.pageNumber > 1) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber - 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onNext(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber + 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onLast(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageCount };\n this.pagingChange.emit(this.paging);\n }\n }\n}\n","<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n","import { Component, Input, OnChanges } from '@angular/core';\n\n@Component({\n selector: 'pdb-range-view',\n templateUrl: './range-view.component.html',\n styleUrls: ['./range-view.component.scss'],\n})\nexport class RangeViewComponent implements OnChanges {\n /**\n * The domain of the range view (start, limit).\n */\n @Input() public domain: Array<number>;\n /**\n * The range of the range view (start, limit).\n */\n @Input() public range: Array<number>;\n /**\n * The width of the component.\n */\n @Input() public width: number;\n /**\n * The height of the component.\n */\n @Input() public height: number;\n\n public scaledRange: Array<number>;\n\n constructor() {\n this.domain = [0, 100];\n this.range = [0, 100];\n this.width = 100;\n this.height = 5;\n this.scaledRange = [];\n }\n\n ngOnChanges() {\n const domainWidth = this.domain[1] - this.domain[0];\n const rangeWidth = this.range[1] - this.range[0];\n const rangeStart = this.range[0] - this.domain[0];\n\n this.scaledRange = [\n (rangeStart / domainWidth) * this.width,\n ((rangeStart + rangeWidth) / domainWidth) * this.width,\n ];\n }\n}\n","<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagedTreeNode, PagingInfo } from '../../services/paged-tree.store';\n\nexport interface PageChangeRequest {\n node: PagedTreeNode<any>;\n paging: PagingInfo;\n}\n\n/**\n * Browser tree node component view. This wraps some HTML content providing\n * a toggle button to expand/collapse the node, a paging control for the\n * node's children, and a button to edit the node's filter. You should then\n * provide the HTML content to display the node's data inside this component, e.g.\n * <pdb-browser-tree-node [node]=\"node\">\n * <your-node-view [node]=\"node\" />\n * <pdb-browser-tree-node>\n */\n@Component({\n selector: 'pdb-browser-tree-node',\n templateUrl: './browser-tree-node.component.html',\n styleUrls: ['./browser-tree-node.component.css'],\n})\nexport class BrowserTreeNodeComponent {\n private _node: PagedTreeNode<any> | undefined | null;\n\n /**\n * The node to display.\n */\n @Input()\n public get node(): PagedTreeNode<any> | undefined | null {\n return this._node;\n }\n\n public set node(value: PagedTreeNode<any> | undefined | null) {\n if (this._node === value) {\n return;\n }\n this._node = value;\n }\n\n /**\n * The paging information for the node's children.\n */\n @Input()\n paging?: PagingInfo;\n\n /**\n * True to show debug information.\n */\n @Input()\n public debug?: boolean;\n\n @Input()\n public hidePaging?: boolean;\n\n /**\n * Emits when the user wants to toggle the expanded state of the node.\n */\n @Output()\n public toggleExpandedRequest: EventEmitter<PagedTreeNode<any>>;\n\n /**\n * Emits when the user wants to change the page number of the node's children.\n */\n @Output()\n public changePageRequest: EventEmitter<PageChangeRequest>;\n\n @Output()\n public editNodeFilterRequest: EventEmitter<PagedTreeNode<any>>;\n\n constructor() {\n this.toggleExpandedRequest = new EventEmitter<PagedTreeNode<any>>();\n this.changePageRequest = new EventEmitter<PageChangeRequest>();\n this.editNodeFilterRequest = new EventEmitter<PagedTreeNode<any>>();\n }\n\n public onToggleExpanded(): void {\n if (!this._node) {\n return;\n }\n this.toggleExpandedRequest.emit(this._node as PagedTreeNode<any>);\n }\n\n public onPagingChange(node: PagedTreeNode<any>, paging: PagingInfo): void {\n this.changePageRequest.emit({\n node,\n paging,\n });\n }\n\n public onEditFilter(): void {\n if (this._node) {\n this.editNodeFilterRequest.emit(this._node);\n }\n }\n}\n","<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * A Least Recently Used cache that can be used to store any type of object.\r\n * The cache works in two modes: considering the size of the objects or not.\r\n * If the size is considered, the cache will have a maximum size and will\r\n * remove the oldest objects when the maximum size is reached. Note that\r\n * the size is only roughly estimated. This avoids removing too many\r\n * entries from the cache when the maximum is reached.\r\n * If the size is not considered, the cache will have a maximum number of\r\n * objects and will remove the oldest objects when the maximum number is\r\n * reached.\r\n */\r\nexport class LRUCache<T> {\r\n private maxSize: number;\r\n private totalSize: number;\r\n private considerSize: boolean;\r\n private cache: Map<string, T>;\r\n private sizes: Map<string, number>;\r\n\r\n /**\r\n * Creates a new cache.\r\n * @param maxSize The maximum size of the cache. This is either\r\n * the maximum number of items in the cache (when considerSize\r\n * is false) or the maximum total size of all items in the\r\n * cache in bytes (when considerSize is true).\r\n * @param considerSize True if the size of the objects should be\r\n * considered.\r\n */\r\n constructor(maxSize: number, considerSize: boolean = false) {\r\n this.maxSize = maxSize;\r\n this.totalSize = 0;\r\n this.considerSize = considerSize;\r\n this.cache = new Map<string, T>();\r\n this.sizes = new Map<string, number>();\r\n }\r\n\r\n /**\r\n * Get an item from the cache.\r\n * @param key The key of the item to get.\r\n * @returns The item or undefined if the item is not in the cache.\r\n */\r\n public get(key: string): T | undefined {\r\n let item: T | undefined = this.cache.get(key);\r\n if (item) {\r\n this.cache.delete(key);\r\n this.cache.set(key, item);\r\n }\r\n return item;\r\n }\r\n\r\n /**\r\n * Put an item in the cache.\r\n * @param key The key of the item to put.\r\n * @param item The item to put.\r\n * @param size The estimated size of the item in bytes.\r\n * This must be calculated by the caller but only when\r\n * considerSize is true.\r\n */\r\n public put(key: string, item: T, size: number): void {\r\n this.cache.delete(key);\r\n this.cache.set(key, item);\r\n this.sizes.set(key, size);\r\n if (this.considerSize) {\r\n this.totalSize += size;\r\n while (this.totalSize > this.maxSize) {\r\n const oldestKey = this.cache.keys().next().value;\r\n let oldestSize = this.sizes.get(oldestKey);\r\n if (oldestSize) {\r\n this.totalSize -= oldestSize;\r\n }\r\n this.cache.delete(oldestKey);\r\n this.sizes.delete(oldestKey);\r\n }\r\n } else {\r\n while (this.cache.size > this.maxSize) {\r\n const oldestKey = this.cache.keys().next().value;\r\n this.cache.delete(oldestKey);\r\n this.sizes.delete(oldestKey);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clear(): void {\r\n this.cache.clear();\r\n this.sizes.clear();\r\n this.totalSize = 0;\r\n }\r\n\r\n /**\r\n * Estimate the size of an object in bytes.\r\n * @param obj The object to calculate the size of.\r\n * @returns The estimated size of the object in bytes.\r\n */\r\n public static calculateObjectSize(obj: any): number {\r\n if (!obj) {\r\n return 0;\r\n }\r\n let totalSize = 0;\r\n let keys = Object.keys(obj);\r\n for (let key of keys) {\r\n let value = obj[key];\r\n if (typeof value === 'string') {\r\n totalSize += value.length * 2;\r\n } else if (typeof value === 'number') {\r\n totalSize += 8;\r\n } else if (typeof value === 'boolean') {\r\n totalSize += 4;\r\n } else if (typeof value === 'object' && value !== null) {\r\n totalSize += this.calculateObjectSize(value);\r\n }\r\n }\r\n return totalSize;\r\n }\r\n}\r\n","import { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\n\r\n/**\r\n * Options for the paged list store.\r\n */\r\nexport interface PagedListStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * Default options for the paged list store.\r\n */\r\nexport const DEFAULT_PAGED_LIST_STORE_OPTIONS: PagedListStoreOptions = {\r\n pageSize: 20,\r\n cacheSize: 50,\r\n};\r\n\r\n/**\r\n * The interface to be implemented by the service used by PagedListStore.\r\n */\r\nexport interface PagedListStoreService<F, E> {\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The size of the page to load.\r\n * @param filter The filter to apply.\r\n */\r\n loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: F\r\n ): Observable<DataPage<E>>;\r\n}\r\n\r\n/**\r\n * A generic paged list store using a filter object of type F\r\n * and a list of elements of type E.\r\n */\r\nexport class PagedListStore<F, E> {\r\n private _pageSize: number;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private _page$: BehaviorSubject<DataPage<E>>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _cache: LRUCache<DataPage<E>>;\r\n\r\n /**\r\n * The page. It is updated when the page is changed or the filter is changed.\r\n */\r\n public page$: Observable<Readonly<DataPage<E>>>;\r\n\r\n /**\r\n * The filter. It is updated when the filter is changed.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Create a new paged list store.\r\n * @param options Options for the paged list store.\r\n */\r\n constructor(\r\n private _service: PagedListStoreService<F, E>,\r\n options: PagedListStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<E>>(options.cacheSize);\r\n // page\r\n this._page$ = new BehaviorSubject<DataPage<E>>({\r\n pageNumber: 0,\r\n pageCount: 0,\r\n pageSize: 0,\r\n total: 0,\r\n items: [],\r\n });\r\n this.page$ = this._page$.asObservable();\r\n // filter\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n }\r\n\r\n /**\r\n * Returns true if the store is empty, false otherwise.\r\n * @returns true if the store is empty, false otherwise.\r\n */\r\n public isEmpty(): boolean {\r\n return this._page$.value.items.length === 0;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n private buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber the page number to load.\r\n */\r\n private loadPage(pageNumber: number): Observable<DataPage<E>> {\r\n return this._service.loadPage(\r\n pageNumber,\r\n this._pageSize,\r\n this._filter$.value\r\n );\r\n }\r\n\r\n /**\r\n * Set the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The page size.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setPage(pageNumber: number, pageSize?: number): Promise<void> {\r\n if (pageSize && pageSize !== this._pageSize) {\r\n this._pageSize = pageSize;\r\n }\r\n return new Promise((resolve, reject) => {\r\n // if page is in cache, return it\r\n const key = this.buildCacheKey(pageNumber, this._filter$.value);\r\n const cachedPage = this._cache.get(key);\r\n if (cachedPage) {\r\n this._page$.next(cachedPage);\r\n resolve();\r\n return;\r\n }\r\n\r\n // else load page\r\n this.loadPage(pageNumber).subscribe({\r\n next: (page) => {\r\n this._page$.next(page);\r\n resolve();\r\n },\r\n error: reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the current page.\r\n * @returns The current page.\r\n */\r\n public getPage(): DataPage<E> {\r\n return this._page$.value;\r\n }\r\n\r\n /**\r\n * Apply the given filter and load the first page.\r\n * @param filter The filter to apply.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setFilter(filter: F): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this._filter$.next(filter);\r\n this.setPage(1).then(resolve, reject);\r\n });\r\n }\r\n\r\n /**\r\n * Get the current filter.\r\n * @returns The current filter.\r\n */\r\n public getFilter(): F {\r\n return this._filter$.value;\r\n }\r\n\r\n /**\r\n * Reset the filter and load the first page. The cache is cleared.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public reset(): Promise<void> {\r\n this._cache.clear();\r\n return this.setFilter({} as F);\r\n }\r\n}\r\n","import {\r\n BehaviorSubject,\r\n Observable,\r\n forkJoin,\r\n of,\r\n switchMap,\r\n tap,\r\n} from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\nimport { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';\r\n\r\n/**\r\n * A tree node. Your data service should return a list of these nodes\r\n * or of any type extending this interface.\r\n */\r\nexport interface TreeNode {\r\n id: number;\r\n parentId?: number;\r\n y: number;\r\n x: number;\r\n label: string;\r\n tag?: string;\r\n hasChildren?: boolean;\r\n}\r\n\r\n/**\r\n * A filter for tree nodes.\r\n */\r\nexport interface TreeNodeFilter {\r\n tags?: string[];\r\n parentId?: number;\r\n}\r\n\r\n/**\r\n * Paging information for a paged tree node.\r\n */\r\nexport interface PagingInfo {\r\n pageNumber: number;\r\n pageCount: number;\r\n total: number;\r\n}\r\n\r\n/**\r\n * A tree node with paging information, used in NodeBrowserStore.\r\n */\r\nexport interface PagedTreeNode<F extends TreeNodeFilter> extends TreeNode {\r\n paging: PagingInfo;\r\n expanded?: boolean;\r\n filter?: F;\r\n}\r\n\r\n/**\r\n * The interface to be implemented by the service used by NodeBrowserStore\r\n * to load nodes.\r\n */\r\nexport interface PagedTreeStoreService<F extends TreeNodeFilter> {\r\n /**\r\n * Get all the root nodes, or just the ones having one of the specified\r\n * tags.\r\n * @param tags The optional tags to filter the root nodes.\r\n */\r\n getRootNodes(tags?: string[]): Observable<TreeNode[]>;\r\n\r\n /**\r\n * Get the specified page of nodes.\r\n * @param filter The filter.\r\n * @param pageNumber The page number.\r\n * @param pageSize The page size.\r\n */\r\n getNodes(\r\n filter: F,\r\n pageNumber: number,\r\n pageSize: number\r\n ): Observable<DataPage<TreeNode>>;\r\n\r\n /**\r\n * Get the list of unique node tags. Each tag corresponds to a tree,\r\n * as nodes are virtually grouped by their tag.\r\n */\r\n getTags(): Observable<string[]>;\r\n}\r\n\r\n/**\r\n * Options for the NodeBrowserStore.\r\n */\r\nexport interface PagedTreeStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * A store for the node browser component. This store is used to keep a\r\n * list of nodes, and to load them from the API. It also keeps the root\r\n * node. Every tree node in the list is extended with page number,\r\n * page count and total items, plus expansion-related metadata.\r\n * The store keeps a flat list of these tree nodes, allowing users to\r\n * expand and collapse them.\r\n * F is the type of the filter object, E is the type of the paged tree nodes.\r\n */\r\nexport class PagedTreeStore<\r\n E extends PagedTreeNode<F>,\r\n F extends TreeNodeFilter\r\n> {\r\n private _radix?: E;\r\n private _radixLabel: string;\r\n private _roots: E[];\r\n private _nodes$: BehaviorSubject<E[]>;\r\n private _tags$: BehaviorSubject<string[]>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private readonly _cache: LRUCache<DataPage<TreeNode>>;\r\n\r\n private _pageSize: number;\r\n // dirty state: this is reset when the store is reset, and set to true\r\n // when the store is changed\r\n private _dirty?: boolean;\r\n\r\n /**\r\n * The flat list of paged nodes in this store.\r\n */\r\n public nodes$: Observable<Readonly<E[]>>;\r\n\r\n /**\r\n * The list of tree tags in this store.\r\n */\r\n public tags$: Observable<Readonly<string[]>>;\r\n\r\n /**\r\n * The global nodes filter.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset(this._radix?.label || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Create an instance of the store.\r\n * @param _service The service used to load nodes.\r\n * @param options The options to configure this store.\r\n */\r\n constructor(\r\n private _service: PagedTreeStoreService<F>,\r\n options: PagedTreeStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<TreeNode>>(options.cacheSize);\r\n this._customCacheKeyBuilder = options.buildCacheKey;\r\n this._radixLabel = '(root)';\r\n this._roots = [];\r\n this._nodes$ = new BehaviorSubject<E[]>([]);\r\n this.nodes$ = this._nodes$.asObservable();\r\n this._tags$ = new BehaviorSubject<string[]>([]);\r\n this.tags$ = this._tags$.asObservable();\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n this._dirty = true;\r\n this.updateTags();\r\n }\r\n\r\n private updateTags(): void {\r\n this._service.getTags().subscribe((tags) => {\r\n this._tags$.next(tags);\r\n });\r\n }\r\n\r\n /**\r\n * Gets the global filter, eventually overridden with values\r\n * from the specified node's filter.\r\n * @param node The optional node.\r\n * @returns The filter.\r\n */\r\n private getFilter(node?: PagedTreeNode<F>): F {\r\n return node?.filter\r\n ? {\r\n ...this._filter$.value,\r\n ...node.filter,\r\n }\r\n : this._filter$.value;\r\n }\r\n\r\n /**\r\n * Gets all the nodes in the store.\r\n * @returns The nodes.\r\n */\r\n public getNodes(): Readonly<PagedTreeNode<F>[]> {\r\n return this._nodes$.value;\r\n }\r\n\r\n /**\r\n * Gets the list of nodes tags.\r\n * @returns The tags.\r\n */\r\n public getTags(): Readonly<string[]> {\r\n return this._tags$.value;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n private buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n private getPageFromCacheOrServer(\r\n filter: F,\r\n pageNumber: number\r\n ): Observable<DataPage<TreeNode>> {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n const pageInCache = this._cache.get(key);\r\n\r\n if (pageInCache) {\r\n return of(pageInCache);\r\n } else {\r\n return this._service.getNodes(filter, pageNumber, this._pageSize).pipe(\r\n tap((page) => {\r\n this._cache.put(key, page, 0);\r\n })\r\n );\r\n }\r\n }\r\n\r\n private createPageNodes(page: DataPage<TreeNode>): PagedTreeNode<F>[] {\r\n return page.items.map((n) => {\r\n return {\r\n ...n,\r\n hasChildren: n.hasChildren,\r\n paging: {\r\n pageNumber: page.pageNumber,\r\n pageCount: page.pageCount,\r\n total: page.total,\r\n },\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Sets the filter for this store. Whenever the filter is set,\r\n * the store is reset.\r\n * @param filter The filter.\r\n * @param radixLabel The label of the radix node, if this needs to be set.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public setFilter(filter: F, radixLabel?: string): Promise<boolean> {\r\n if (this._filter$.value === filter) {\r\n return Promise.resolve(false);\r\n }\r\n this._filter$.next(filter);\r\n this._dirty = true;\r\n return this.reset(this._radix?.label || radixLabel || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Reset the store, loading the root nodes and their children.\r\n * @param label The label of the radix node.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public reset(label: string): Promise<boolean> {\r\n if (!this._dirty) {\r\n return Promise.resolve(false);\r\n }\r\n this._cache.clear();\r\n const filter = this._filter$.value;\r\n this._radix = {\r\n id: 0,\r\n y: 0,\r\n x: 1,\r\n label: label,\r\n paging: {\r\n pageNumber: 0,\r\n pageCount: 0,\r\n total: 0,\r\n },\r\n } as E;\r\n\r\n return new Promise<boolean>((resolve, reject) => {\r\n this._service\r\n .getRootNodes(filter.tags)\r\n .pipe(\r\n switchMap((nodes) => {\r\n // no roots, clear and return empty set\r\n if (!nodes || nodes.length === 0) {\r\n this._roots = [];\r\n return of([]);\r\n } else {\r\n // got roots, set them and get their children\r\n this._roots = nodes.map(\r\n (node) =>\r\n ({\r\n ...node,\r\n paging: {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: 1,\r\n },\r\n } as E)\r\n );\r\n // fetch children for each root node\r\n return forkJoin(\r\n this._roots.map((root) =>\r\n this.getPageFromCacheOrServer(\r\n { ...filter, parentId: root.id },\r\n 1\r\n )\r\n )\r\n );\r\n }\r\n })\r\n )\r\n .subscribe({\r\n next: (pages) => {\r\n this._dirty = false;\r\n if (pages.some((page) => page.total)) {\r\n // radix\r\n this._radix!.hasChildren = true;\r\n this._radix!.expanded = true;\r\n this._radix!.paging = {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: pages.length,\r\n };\r\n // roots\r\n this._roots.forEach((root, i) => {\r\n root.hasChildren = !!pages[i].total;\r\n root.expanded = !!pages[i].total;\r\n });\r\n const nodes = this._roots.flatMap((root, i) => [\r\n root,\r\n ...this.createPageNodes(pages[i]),\r\n ]);\r\n this._nodes$.next([this._radix!, ...(nodes as E[])]);\r\n resolve(true);\r\n } else {\r\n this._roots.forEach((root) => {\r\n root.hasChildren = false;\r\n root.expanded = false;\r\n });\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n resolve(true);\r\n }\r\n },\r\n error: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Set the node filter for the node with the specified ID.\r\n * @param id The node ID.\r\n * @param filter The filter to set.\r\n * @returns Promise with true if filter was set, false otherwise.\r\n */\r\n public setNodeFilter(id: number, filter?: F | null): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node) {\r\n reject(`Node ID ${id} not found in store`);\r\n }\r\n node!.filter = filter || undefined;\r\n return this.changePage(id, 1);\r\n });\r\n }\r\n\r\n /**\r\n * Expand the node with the specified ID. If the node is not expandable,\r\n * or it is already expanded, this method does nothing.\r\n * @param node The ID of the node to expand.\r\n * @returns Promise with true if the node was expanded, false otherwise.\r\n */\r\n public expand(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(node), parentId: id },\r\n 1\r\n ).subscribe((page) => {\r\n // no children, set hasChildren to false\r\n if (!page.total) {\r\n node!.hasChildren = false;\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // insert page nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node!);\r\n if (index === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n const pageNodes = this.createPageNodes(page);\r\n nodes.splice(index + 1, 0, ...(pageNodes as E[]));\r\n this._nodes$.next(nodes);\r\n node!.hasChildren = true;\r\n node!.expanded = true;\r\n resolve(true);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public expandAll(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n // get the parent node to start from\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.findIndex((n) => n.id === id);\r\n if (nodeIndex === -1) {\r\n return Promise.resolve(false);\r\n }\r\n\r\n // collect all the descendant nodes IDs\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n const nodesToExpand = nodes.slice(nodeIndex, i).map((n) => n.id);\r\n\r\n // expand all the descendant nodes\r\n return new Promise<boolean>((resolve, reject) => {\r\n nodesToExpand.forEach((id) => {\r\n this.expand(id);\r\n this.expandAll(id);\r\n });\r\n resolve(true);\r\n });\r\n }\r\n\r\n public getChildren(id: number): E[] {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false) {\r\n return [];\r\n }\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node);\r\n if (index === -1) {\r\n return [];\r\n }\r\n const children: E[] = [];\r\n let i = index + 1;\r\n while (i < nodes.length && nodes[i].y > node.y) {\r\n children.push(nodes[i]);\r\n i++;\r\n }\r\n return children;\r\n }\r\n\r\n private removeDescendants(\r\n nodes: PagedTreeNode<F>[],\r\n nodeIndex: number\r\n ): void {\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n nodes.splice(nodeIndex + 1, i - nodeIndex - 1);\r\n }\r\n\r\n /**\r\n * Collapse the node with the specified ID. If the node is not expandable,\r\n * or it is already collapsed, this method does nothing.\r\n * @param node The node to collapse.\r\n * @returns Promise with true if the node was collapsed, false otherwise.\r\n */\r\n public collapse(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || !node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n // remove all the descendant nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(node!);\r\n if (nodeIndex === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n this._dirty = true;\r\n this.removeDescendants(nodes, nodeIndex);\r\n this._nodes$.next(nodes);\r\n node!.expanded = false;\r\n resolve(true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Change the page including the node with the specified ID.\r\n * @param node The parent node whose children are inside the page you want to change.\r\n * @param pageNumber The new page number.\r\n * @returns Promise with true if the page was changed, false otherwise.\r\n */\r\n public changePage(parentId: number, pageNumber: number): Promise<boolean> {\r\n return new Promise<boolean>((resolve, reject) => {\r\n const parentNode = this._nodes$.value.find((n) => n.id === parentId);\r\n if (!parentNode) {\r\n resolve(false);\r\n }\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(parentNode), parentId },\r\n pageNumber\r\n ).subscribe((page) => {\r\n // if page is empty do nothing\r\n if (!page.total) {\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // remove all the nodes in the same page of node\r\n // with all their descendants\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(parentNode!) + 1;\r\n const pageNodes = this.createPageNodes(page);\r\n // find the first node of the node's page\r\n let start = nodeIndex;\r\n const oldPageNr = nodes[start].paging.pageNumber;\r\n while (\r\n start > 0 &&\r\n nodes[start - 1].parentId === parentId &&\r\n nodes[start - 1].paging.pageNumber === oldPageNr\r\n ) {\r\n start--;\r\n }\r\n // find the last node of the node's page,\r\n // including all their descendants\r\n let end = nodeIndex + 1;\r\n while (\r\n end < nodes.length &&\r\n nodes[end].parentId === parentId &&\r\n nodes[end].paging.pageNumber === oldPageNr\r\n ) {\r\n end++;\r\n }\r\n // replace all these nodes with the new ones\r\n nodes.splice(start, end - start);\r\n nodes.splice(start, 0, ...(pageNodes as E[]));\r\n // update the parent node paging info\r\n parentNode!.paging.pageNumber = page.pageNumber;\r\n this._nodes$.next(nodes);\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Collapse all the nodes in the store.\r\n */\r\n public collapseAll(): void {\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { CompactPagerComponent } from './components/compact-pager/compact-pager.component';\nimport { RangeViewComponent } from './components/range-view/range-view.component';\nimport { BrowserTreeNodeComponent } from './components/browser-tree-node/browser-tree-node.component';\n\n@NgModule({\n declarations: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n // material\n MatBadgeModule,\n MatButtonModule,\n MatChipsModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatSelectModule,\n MatTooltipModule,\n // myrmidon\n NgToolsModule\n ],\n exports: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n})\nexport class PagedDataBrowsersModule {}\n","/*\n * Public API Surface of paged-data-browsers\n */\n\nexport * from './lib/components/compact-pager/compact-pager.component';\nexport * from './lib/components/range-view/range-view.component';\nexport * from './lib/components/browser-tree-node/browser-tree-node.component';\n\nexport * from './lib/services/paged-list.store';\nexport * from './lib/services/paged-tree.store';\nexport * from './lib/services/lru-cache';\n\nexport * from './lib/paged-data-browsers.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i4","i6.CompactPagerComponent","i7.RangeViewComponent"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-paged-data-browsers.mjs","sources":["../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/lru-cache.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-list.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-tree.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/paged-data-browsers.module.ts","../../../../projects/myrmidon/paged-data-browsers/src/public-api.ts","../../../../projects/myrmidon/paged-data-browsers/src/myrmidon-paged-data-browsers.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagingInfo } from '../../services/paged-tree.store';\n\n@Component({\n selector: 'pdb-compact-pager',\n templateUrl: './compact-pager.component.html',\n styleUrls: ['./compact-pager.component.scss'],\n})\nexport class CompactPagerComponent {\n @Input()\n public paging: PagingInfo;\n\n @Output()\n public pagingChange: EventEmitter<PagingInfo>;\n\n constructor() {\n this.paging = {\n pageNumber: 0,\n pageCount: 0,\n total: 0,\n };\n this.pagingChange = new EventEmitter<PagingInfo>();\n }\n\n public onFirst(): void {\n this.paging = { ...this.paging, pageNumber: 1 };\n this.pagingChange.emit(this.paging);\n }\n\n public onPrevious(): void {\n if (this.paging.pageNumber > 1) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber - 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onNext(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber + 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onLast(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageCount };\n this.pagingChange.emit(this.paging);\n }\n }\n}\n","<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n","import { Component, Input, OnChanges } from '@angular/core';\n\n@Component({\n selector: 'pdb-range-view',\n templateUrl: './range-view.component.html',\n styleUrls: ['./range-view.component.scss'],\n})\nexport class RangeViewComponent implements OnChanges {\n /**\n * The domain of the range view (start, limit).\n */\n @Input() public domain: Array<number>;\n /**\n * The range of the range view (start, limit).\n */\n @Input() public range: Array<number>;\n /**\n * The width of the component.\n */\n @Input() public width: number;\n /**\n * The height of the component.\n */\n @Input() public height: number;\n\n public scaledRange: Array<number>;\n\n constructor() {\n this.domain = [0, 100];\n this.range = [0, 100];\n this.width = 100;\n this.height = 5;\n this.scaledRange = [];\n }\n\n ngOnChanges() {\n const domainWidth = this.domain[1] - this.domain[0];\n const rangeWidth = this.range[1] - this.range[0];\n const rangeStart = this.range[0] - this.domain[0];\n\n this.scaledRange = [\n (rangeStart / domainWidth) * this.width,\n ((rangeStart + rangeWidth) / domainWidth) * this.width,\n ];\n }\n}\n","<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagedTreeNode, PagingInfo } from '../../services/paged-tree.store';\n\nexport interface PageChangeRequest {\n node: PagedTreeNode<any>;\n paging: PagingInfo;\n}\n\n/**\n * Browser tree node component view. This wraps some HTML content providing\n * a toggle button to expand/collapse the node, a paging control for the\n * node's children, and a button to edit the node's filter. You should then\n * provide the HTML content to display the node's data inside this component, e.g.\n * <pdb-browser-tree-node [node]=\"node\">\n * <your-node-view [node]=\"node\" />\n * <pdb-browser-tree-node>\n */\n@Component({\n selector: 'pdb-browser-tree-node',\n templateUrl: './browser-tree-node.component.html',\n styleUrls: ['./browser-tree-node.component.css'],\n})\nexport class BrowserTreeNodeComponent {\n private _node: PagedTreeNode<any> | undefined | null;\n\n /**\n * The node to display.\n */\n @Input()\n public get node(): PagedTreeNode<any> | undefined | null {\n return this._node;\n }\n\n public set node(value: PagedTreeNode<any> | undefined | null) {\n if (this._node === value) {\n return;\n }\n this._node = value;\n }\n\n /**\n * The paging information for the node's children.\n */\n @Input()\n paging?: PagingInfo;\n\n /**\n * True to show debug information.\n */\n @Input()\n public debug?: boolean;\n\n @Input()\n public hidePaging?: boolean;\n\n /**\n * Emits when the user wants to toggle the expanded state of the node.\n */\n @Output()\n public toggleExpandedRequest: EventEmitter<PagedTreeNode<any>>;\n\n /**\n * Emits when the user wants to change the page number of the node's children.\n */\n @Output()\n public changePageRequest: EventEmitter<PageChangeRequest>;\n\n @Output()\n public editNodeFilterRequest: EventEmitter<PagedTreeNode<any>>;\n\n constructor() {\n this.toggleExpandedRequest = new EventEmitter<PagedTreeNode<any>>();\n this.changePageRequest = new EventEmitter<PageChangeRequest>();\n this.editNodeFilterRequest = new EventEmitter<PagedTreeNode<any>>();\n }\n\n public onToggleExpanded(): void {\n if (!this._node) {\n return;\n }\n this.toggleExpandedRequest.emit(this._node as PagedTreeNode<any>);\n }\n\n public onPagingChange(node: PagedTreeNode<any>, paging: PagingInfo): void {\n this.changePageRequest.emit({\n node,\n paging,\n });\n }\n\n public onEditFilter(): void {\n if (this._node) {\n this.editNodeFilterRequest.emit(this._node);\n }\n }\n}\n","<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * A Least Recently Used cache that can be used to store any type of object.\r\n * The cache works in two modes: considering the size of the objects or not.\r\n * If the size is considered, the cache will have a maximum size and will\r\n * remove the oldest objects when the maximum size is reached. Note that\r\n * the size is only roughly estimated. This avoids removing too many\r\n * entries from the cache when the maximum is reached.\r\n * If the size is not considered, the cache will have a maximum number of\r\n * objects and will remove the oldest objects when the maximum number is\r\n * reached.\r\n */\r\nexport class LRUCache<T> {\r\n private _maxSize: number;\r\n private _totalSize: number;\r\n private _considerSize: boolean;\r\n private _cache: Map<string, T>;\r\n private _sizes: Map<string, number>;\r\n\r\n /**\r\n * Creates a new cache.\r\n * @param maxSize The maximum size of the cache. This is either\r\n * the maximum number of items in the cache (when considerSize\r\n * is false) or the maximum total size of all items in the\r\n * cache in bytes (when considerSize is true).\r\n * @param considerSize True if the size of the objects should be\r\n * considered.\r\n */\r\n constructor(maxSize: number, considerSize: boolean = false) {\r\n this._maxSize = maxSize;\r\n this._totalSize = 0;\r\n this._considerSize = considerSize;\r\n this._cache = new Map<string, T>();\r\n this._sizes = new Map<string, number>();\r\n }\r\n\r\n /**\r\n * Get an item from the cache.\r\n * @param key The key of the item to get.\r\n * @returns The item or undefined if the item is not in the cache.\r\n */\r\n public get(key: string): T | undefined {\r\n let item: T | undefined = this._cache.get(key);\r\n if (item) {\r\n this._cache.delete(key);\r\n this._cache.set(key, item);\r\n }\r\n return item;\r\n }\r\n\r\n /**\r\n * Check if an item is in the cache.\r\n * @param key The key of the item to check.\r\n * @returns True if the item is in cache.\r\n */\r\n public has(key: string): boolean {\r\n return this._cache.has(key);\r\n }\r\n\r\n /**\r\n * Put an item in the cache.\r\n * @param key The key of the item to put.\r\n * @param item The item to put.\r\n * @param size The estimated size of the item in bytes.\r\n * This must be calculated by the caller but only when\r\n * considerSize is true.\r\n */\r\n public put(key: string, item: T, size: number): void {\r\n this._cache.delete(key);\r\n this._cache.set(key, item);\r\n this._sizes.set(key, size);\r\n if (this._considerSize) {\r\n this._totalSize += size;\r\n while (this._totalSize > this._maxSize) {\r\n const oldestKey = this._cache.keys().next().value;\r\n let oldestSize = this._sizes.get(oldestKey);\r\n if (oldestSize) {\r\n this._totalSize -= oldestSize;\r\n }\r\n this._cache.delete(oldestKey);\r\n this._sizes.delete(oldestKey);\r\n }\r\n } else {\r\n while (this._cache.size > this._maxSize) {\r\n const oldestKey = this._cache.keys().next().value;\r\n this._cache.delete(oldestKey);\r\n this._sizes.delete(oldestKey);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clear(): void {\r\n this._cache.clear();\r\n this._sizes.clear();\r\n this._totalSize = 0;\r\n }\r\n\r\n /**\r\n * Estimate the size of an object in bytes.\r\n * @param obj The object to calculate the size of.\r\n * @returns The estimated size of the object in bytes.\r\n */\r\n public static calculateObjectSize(obj: any): number {\r\n if (!obj) {\r\n return 0;\r\n }\r\n let totalSize = 0;\r\n let keys = Object.keys(obj);\r\n for (let key of keys) {\r\n let value = obj[key];\r\n if (typeof value === 'string') {\r\n totalSize += value.length * 2;\r\n } else if (typeof value === 'number') {\r\n totalSize += 8;\r\n } else if (typeof value === 'boolean') {\r\n totalSize += 4;\r\n } else if (typeof value === 'object' && value !== null) {\r\n totalSize += this.calculateObjectSize(value);\r\n }\r\n }\r\n return totalSize;\r\n }\r\n}\r\n","import { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\n\r\n/**\r\n * Options for the paged list store.\r\n */\r\nexport interface PagedListStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * Default options for the paged list store.\r\n */\r\nexport const DEFAULT_PAGED_LIST_STORE_OPTIONS: PagedListStoreOptions = {\r\n pageSize: 20,\r\n cacheSize: 50,\r\n};\r\n\r\n/**\r\n * The interface to be implemented by the service used by PagedListStore.\r\n */\r\nexport interface PagedListStoreService<F, E> {\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The size of the page to load.\r\n * @param filter The filter to apply.\r\n */\r\n loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: F\r\n ): Observable<DataPage<E>>;\r\n}\r\n\r\n/**\r\n * A generic paged list store using a filter object of type F\r\n * and a list of elements of type E.\r\n */\r\nexport class PagedListStore<F, E> {\r\n private _pageSize: number;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private _page$: BehaviorSubject<DataPage<E>>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _cache: LRUCache<DataPage<E>>;\r\n\r\n /**\r\n * The page. It is updated when the page is changed or the filter is changed.\r\n */\r\n public page$: Observable<Readonly<DataPage<E>>>;\r\n\r\n /**\r\n * The filter. It is updated when the filter is changed.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Create a new paged list store.\r\n * @param options Options for the paged list store.\r\n */\r\n constructor(\r\n private _service: PagedListStoreService<F, E>,\r\n options: PagedListStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<E>>(options.cacheSize);\r\n // page\r\n this._page$ = new BehaviorSubject<DataPage<E>>({\r\n pageNumber: 0,\r\n pageCount: 0,\r\n pageSize: 0,\r\n total: 0,\r\n items: [],\r\n });\r\n this.page$ = this._page$.asObservable();\r\n // filter\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n }\r\n\r\n /**\r\n * Returns true if the store is empty, false otherwise.\r\n * @returns true if the store is empty, false otherwise.\r\n */\r\n public isEmpty(): boolean {\r\n return this._page$.value.items.length === 0;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n public buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber the page number to load.\r\n */\r\n private loadPage(pageNumber: number): Observable<DataPage<E>> {\r\n return this._service.loadPage(\r\n pageNumber,\r\n this._pageSize,\r\n this._filter$.value\r\n );\r\n }\r\n\r\n /**\r\n * Set the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The page size.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setPage(pageNumber: number, pageSize?: number): Promise<void> {\r\n if (pageSize && pageSize !== this._pageSize) {\r\n this._pageSize = pageSize;\r\n }\r\n return new Promise((resolve, reject) => {\r\n // if page is in cache, return it\r\n const key = this.buildCacheKey(pageNumber, this._filter$.value);\r\n const cachedPage = this._cache.get(key);\r\n if (cachedPage) {\r\n this._page$.next(cachedPage);\r\n resolve();\r\n return;\r\n }\r\n\r\n // else load page\r\n this.loadPage(pageNumber).subscribe({\r\n next: (page) => {\r\n this._page$.next(page);\r\n resolve();\r\n },\r\n error: reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the current page.\r\n * @returns The current page.\r\n */\r\n public getPage(): DataPage<E> {\r\n return this._page$.value;\r\n }\r\n\r\n /**\r\n * Apply the given filter and load the first page.\r\n * @param filter The filter to apply.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setFilter(filter: F): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this._filter$.next(filter);\r\n this.setPage(1).then(resolve, reject);\r\n });\r\n }\r\n\r\n /**\r\n * Get the current filter.\r\n * @returns The current filter.\r\n */\r\n public getFilter(): F {\r\n return this._filter$.value;\r\n }\r\n\r\n /**\r\n * Reset the filter and load the first page. The cache is cleared.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public reset(): Promise<void> {\r\n this._cache.clear();\r\n return this.setFilter({} as F);\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clearCache(): void {\r\n this._cache.clear();\r\n }\r\n\r\n /**\r\n * Check if the page with the given number and filter is in cache.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns True if the page is in cache, false otherwise.\r\n */\r\n public hasCachedPage(pageNumber: number, filter: F): boolean {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n return this._cache.has(key);\r\n }\r\n}\r\n","import {\r\n BehaviorSubject,\r\n Observable,\r\n forkJoin,\r\n of,\r\n switchMap,\r\n tap,\r\n} from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\nimport { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';\r\n\r\n/**\r\n * A tree node. Your data service should return a list of these nodes\r\n * or of any type extending this interface.\r\n */\r\nexport interface TreeNode {\r\n id: number;\r\n parentId?: number;\r\n y: number;\r\n x: number;\r\n label: string;\r\n tag?: string;\r\n hasChildren?: boolean;\r\n}\r\n\r\n/**\r\n * A filter for tree nodes.\r\n */\r\nexport interface TreeNodeFilter {\r\n tags?: string[];\r\n parentId?: number;\r\n}\r\n\r\n/**\r\n * Paging information for a paged tree node.\r\n */\r\nexport interface PagingInfo {\r\n pageNumber: number;\r\n pageCount: number;\r\n total: number;\r\n}\r\n\r\n/**\r\n * A tree node with paging information, used in NodeBrowserStore.\r\n */\r\nexport interface PagedTreeNode<F extends TreeNodeFilter> extends TreeNode {\r\n paging: PagingInfo;\r\n expanded?: boolean;\r\n filter?: F;\r\n}\r\n\r\n/**\r\n * The interface to be implemented by the service used by NodeBrowserStore\r\n * to load nodes.\r\n */\r\nexport interface PagedTreeStoreService<F extends TreeNodeFilter> {\r\n /**\r\n * Get all the root nodes, or just the ones having one of the specified\r\n * tags.\r\n * @param tags The optional tags to filter the root nodes.\r\n */\r\n getRootNodes(tags?: string[]): Observable<TreeNode[]>;\r\n\r\n /**\r\n * Get the specified page of nodes.\r\n * @param filter The filter.\r\n * @param pageNumber The page number.\r\n * @param pageSize The page size.\r\n */\r\n getNodes(\r\n filter: F,\r\n pageNumber: number,\r\n pageSize: number\r\n ): Observable<DataPage<TreeNode>>;\r\n\r\n /**\r\n * Get the list of unique node tags. Each tag corresponds to a tree,\r\n * as nodes are virtually grouped by their tag.\r\n */\r\n getTags(): Observable<string[]>;\r\n}\r\n\r\n/**\r\n * Options for the NodeBrowserStore.\r\n */\r\nexport interface PagedTreeStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * A store for the node browser component. This store is used to keep a\r\n * list of nodes, and to load them from the API. It also keeps the root\r\n * node. Every tree node in the list is extended with page number,\r\n * page count and total items, plus expansion-related metadata.\r\n * The store keeps a flat list of these tree nodes, allowing users to\r\n * expand and collapse them.\r\n * F is the type of the filter object, E is the type of the paged tree nodes.\r\n */\r\nexport class PagedTreeStore<\r\n E extends PagedTreeNode<F>,\r\n F extends TreeNodeFilter\r\n> {\r\n private _radix?: E;\r\n private _radixLabel: string;\r\n private _roots: E[];\r\n private _nodes$: BehaviorSubject<E[]>;\r\n private _tags$: BehaviorSubject<string[]>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private readonly _cache: LRUCache<DataPage<TreeNode>>;\r\n\r\n private _pageSize: number;\r\n // dirty state: this is reset when the store is reset, and set to true\r\n // when the store is changed\r\n private _dirty?: boolean;\r\n\r\n /**\r\n * The flat list of paged nodes in this store.\r\n */\r\n public nodes$: Observable<Readonly<E[]>>;\r\n\r\n /**\r\n * The list of tree tags in this store.\r\n */\r\n public tags$: Observable<Readonly<string[]>>;\r\n\r\n /**\r\n * The global nodes filter.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset(this._radix?.label || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Create an instance of the store.\r\n * @param _service The service used to load nodes.\r\n * @param options The options to configure this store.\r\n */\r\n constructor(\r\n private _service: PagedTreeStoreService<F>,\r\n options: PagedTreeStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<TreeNode>>(options.cacheSize);\r\n this._customCacheKeyBuilder = options.buildCacheKey;\r\n this._radixLabel = '(root)';\r\n this._roots = [];\r\n this._nodes$ = new BehaviorSubject<E[]>([]);\r\n this.nodes$ = this._nodes$.asObservable();\r\n this._tags$ = new BehaviorSubject<string[]>([]);\r\n this.tags$ = this._tags$.asObservable();\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n this._dirty = true;\r\n this.updateTags();\r\n }\r\n\r\n private updateTags(): void {\r\n this._service.getTags().subscribe((tags) => {\r\n this._tags$.next(tags);\r\n });\r\n }\r\n\r\n /**\r\n * Gets the global filter, eventually overridden with values\r\n * from the specified node's filter.\r\n * @param node The optional node.\r\n * @returns The filter.\r\n */\r\n private getFilter(node?: PagedTreeNode<F>): F {\r\n return node?.filter\r\n ? {\r\n ...this._filter$.value,\r\n ...node.filter,\r\n }\r\n : this._filter$.value;\r\n }\r\n\r\n /**\r\n * Gets all the nodes in the store.\r\n * @returns The nodes.\r\n */\r\n public getNodes(): Readonly<PagedTreeNode<F>[]> {\r\n return this._nodes$.value;\r\n }\r\n\r\n /**\r\n * Gets the list of nodes tags.\r\n * @returns The tags.\r\n */\r\n public getTags(): Readonly<string[]> {\r\n return this._tags$.value;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n public buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n private getPageFromCacheOrServer(\r\n filter: F,\r\n pageNumber: number\r\n ): Observable<DataPage<TreeNode>> {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n const pageInCache = this._cache.get(key);\r\n\r\n if (pageInCache) {\r\n return of(pageInCache);\r\n } else {\r\n return this._service.getNodes(filter, pageNumber, this._pageSize).pipe(\r\n tap((page) => {\r\n this._cache.put(key, page, 0);\r\n })\r\n );\r\n }\r\n }\r\n\r\n private createPageNodes(page: DataPage<TreeNode>): PagedTreeNode<F>[] {\r\n return page.items.map((n) => {\r\n return {\r\n ...n,\r\n hasChildren: n.hasChildren,\r\n paging: {\r\n pageNumber: page.pageNumber,\r\n pageCount: page.pageCount,\r\n total: page.total,\r\n },\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Sets the filter for this store. Whenever the filter is set,\r\n * the store is reset.\r\n * @param filter The filter.\r\n * @param radixLabel The label of the radix node, if this needs to be set.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public setFilter(filter: F, radixLabel?: string): Promise<boolean> {\r\n if (this._filter$.value === filter) {\r\n return Promise.resolve(false);\r\n }\r\n this._filter$.next(filter);\r\n this._dirty = true;\r\n return this.reset(this._radix?.label || radixLabel || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Reset the store, loading the root nodes and their children.\r\n * @param label The label of the radix node.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public reset(label: string): Promise<boolean> {\r\n if (!this._dirty) {\r\n return Promise.resolve(false);\r\n }\r\n this._cache.clear();\r\n const filter = this._filter$.value;\r\n this._radix = {\r\n id: 0,\r\n y: 0,\r\n x: 1,\r\n label: label,\r\n paging: {\r\n pageNumber: 0,\r\n pageCount: 0,\r\n total: 0,\r\n },\r\n } as E;\r\n\r\n return new Promise<boolean>((resolve, reject) => {\r\n this._service\r\n .getRootNodes(filter.tags)\r\n .pipe(\r\n switchMap((nodes) => {\r\n // no roots, clear and return empty set\r\n if (!nodes || nodes.length === 0) {\r\n this._roots = [];\r\n return of([]);\r\n } else {\r\n // got roots, set them and get their children\r\n this._roots = nodes.map(\r\n (node) =>\r\n ({\r\n ...node,\r\n paging: {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: 1,\r\n },\r\n } as E)\r\n );\r\n // fetch children for each root node\r\n return forkJoin(\r\n this._roots.map((root) =>\r\n this.getPageFromCacheOrServer(\r\n { ...filter, parentId: root.id },\r\n 1\r\n )\r\n )\r\n );\r\n }\r\n })\r\n )\r\n .subscribe({\r\n next: (pages) => {\r\n this._dirty = false;\r\n if (pages.some((page) => page.total)) {\r\n // radix\r\n this._radix!.hasChildren = true;\r\n this._radix!.expanded = true;\r\n this._radix!.paging = {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: pages.length,\r\n };\r\n // roots\r\n this._roots.forEach((root, i) => {\r\n root.hasChildren = !!pages[i].total;\r\n root.expanded = !!pages[i].total;\r\n });\r\n const nodes = this._roots.flatMap((root, i) => [\r\n root,\r\n ...this.createPageNodes(pages[i]),\r\n ]);\r\n this._nodes$.next([this._radix!, ...(nodes as E[])]);\r\n resolve(true);\r\n } else {\r\n this._roots.forEach((root) => {\r\n root.hasChildren = false;\r\n root.expanded = false;\r\n });\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n resolve(true);\r\n }\r\n },\r\n error: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Set the node filter for the node with the specified ID.\r\n * @param id The node ID.\r\n * @param filter The filter to set.\r\n * @returns Promise with true if filter was set, false otherwise.\r\n */\r\n public setNodeFilter(id: number, filter?: F | null): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node) {\r\n reject(`Node ID ${id} not found in store`);\r\n }\r\n node!.filter = filter || undefined;\r\n return this.changePage(id, 1);\r\n });\r\n }\r\n\r\n /**\r\n * Expand the node with the specified ID. If the node is not expandable,\r\n * or it is already expanded, this method does nothing.\r\n * @param node The ID of the node to expand.\r\n * @returns Promise with true if the node was expanded, false otherwise.\r\n */\r\n public expand(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(node), parentId: id },\r\n 1\r\n ).subscribe((page) => {\r\n // no children, set hasChildren to false\r\n if (!page.total) {\r\n node!.hasChildren = false;\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // insert page nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node!);\r\n if (index === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n const pageNodes = this.createPageNodes(page);\r\n nodes.splice(index + 1, 0, ...(pageNodes as E[]));\r\n this._nodes$.next(nodes);\r\n node!.hasChildren = true;\r\n node!.expanded = true;\r\n resolve(true);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public expandAll(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n // get the parent node to start from\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.findIndex((n) => n.id === id);\r\n if (nodeIndex === -1) {\r\n return Promise.resolve(false);\r\n }\r\n\r\n // collect all the descendant nodes IDs\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n const nodesToExpand = nodes.slice(nodeIndex, i).map((n) => n.id);\r\n\r\n // expand all the descendant nodes\r\n return new Promise<boolean>((resolve, reject) => {\r\n nodesToExpand.forEach((id) => {\r\n this.expand(id);\r\n this.expandAll(id);\r\n });\r\n resolve(true);\r\n });\r\n }\r\n\r\n public getChildren(id: number): E[] {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false) {\r\n return [];\r\n }\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node);\r\n if (index === -1) {\r\n return [];\r\n }\r\n const children: E[] = [];\r\n let i = index + 1;\r\n while (i < nodes.length && nodes[i].y > node.y) {\r\n children.push(nodes[i]);\r\n i++;\r\n }\r\n return children;\r\n }\r\n\r\n private removeDescendants(\r\n nodes: PagedTreeNode<F>[],\r\n nodeIndex: number\r\n ): void {\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n nodes.splice(nodeIndex + 1, i - nodeIndex - 1);\r\n }\r\n\r\n /**\r\n * Collapse the node with the specified ID. If the node is not expandable,\r\n * or it is already collapsed, this method does nothing.\r\n * @param node The node to collapse.\r\n * @returns Promise with true if the node was collapsed, false otherwise.\r\n */\r\n public collapse(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || !node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n // remove all the descendant nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(node!);\r\n if (nodeIndex === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n this._dirty = true;\r\n this.removeDescendants(nodes, nodeIndex);\r\n this._nodes$.next(nodes);\r\n node!.expanded = false;\r\n resolve(true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Change the page including the node with the specified ID.\r\n * @param node The parent node whose children are inside the page you want to change.\r\n * @param pageNumber The new page number.\r\n * @returns Promise with true if the page was changed, false otherwise.\r\n */\r\n public changePage(parentId: number, pageNumber: number): Promise<boolean> {\r\n return new Promise<boolean>((resolve, reject) => {\r\n const parentNode = this._nodes$.value.find((n) => n.id === parentId);\r\n if (!parentNode) {\r\n resolve(false);\r\n }\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(parentNode), parentId },\r\n pageNumber\r\n ).subscribe((page) => {\r\n // if page is empty do nothing\r\n if (!page.total) {\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // remove all the nodes in the same page of node\r\n // with all their descendants\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(parentNode!) + 1;\r\n const pageNodes = this.createPageNodes(page);\r\n // find the first node of the node's page\r\n let start = nodeIndex;\r\n const oldPageNr = nodes[start].paging.pageNumber;\r\n while (\r\n start > 0 &&\r\n nodes[start - 1].parentId === parentId &&\r\n nodes[start - 1].paging.pageNumber === oldPageNr\r\n ) {\r\n start--;\r\n }\r\n // find the last node of the node's page,\r\n // including all their descendants\r\n let end = nodeIndex + 1;\r\n while (\r\n end < nodes.length &&\r\n nodes[end].parentId === parentId &&\r\n nodes[end].paging.pageNumber === oldPageNr\r\n ) {\r\n end++;\r\n }\r\n // replace all these nodes with the new ones\r\n nodes.splice(start, end - start);\r\n nodes.splice(start, 0, ...(pageNodes as E[]));\r\n // update the parent node paging info\r\n parentNode!.paging.pageNumber = page.pageNumber;\r\n this._nodes$.next(nodes);\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Collapse all the nodes in the store.\r\n */\r\n public collapseAll(): void {\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clearCache(): void {\r\n this._cache.clear();\r\n }\r\n\r\n /**\r\n * Check if the page with the given number and filter is in cache.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns True if the page is in cache, false otherwise.\r\n */\r\n public hasCachedPage(pageNumber: number, filter: F): boolean {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n return this._cache.has(key);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { CompactPagerComponent } from './components/compact-pager/compact-pager.component';\nimport { RangeViewComponent } from './components/range-view/range-view.component';\nimport { BrowserTreeNodeComponent } from './components/browser-tree-node/browser-tree-node.component';\n\n@NgModule({\n declarations: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n // material\n MatBadgeModule,\n MatButtonModule,\n MatChipsModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatSelectModule,\n MatTooltipModule,\n // myrmidon\n NgToolsModule\n ],\n exports: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n})\nexport class PagedDataBrowsersModule {}\n","/*\n * Public API Surface of paged-data-browsers\n */\n\nexport * from './lib/components/compact-pager/compact-pager.component';\nexport * from './lib/components/range-view/range-view.component';\nexport * from './lib/components/browser-tree-node/browser-tree-node.component';\n\nexport * from './lib/services/paged-list.store';\nexport * from './lib/services/paged-tree.store';\nexport * from './lib/services/lru-cache';\n\nexport * from './lib/paged-data-browsers.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i4","i6.CompactPagerComponent","i7.RangeViewComponent"],"mappings":"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"}
@@ -10,11 +10,11 @@
10
10
  * reached.
11
11
  */
12
12
  export declare class LRUCache<T> {
13
- private maxSize;
14
- private totalSize;
15
- private considerSize;
16
- private cache;
17
- private sizes;
13
+ private _maxSize;
14
+ private _totalSize;
15
+ private _considerSize;
16
+ private _cache;
17
+ private _sizes;
18
18
  /**
19
19
  * Creates a new cache.
20
20
  * @param maxSize The maximum size of the cache. This is either
@@ -31,6 +31,12 @@ export declare class LRUCache<T> {
31
31
  * @returns The item or undefined if the item is not in the cache.
32
32
  */
33
33
  get(key: string): T | undefined;
34
+ /**
35
+ * Check if an item is in the cache.
36
+ * @param key The key of the item to check.
37
+ * @returns True if the item is in cache.
38
+ */
39
+ has(key: string): boolean;
34
40
  /**
35
41
  * Put an item in the cache.
36
42
  * @param key The key of the item to put.
@@ -81,7 +81,7 @@ export declare class PagedListStore<F, E> {
81
81
  * @param filter The filter.
82
82
  * @returns A string to be used as cache key.
83
83
  */
84
- private buildCacheKey;
84
+ buildCacheKey(pageNumber: number, filter: F): string;
85
85
  /**
86
86
  * Load the page with the given number.
87
87
  * @param pageNumber the page number to load.
@@ -115,4 +115,15 @@ export declare class PagedListStore<F, E> {
115
115
  * @returns Promise which resolves when the page is loaded.
116
116
  */
117
117
  reset(): Promise<void>;
118
+ /**
119
+ * Clear the cache.
120
+ */
121
+ clearCache(): void;
122
+ /**
123
+ * Check if the page with the given number and filter is in cache.
124
+ * @param pageNumber The page number.
125
+ * @param filter The filter.
126
+ * @returns True if the page is in cache, false otherwise.
127
+ */
128
+ hasCachedPage(pageNumber: number, filter: F): boolean;
118
129
  }
@@ -153,7 +153,7 @@ export declare class PagedTreeStore<E extends PagedTreeNode<F>, F extends TreeNo
153
153
  * @param filter The filter.
154
154
  * @returns A string to be used as cache key.
155
155
  */
156
- private buildCacheKey;
156
+ buildCacheKey(pageNumber: number, filter: F): string;
157
157
  private getPageFromCacheOrServer;
158
158
  private createPageNodes;
159
159
  /**
@@ -205,4 +205,15 @@ export declare class PagedTreeStore<E extends PagedTreeNode<F>, F extends TreeNo
205
205
  * Collapse all the nodes in the store.
206
206
  */
207
207
  collapseAll(): void;
208
+ /**
209
+ * Clear the cache.
210
+ */
211
+ clearCache(): void;
212
+ /**
213
+ * Check if the page with the given number and filter is in cache.
214
+ * @param pageNumber The page number.
215
+ * @param filter The filter.
216
+ * @returns True if the page is in cache, false otherwise.
217
+ */
218
+ hasCachedPage(pageNumber: number, filter: F): boolean;
208
219
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/paged-data-browsers",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Generic simple paged data browsers.",
5
5
  "keywords": [
6
6
  "data browsers"