igniteui-angular 14.0.11 → 14.0.14

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.
@@ -26,9 +26,13 @@ export class IgxGridSelectionService {
26
26
  */
27
27
  this.pointerEventInGridBody = false;
28
28
  this._ranges = new Set();
29
- this.pointerOriginHandler = () => {
29
+ this.pointerOriginHandler = (event) => {
30
30
  this.pointerEventInGridBody = false;
31
31
  document.body.removeEventListener('pointerup', this.pointerOriginHandler);
32
+ const targetTagName = event.target.tagName.toLowerCase();
33
+ if (targetTagName !== 'igx-grid-cell' && targetTagName !== 'igx-tree-grid-cell') {
34
+ this.pointerUp(this._lastSelectedNode, this.grid.rangeSelected, true);
35
+ }
32
36
  };
33
37
  this.initPointerState();
34
38
  this.initKeyboardState();
@@ -145,6 +149,7 @@ export class IgxGridSelectionService {
145
149
  * and the start node of the `state`.
146
150
  */
147
151
  generateRange(node, state) {
152
+ this._lastSelectedNode = node;
148
153
  if (!state) {
149
154
  return {
150
155
  rowStart: node.row,
@@ -262,8 +267,8 @@ export class IgxGridSelectionService {
262
267
  }
263
268
  return true;
264
269
  }
265
- pointerUp(node, emitter) {
266
- if (this.dragMode) {
270
+ pointerUp(node, emitter, firedOutsideGrid) {
271
+ if (this.dragMode || firedOutsideGrid) {
267
272
  this.restoreTextSelection();
268
273
  this.addRangeMeta(node, this.pointerState);
269
274
  this.mergeMap(this.selection, this.temp);
@@ -654,4 +659,4 @@ IgxGridSelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.
654
659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: IgxGridSelectionService, decorators: [{
655
660
  type: Injectable
656
661
  }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i1.PlatformUtil }]; } });
657
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7OztBQWM1RixNQUFNLE9BQU8sdUJBQXVCO0lBdURoQyxZQUFvQixJQUFZLEVBQVksUUFBc0I7UUFBOUMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFZLGFBQVEsR0FBUixRQUFRLENBQWM7UUFyRDNELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsa0JBQWEsR0FBRyxFQUE2QixDQUFDO1FBQzlDLGlCQUFZLEdBQUcsRUFBNEIsQ0FBQztRQUM1QyxpQkFBWSxHQUFHLEVBQTJCLENBQUM7UUFFM0MsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQzNDLFNBQUksR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUN0QyxpQkFBWSxHQUFhLElBQUksR0FBRyxFQUFPLENBQUM7UUFDeEMsc0JBQWlCLEdBQWEsSUFBSSxHQUFHLEVBQU8sQ0FBQztRQUM3QyxvQkFBZSxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3hEOztXQUVHO1FBQ0ksdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUUxQzs7O1dBR0c7UUFDSywyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFHL0IsWUFBTyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBdXNCekMseUJBQW9CLEdBQUcsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxL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Z0MsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBSztRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7O29IQTl0QlEsdUJBQXVCO3dIQUF2Qix1QkFBdUI7MkZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICAgIEdyaWRTZWxlY3Rpb25SYW5nZSxcbiAgICBJQ29sdW1uU2VsZWN0aW9uU3RhdGUsXG4gICAgSU11bHRpUm93TGF5b3V0Tm9kZSxcbiAgICBJU2VsZWN0aW9uS2V5Ym9hcmRTdGF0ZSxcbiAgICBJU2VsZWN0aW9uTm9kZSxcbiAgICBJU2VsZWN0aW9uUG9pbnRlclN0YXRlLFxuICAgIFNlbGVjdGlvblN0YXRlXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgICBwdWJsaWMgZ3JpZDogR3JpZFR5cGU7XG4gICAgcHVibGljIGRyYWdNb2RlID0gZmFsc2U7XG4gICAgcHVibGljIGFjdGl2ZUVsZW1lbnQ6IElTZWxlY3Rpb25Ob2RlIHwgbnVsbDtcbiAgICBwdWJsaWMga2V5Ym9hcmRTdGF0ZSA9IHt9IGFzIElTZWxlY3Rpb25LZXlib2FyZFN0YXRlO1xuICAgIHB1YmxpYyBwb2ludGVyU3RhdGUgPSB7fSBhcyBJU2VsZWN0aW9uUG9pbnRlclN0YXRlO1xuICAgIHB1YmxpYyBjb2x1bW5zU3RhdGUgPSB7fSBhcyBJQ29sdW1uU2VsZWN0aW9uU3RhdGU7XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uID0gbmV3IE1hcDxudW1iZXIsIFNldDxudW1iZXI+PigpO1xuICAgIHB1YmxpYyB0ZW1wID0gbmV3IE1hcDxudW1iZXIsIFNldDxudW1iZXI+PigpO1xuICAgIHB1YmxpYyByb3dTZWxlY3Rpb246IFNldDxhbnk+ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHVibGljIGluZGV0ZXJtaW5hdGVSb3dzOiBTZXQ8YW55PiA9IG5ldyBTZXQ8YW55PigpO1xuICAgIHB1YmxpYyBjb2x1bW5TZWxlY3Rpb246IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRSb3dzQ2hhbmdlID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZWQgd2hlbiBhIHBvaW50ZXJkb3duIGV2ZW50IGlzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGdyaWQgYm9keSAoY2VsbHMpLlxuICAgICAqIFdoZW4gYGZhbHNlYCB0aGUgZHJhZyBzZWxlY3QgYmVoYXZpb3IgaXMgZGlzYWJsZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwb2ludGVyRXZlbnRJbkdyaWRCb2R5ID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGFsbFJvd3NTZWxlY3RlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9yYW5nZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uUmFuZ2U6IFJhbmdlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCByYW5nZXMgaW4gdGhlIGdyaWQgZnJvbSBib3RoXG4gICAgICoga2V5Ym9hcmQgYW5kIHBvaW50ZXIgaW50ZXJhY3Rpb25zXG4gICAgICovXG4gICAgcHVibGljIGdldCByYW5nZXMoKTogR3JpZFNlbGVjdGlvblJhbmdlW10ge1xuXG4gICAgICAgIC8vIFRoZSBsYXN0IGFjdGlvbiB3YXMga2V5Ym9hcmQgKyBzaGlmdCBzZWxlY3Rpb24gLT4gYWRkIGl0XG4gICAgICAgIHRoaXMuYWRkS2V5Ym9hcmRSYW5nZSgpO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlcyA9IEFycmF5LmZyb20odGhpcy5fcmFuZ2VzKS5tYXAocmFuZ2UgPT4gSlNPTi5wYXJzZShyYW5nZSkpO1xuXG4gICAgICAgIC8vIE5vIHJhbmdlcyBidXQgd2UgaGF2ZSBhIGZvY3VzZWQgY2VsbCAtPiBhZGQgaXRcbiAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoICYmIHRoaXMuYWN0aXZlRWxlbWVudCAmJiB0aGlzLmdyaWQuaXNDZWxsU2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2godGhpcy5nZW5lcmF0ZVJhbmdlKHRoaXMuYWN0aXZlRWxlbWVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByaW1hcnlCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50ZXJTdGF0ZS5wcmltYXJ5QnV0dG9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcHJpbWFyeUJ1dHRvbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5wcmltYXJ5QnV0dG9uID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsKSB7XG4gICAgICAgIHRoaXMuaW5pdFBvaW50ZXJTdGF0ZSgpO1xuICAgICAgICB0aGlzLmluaXRLZXlib2FyZFN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnNTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUga2V5Ym9hcmQgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdEtleWJvYXJkU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5ub2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLnNoaWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5yYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHBvaW50ZXIgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdFBvaW50ZXJTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUubm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLmN0cmwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuc2hpZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUucmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5wcmltYXJ5QnV0dG9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNvbHVtbnMgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdENvbHVtbnNTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zU3RhdGUuZmllbGQgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZSA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzaW5nbGUgbm9kZS5cbiAgICAgKiBTaW5nbGUgY2xpY2tzIHwgQ3RybCArIHNpbmdsZSBjbGlja3Mgb24gY2VsbHMgaXMgdGhlIHVzdWFsIGNhc2UuXG4gICAgICovXG4gICAgcHVibGljIGFkZChub2RlOiBJU2VsZWN0aW9uTm9kZSwgYWRkVG9SYW5nZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmhhcyhub2RlLnJvdykpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmdldChub2RlLnJvdykuYWRkKG5vZGUuY29sdW1uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldChub2RlLnJvdywgbmV3IFNldDxudW1iZXI+KCkpLmdldChub2RlLnJvdykuYWRkKG5vZGUuY29sdW1uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZGRUb1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZXMuYWRkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYWN0aXZlIGtleWJvYXJkIHJhbmdlIHNlbGVjdGlvbiAoaWYgYW55KSB0byB0aGUgYHJhbmdlc2AgbWV0YS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkS2V5Ym9hcmRSYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdGF0ZS5yYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFuZ2VzLmFkZChKU09OLnN0cmluZ2lmeSh0aGlzLmtleWJvYXJkU3RhdGUucmFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUobm9kZTogSVNlbGVjdGlvbk5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmhhcyhub2RlLnJvdykpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmdldChub2RlLnJvdykuZGVsZXRlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmFuZ2VzLmRlbGV0ZShKU09OLnN0cmluZ2lmeSh0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSkpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbk1hcChub2RlOiBJU2VsZWN0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0aW9uLmhhcyhub2RlLnJvdykgJiYgdGhpcy5zZWxlY3Rpb24uZ2V0KG5vZGUucm93KS5oYXMobm9kZS5jb2x1bW4pKSB8fFxuICAgICAgICAgICAgKHRoaXMudGVtcC5oYXMobm9kZS5yb3cpICYmIHRoaXMudGVtcC5nZXQobm9kZS5yb3cpLmhhcyhub2RlLmNvbHVtbikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RlZChub2RlOiBJU2VsZWN0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNBY3RpdmVOb2RlKG5vZGUpICYmIHRoaXMuZ3JpZC5pc0NlbGxTZWxlY3RhYmxlKSB8fCB0aGlzLmlzSW5NYXAobm9kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWN0aXZlTm9kZShub2RlOiBJU2VsZWN0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuYWN0aXZlRWxlbWVudC5jb2x1bW4gPT09IG5vZGUuY29sdW1uICYmIHRoaXMuYWN0aXZlRWxlbWVudC5yb3cgPT09IG5vZGUucm93O1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5hY3RpdmVFbGVtZW50LmxheW91dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNBY3RpdmUgJiYgdGhpcy5pc0FjdGl2ZUxheW91dChsYXlvdXQsIG5vZGUubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0FjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWN0aXZlTGF5b3V0KGN1cnJlbnQ6IElNdWx0aVJvd0xheW91dE5vZGUsIHRhcmdldDogSU11bHRpUm93TGF5b3V0Tm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY3VycmVudC5jb2x1bW5WaXNpYmxlSW5kZXggPT09IHRhcmdldC5jb2x1bW5WaXNpYmxlSW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFJhbmdlTWV0YShub2RlOiBJU2VsZWN0aW9uTm9kZSwgc3RhdGU/OiBTZWxlY3Rpb25TdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yYW5nZXMuYWRkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBzdGF0ZSkpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlUmFuZ2VNZXRhKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzdGF0ZT86IFNlbGVjdGlvblN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jhbmdlcy5kZWxldGUoSlNPTi5zdHJpbmdpZnkodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHN0YXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIG5ldyBzZWxlY3Rpb24gcmFuZ2UgZnJvbSB0aGUgZ2l2ZW4gYG5vZGVgLlxuICAgICAqIElmIGBzdGF0ZWAgaXMgcGFzc2VkIGluc3RlYWQgaXQgd2lsbCBnZW5lcmF0ZSB0aGUgcmFuZ2UgYmFzZWQgb24gdGhlIHBhc3NlZCBgbm9kZWBcbiAgICAgKiBhbmQgdGhlIHN0YXJ0IG5vZGUgb2YgdGhlIGBzdGF0ZWAuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlUmFuZ2Uobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlPzogU2VsZWN0aW9uU3RhdGUpOiBHcmlkU2VsZWN0aW9uUmFuZ2Uge1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJvd1N0YXJ0OiBub2RlLnJvdyxcbiAgICAgICAgICAgICAgICByb3dFbmQ6IG5vZGUucm93LFxuICAgICAgICAgICAgICAgIGNvbHVtblN0YXJ0OiBub2RlLmNvbHVtbixcbiAgICAgICAgICAgICAgICBjb2x1bW5FbmQ6IG5vZGUuY29sdW1uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyByb3csIGNvbHVtbiB9ID0gc3RhdGUubm9kZTtcbiAgICAgICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihub2RlLnJvdywgcm93KTtcbiAgICAgICAgY29uc3Qgcm93RW5kID0gTWF0aC5tYXgobm9kZS5yb3csIHJvdyk7XG4gICAgICAgIGNvbnN0IGNvbHVtblN0YXJ0ID0gTWF0aC5taW4obm9kZS5jb2x1bW4sIGNvbHVtbik7XG4gICAgICAgIGNvbnN0IGNvbHVtbkVuZCA9IE1hdGgubWF4KG5vZGUuY29sdW1uLCBjb2x1bW4pO1xuXG4gICAgICAgIHJldHVybiB7IHJvd1N0YXJ0LCByb3dFbmQsIGNvbHVtblN0YXJ0LCBjb2x1bW5FbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIHB1YmxpYyBrZXlib2FyZFN0YXRlT25LZXlkb3duKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzaGlmdDogYm9vbGVhbiwgc2hpZnRUYWI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdFBvaW50ZXJTdGF0ZSgpO1xuICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUuc2hpZnQgPSBzaGlmdCAmJiAhc2hpZnRUYWI7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLm5hdmlnYXRpb24uaXNEYXRhUm93KG5vZGUucm93KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEtiIG5hdmlnYXRpb24gd2l0aCBzaGlmdCBhbmQgbm8gcHJldmlvdXMgbm9kZS5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluaXQgdGhlIHN0YXJ0IG5vZGUuXG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkU3RhdGUuc2hpZnQgJiYgIXRoaXMua2V5Ym9hcmRTdGF0ZS5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUubm9kZSA9IE9iamVjdC5hc3NpZ24oe30sIG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGtleWJvYXJkU3RhdGVPbkZvY3VzKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZFNlbGVjdGlvblJhbmdlPiwgZG9tKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtiU3RhdGUgPSB0aGlzLmtleWJvYXJkU3RhdGU7XG5cbiAgICAgICAgLy8gRm9jdXMgdHJpZ2dlcmVkIGJ5IGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgICAgaWYgKGtiU3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0Nocm9taXVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVNlbGVjdGlvbkNocm9tZShkb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RhcnQgZ2VuZXJhdGluZyBhIHJhbmdlIGlmIHNoaWZ0IGlzIGhvbGRcbiAgICAgICAgICAgIGlmIChrYlN0YXRlLnNoaWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU2VsZWN0KG5vZGUsIGtiU3RhdGUpO1xuICAgICAgICAgICAgICAgIGtiU3RhdGUucmFuZ2UgPSB0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSwga2JTdGF0ZSk7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBrYlN0YXRlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXRLZXlib2FyZFN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmFkZChub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyRG93bihub2RlOiBJU2VsZWN0aW9uTm9kZSwgc2hpZnQ6IGJvb2xlYW4sIGN0cmw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRLZXlib2FyZFJhbmdlKCk7XG4gICAgICAgIHRoaXMuaW5pdEtleWJvYXJkU3RhdGUoKTtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuY3RybCA9IGN0cmw7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLnNoaWZ0ID0gc2hpZnQ7XG4gICAgICAgIHRoaXMucG9pbnRlckV2ZW50SW5HcmlkQm9keSA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5wb2ludGVyT3JpZ2luSGFuZGxlcik7XG5cbiAgICAgICAgLy8gTm8gY3RybCBrZXkgcHJlc3NlZCAtIG5vIG11bHRpcGxlIHNlbGVjdGlvblxuICAgICAgICBpZiAoIWN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGlmdCkge1xuICAgICAgICAgICAgLy8gTm8gcHJldmlvdXNseSAnY2xpY2tlZCcgbm9kZS4gVXNlIHRoZSBsYXN0IGFjdGl2ZSBub2RlLlxuICAgICAgICAgICAgaWYgKCF0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUubm9kZSA9IHRoaXMuYWN0aXZlRWxlbWVudCB8fCBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb2ludGVyRG93blNoaWZ0S2V5KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3ZlUmFuZ2VNZXRhKG5vZGUpO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gbm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9pbnRlckRvd25TaGlmdEtleShub2RlOiBJU2VsZWN0aW9uTm9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0UmFuZ2Uobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZU1hcCh0YXJnZXQ6IE1hcDxudW1iZXIsIFNldDxudW1iZXI+Piwgc291cmNlOiBNYXA8bnVtYmVyLCBTZXQ8bnVtYmVyPj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBzb3VyY2UuZW50cmllcygpO1xuICAgICAgICBsZXQgcGFpciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgbGV0IGtleTogbnVtYmVyO1xuICAgICAgICBsZXQgdmFsdWU6IFNldDxudW1iZXI+O1xuXG4gICAgICAgIHdoaWxlICghcGFpci5kb25lKSB7XG4gICAgICAgICAgICBba2V5LCB2YWx1ZV0gPSBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGFyZ2V0LmdldChrZXkpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2gocmVjb3JkID0+IG5ld1ZhbHVlLmFkZChyZWNvcmQpKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0KGtleSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFpciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyRW50ZXIobm9kZTogSVNlbGVjdGlvbk5vZGUsIGV2ZW50OiBQb2ludGVyRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvI3RoZS1idXR0b24tcHJvcGVydHlcbiAgICAgICAgdGhpcy5kcmFnTW9kZSA9IChldmVudC5idXR0b25zID09PSAxICYmIChldmVudC5idXR0b24gPT09IC0xIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMCkpICYmIHRoaXMucG9pbnRlckV2ZW50SW5HcmlkQm9keTtcbiAgICAgICAgaWYgKCF0aGlzLmRyYWdNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhclRleHRTZWxlY3Rpb24oKTtcblxuICAgICAgICAvLyBJZiB0aGUgdXNlcnMgdHJpZ2dlcnMgYSBkcmFnLWxpa2UgZXZlbnQgYnkgZmlyc3QgY2xpY2tpbmcgb3V0c2lkZSB0aGUgZ3JpZCBjZWxsc1xuICAgICAgICAvLyBhbmQgdGhlbiBlbnRlcnMgaW4gdGhlIGdyaWQgYm9keSB3ZSBtYXkgbm90IGhhdmUgYSBpbml0aWFsIHBvaW50ZXIgc3RhcnRpbmcgbm9kZS5cbiAgICAgICAgLy8gQXNzdW1lIHRoZSBmaXJzdCBwb2ludGVyZW50ZXIgbm9kZSBpcyB3aGVyZSB3ZSBzdGFydC5cbiAgICAgICAgaWYgKCF0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvaW50ZXJTdGF0ZS5jdHJsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKG5vZGUsIHRoaXMucG9pbnRlclN0YXRlLCB0aGlzLnRlbXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcmFnU2VsZWN0KG5vZGUsIHRoaXMucG9pbnRlclN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9pbnRlclVwKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZFNlbGVjdGlvblJhbmdlPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5kcmFnTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5hZGRSYW5nZU1ldGEobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tZXJnZU1hcCh0aGlzLnNlbGVjdGlvbiwgdGhpcy50ZW1wKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5UYXNrKCgpID0+IGVtaXR0ZXIuZW1pdCh0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpKSk7XG4gICAgICAgICAgICB0aGlzLnRlbXAuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ01vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9pbnRlclN0YXRlLnNoaWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5hZGRSYW5nZU1ldGEobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgICAgICAgICAgZW1pdHRlci5lbWl0KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdFJhbmdlKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzdGF0ZTogU2VsZWN0aW9uU3RhdGUsIGNvbGxlY3Rpb246IE1hcDxudW1iZXIsIFNldDxudW1iZXI+PiA9IHRoaXMuc2VsZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09PSB0aGlzLnRlbXApIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHJvd1N0YXJ0LCByb3dFbmQsIGNvbHVtblN0YXJ0LCBjb2x1bW5FbmQgfSA9IHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBzdGF0ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSByb3dTdGFydDsgaSA8PSByb3dFbmQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGNvbHVtblN0YXJ0IGFzIG51bWJlcjsgaiA8PSBjb2x1bW5FbmQ7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmhhcyhpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmdldChpKS5hZGQoaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5zZXQoaSwgbmV3IFNldDxudW1iZXI+KCkpLmdldChpKS5hZGQoaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRyYWdTZWxlY3Qobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlOiBTZWxlY3Rpb25TdGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9pbnRlclN0YXRlLmN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RSYW5nZShub2RlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKGNsZWFyQWNyaXZlRWwgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAoY2xlYXJBY3JpdmVFbCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlbXAuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fcmFuZ2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25SYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXN0b3JlVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UodGhpcy5fc2VsZWN0aW9uUmFuZ2UgfHwgZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgcm93IGlkJ3MuICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkUm93cygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPyBBcnJheS5mcm9tKHRoaXMucm93U2VsZWN0aW9uLmtleXMoKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhcnJheSBvZiB0aGUgcm93cyBpbiBpbmRldGVybWluYXRlIHN0YXRlLiAqL1xuICAgIHB1YmxpYyBnZXRJbmRldGVybWluYXRlUm93cygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3Muc2l6ZSA/IEFycmF5LmZyb20odGhpcy5pbmRldGVybWluYXRlUm93cy5rZXlzKCkpIDogW107XG4gICAgfVxuXG4gICAgLyoqIENsZWFycyByb3cgc2VsZWN0aW9uLCBpZiBmaWx0ZXJpbmcgaXMgYXBwbGllZCBjbGVhcnMgb25seSBzZWxlY3RlZCByb3dzIGZyb20gZmlsdGVyZWQgZGF0YS4gKi9cbiAgICBwdWJsaWMgY2xlYXJSb3dTZWxlY3Rpb24oZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRSZWMgPSB0aGlzLmlzRmlsdGVyaW5nQXBwbGllZCgpID9cbiAgICAgICAgICAgIHRoaXMuZ2V0Um93SURzKHRoaXMuYWxsRGF0YSkuZmlsdGVyKHJJRCA9PiB0aGlzLmlzUm93U2VsZWN0ZWQocklEKSkgOiB0aGlzLmdldFNlbGVjdGVkUm93cygpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmlzRmlsdGVyaW5nQXBwbGllZCgpID8gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKS5maWx0ZXIoeCA9PiAhcmVtb3ZlZFJlYy5pbmNsdWRlcyh4KSkgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZFJlYywgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgYWxsIHJvd3MsIGlmIGZpbHRlcmluZyBpcyBhcHBsaWVkIHNlbGVjdCBvbmx5IGZyb20gZmlsdGVyZWQgZGF0YS4gKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhldmVudD8pIHtcbiAgICAgICAgY29uc3QgYWxsUm93SURzID0gdGhpcy5nZXRSb3dJRHModGhpcy5hbGxEYXRhKTtcbiAgICAgICAgY29uc3QgYWRkZWRSb3dzID0gYWxsUm93SURzLmZpbHRlcigocklEKSA9PiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHJJRCkpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnJvd1NlbGVjdGlvbi5zaXplID8gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKS5jb25jYXQoYWRkZWRSb3dzKSA6IGFkZGVkUm93cztcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlUm93cy5jbGVhcigpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkUm93cywgW10sIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBzZWxlY3RSb3dCeUlkKHJvd0lELCBjbGVhclByZXZTZWxlY3Rpb24/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgaWYgKCEodGhpcy5ncmlkLmlzUm93U2VsZWN0YWJsZSB8fCB0aGlzLmdyaWQuaXNQaXZvdCkgfHwgdGhpcy5pc1Jvd0RlbGV0ZWQocm93SUQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJQcmV2U2VsZWN0aW9uID0gIXRoaXMuZ3JpZC5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCB8fCBjbGVhclByZXZTZWxlY3Rpb247XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gW3Jvd0lEXSA6IHRoaXMucm93U2VsZWN0aW9uLmhhcyhyb3dJRCkgP1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzIDogWy4uLnNlbGVjdGVkUm93cywgcm93SURdO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gc2VsZWN0ZWRSb3dzIDogW107XG4gICAgICAgIHRoaXMuZW1pdFJvd1NlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgW3Jvd0lEXSwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3cocm93SUQsIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNSb3dTZWxlY3RlZChyb3dJRCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUm93cygpLmZpbHRlcihyID0+IHIgIT09IHJvd0lEKTtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0aW9uLnNpemUgJiYgdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgW3Jvd0lEXSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHJvd3MgYW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Moa2V5czogYW55W10sIGNsZWFyUHJldlNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZC5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93c1RvU2VsZWN0ID0ga2V5cy5maWx0ZXIoeCA9PiAhdGhpcy5pc1Jvd0RlbGV0ZWQoeCkgJiYgIXRoaXMucm93U2VsZWN0aW9uLmhhcyh4KSk7XG4gICAgICAgIGlmICghcm93c1RvU2VsZWN0Lmxlbmd0aCAmJiAhY2xlYXJQcmV2U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBubyB2YWxpZC9hZGRpdGlvbmFsIHJvd3MgdG8gc2VsZWN0IGFuZCBubyBjbGVhclxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gcm93c1RvU2VsZWN0IDogWy4uLnNlbGVjdGVkUm93cywgLi4ucm93c1RvU2VsZWN0XTtcbiAgICAgICAgY29uc3Qga2V5c0FzU2V0ID0gbmV3IFNldChyb3dzVG9TZWxlY3QpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gc2VsZWN0ZWRSb3dzLmZpbHRlcih4ID0+ICFrZXlzQXNTZXQuaGFzKHgpKSA6IFtdO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIHJvd3NUb1NlbGVjdCwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3Moa2V5czogYW55W10sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd3NUb0Rlc2VsZWN0ID0ga2V5cy5maWx0ZXIoeCA9PiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMoeCkpO1xuICAgICAgICBpZiAoIXJvd3NUb0Rlc2VsZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5c0FzU2V0ID0gbmV3IFNldChyb3dzVG9EZXNlbGVjdCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCkuZmlsdGVyKHIgPT4gIWtleXNBc1NldC5oYXMocikpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIFtdLCByb3dzVG9EZXNlbGVjdCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3Qgc3BlY2lmaWVkIHJvd3MuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHM6IGFueVtdLCBjbGVhclByZXZTZWxlY3Rpb24/KTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcm93SURzLmZvckVhY2gocm93SUQgPT4gdGhpcy5yb3dTZWxlY3Rpb24uYWRkKHJvd0lEKSk7XG4gICAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5uZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHNwZWNpZmllZCByb3dzLiBObyBldmVudCBpcyBlbWl0dGVkLiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHJvd0lEcy5mb3JFYWNoKHJvd0lEID0+IHRoaXMucm93U2VsZWN0aW9uLmRlbGV0ZShyb3dJRCkpO1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UubmV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jvd1NlbGVjdGVkKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbi5zaXplID4gMCAmJiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Bpdm90Um93U2VsZWN0ZWQocm93SUQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0Um93SWQgPSByb3dJRC5yZXBsYWNlKHgsJycpO1xuICAgICAgICAgICAgaWYgKHJvd0lELmluY2x1ZGVzKHgpICYmIChjb3JyZWN0Um93SWQgPT09ICcnIHx8IGNvcnJlY3RSb3dJZC5zdGFydHNXaXRoKCdfJykpICkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA+IDAgJiYgY29udGFpbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUm93SW5JbmRldGVybWluYXRlU3RhdGUocm93SUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3Muc2l6ZSA+IDAgJiYgdGhpcy5pbmRldGVybWluYXRlUm93cy5oYXMocm93SUQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgcmFuZ2UgZnJvbSBsYXN0IHNlbGVjdGVkIHJvdyB0byB0aGUgY3VycmVudCBzcGVjaWZpZWQgcm93LiAqL1xuICAgIHB1YmxpYyBzZWxlY3RNdWx0aXBsZVJvd3Mocm93SUQsIHJvd0RhdGEsIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF0aGlzLnJvd1NlbGVjdGlvbi5zaXplIHx8IHRoaXMuaXNSb3dEZWxldGVkKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3dCeUlkKHJvd0lEKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuYWxsRGF0YTtcbiAgICAgICAgY29uc3QgbGFzdFJvd0lEID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKVt0aGlzLnJvd1NlbGVjdGlvbi5zaXplIC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJJbmRleCA9IGdyaWREYXRhLmluZGV4T2YodGhpcy5nZXRSb3dEYXRhQnlJZChsYXN0Um93SUQpKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBncmlkRGF0YS5pbmRleE9mKHJvd0RhdGEpO1xuICAgICAgICBjb25zdCByb3dzID0gZ3JpZERhdGEuc2xpY2UoTWF0aC5taW4oY3VyckluZGV4LCBuZXdJbmRleCksIE1hdGgubWF4KGN1cnJJbmRleCwgbmV3SW5kZXgpICsgMSk7XG5cbiAgICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLmdldFJvd0lEcyhyb3dzKS5maWx0ZXIocklEID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQocklEKSk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCkuY29uY2F0KGFkZGVkKTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgW10sIGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXJlQWxsUm93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbGxSb3dzU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxsUm93c1NlbGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YUl0ZW1zSUQgPSB0aGlzLmdldFJvd0lEcyh0aGlzLmFsbERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBNYXRoLm1pbih0aGlzLnJvd1NlbGVjdGlvbi5zaXplLCBkYXRhSXRlbXNJRC5sZW5ndGgpID4gMCAmJlxuICAgICAgICAgICAgbmV3IFNldChBcnJheS5mcm9tKHRoaXMucm93U2VsZWN0aW9uLnZhbHVlcygpKS5jb25jYXQoZGF0YUl0ZW1zSUQpKS5zaXplID09PSB0aGlzLnJvd1NlbGVjdGlvbi5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNTb21lUm93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgP1xuICAgICAgICAgICAgdGhpcy5nZXRSb3dJRHModGhpcy5ncmlkLmZpbHRlcmVkRGF0YSkuc29tZShySUQgPT4gdGhpcy5pc1Jvd1NlbGVjdGVkKHJJRCkpIDogdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPiAwICYmIGZpbHRlcmVkRGF0YSAmJiAhdGhpcy5hcmVBbGxSb3dTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWRTZWxlY3RlZFJvd0lkcygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRmlsdGVyaW5nQXBwbGllZCgpID9cbiAgICAgICAgICAgIHRoaXMuZ2V0Um93SURzKHRoaXMuYWxsRGF0YSkuZmlsdGVyKHJvd0lEID0+IHRoaXMuaXNSb3dTZWxlY3RlZChyb3dJRCkpIDpcbiAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCkuZmlsdGVyKHJvd0lEID0+ICF0aGlzLmlzUm93RGVsZXRlZChyb3dJRCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQ/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUm93cygpO1xuICAgICAgICBpZiAodGhpcy5hcmVFcXVhbENvbGxlY3Rpb25zKGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBvbGRTZWxlY3Rpb246IGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIGFkZGVkLCByZW1vdmVkLCBldmVudCwgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWQucm93U2VsZWN0aW9uQ2hhbmdpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzV2l0aE5vRXZlbnQoYXJncy5uZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSb3dEYXRhQnlJZChyb3dJRCk6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0Um93SURzKHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKSkuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIHJldHVybiByb3dJbmRleCA8IDAgPyB7fSA6IHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKVtyb3dJbmRleF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvd0lEcyhkYXRhKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucHJpbWFyeUtleSAmJiBkYXRhLmxlbmd0aCA/IGRhdGEubWFwKHJlYyA9PiByZWNbdGhpcy5ncmlkLnByaW1hcnlLZXldKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFySGVhZGVyQ0JTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIENsZWFyIHJvd1NlbGVjdGlvbiBhbmQgdXBkYXRlIGNoZWNrYm94IHN0YXRlICovXG4gICAgcHVibGljIGNsZWFyQWxsU2VsZWN0ZWRSb3dzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvd1NlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVSb3dzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLm5leHQoKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhbGwgZGF0YSBpbiB0aGUgZ3JpZCwgd2l0aCBhcHBsaWVkIGZpbHRlcmluZyBhbmQgc29ydGluZyBhbmQgd2l0aG91dCBkZWxldGVkIHJvd3MuICovXG4gICAgcHVibGljIGdldCBhbGxEYXRhKCk6IEFycmF5PGFueT4ge1xuICAgICAgICBsZXQgYWxsRGF0YTtcbiAgICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgfHwgdGhpcy5ncmlkLnNvcnRpbmdFeHByZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFsbERhdGEgPSB0aGlzLmdyaWQucGlubmVkUmVjb3Jkc0NvdW50ID8gdGhpcy5ncmlkLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSA6IHRoaXMuZ3JpZC5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxEYXRhID0gdGhpcy5ncmlkLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxEYXRhLmZpbHRlcihyRGF0YSA9PiAhdGhpcy5pc1Jvd0RlbGV0ZWQodGhpcy5ncmlkLmdyaWRBUEkuZ2V0X3Jvd19pZChyRGF0YSkpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgY29sdW1ucyBmaWVsZHMuICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uU2VsZWN0aW9uLnNpemUgPyBBcnJheS5mcm9tKHRoaXMuY29sdW1uU2VsZWN0aW9uLmtleXMoKSkgOiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb2x1bW5TZWxlY3RlZChmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtblNlbGVjdGlvbi5zaXplID4gMCAmJiB0aGlzLmNvbHVtblNlbGVjdGlvbi5oYXMoZmllbGQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbihmaWVsZDogc3RyaW5nLCBjbGVhclByZXZTZWxlY3Rpb24/LCBzZWxlY3RDb2x1bW5zUmFuZ2U/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhdGVDb2x1bW4gPSB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA/IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUodGhpcy5jb2x1bW5zU3RhdGUuZmllbGQpIDogbnVsbDtcbiAgICAgICAgaWYgKCFldmVudCB8fCAhc3RhdGVDb2x1bW4gfHwgc3RhdGVDb2x1bW4udmlzaWJsZUluZGV4IDwgMCB8fCAhc2VsZWN0Q29sdW1uc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA9IGZpZWxkO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zU3RhdGUucmFuZ2UgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gW2ZpZWxkXSA6IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuaW5kZXhPZihmaWVsZCkgIT09IC0xID9cbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpIDogWy4uLnRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCksIGZpZWxkXTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjbGVhclByZXZTZWxlY3Rpb24gPyB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjb2xGaWVsZCA9PiBjb2xGaWVsZCAhPT0gZmllbGQpIDogW107XG4gICAgICAgICAgICBjb25zdCBhZGRlZCA9IHRoaXMuaXNDb2x1bW5TZWxlY3RlZChmaWVsZCkgPyBbXSA6IFtmaWVsZF07XG4gICAgICAgICAgICB0aGlzLmVtaXRDb2x1bW5TZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0Q29sdW1uc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnNSYW5nZShmaWVsZCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy4gQW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnMoZmllbGRzOiBzdHJpbmdbXSwgY2xlYXJQcmV2U2VsZWN0aW9uPywgc2VsZWN0Q29sdW1uc1JhbmdlPywgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBmaWVsZHMubWFwKGYgPT4gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZShmKSkuc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleCk7XG4gICAgICAgIGNvbnN0IHN0YXRlQ29sdW1uID0gdGhpcy5jb2x1bW5zU3RhdGUuZmllbGQgPyB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkKSA6IG51bGw7XG4gICAgICAgIGlmICghc3RhdGVDb2x1bW4gfHwgc3RhdGVDb2x1bW4udmlzaWJsZUluZGV4IDwgMCB8fCAhc2VsZWN0Q29sdW1uc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA9IGNvbHVtbnNbMF0gPyBjb2x1bW5zWzBdLmZpZWxkIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gZmllbGRzLmZpbHRlcihjb2xGaWVsZCA9PiAhdGhpcy5pc0NvbHVtblNlbGVjdGVkKGNvbEZpZWxkKSk7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5maWx0ZXIoY29sRmllbGQgPT4gZmllbGRzLmluZGV4T2YoY29sRmllbGQpID09PSAtMSkgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IGZpZWxkcyA6IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY29uY2F0KGFkZGVkKTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZWRTdGFydCA9IHN0YXRlQ29sdW1uLnZpc2libGVJbmRleCA+XG4gICAgICAgICAgICAgICAgY29sdW1uc1tjb2x1bW5zLmxlbmd0aCAtIDFdLnZpc2libGVJbmRleCA/IGNvbHVtbnNbMF0uZmllbGQgOiBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0uZmllbGQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnNSYW5nZShmaWxlZFN0YXJ0LCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHJhbmdlIGZyb20gbGFzdCBjbGlja2VkIGNvbHVtbiB0byB0aGUgY3VycmVudCBzcGVjaWZpZWQgY29sdW1uLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zUmFuZ2UoZmllbGQ6IHN0cmluZywgZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VyckluZGV4ID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSh0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCkudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZ3JpZC5jb2x1bW5Ub1Zpc2libGVJbmRleChmaWVsZCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnNGaWVsZHMgPSB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cClcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KVxuICAgICAgICAgICAgLnNsaWNlKE1hdGgubWluKGN1cnJJbmRleCwgbmV3SW5kZXgpLCBNYXRoLm1heChjdXJySW5kZXgsIG5ld0luZGV4KSArIDEpXG4gICAgICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wuc2VsZWN0YWJsZSkubWFwKGNvbCA9PiBjb2wuZmllbGQpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gW107XG4gICAgICAgIGNvbnN0IG9sZEFkZGVkID0gW107XG4gICAgICAgIGNvbnN0IGFkZGVkID0gY29sdW1uc0ZpZWxkcy5maWx0ZXIoY29sRmllbGQgPT4gIXRoaXMuaXNDb2x1bW5TZWxlY3RlZChjb2xGaWVsZCkpO1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZS5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbnNGaWVsZHMuaW5kZXhPZihmKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkLnB1c2goZik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZEFkZGVkLnB1c2goZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZSA9IGNvbHVtbnNGaWVsZHMuZmlsdGVyKGNvbEZpZWxkID0+ICF0aGlzLmlzQ29sdW1uU2VsZWN0ZWQoY29sRmllbGQpIHx8IG9sZEFkZGVkLmluZGV4T2YoY29sRmllbGQpID4gLTEpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmNvbmNhdChhZGRlZCkuZmlsdGVyKGMgPT4gcmVtb3ZlZC5pbmRleE9mKGMpID09PSAtMSk7XG4gICAgICAgIHRoaXMuZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgYWRkZWQsIHJlbW92ZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLiBObyBldmVudCBpcyBlbWl0dGVkLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoZmllbGRzOiBzdHJpbmdbXSwgY2xlYXJQcmV2U2VsZWN0aW9uPyk6IHZvaWQge1xuICAgICAgICBpZiAoY2xlYXJQcmV2U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtblNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uU2VsZWN0aW9uLmFkZChmaWVsZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW4oZmllbGQ6IHN0cmluZywgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjID0+IGMgIT09IGZpZWxkKTtcbiAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgW2ZpZWxkXSwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy4gTm8gZXZlbnQgaXMgZW1pdHRlZC4gKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoZmllbGRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB0aGlzLmNvbHVtblNlbGVjdGlvbi5kZWxldGUoZmllbGQpKTtcbiAgICB9XG5cbiAgICAvKiogRGVzZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMuIEFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnMoZmllbGRzOiBzdHJpbmdbXSwgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjb2xGaWVsZCA9PiBmaWVsZHMuaW5kZXhPZihjb2xGaWVsZCkgPiAtMSk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGNvbEZpZWxkID0+IGZpZWxkcy5pbmRleE9mKGNvbEZpZWxkKSA9PT0gLTEpO1xuXG4gICAgICAgIHRoaXMuZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgW10sIHJlbW92ZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgYWRkZWQsIHJlbW92ZWQsIGV2ZW50Pyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdXJyU2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgaWYgKHRoaXMuYXJlRXF1YWxDb2xsZWN0aW9ucyhjdXJyU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgb2xkU2VsZWN0aW9uOiBjdXJyU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24sXG4gICAgICAgICAgICBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQsIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblNlbGVjdGlvbkNoYW5naW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGFyZ3MubmV3U2VsZWN0aW9uLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQ2xlYXIgY29sdW1uU2VsZWN0aW9uICovXG4gICAgcHVibGljIGNsZWFyQWxsU2VsZWN0ZWRDb2x1bW5zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbHVtblNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcmVFcXVhbENvbGxlY3Rpb25zKGZpcnN0LCBzZWNvbmQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Lmxlbmd0aCA9PT0gc2Vjb25kLmxlbmd0aCAmJiBuZXcgU2V0KGZpcnN0LmNvbmNhdChzZWNvbmQpKS5zaXplID09PSBmaXJzdC5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKOKVr8Kw4pahwrDvvInila/vuLUg4pS74pSB4pS7XG4gICAgICogQ2hyb21lIGFuZCBDaHJvbWl1bSBkb24ndCBjYXJlIGFib3V0IHRoZSBhY3RpdmVcbiAgICAgKiByYW5nZSBhZnRlciBrZXlib2FyZCBuYXZpZ2F0aW9uLCB0aHVzIHRoaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbW92ZVNlbGVjdGlvbkNocm9tZShub2RlOiBOb2RlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG5ldyBSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKG5vZGUpO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nQXBwbGllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZW1wdHkodGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgfHxcbiAgICAgICAgICAgICFGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZW1wdHkodGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUm93RGVsZXRlZChyb3dJRCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmdyaWRBUEkucm93X2RlbGV0ZWRfdHJhbnNhY3Rpb24ocm93SUQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9pbnRlck9yaWdpbkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucG9pbnRlckV2ZW50SW5HcmlkQm9keSA9IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMucG9pbnRlck9yaWdpbkhhbmRsZXIpO1xuICAgIH07XG59XG4iXX0=
662
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7OztBQWM1RixNQUFNLE9BQU8sdUJBQXVCO0lBd0RoQyxZQUFvQixJQUFZLEVBQVksUUFBc0I7UUFBOUMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFZLGFBQVEsR0FBUixRQUFRLENBQWM7UUF0RDNELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsa0JBQWEsR0FBRyxFQUE2QixDQUFDO1FBQzlDLGlCQUFZLEdBQUcsRUFBNEIsQ0FBQztRQUM1QyxpQkFBWSxHQUFHLEVBQTJCLENBQUM7UUFFM0MsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQzNDLFNBQUksR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUN0QyxpQkFBWSxHQUFhLElBQUksR0FBRyxFQUFPLENBQUM7UUFDeEMsc0JBQWlCLEdBQWEsSUFBSSxHQUFHLEVBQU8sQ0FBQztRQUM3QyxvQkFBZSxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3hEOztXQUVHO1FBQ0ksdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUUxQzs7O1dBR0c7UUFDSywyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFJL0IsWUFBTyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBeXNCekMseUJBQW9CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsc0JB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QUksS0FBSyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixPQUFPLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDdEUsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBSztRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7O29IQWp1QlEsdUJBQXVCO3dIQUF2Qix1QkFBdUI7MkZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICAgIEdyaWRTZWxlY3Rpb25SYW5nZSxcbiAgICBJQ29sdW1uU2VsZWN0aW9uU3RhdGUsXG4gICAgSU11bHRpUm93TGF5b3V0Tm9kZSxcbiAgICBJU2VsZWN0aW9uS2V5Ym9hcmRTdGF0ZSxcbiAgICBJU2VsZWN0aW9uTm9kZSxcbiAgICBJU2VsZWN0aW9uUG9pbnRlclN0YXRlLFxuICAgIFNlbGVjdGlvblN0YXRlXG59IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgICBwdWJsaWMgZ3JpZDogR3JpZFR5cGU7XG4gICAgcHVibGljIGRyYWdNb2RlID0gZmFsc2U7XG4gICAgcHVibGljIGFjdGl2ZUVsZW1lbnQ6IElTZWxlY3Rpb25Ob2RlIHwgbnVsbDtcbiAgICBwdWJsaWMga2V5Ym9hcmRTdGF0ZSA9IHt9IGFzIElTZWxlY3Rpb25LZXlib2FyZFN0YXRlO1xuICAgIHB1YmxpYyBwb2ludGVyU3RhdGUgPSB7fSBhcyBJU2VsZWN0aW9uUG9pbnRlclN0YXRlO1xuICAgIHB1YmxpYyBjb2x1bW5zU3RhdGUgPSB7fSBhcyBJQ29sdW1uU2VsZWN0aW9uU3RhdGU7XG5cbiAgICBwdWJsaWMgc2VsZWN0aW9uID0gbmV3IE1hcDxudW1iZXIsIFNldDxudW1iZXI+PigpO1xuICAgIHB1YmxpYyB0ZW1wID0gbmV3IE1hcDxudW1iZXIsIFNldDxudW1iZXI+PigpO1xuICAgIHB1YmxpYyByb3dTZWxlY3Rpb246IFNldDxhbnk+ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgcHVibGljIGluZGV0ZXJtaW5hdGVSb3dzOiBTZXQ8YW55PiA9IG5ldyBTZXQ8YW55PigpO1xuICAgIHB1YmxpYyBjb2x1bW5TZWxlY3Rpb246IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0ZWRSb3dzQ2hhbmdlID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZWQgd2hlbiBhIHBvaW50ZXJkb3duIGV2ZW50IGlzIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGdyaWQgYm9keSAoY2VsbHMpLlxuICAgICAqIFdoZW4gYGZhbHNlYCB0aGUgZHJhZyBzZWxlY3QgYmVoYXZpb3IgaXMgZGlzYWJsZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwb2ludGVyRXZlbnRJbkdyaWRCb2R5ID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGFsbFJvd3NTZWxlY3RlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9sYXN0U2VsZWN0ZWROb2RlOiBJU2VsZWN0aW9uTm9kZTtcbiAgICBwcml2YXRlIF9yYW5nZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uUmFuZ2U6IFJhbmdlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCByYW5nZXMgaW4gdGhlIGdyaWQgZnJvbSBib3RoXG4gICAgICoga2V5Ym9hcmQgYW5kIHBvaW50ZXIgaW50ZXJhY3Rpb25zXG4gICAgICovXG4gICAgcHVibGljIGdldCByYW5nZXMoKTogR3JpZFNlbGVjdGlvblJhbmdlW10ge1xuXG4gICAgICAgIC8vIFRoZSBsYXN0IGFjdGlvbiB3YXMga2V5Ym9hcmQgKyBzaGlmdCBzZWxlY3Rpb24gLT4gYWRkIGl0XG4gICAgICAgIHRoaXMuYWRkS2V5Ym9hcmRSYW5nZSgpO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlcyA9IEFycmF5LmZyb20odGhpcy5fcmFuZ2VzKS5tYXAocmFuZ2UgPT4gSlNPTi5wYXJzZShyYW5nZSkpO1xuXG4gICAgICAgIC8vIE5vIHJhbmdlcyBidXQgd2UgaGF2ZSBhIGZvY3VzZWQgY2VsbCAtPiBhZGQgaXRcbiAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoICYmIHRoaXMuYWN0aXZlRWxlbWVudCAmJiB0aGlzLmdyaWQuaXNDZWxsU2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2godGhpcy5nZW5lcmF0ZVJhbmdlKHRoaXMuYWN0aXZlRWxlbWVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByaW1hcnlCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50ZXJTdGF0ZS5wcmltYXJ5QnV0dG9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcHJpbWFyeUJ1dHRvbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5wcmltYXJ5QnV0dG9uID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsKSB7XG4gICAgICAgIHRoaXMuaW5pdFBvaW50ZXJTdGF0ZSgpO1xuICAgICAgICB0aGlzLmluaXRLZXlib2FyZFN0YXRlKCk7XG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnNTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUga2V5Ym9hcmQgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdEtleWJvYXJkU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5ub2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLnNoaWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5yYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRTdGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHBvaW50ZXIgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdFBvaW50ZXJTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUubm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLmN0cmwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuc2hpZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUucmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5wcmltYXJ5QnV0dG9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNvbHVtbnMgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdENvbHVtbnNTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zU3RhdGUuZmllbGQgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZSA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzaW5nbGUgbm9kZS5cbiAgICAgKiBTaW5nbGUgY2xpY2tzIHwgQ3RybCArIHNpbmdsZSBjbGlja3Mgb24gY2VsbHMgaXMgdGhlIHVzdWFsIGNhc2UuXG4gICAgICovXG4gICAgcHVibGljIGFkZChub2RlOiBJU2VsZWN0aW9uTm9kZSwgYWRkVG9SYW5nZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmhhcyhub2RlLnJvdykpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmdldChub2RlLnJvdykuYWRkKG5vZGUuY29sdW1uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldChub2RlLnJvdywgbmV3IFNldDxudW1iZXI+KCkpLmdldChub2RlLnJvdykuYWRkKG5vZGUuY29sdW1uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZGRUb1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZXMuYWRkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYWN0aXZlIGtleWJvYXJkIHJhbmdlIHNlbGVjdGlvbiAoaWYgYW55KSB0byB0aGUgYHJhbmdlc2AgbWV0YS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkS2V5Ym9hcmRSYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRTdGF0ZS5yYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcmFuZ2VzLmFkZChKU09OLnN0cmluZ2lmeSh0aGlzLmtleWJvYXJkU3RhdGUucmFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUobm9kZTogSVNlbGVjdGlvbk5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmhhcyhub2RlLnJvdykpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmdldChub2RlLnJvdykuZGVsZXRlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmFuZ2VzLmRlbGV0ZShKU09OLnN0cmluZ2lmeSh0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSkpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbk1hcChub2RlOiBJU2VsZWN0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2VsZWN0aW9uLmhhcyhub2RlLnJvdykgJiYgdGhpcy5zZWxlY3Rpb24uZ2V0KG5vZGUucm93KS5oYXMobm9kZS5jb2x1bW4pKSB8fFxuICAgICAgICAgICAgKHRoaXMudGVtcC5oYXMobm9kZS5yb3cpICYmIHRoaXMudGVtcC5nZXQobm9kZS5yb3cpLmhhcyhub2RlLmNvbHVtbikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RlZChub2RlOiBJU2VsZWN0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNBY3RpdmVOb2RlKG5vZGUpICYmIHRoaXMuZ3JpZC5pc0NlbGxTZWxlY3RhYmxlKSB8fCB0aGlzLmlzSW5NYXAobm9kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWN0aXZlTm9kZShub2RlOiBJU2VsZWN0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuYWN0aXZlRWxlbWVudC5jb2x1bW4gPT09IG5vZGUuY29sdW1uICYmIHRoaXMuYWN0aXZlRWxlbWVudC5yb3cgPT09IG5vZGUucm93O1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5hY3RpdmVFbGVtZW50LmxheW91dDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNBY3RpdmUgJiYgdGhpcy5pc0FjdGl2ZUxheW91dChsYXlvdXQsIG5vZGUubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0FjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWN0aXZlTGF5b3V0KGN1cnJlbnQ6IElNdWx0aVJvd0xheW91dE5vZGUsIHRhcmdldDogSU11bHRpUm93TGF5b3V0Tm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY3VycmVudC5jb2x1bW5WaXNpYmxlSW5kZXggPT09IHRhcmdldC5jb2x1bW5WaXNpYmxlSW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFJhbmdlTWV0YShub2RlOiBJU2VsZWN0aW9uTm9kZSwgc3RhdGU/OiBTZWxlY3Rpb25TdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9yYW5nZXMuYWRkKEpTT04uc3RyaW5naWZ5KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBzdGF0ZSkpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlUmFuZ2VNZXRhKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzdGF0ZT86IFNlbGVjdGlvblN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Jhbmdlcy5kZWxldGUoSlNPTi5zdHJpbmdpZnkodGhpcy5nZW5lcmF0ZVJhbmdlKG5vZGUsIHN0YXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIG5ldyBzZWxlY3Rpb24gcmFuZ2UgZnJvbSB0aGUgZ2l2ZW4gYG5vZGVgLlxuICAgICAqIElmIGBzdGF0ZWAgaXMgcGFzc2VkIGluc3RlYWQgaXQgd2lsbCBnZW5lcmF0ZSB0aGUgcmFuZ2UgYmFzZWQgb24gdGhlIHBhc3NlZCBgbm9kZWBcbiAgICAgKiBhbmQgdGhlIHN0YXJ0IG5vZGUgb2YgdGhlIGBzdGF0ZWAuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlUmFuZ2Uobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlPzogU2VsZWN0aW9uU3RhdGUpOiBHcmlkU2VsZWN0aW9uUmFuZ2Uge1xuICAgICAgICB0aGlzLl9sYXN0U2VsZWN0ZWROb2RlID0gbm9kZTtcblxuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJvd1N0YXJ0OiBub2RlLnJvdyxcbiAgICAgICAgICAgICAgICByb3dFbmQ6IG5vZGUucm93LFxuICAgICAgICAgICAgICAgIGNvbHVtblN0YXJ0OiBub2RlLmNvbHVtbixcbiAgICAgICAgICAgICAgICBjb2x1bW5FbmQ6IG5vZGUuY29sdW1uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyByb3csIGNvbHVtbiB9ID0gc3RhdGUubm9kZTtcbiAgICAgICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihub2RlLnJvdywgcm93KTtcbiAgICAgICAgY29uc3Qgcm93RW5kID0gTWF0aC5tYXgobm9kZS5yb3csIHJvdyk7XG4gICAgICAgIGNvbnN0IGNvbHVtblN0YXJ0ID0gTWF0aC5taW4obm9kZS5jb2x1bW4sIGNvbHVtbik7XG4gICAgICAgIGNvbnN0IGNvbHVtbkVuZCA9IE1hdGgubWF4KG5vZGUuY29sdW1uLCBjb2x1bW4pO1xuXG4gICAgICAgIHJldHVybiB7IHJvd1N0YXJ0LCByb3dFbmQsIGNvbHVtblN0YXJ0LCBjb2x1bW5FbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqL1xuICAgIHB1YmxpYyBrZXlib2FyZFN0YXRlT25LZXlkb3duKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzaGlmdDogYm9vbGVhbiwgc2hpZnRUYWI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZFN0YXRlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdFBvaW50ZXJTdGF0ZSgpO1xuICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUuc2hpZnQgPSBzaGlmdCAmJiAhc2hpZnRUYWI7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLm5hdmlnYXRpb24uaXNEYXRhUm93KG5vZGUucm93KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEtiIG5hdmlnYXRpb24gd2l0aCBzaGlmdCBhbmQgbm8gcHJldmlvdXMgbm9kZS5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluaXQgdGhlIHN0YXJ0IG5vZGUuXG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkU3RhdGUuc2hpZnQgJiYgIXRoaXMua2V5Ym9hcmRTdGF0ZS5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkU3RhdGUubm9kZSA9IE9iamVjdC5hc3NpZ24oe30sIG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGtleWJvYXJkU3RhdGVPbkZvY3VzKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZFNlbGVjdGlvblJhbmdlPiwgZG9tKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtiU3RhdGUgPSB0aGlzLmtleWJvYXJkU3RhdGU7XG5cbiAgICAgICAgLy8gRm9jdXMgdHJpZ2dlcmVkIGJ5IGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgICAgaWYgKGtiU3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0Nocm9taXVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVNlbGVjdGlvbkNocm9tZShkb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RhcnQgZ2VuZXJhdGluZyBhIHJhbmdlIGlmIHNoaWZ0IGlzIGhvbGRcbiAgICAgICAgICAgIGlmIChrYlN0YXRlLnNoaWZ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU2VsZWN0KG5vZGUsIGtiU3RhdGUpO1xuICAgICAgICAgICAgICAgIGtiU3RhdGUucmFuZ2UgPSB0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSwga2JTdGF0ZSk7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBrYlN0YXRlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXRLZXlib2FyZFN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmFkZChub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyRG93bihub2RlOiBJU2VsZWN0aW9uTm9kZSwgc2hpZnQ6IGJvb2xlYW4sIGN0cmw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRLZXlib2FyZFJhbmdlKCk7XG4gICAgICAgIHRoaXMuaW5pdEtleWJvYXJkU3RhdGUoKTtcbiAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUuY3RybCA9IGN0cmw7XG4gICAgICAgIHRoaXMucG9pbnRlclN0YXRlLnNoaWZ0ID0gc2hpZnQ7XG4gICAgICAgIHRoaXMucG9pbnRlckV2ZW50SW5HcmlkQm9keSA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5wb2ludGVyT3JpZ2luSGFuZGxlcik7XG5cbiAgICAgICAgLy8gTm8gY3RybCBrZXkgcHJlc3NlZCAtIG5vIG11bHRpcGxlIHNlbGVjdGlvblxuICAgICAgICBpZiAoIWN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaGlmdCkge1xuICAgICAgICAgICAgLy8gTm8gcHJldmlvdXNseSAnY2xpY2tlZCcgbm9kZS4gVXNlIHRoZSBsYXN0IGFjdGl2ZSBub2RlLlxuICAgICAgICAgICAgaWYgKCF0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyU3RhdGUubm9kZSA9IHRoaXMuYWN0aXZlRWxlbWVudCB8fCBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb2ludGVyRG93blNoaWZ0S2V5KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3ZlUmFuZ2VNZXRhKG5vZGUpO1xuICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gbm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9pbnRlckRvd25TaGlmdEtleShub2RlOiBJU2VsZWN0aW9uTm9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0UmFuZ2Uobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZU1hcCh0YXJnZXQ6IE1hcDxudW1iZXIsIFNldDxudW1iZXI+Piwgc291cmNlOiBNYXA8bnVtYmVyLCBTZXQ8bnVtYmVyPj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBzb3VyY2UuZW50cmllcygpO1xuICAgICAgICBsZXQgcGFpciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgbGV0IGtleTogbnVtYmVyO1xuICAgICAgICBsZXQgdmFsdWU6IFNldDxudW1iZXI+O1xuXG4gICAgICAgIHdoaWxlICghcGFpci5kb25lKSB7XG4gICAgICAgICAgICBba2V5LCB2YWx1ZV0gPSBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGFyZ2V0LmdldChrZXkpO1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2gocmVjb3JkID0+IG5ld1ZhbHVlLmFkZChyZWNvcmQpKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0KGtleSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFpciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwb2ludGVyRW50ZXIobm9kZTogSVNlbGVjdGlvbk5vZGUsIGV2ZW50OiBQb2ludGVyRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvI3RoZS1idXR0b24tcHJvcGVydHlcbiAgICAgICAgdGhpcy5kcmFnTW9kZSA9IChldmVudC5idXR0b25zID09PSAxICYmIChldmVudC5idXR0b24gPT09IC0xIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMCkpICYmIHRoaXMucG9pbnRlckV2ZW50SW5HcmlkQm9keTtcbiAgICAgICAgaWYgKCF0aGlzLmRyYWdNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhclRleHRTZWxlY3Rpb24oKTtcblxuICAgICAgICAvLyBJZiB0aGUgdXNlcnMgdHJpZ2dlcnMgYSBkcmFnLWxpa2UgZXZlbnQgYnkgZmlyc3QgY2xpY2tpbmcgb3V0c2lkZSB0aGUgZ3JpZCBjZWxsc1xuICAgICAgICAvLyBhbmQgdGhlbiBlbnRlcnMgaW4gdGhlIGdyaWQgYm9keSB3ZSBtYXkgbm90IGhhdmUgYSBpbml0aWFsIHBvaW50ZXIgc3RhcnRpbmcgbm9kZS5cbiAgICAgICAgLy8gQXNzdW1lIHRoZSBmaXJzdCBwb2ludGVyZW50ZXIgbm9kZSBpcyB3aGVyZSB3ZSBzdGFydC5cbiAgICAgICAgaWYgKCF0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTdGF0ZS5ub2RlID0gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvaW50ZXJTdGF0ZS5jdHJsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFJhbmdlKG5vZGUsIHRoaXMucG9pbnRlclN0YXRlLCB0aGlzLnRlbXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcmFnU2VsZWN0KG5vZGUsIHRoaXMucG9pbnRlclN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9pbnRlclVwKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBlbWl0dGVyOiBFdmVudEVtaXR0ZXI8R3JpZFNlbGVjdGlvblJhbmdlPiwgZmlyZWRPdXRzaWRlR3JpZD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ01vZGUgfHwgZmlyZWRPdXRzaWRlR3JpZCkge1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5hZGRSYW5nZU1ldGEobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tZXJnZU1hcCh0aGlzLnNlbGVjdGlvbiwgdGhpcy50ZW1wKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5UYXNrKCgpID0+IGVtaXR0ZXIuZW1pdCh0aGlzLmdlbmVyYXRlUmFuZ2Uobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpKSk7XG4gICAgICAgICAgICB0aGlzLnRlbXAuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ01vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucG9pbnRlclN0YXRlLnNoaWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5hZGRSYW5nZU1ldGEobm9kZSwgdGhpcy5wb2ludGVyU3RhdGUpO1xuICAgICAgICAgICAgZW1pdHRlci5lbWl0KHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCB0aGlzLnBvaW50ZXJTdGF0ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdFJhbmdlKG5vZGU6IElTZWxlY3Rpb25Ob2RlLCBzdGF0ZTogU2VsZWN0aW9uU3RhdGUsIGNvbGxlY3Rpb246IE1hcDxudW1iZXIsIFNldDxudW1iZXI+PiA9IHRoaXMuc2VsZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09PSB0aGlzLnRlbXApIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHJvd1N0YXJ0LCByb3dFbmQsIGNvbHVtblN0YXJ0LCBjb2x1bW5FbmQgfSA9IHRoaXMuZ2VuZXJhdGVSYW5nZShub2RlLCBzdGF0ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSByb3dTdGFydDsgaSA8PSByb3dFbmQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGNvbHVtblN0YXJ0IGFzIG51bWJlcjsgaiA8PSBjb2x1bW5FbmQ7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmhhcyhpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmdldChpKS5hZGQoaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5zZXQoaSwgbmV3IFNldDxudW1iZXI+KCkpLmdldChpKS5hZGQoaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRyYWdTZWxlY3Qobm9kZTogSVNlbGVjdGlvbk5vZGUsIHN0YXRlOiBTZWxlY3Rpb25TdGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucG9pbnRlclN0YXRlLmN0cmwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RSYW5nZShub2RlLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKGNsZWFyQWNyaXZlRWwgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAoY2xlYXJBY3JpdmVFbCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLnRlbXAuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fcmFuZ2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25SYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXN0b3JlVGV4dFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UodGhpcy5fc2VsZWN0aW9uUmFuZ2UgfHwgZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgcm93IGlkJ3MuICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkUm93cygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPyBBcnJheS5mcm9tKHRoaXMucm93U2VsZWN0aW9uLmtleXMoKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhcnJheSBvZiB0aGUgcm93cyBpbiBpbmRldGVybWluYXRlIHN0YXRlLiAqL1xuICAgIHB1YmxpYyBnZXRJbmRldGVybWluYXRlUm93cygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3Muc2l6ZSA/IEFycmF5LmZyb20odGhpcy5pbmRldGVybWluYXRlUm93cy5rZXlzKCkpIDogW107XG4gICAgfVxuXG4gICAgLyoqIENsZWFycyByb3cgc2VsZWN0aW9uLCBpZiBmaWx0ZXJpbmcgaXMgYXBwbGllZCBjbGVhcnMgb25seSBzZWxlY3RlZCByb3dzIGZyb20gZmlsdGVyZWQgZGF0YS4gKi9cbiAgICBwdWJsaWMgY2xlYXJSb3dTZWxlY3Rpb24oZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRSZWMgPSB0aGlzLmlzRmlsdGVyaW5nQXBwbGllZCgpID9cbiAgICAgICAgICAgIHRoaXMuZ2V0Um93SURzKHRoaXMuYWxsRGF0YSkuZmlsdGVyKHJJRCA9PiB0aGlzLmlzUm93U2VsZWN0ZWQocklEKSkgOiB0aGlzLmdldFNlbGVjdGVkUm93cygpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmlzRmlsdGVyaW5nQXBwbGllZCgpID8gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKS5maWx0ZXIoeCA9PiAhcmVtb3ZlZFJlYy5pbmNsdWRlcyh4KSkgOiBbXTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgcmVtb3ZlZFJlYywgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgYWxsIHJvd3MsIGlmIGZpbHRlcmluZyBpcyBhcHBsaWVkIHNlbGVjdCBvbmx5IGZyb20gZmlsdGVyZWQgZGF0YS4gKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhldmVudD8pIHtcbiAgICAgICAgY29uc3QgYWxsUm93SURzID0gdGhpcy5nZXRSb3dJRHModGhpcy5hbGxEYXRhKTtcbiAgICAgICAgY29uc3QgYWRkZWRSb3dzID0gYWxsUm93SURzLmZpbHRlcigocklEKSA9PiAhdGhpcy5pc1Jvd1NlbGVjdGVkKHJJRCkpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnJvd1NlbGVjdGlvbi5zaXplID8gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKS5jb25jYXQoYWRkZWRSb3dzKSA6IGFkZGVkUm93cztcbiAgICAgICAgdGhpcy5pbmRldGVybWluYXRlUm93cy5jbGVhcigpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkUm93cywgW10sIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHRoZSBzcGVjaWZpZWQgcm93IGFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBzZWxlY3RSb3dCeUlkKHJvd0lELCBjbGVhclByZXZTZWxlY3Rpb24/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgaWYgKCEodGhpcy5ncmlkLmlzUm93U2VsZWN0YWJsZSB8fCB0aGlzLmdyaWQuaXNQaXZvdCkgfHwgdGhpcy5pc1Jvd0RlbGV0ZWQocm93SUQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJQcmV2U2VsZWN0aW9uID0gIXRoaXMuZ3JpZC5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCB8fCBjbGVhclByZXZTZWxlY3Rpb247XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gW3Jvd0lEXSA6IHRoaXMucm93U2VsZWN0aW9uLmhhcyhyb3dJRCkgP1xuICAgICAgICAgICAgc2VsZWN0ZWRSb3dzIDogWy4uLnNlbGVjdGVkUm93cywgcm93SURdO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gc2VsZWN0ZWRSb3dzIDogW107XG4gICAgICAgIHRoaXMuZW1pdFJvd1NlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgW3Jvd0lEXSwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3cocm93SUQsIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNSb3dTZWxlY3RlZChyb3dJRCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUm93cygpLmZpbHRlcihyID0+IHIgIT09IHJvd0lEKTtcbiAgICAgICAgaWYgKHRoaXMucm93U2VsZWN0aW9uLnNpemUgJiYgdGhpcy5yb3dTZWxlY3Rpb24uaGFzKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgW3Jvd0lEXSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHJvd3MgYW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Moa2V5czogYW55W10sIGNsZWFyUHJldlNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZC5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93c1RvU2VsZWN0ID0ga2V5cy5maWx0ZXIoeCA9PiAhdGhpcy5pc1Jvd0RlbGV0ZWQoeCkgJiYgIXRoaXMucm93U2VsZWN0aW9uLmhhcyh4KSk7XG4gICAgICAgIGlmICghcm93c1RvU2VsZWN0Lmxlbmd0aCAmJiAhY2xlYXJQcmV2U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBubyB2YWxpZC9hZGRpdGlvbmFsIHJvd3MgdG8gc2VsZWN0IGFuZCBubyBjbGVhclxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gcm93c1RvU2VsZWN0IDogWy4uLnNlbGVjdGVkUm93cywgLi4ucm93c1RvU2VsZWN0XTtcbiAgICAgICAgY29uc3Qga2V5c0FzU2V0ID0gbmV3IFNldChyb3dzVG9TZWxlY3QpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gc2VsZWN0ZWRSb3dzLmZpbHRlcih4ID0+ICFrZXlzQXNTZXQuaGFzKHgpKSA6IFtdO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIHJvd3NUb1NlbGVjdCwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3Moa2V5czogYW55W10sIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd3NUb0Rlc2VsZWN0ID0ga2V5cy5maWx0ZXIoeCA9PiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMoeCkpO1xuICAgICAgICBpZiAoIXJvd3NUb0Rlc2VsZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5c0FzU2V0ID0gbmV3IFNldChyb3dzVG9EZXNlbGVjdCk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCkuZmlsdGVyKHIgPT4gIWtleXNBc1NldC5oYXMocikpO1xuICAgICAgICB0aGlzLmVtaXRSb3dTZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIFtdLCByb3dzVG9EZXNlbGVjdCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3Qgc3BlY2lmaWVkIHJvd3MuIE5vIGV2ZW50IGlzIGVtaXR0ZWQuICovXG4gICAgcHVibGljIHNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHM6IGFueVtdLCBjbGVhclByZXZTZWxlY3Rpb24/KTogdm9pZCB7XG4gICAgICAgIGlmIChjbGVhclByZXZTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcm93SURzLmZvckVhY2gocm93SUQgPT4gdGhpcy5yb3dTZWxlY3Rpb24uYWRkKHJvd0lEKSk7XG4gICAgICAgIHRoaXMuYWxsUm93c1NlbGVjdGVkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5uZXh0KCk7XG4gICAgfVxuXG4gICAgLyoqIERlc2VsZWN0IHNwZWNpZmllZCByb3dzLiBObyBldmVudCBpcyBlbWl0dGVkLiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHJvd0lEcy5mb3JFYWNoKHJvd0lEID0+IHRoaXMucm93U2VsZWN0aW9uLmRlbGV0ZShyb3dJRCkpO1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UubmV4dCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jvd1NlbGVjdGVkKHJvd0lEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbi5zaXplID4gMCAmJiB0aGlzLnJvd1NlbGVjdGlvbi5oYXMocm93SUQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Bpdm90Um93U2VsZWN0ZWQocm93SUQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGNvbnRhaW5zID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93U2VsZWN0aW9uLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0Um93SWQgPSByb3dJRC5yZXBsYWNlKHgsJycpO1xuICAgICAgICAgICAgaWYgKHJvd0lELmluY2x1ZGVzKHgpICYmIChjb3JyZWN0Um93SWQgPT09ICcnIHx8IGNvcnJlY3RSb3dJZC5zdGFydHNXaXRoKCdfJykpICkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24uc2l6ZSA+IDAgJiYgY29udGFpbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUm93SW5JbmRldGVybWluYXRlU3RhdGUocm93SUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZVJvd3Muc2l6ZSA+IDAgJiYgdGhpcy5pbmRldGVybWluYXRlUm93cy5oYXMocm93SUQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgcmFuZ2UgZnJvbSBsYXN0IHNlbGVjdGVkIHJvdyB0byB0aGUgY3VycmVudCBzcGVjaWZpZWQgcm93LiAqL1xuICAgIHB1YmxpYyBzZWxlY3RNdWx0aXBsZVJvd3Mocm93SUQsIHJvd0RhdGEsIGV2ZW50Pyk6IHZvaWQge1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF0aGlzLnJvd1NlbGVjdGlvbi5zaXplIHx8IHRoaXMuaXNSb3dEZWxldGVkKHJvd0lEKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3dCeUlkKHJvd0lEKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncmlkRGF0YSA9IHRoaXMuYWxsRGF0YTtcbiAgICAgICAgY29uc3QgbGFzdFJvd0lEID0gdGhpcy5nZXRTZWxlY3RlZFJvd3MoKVt0aGlzLnJvd1NlbGVjdGlvbi5zaXplIC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJJbmRleCA9IGdyaWREYXRhLmluZGV4T2YodGhpcy5nZXRSb3dEYXRhQnlJZChsYXN0Um93SUQpKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBncmlkRGF0YS5pbmRleE9mKHJvd0RhdGEpO1xuICAgICAgICBjb25zdCByb3dzID0gZ3JpZERhdGEuc2xpY2UoTWF0aC5taW4oY3VyckluZGV4LCBuZXdJbmRleCksIE1hdGgubWF4KGN1cnJJbmRleCwgbmV3SW5kZXgpICsgMSk7XG5cbiAgICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLmdldFJvd0lEcyhyb3dzKS5maWx0ZXIocklEID0+ICF0aGlzLmlzUm93U2VsZWN0ZWQocklEKSk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCkuY29uY2F0KGFkZGVkKTtcbiAgICAgICAgdGhpcy5lbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgW10sIGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXJlQWxsUm93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hbGxSb3dzU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxsUm93c1NlbGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YUl0ZW1zSUQgPSB0aGlzLmdldFJvd0lEcyh0aGlzLmFsbERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBNYXRoLm1pbih0aGlzLnJvd1NlbGVjdGlvbi5zaXplLCBkYXRhSXRlbXNJRC5sZW5ndGgpID4gMCAmJlxuICAgICAgICAgICAgbmV3IFNldChBcnJheS5mcm9tKHRoaXMucm93U2VsZWN0aW9uLnZhbHVlcygpKS5jb25jYXQoZGF0YUl0ZW1zSUQpKS5zaXplID09PSB0aGlzLnJvd1NlbGVjdGlvbi5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNTb21lUm93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgP1xuICAgICAgICAgICAgdGhpcy5nZXRSb3dJRHModGhpcy5ncmlkLmZpbHRlcmVkRGF0YSkuc29tZShySUQgPT4gdGhpcy5pc1Jvd1NlbGVjdGVkKHJJRCkpIDogdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uLnNpemUgPiAwICYmIGZpbHRlcmVkRGF0YSAmJiAhdGhpcy5hcmVBbGxSb3dTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWRTZWxlY3RlZFJvd0lkcygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRmlsdGVyaW5nQXBwbGllZCgpID9cbiAgICAgICAgICAgIHRoaXMuZ2V0Um93SURzKHRoaXMuYWxsRGF0YSkuZmlsdGVyKHJvd0lEID0+IHRoaXMuaXNSb3dTZWxlY3RlZChyb3dJRCkpIDpcbiAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKCkuZmlsdGVyKHJvd0lEID0+ICF0aGlzLmlzUm93RGVsZXRlZChyb3dJRCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0Um93U2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQ/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUm93cygpO1xuICAgICAgICBpZiAodGhpcy5hcmVFcXVhbENvbGxlY3Rpb25zKGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgICAgICBvbGRTZWxlY3Rpb246IGN1cnJTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbixcbiAgICAgICAgICAgIGFkZGVkLCByZW1vdmVkLCBldmVudCwgY2FuY2VsOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWQucm93U2VsZWN0aW9uQ2hhbmdpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzV2l0aE5vRXZlbnQoYXJncy5uZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSb3dEYXRhQnlJZChyb3dJRCk6IGFueSB7XG4gICAgICAgIGlmICghdGhpcy5ncmlkLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ2V0Um93SURzKHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKSkuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIHJldHVybiByb3dJbmRleCA8IDAgPyB7fSA6IHRoaXMuZ3JpZC5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKVtyb3dJbmRleF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvd0lEcyhkYXRhKTogQXJyYXk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQucHJpbWFyeUtleSAmJiBkYXRhLmxlbmd0aCA/IGRhdGEubWFwKHJlYyA9PiByZWNbdGhpcy5ncmlkLnByaW1hcnlLZXldKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFySGVhZGVyQ0JTdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIENsZWFyIHJvd1NlbGVjdGlvbiBhbmQgdXBkYXRlIGNoZWNrYm94IHN0YXRlICovXG4gICAgcHVibGljIGNsZWFyQWxsU2VsZWN0ZWRSb3dzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvd1NlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVSb3dzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzQ2hhbmdlLm5leHQoKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhbGwgZGF0YSBpbiB0aGUgZ3JpZCwgd2l0aCBhcHBsaWVkIGZpbHRlcmluZyBhbmQgc29ydGluZyBhbmQgd2l0aG91dCBkZWxldGVkIHJvd3MuICovXG4gICAgcHVibGljIGdldCBhbGxEYXRhKCk6IEFycmF5PGFueT4ge1xuICAgICAgICBsZXQgYWxsRGF0YTtcbiAgICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJpbmdBcHBsaWVkKCkgfHwgdGhpcy5ncmlkLnNvcnRpbmdFeHByZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFsbERhdGEgPSB0aGlzLmdyaWQucGlubmVkUmVjb3Jkc0NvdW50ID8gdGhpcy5ncmlkLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSA6IHRoaXMuZ3JpZC5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxEYXRhID0gdGhpcy5ncmlkLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbGxEYXRhLmZpbHRlcihyRGF0YSA9PiAhdGhpcy5pc1Jvd0RlbGV0ZWQodGhpcy5ncmlkLmdyaWRBUEkuZ2V0X3Jvd19pZChyRGF0YSkpKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgY29sdW1ucyBmaWVsZHMuICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uU2VsZWN0aW9uLnNpemUgPyBBcnJheS5mcm9tKHRoaXMuY29sdW1uU2VsZWN0aW9uLmtleXMoKSkgOiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb2x1bW5TZWxlY3RlZChmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtblNlbGVjdGlvbi5zaXplID4gMCAmJiB0aGlzLmNvbHVtblNlbGVjdGlvbi5oYXMoZmllbGQpO1xuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbihmaWVsZDogc3RyaW5nLCBjbGVhclByZXZTZWxlY3Rpb24/LCBzZWxlY3RDb2x1bW5zUmFuZ2U/LCBldmVudD8pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhdGVDb2x1bW4gPSB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA/IHRoaXMuZ3JpZC5nZXRDb2x1bW5CeU5hbWUodGhpcy5jb2x1bW5zU3RhdGUuZmllbGQpIDogbnVsbDtcbiAgICAgICAgaWYgKCFldmVudCB8fCAhc3RhdGVDb2x1bW4gfHwgc3RhdGVDb2x1bW4udmlzaWJsZUluZGV4IDwgMCB8fCAhc2VsZWN0Q29sdW1uc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA9IGZpZWxkO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zU3RhdGUucmFuZ2UgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gW2ZpZWxkXSA6IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuaW5kZXhPZihmaWVsZCkgIT09IC0xID9cbiAgICAgICAgICAgICAgICB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpIDogWy4uLnRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCksIGZpZWxkXTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjbGVhclByZXZTZWxlY3Rpb24gPyB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjb2xGaWVsZCA9PiBjb2xGaWVsZCAhPT0gZmllbGQpIDogW107XG4gICAgICAgICAgICBjb25zdCBhZGRlZCA9IHRoaXMuaXNDb2x1bW5TZWxlY3RlZChmaWVsZCkgPyBbXSA6IFtmaWVsZF07XG4gICAgICAgICAgICB0aGlzLmVtaXRDb2x1bW5TZWxlY3Rpb25FdmVudChuZXdTZWxlY3Rpb24sIGFkZGVkLCByZW1vdmVkLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0Q29sdW1uc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnNSYW5nZShmaWVsZCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy4gQW5kIGVtaXQgZXZlbnQuICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnMoZmllbGRzOiBzdHJpbmdbXSwgY2xlYXJQcmV2U2VsZWN0aW9uPywgc2VsZWN0Q29sdW1uc1JhbmdlPywgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBmaWVsZHMubWFwKGYgPT4gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZShmKSkuc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleCk7XG4gICAgICAgIGNvbnN0IHN0YXRlQ29sdW1uID0gdGhpcy5jb2x1bW5zU3RhdGUuZmllbGQgPyB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKHRoaXMuY29sdW1uc1N0YXRlLmZpZWxkKSA6IG51bGw7XG4gICAgICAgIGlmICghc3RhdGVDb2x1bW4gfHwgc3RhdGVDb2x1bW4udmlzaWJsZUluZGV4IDwgMCB8fCAhc2VsZWN0Q29sdW1uc1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCA9IGNvbHVtbnNbMF0gPyBjb2x1bW5zWzBdLmZpZWxkIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1N0YXRlLnJhbmdlID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gZmllbGRzLmZpbHRlcihjb2xGaWVsZCA9PiAhdGhpcy5pc0NvbHVtblNlbGVjdGVkKGNvbEZpZWxkKSk7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gY2xlYXJQcmV2U2VsZWN0aW9uID8gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKS5maWx0ZXIoY29sRmllbGQgPT4gZmllbGRzLmluZGV4T2YoY29sRmllbGQpID09PSAtMSkgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IGNsZWFyUHJldlNlbGVjdGlvbiA/IGZpZWxkcyA6IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuY29uY2F0KGFkZGVkKTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZWRTdGFydCA9IHN0YXRlQ29sdW1uLnZpc2libGVJbmRleCA+XG4gICAgICAgICAgICAgICAgY29sdW1uc1tjb2x1bW5zLmxlbmd0aCAtIDFdLnZpc2libGVJbmRleCA/IGNvbHVtbnNbMF0uZmllbGQgOiBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0uZmllbGQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnNSYW5nZShmaWxlZFN0YXJ0LCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHJhbmdlIGZyb20gbGFzdCBjbGlja2VkIGNvbHVtbiB0byB0aGUgY3VycmVudCBzcGVjaWZpZWQgY29sdW1uLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zUmFuZ2UoZmllbGQ6IHN0cmluZywgZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VyckluZGV4ID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSh0aGlzLmNvbHVtbnNTdGF0ZS5maWVsZCkudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuZ3JpZC5jb2x1bW5Ub1Zpc2libGVJbmRleChmaWVsZCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnNGaWVsZHMgPSB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cClcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KVxuICAgICAgICAgICAgLnNsaWNlKE1hdGgubWluKGN1cnJJbmRleCwgbmV3SW5kZXgpLCBNYXRoLm1heChjdXJySW5kZXgsIG5ld0luZGV4KSArIDEpXG4gICAgICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wuc2VsZWN0YWJsZSkubWFwKGNvbCA9PiBjb2wuZmllbGQpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gW107XG4gICAgICAgIGNvbnN0IG9sZEFkZGVkID0gW107XG4gICAgICAgIGNvbnN0IGFkZGVkID0gY29sdW1uc0ZpZWxkcy5maWx0ZXIoY29sRmllbGQgPT4gIXRoaXMuaXNDb2x1bW5TZWxlY3RlZChjb2xGaWVsZCkpO1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZS5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbnNGaWVsZHMuaW5kZXhPZihmKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkLnB1c2goZik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZEFkZGVkLnB1c2goZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbHVtbnNTdGF0ZS5yYW5nZSA9IGNvbHVtbnNGaWVsZHMuZmlsdGVyKGNvbEZpZWxkID0+ICF0aGlzLmlzQ29sdW1uU2VsZWN0ZWQoY29sRmllbGQpIHx8IG9sZEFkZGVkLmluZGV4T2YoY29sRmllbGQpID4gLTEpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmNvbmNhdChhZGRlZCkuZmlsdGVyKGMgPT4gcmVtb3ZlZC5pbmRleE9mKGMpID09PSAtMSk7XG4gICAgICAgIHRoaXMuZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgYWRkZWQsIHJlbW92ZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLiBObyBldmVudCBpcyBlbWl0dGVkLiAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoZmllbGRzOiBzdHJpbmdbXSwgY2xlYXJQcmV2U2VsZWN0aW9uPyk6IHZvaWQge1xuICAgICAgICBpZiAoY2xlYXJQcmV2U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtblNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uU2VsZWN0aW9uLmFkZChmaWVsZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgZW1pdCBldmVudC4gKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW4oZmllbGQ6IHN0cmluZywgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjID0+IGMgIT09IGZpZWxkKTtcbiAgICAgICAgdGhpcy5lbWl0Q29sdW1uU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBbXSwgW2ZpZWxkXSwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucy4gTm8gZXZlbnQgaXMgZW1pdHRlZC4gKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoZmllbGRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB0aGlzLmNvbHVtblNlbGVjdGlvbi5kZWxldGUoZmllbGQpKTtcbiAgICB9XG5cbiAgICAvKiogRGVzZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMuIEFuZCBlbWl0IGV2ZW50LiAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdENvbHVtbnMoZmllbGRzOiBzdHJpbmdbXSwgZXZlbnQ/KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1ucygpLmZpbHRlcihjb2xGaWVsZCA9PiBmaWVsZHMuaW5kZXhPZihjb2xGaWVsZCkgPiAtMSk7XG4gICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zKCkuZmlsdGVyKGNvbEZpZWxkID0+IGZpZWxkcy5pbmRleE9mKGNvbEZpZWxkKSA9PT0gLTEpO1xuXG4gICAgICAgIHRoaXMuZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgW10sIHJlbW92ZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdENvbHVtblNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgYWRkZWQsIHJlbW92ZWQsIGV2ZW50Pyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdXJyU2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgaWYgKHRoaXMuYXJlRXF1YWxDb2xsZWN0aW9ucyhjdXJyU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgb2xkU2VsZWN0aW9uOiBjdXJyU2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24sXG4gICAgICAgICAgICBhZGRlZCwgcmVtb3ZlZCwgZXZlbnQsIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblNlbGVjdGlvbkNoYW5naW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGFyZ3MubmV3U2VsZWN0aW9uLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQ2xlYXIgY29sdW1uU2VsZWN0aW9uICovXG4gICAgcHVibGljIGNsZWFyQWxsU2VsZWN0ZWRDb2x1bW5zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbHVtblNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcmVFcXVhbENvbGxlY3Rpb25zKGZpcnN0LCBzZWNvbmQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Lmxlbmd0aCA9PT0gc2Vjb25kLmxlbmd0aCAmJiBuZXcgU2V0KGZpcnN0LmNvbmNhdChzZWNvbmQpKS5zaXplID09PSBmaXJzdC5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKOKVr8Kw4pahwrDvvInila/vuLUg4pS74pSB4pS7XG4gICAgICogQ2hyb21lIGFuZCBDaHJvbWl1bSBkb24ndCBjYXJlIGFib3V0IHRoZSBhY3RpdmVcbiAgICAgKiByYW5nZSBhZnRlciBrZXlib2FyZCBuYXZpZ2F0aW9uLCB0aHVzIHRoaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbW92ZVNlbGVjdGlvbkNocm9tZShub2RlOiBOb2RlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG5ldyBSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlKG5vZGUpO1xuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRmlsdGVyaW5nQXBwbGllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICFGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZW1wdHkodGhpcy5ncmlkLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgfHxcbiAgICAgICAgICAgICFGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZW1wdHkodGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUm93RGVsZXRlZChyb3dJRCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmdyaWRBUEkucm93X2RlbGV0ZWRfdHJhbnNhY3Rpb24ocm93SUQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9pbnRlck9yaWdpbkhhbmRsZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5wb2ludGVyRXZlbnRJbkdyaWRCb2R5ID0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5wb2ludGVyT3JpZ2luSGFuZGxlcik7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0VGFnTmFtZSA9IGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0YXJnZXRUYWdOYW1lICE9PSAnaWd4LWdyaWQtY2VsbCcgJiYgdGFyZ2V0VGFnTmFtZSAhPT0gJ2lneC10cmVlLWdyaWQtY2VsbCcpIHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRlclVwKHRoaXMuX2xhc3RTZWxlY3RlZE5vZGUsIHRoaXMuZ3JpZC5yYW5nZVNlbGVjdGVkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iXX0=
@@ -381,10 +381,10 @@ export class IgxPageNavigationComponent {
381
381
  }
382
382
  }
383
383
  IgxPageNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: IgxPageNavigationComponent, deps: [{ token: IgxPaginatorComponent, host: true }], target: i0.ɵɵFactoryTarget.Component });
384
- IgxPageNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: IgxPageNavigationComponent, selector: "igx-page-nav", inputs: { role: "role" }, host: { properties: { "class.igx-page-nav": "this.cssClass", "attr.role": "this.role" } }, ngImport: i0, template: "<button\n [title]=\"paginator.resourceStrings.igx_paginator_first_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.paginate(0)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n>\n <igx-icon>first_page</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_previous_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.previousPage()\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n>\n <igx-icon>chevron_left</igx-icon>\n</button>\n<div class=\"igx-page-nav__text\" aria-current=\"page\">\n <span>{{ paginator.page + 1 }}</span>\n <span\n >&nbsp;{{\n paginator.resourceStrings.igx_paginator_pager_text\n }}&nbsp;</span\n >\n <span>{{ paginator.totalPages }}</span>\n</div>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_next_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.nextPage()\"\n igxRipple\n [igxRippleCentered]=\"true\"\n igxButton=\"icon\"\n>\n <igx-icon>chevron_right</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_last_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.paginate(paginator.totalPages - 1)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n>\n <igx-icon>last_page</igx-icon>\n</button>\n\n", dependencies: [{ kind: "directive", type: i6.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i7.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i8.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }] });
384
+ IgxPageNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: IgxPageNavigationComponent, selector: "igx-page-nav", inputs: { role: "role" }, host: { properties: { "class.igx-page-nav": "this.cssClass", "attr.role": "this.role" } }, ngImport: i0, template: "<button\n [title]=\"paginator.resourceStrings.igx_paginator_first_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.paginate(0)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n type=\"button\"\n>\n <igx-icon>first_page</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_previous_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.previousPage()\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n type=\"button\"\n>\n <igx-icon>chevron_left</igx-icon>\n</button>\n<div class=\"igx-page-nav__text\" aria-current=\"page\">\n <span>{{ paginator.page + 1 }}</span>\n <span\n >&nbsp;{{\n paginator.resourceStrings.igx_paginator_pager_text\n }}&nbsp;</span\n >\n <span>{{ paginator.totalPages }}</span>\n</div>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_next_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.nextPage()\"\n igxRipple\n [igxRippleCentered]=\"true\"\n igxButton=\"icon\"\n type=\"button\"\n>\n <igx-icon>chevron_right</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_last_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.paginate(paginator.totalPages - 1)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n type=\"button\"\n>\n <igx-icon>last_page</igx-icon>\n</button>\n\n", dependencies: [{ kind: "directive", type: i6.IgxButtonDirective, selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { kind: "component", type: i7.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { kind: "directive", type: i8.IgxRippleDirective, selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }] });
385
385
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: IgxPageNavigationComponent, decorators: [{
386
386
  type: Component,
387
- args: [{ selector: 'igx-page-nav', template: "<button\n [title]=\"paginator.resourceStrings.igx_paginator_first_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.paginate(0)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n>\n <igx-icon>first_page</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_previous_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.previousPage()\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n>\n <igx-icon>chevron_left</igx-icon>\n</button>\n<div class=\"igx-page-nav__text\" aria-current=\"page\">\n <span>{{ paginator.page + 1 }}</span>\n <span\n >&nbsp;{{\n paginator.resourceStrings.igx_paginator_pager_text\n }}&nbsp;</span\n >\n <span>{{ paginator.totalPages }}</span>\n</div>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_next_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.nextPage()\"\n igxRipple\n [igxRippleCentered]=\"true\"\n igxButton=\"icon\"\n>\n <igx-icon>chevron_right</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_last_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.paginate(paginator.totalPages - 1)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n>\n <igx-icon>last_page</igx-icon>\n</button>\n\n" }]
387
+ args: [{ selector: 'igx-page-nav', template: "<button\n [title]=\"paginator.resourceStrings.igx_paginator_first_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.paginate(0)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n type=\"button\"\n>\n <igx-icon>first_page</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_previous_page_button_text\"\n [disabled]=\"paginator.isFirstPageDisabled\"\n [attr.aria-disabled]=\"paginator.isFirstPageDisabled\"\n (click)=\"paginator.previousPage()\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n type=\"button\"\n>\n <igx-icon>chevron_left</igx-icon>\n</button>\n<div class=\"igx-page-nav__text\" aria-current=\"page\">\n <span>{{ paginator.page + 1 }}</span>\n <span\n >&nbsp;{{\n paginator.resourceStrings.igx_paginator_pager_text\n }}&nbsp;</span\n >\n <span>{{ paginator.totalPages }}</span>\n</div>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_next_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.nextPage()\"\n igxRipple\n [igxRippleCentered]=\"true\"\n igxButton=\"icon\"\n type=\"button\"\n>\n <igx-icon>chevron_right</igx-icon>\n</button>\n<button\n [title]=\"paginator.resourceStrings.igx_paginator_last_page_button_text\"\n [disabled]=\"paginator.isLastPageDisabled\"\n [attr.aria-disabled]=\"paginator.isLastPageDisabled\"\n (click)=\"paginator.paginate(paginator.totalPages - 1)\"\n igxButton=\"icon\"\n igxRipple\n [igxRippleCentered]=\"true\"\n type=\"button\"\n>\n <igx-icon>last_page</igx-icon>\n</button>\n\n" }]
388
388
  }], ctorParameters: function () { return [{ type: IgxPaginatorComponent, decorators: [{
389
389
  type: Host
390
390
  }] }]; }, propDecorators: { cssClass: [{
@@ -396,4 +396,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImpor
396
396
  }, {
397
397
  type: Input
398
398
  }] } });
399
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL3BhZ2luYXRvci9wYWdlLXNpemUtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcGFnaW5hdG9yL3BhZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFFVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7OztBQU16SCxNQUFNLE9BQU8sNkJBQTZCO0lBRDFDO1FBRUk7OztXQUdHO1FBRUksYUFBUSxHQUFHLHVCQUF1QixDQUFDO0tBQzdDOzswSEFQWSw2QkFBNkI7OEdBQTdCLDZCQUE2QjsyRkFBN0IsNkJBQTZCO2tCQUR6QyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLDZDQUE2QyxFQUFFOzhCQU8zRCxRQUFRO3NCQURkLFdBQVc7dUJBQUMsNkJBQTZCOztBQU85QyxN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R0ksU0FBSSxHQUFHLFlBQVksQ0FBQztJQUVvQyxDQUFDOzt1SEFmdkQsMEJBQTBCLGtCQWVHLHFCQUFxQjsyR0FmbEQsMEJBQTBCLHlLR2hZdkMsNnREQXNEQTsyRkgwVWEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNJLGNBQWM7MERBa0JjLHFCQUFxQjswQkFBOUMsSUFBSTs0Q0FUVixRQUFRO3NCQURkLFdBQVc7dUJBQUMsb0JBQW9CO2dCQVExQixJQUFJO3NCQUZWLFdBQVc7dUJBQUMsV0FBVzs7c0JBQ3ZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQgeyBJUGFnZUNhbmNlbGxhYmxlRXZlbnRBcmdzLCBJUGFnZUV2ZW50QXJncyB9IGZyb20gJy4vcGFnaW5hdG9yLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgSVBhZ2luYXRvclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9wYWdpbmF0b3ItcmVzb3VyY2VzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2lneFBhZ2luYXRvckNvbnRlbnRdLGlneC1wYWdpbmF0b3ItY29udGVudCcgfSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdpbmF0b3JUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2luYXRvci1jb250ZW50JylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXBhZ2luYXRvci1jb250ZW50Jztcbn1cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXBhZ2luYXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICdwYWdpbmF0b3IuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4UGFnaW5hdG9yVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgcHVibGljIGN1c3RvbUNvbnRlbnQ6IElneFBhZ2luYXRvclRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGBwZXJQYWdlYCBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgcGFnaW5hdG9yIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBhZ2luYXRvciAocGVyUGFnZUNoYW5nZSk9XCJvblBlclBhZ2VDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIG9uUGVyUGFnZUNoYW5nZShwZXJQYWdlOiBudW1iZXIpIHtcbiAgICAgKiAgIHRoaXMucGVyUGFnZSA9IHBlclBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHRoZSBjdXJyZW50IHBhZ2UgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGFnaW5hdG9yIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBwYWdpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBjdXJyZW50IGFuZCBuZXh0IHBhZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGFnaW5hdG9yIChwYWdpbmcpPVwicGFnaW5nSGFuZGxlcigkZXZlbnQpXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlQ2FuY2VsbGFibGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHBhZ2luZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHBhZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGFnaW5hdG9yIChwYWdpbmdEb25lKT1cInBhZ2luZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGFnaW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBwYWdlcyBjYWxjdWxhdGVkIGZyb20gdG90YWxSZWNvcmRzIGFuZCBwZXJQYWdlXG4gICAgICovXG4gICAgcHVibGljIHRvdGFsUGFnZXM6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3BhZ2UgPSAwO1xuICAgIHByb3RlY3RlZCBfdG90YWxSZWNvcmRzOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9zZWxlY3RPcHRpb25zID0gWzUsIDEwLCAxNSwgMjUsIDUwLCAxMDAsIDUwMF07XG4gICAgcHJvdGVjdGVkIF9wZXJQYWdlID0gMTU7XG5cbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBDdXJyZW50UmVzb3VyY2VTdHJpbmdzLlBhZ2luYXRvclJlc1N0cmluZ3M7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7fTtcbiAgICBwcml2YXRlIGRlZmF1bHRTZWxlY3RWYWx1ZXMgPSBbNSwgMTAsIDE1LCAyNSwgNTAsIDEwMCwgNTAwXTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNsYXNzIG9mIHRoZSBJZ3hQYWdpbmF0b3JDb21wb25lbnQgYmFzZWRcbiAgICAgKiBvbiB0aGUgcHJvdmlkZWQgZGlzcGxheURlbnNpdHkuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnaW5hdG9yLS1jb3N5JylcbiAgICBwdWJsaWMgZ2V0IGNsYXNzQ29zeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvc3k7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnaW5hdG9yLS1jb21wYWN0JylcbiAgICBwdWJsaWMgZ2V0IGNsYXNzQ29tcGFjdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnaW5hdG9yJylcbiAgICBwdWJsaWMgZ2V0IGNsYXNzQ29tZm9ydGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHksIHNldHMgY3VycmVudCBwYWdlIG9mIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YC5cbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAwLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgcGFnZSA9IHRoaXMucGFnaW5hdG9yLnBhZ2U7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYWdlID09PSB2YWx1ZSB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiB0aGlzLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxFdmVudEFyZ3M6IElQYWdlQ2FuY2VsbGFibGVFdmVudEFyZ3MgPSB7IGN1cnJlbnQ6IHRoaXMuX3BhZ2UsIG5leHQ6IHZhbHVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBhZ2VFdmVudEFyZ3MgPSB7IHByZXZpb3VzOiB0aGlzLl9wYWdlLCBjdXJyZW50OiB2YWx1ZSB9O1xuXG4gICAgICAgIHRoaXMucGFnaW5nLmVtaXQoY2FuY2VsRXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGNhbmNlbEV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYWdlID0gdmFsdWU7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuX3BhZ2UpO1xuXG4gICAgICAgIHRoaXMucGFnaW5nRG9uZS5lbWl0KGV2ZW50QXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5LCBzZXRzIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIHBlciBwYWdlIGluIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YC5cbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAxNS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1zUGVyUGFnZSA9IHRoaXMucGFnaW5hdG9yLnBlclBhZ2U7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJQYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGVyUGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdGhpcy5wZXJQYWdlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlclBhZ2UgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB0aGlzLnBlclBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0T3B0aW9ucyA9IHRoaXMuc29ydFVuaXF1ZU9wdGlvbnModGhpcy5kZWZhdWx0U2VsZWN0VmFsdWVzLCB0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxSZWNvcmRzIC8gdGhpcy5fcGVyUGFnZSk7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsUGFnZXMgIT09IDAgJiYgdGhpcy5wYWdlID49IHRoaXMudG90YWxQYWdlcykge1xuICAgICAgICAgICAgdGhpcy5wYWdlID0gdGhpcy50b3RhbFBhZ2VzIC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHRvdGFsIHJlY29yZHMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b3RhbFJlY29yZHMgPSB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbFJlY29yZHMgLyB0aGlzLnBlclBhZ2UpO1xuICAgICAgICBpZiAodGhpcy5wYWdlID4gdGhpcy50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGN1c3RvbSBvcHRpb25zIGluIHRoZSBzZWxlY3Qgb2YgdGhlIHBhZ2luYXRvclxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgb3B0aW9ucyA9IHRoaXMucGFnaW5hdG9yLnNlbGVjdE9wdGlvbnM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RPcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0T3B0aW9ucyh2YWx1ZTogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RPcHRpb25zID0gdGhpcy5zb3J0VW5pcXVlT3B0aW9ucyh2YWx1ZSwgdGhpcy5fcGVyUGFnZSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdFZhbHVlcyA9IFsuLi52YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBjdXN0b20gT3ZlcmxheVNldHRpbmdzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBhZ2luYXRvciBbb3ZlcmxheVNldHRpbmdzXSA9IFwiY3VzdG9tT3ZlcmxheVNldHRpbmdzXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBvdmVybGF5U2V0dGluZ3MoKTogT3ZlcmxheVNldHRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlTZXR0aW5ncztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG92ZXJsYXlTZXR0aW5ncyh2YWx1ZTogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX292ZXJsYXlTZXR0aW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgc2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElQYWdpbmF0b3JSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElQYWdpbmF0b3JSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMucGFnaW5hdG9yLmlzTGFzdFBhZ2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlICsgMSA+PSB0aGlzLnRvdGFsUGFnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBwYWdlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMucGFnaW5hdG9yLmlzRmlyc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UgPT09IDA7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBmaXJzdCBwYWdlciBidXR0b25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGaXJzdFBhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgbGFzdCBwYWdlciBidXR0b25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGFnZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xhc3RQYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgRGlzcGxheURlbnNpdHkgZm9yIHRoZSA8c2VsZWN0PiBpbnNpZGUgdGhlIHBhZ2luYXRvclxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnaW5hdG9yU2VsZWN0RGlzcGxheURlbnNpdHkoKTogRGlzcGxheURlbnNpdHkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tZm9ydGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgLCBpZiB0aGUgcGFnaW5hdG9yIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IHBhZ2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucGFnaW5hdG9yLm5leHRQYWdlKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIG5leHRQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNMYXN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgYElneFBhZ2luYXRvckNvbXBvbmVudGAsIGlmIHRoZSBwYWdpbmF0b3IgaXMgbm90IGFscmVhZHkgYXQgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucGFnaW5hdG9yLnByZXZpb3VzUGFnZSgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgZGVzaXJlZCBwYWdlIGluZGV4LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnBhZ2luYXRvci5wYWdpbmF0ZSgxKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWxcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHBhZ2luYXRlKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IHRoaXMudG90YWxQYWdlcyAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhZ2UgPSB2YWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0VW5pcXVlT3B0aW9ucyh2YWx1ZXM6IEFycmF5PG51bWJlcj4sIG5ld09wdGlvbjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi52YWx1ZXMsIG5ld09wdGlvbl0pKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgfVxufVxuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXBhZ2Utc2l6ZScsXG4gICAgdGVtcGxhdGVVcmw6ICdwYWdlLXNpemUtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdlU2l6ZVNlbGVjdG9yQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnZS1zaXplJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXBhZ2Utc2l6ZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIHB1YmxpYyBwYWdpbmF0b3I6IElneFBhZ2luYXRvckNvbXBvbmVudCkgeyB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtcGFnZS1uYXYnLFxuICAgIHRlbXBsYXRlVXJsOiAncGFnZXIuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdlTmF2aWdhdGlvbkNvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2UtbmF2JylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXBhZ2UtbmF2JztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvbGUgPSAnbmF2aWdhdGlvbic7XG5cbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIHB1YmxpYyBwYWdpbmF0b3I6IElneFBhZ2luYXRvckNvbXBvbmVudCkgeyB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbaWd4UGFnaW5hdG9yQ29udGVudF0saWd4LXBhZ2luYXRvci1jb250ZW50XCI+PC9uZy1jb250ZW50PlxuXG48aWd4LXBhZ2Utc2l6ZSAqbmdJZj1cIiFjdXN0b21Db250ZW50XCI+PC9pZ3gtcGFnZS1zaXplPlxuPGlneC1wYWdlLW5hdiAqbmdJZj1cIiFjdXN0b21Db250ZW50XCI+PC9pZ3gtcGFnZS1uYXY+XG4iLCI8bGFiZWwgY2xhc3M9XCJpZ3gtcGFnZS1zaXplX19sYWJlbFwiPnt7IHBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9sYWJlbCB9fTwvbGFiZWw+XG48ZGl2IGNsYXNzPVwiaWd4LXBhZ2Utc2l6ZV9fc2VsZWN0XCI+XG4gICAgPGlneC1zZWxlY3QgW292ZXJsYXlTZXR0aW5nc109XCJwYWdpbmF0b3Iub3ZlcmxheVNldHRpbmdzXCIgWyhuZ01vZGVsKV09XCJwYWdpbmF0b3IucGVyUGFnZVwiXG4gICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJwYWdpbmF0b3IucGFnaW5hdG9yU2VsZWN0RGlzcGxheURlbnNpdHlcIiB0eXBlPVwiYm9yZGVyXCI+XG4gICAgICAgIDxsYWJlbCBpZ3hMYWJlbCBbaGlkZGVuXT1cInRydWVcIj57eyBwYWdpbmF0b3IucmVzb3VyY2VTdHJpbmdzLmlneF9wYWdpbmF0b3JfbGFiZWwgfX08L2xhYmVsPlxuICAgICAgICA8aWd4LXNlbGVjdC1pdGVtIFt2YWx1ZV09XCJ2YWxcIiAqbmdGb3I9XCJsZXQgdmFsIG9mIHBhZ2luYXRvci5zZWxlY3RPcHRpb25zXCI+XG4gICAgICAgICAgICB7eyB2YWwgfX1cbiAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgPC9pZ3gtc2VsZWN0PlxuPC9kaXY+XG4iLCI8YnV0dG9uXG4gICAgW3RpdGxlXT1cInBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9maXJzdF9wYWdlX2J1dHRvbl90ZXh0XCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5hdG9yLmlzRmlyc3RQYWdlRGlzYWJsZWRcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicGFnaW5hdG9yLmlzRmlyc3RQYWdlRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJwYWdpbmF0b3IucGFnaW5hdGUoMClcIlxuICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgIGlneFJpcHBsZVxuICAgIFtpZ3hSaXBwbGVDZW50ZXJlZF09XCJ0cnVlXCJcbj5cbiAgICA8aWd4LWljb24+Zmlyc3RfcGFnZTwvaWd4LWljb24+XG48L2J1dHRvbj5cbjxidXR0b25cbiAgICBbdGl0bGVdPVwicGFnaW5hdG9yLnJlc291cmNlU3RyaW5ncy5pZ3hfcGFnaW5hdG9yX3ByZXZpb3VzX3BhZ2VfYnV0dG9uX3RleHRcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNGaXJzdFBhZ2VEaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNGaXJzdFBhZ2VEaXNhYmxlZFwiXG4gICAgKGNsaWNrKT1cInBhZ2luYXRvci5wcmV2aW91c1BhZ2UoKVwiXG4gICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgaWd4UmlwcGxlXG4gICAgW2lneFJpcHBsZUNlbnRlcmVkXT1cInRydWVcIlxuPlxuICAgIDxpZ3gtaWNvbj5jaGV2cm9uX2xlZnQ8L2lneC1pY29uPlxuPC9idXR0b24+XG48ZGl2IGNsYXNzPVwiaWd4LXBhZ2UtbmF2X190ZXh0XCIgYXJpYS1jdXJyZW50PVwicGFnZVwiPlxuICAgIDxzcGFuPnt7IHBhZ2luYXRvci5wYWdlICsgMSB9fTwvc3Bhbj5cbiAgICA8c3BhblxuICAgICAgICA+Jm5ic3A7e3tcbiAgICAgICAgICAgIHBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9wYWdlcl90ZXh0XG4gICAgICAgIH19Jm5ic3A7PC9zcGFuXG4gICAgPlxuICAgIDxzcGFuPnt7IHBhZ2luYXRvci50b3RhbFBhZ2VzIH19PC9zcGFuPlxuPC9kaXY+XG48YnV0dG9uXG4gICAgW3RpdGxlXT1cInBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9uZXh0X3BhZ2VfYnV0dG9uX3RleHRcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNMYXN0UGFnZURpc2FibGVkXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInBhZ2luYXRvci5pc0xhc3RQYWdlRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJwYWdpbmF0b3IubmV4dFBhZ2UoKVwiXG4gICAgaWd4UmlwcGxlXG4gICAgW2lneFJpcHBsZUNlbnRlcmVkXT1cInRydWVcIlxuICAgIGlneEJ1dHRvbj1cImljb25cIlxuPlxuICAgIDxpZ3gtaWNvbj5jaGV2cm9uX3JpZ2h0PC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuPGJ1dHRvblxuICAgIFt0aXRsZV09XCJwYWdpbmF0b3IucmVzb3VyY2VTdHJpbmdzLmlneF9wYWdpbmF0b3JfbGFzdF9wYWdlX2J1dHRvbl90ZXh0XCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5hdG9yLmlzTGFzdFBhZ2VEaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNMYXN0UGFnZURpc2FibGVkXCJcbiAgICAoY2xpY2spPVwicGFnaW5hdG9yLnBhZ2luYXRlKHBhZ2luYXRvci50b3RhbFBhZ2VzIC0gMSlcIlxuICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgIGlneFJpcHBsZVxuICAgIFtpZ3hSaXBwbGVDZW50ZXJlZF09XCJ0cnVlXCJcbj5cbiAgICA8aWd4LWljb24+bGFzdF9wYWdlPC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuXG4iXX0=
399
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudC5odG1sIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL3BhZ2luYXRvci9wYWdlLXNpemUtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvcGFnaW5hdG9yL3BhZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFFVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7OztBQU16SCxNQUFNLE9BQU8sNkJBQTZCO0lBRDFDO1FBRUk7OztXQUdHO1FBRUksYUFBUSxHQUFHLHVCQUF1QixDQUFDO0tBQzdDOzswSEFQWSw2QkFBNkI7OEdBQTdCLDZCQUE2QjsyRkFBN0IsNkJBQTZCO2tCQUR6QyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLDZDQUE2QyxFQUFFOzhCQU8zRCxRQUFRO3NCQURkLFdBQVc7dUJBQUMsNkJBQTZCOztBQU85QyxNQUFNLE9BQU8scUJBQXNCLFNBQVEsa0JBQWtCO0lBb096RCxZQUErRCxzQkFBOEMsRUFDakcsVUFBc0IsRUFBVSxHQUFzQjtRQUM5RCxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUY2QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ2pHLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTVObEU7Ozs7Ozs7Ozs7OztXQVlHO1FBRUksa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWxEOzs7Ozs7Ozs7Ozs7V0FZRztRQUVJLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRS9DOzs7Ozs7Ozs7V0FTRztRQUVJLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUU5RDs7Ozs7Ozs7O1dBU0c7UUFFSSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFNN0MsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVWLG1CQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWhCLHFCQUFnQixHQUFHLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDO1FBQzlELHFCQUFnQixHQUFvQixFQUFFLENBQUM7UUFDdkMsd0JBQW1CLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQXlKNUQsQ0FBQztJQXZKRDs7O09BR0c7SUFDSCxJQUNXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQ1csWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssY0FBYyxDQUFDLE9BQU8sQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFDVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLGNBQWMsQ0FBQyxXQUFXLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsSUFDVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLElBQUksQ0FBQyxLQUFhO1FBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5RCxPQUFPO1NBQ1Y7UUFDRCxNQUFNLGVBQWUsR0FBOEIsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN2RyxNQUFNLFNBQVMsR0FBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFFM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEMsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFO1lBQ3hCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxJQUNXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDNUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO1lBQ3JDLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQ25DO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUNXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNqQjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUNXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUFvQjtRQUN6QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLGVBQWUsQ0FBQyxLQUFzQjtRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLGVBQWUsQ0FBQyxLQUFnQztRQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqQyxDQUFDO0lBT0Q7Ozs7O09BS0c7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQVcsV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFHRDs7T0FFRztJQUNILElBQVcsbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyw2QkFBNkI7UUFDcEMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLGNBQWMsQ0FBQyxXQUFXLEVBQUU7WUFDcEQsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFDRDs7Ozs7OztPQU9HO0lBQ0ksUUFBUTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztJQUNEOzs7Ozs7O09BT0c7SUFDSSxZQUFZO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbkIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7U0FDbEI7SUFDTCxDQUFDO0lBQ0Q7Ozs7Ozs7O09BUUc7SUFDSSxRQUFRLENBQUMsR0FBVztRQUN2QixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFxQixFQUFFLFNBQWlCO1FBQzlELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQzs7a0hBdlVRLHFCQUFxQixrQkFvT0UsbUJBQW1CO3NHQXBPMUMscUJBQXFCLHFqQkFNaEIsNkJBQTZCLHVFQ3ZDL0Msd01BSUEsME5ENFhhLDBCQUEwQixrSEFoQjFCLDRCQUE0QjsyRkEvVTVCLHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDSSxlQUFlOzswQkF1T1osUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7cUdBN041QyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLDZCQUE2QjtnQkFpQnBDLGFBQWE7c0JBRG5CLE1BQU07Z0JBaUJBLFVBQVU7c0JBRGhCLE1BQU07Z0JBY0EsTUFBTTtzQkFEWixNQUFNO2dCQWNBLFVBQVU7c0JBRGhCLE1BQU07Z0JBcUJJLFNBQVM7c0JBRG5CLFdBQVc7dUJBQUMsMkJBQTJCO2dCQU03QixZQUFZO3NCQUR0QixXQUFXO3VCQUFDLDhCQUE4QjtnQkFNaEMsZ0JBQWdCO3NCQUQxQixXQUFXO3VCQUFDLHFCQUFxQjtnQkFldkIsSUFBSTtzQkFEZCxLQUFLO2dCQWdDSyxPQUFPO3NCQURqQixLQUFLO2dCQTJCSyxZQUFZO3NCQUR0QixLQUFLO2dCQXVCSyxhQUFhO3NCQUR2QixLQUFLO2dCQWlCSyxlQUFlO3NCQUR6QixLQUFLO2dCQWNLLGVBQWU7c0JBRHpCLEtBQUs7O0FBdUhWLE1BQU0sT0FBTyw0QkFBNEI7SUFRckMsWUFBMkIsU0FBZ0M7UUFBaEMsY0FBUyxHQUFULFNBQVMsQ0FBdUI7UUFQM0Q7OztXQUdHO1FBRUksYUFBUSxHQUFHLGVBQWUsQ0FBQztJQUU2QixDQUFDOzt5SEFSdkQsNEJBQTRCLGtCQVFDLHFCQUFxQjs2R0FSbEQsNEJBQTRCLHVIRWhYekMsb2xCQVVBOzJGRnNXYSw0QkFBNEI7a0JBSnhDLFNBQVM7K0JBQ0ksZUFBZTswREFXYSxxQkFBcUI7MEJBQTlDLElBQUk7NENBRlYsUUFBUTtzQkFEZCxXQUFXO3VCQUFDLHFCQUFxQjs7QUFXdEMsTUFBTSxPQUFPLDBCQUEwQjtJQWVuQyxZQUEyQixTQUFnQztRQUFoQyxjQUFTLEdBQVQsU0FBUyxDQUF1QjtRQWQzRDs7O1dBR0c7UUFFSSxhQUFRLEdBQUcsY0FBYyxDQUFDO1FBRWpDOztXQUVHO1FBR0ksU0FBSSxHQUFHLFlBQVksQ0FBQztJQUVvQyxDQUFDOzt1SEFmdkQsMEJBQTBCLGtCQWVHLHFCQUFxQjsyR0FmbEQsMEJBQTBCLHlLR2hZdkMsaXpEQTBEQTsyRkhzVWEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNJLGNBQWM7MERBa0JjLHFCQUFxQjswQkFBOUMsSUFBSTs0Q0FUVixRQUFRO3NCQURkLFdBQVc7dUJBQUMsb0JBQW9CO2dCQVExQixJQUFJO3NCQUZWLFdBQVc7dUJBQUMsV0FBVzs7c0JBQ3ZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGlyZWN0aXZlLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3QsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQgeyBJUGFnZUNhbmNlbGxhYmxlRXZlbnRBcmdzLCBJUGFnZUV2ZW50QXJncyB9IGZyb20gJy4vcGFnaW5hdG9yLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgSVBhZ2luYXRvclJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9wYWdpbmF0b3ItcmVzb3VyY2VzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2lneFBhZ2luYXRvckNvbnRlbnRdLGlneC1wYWdpbmF0b3ItY29udGVudCcgfSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdpbmF0b3JUZW1wbGF0ZURpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2luYXRvci1jb250ZW50JylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXBhZ2luYXRvci1jb250ZW50Jztcbn1cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXBhZ2luYXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICdwYWdpbmF0b3IuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2Uge1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4UGFnaW5hdG9yVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgcHVibGljIGN1c3RvbUNvbnRlbnQ6IElneFBhZ2luYXRvclRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGBwZXJQYWdlYCBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgcGFnaW5hdG9yIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBhZ2luYXRvciAocGVyUGFnZUNoYW5nZSk9XCJvblBlclBhZ2VDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIG9uUGVyUGFnZUNoYW5nZShwZXJQYWdlOiBudW1iZXIpIHtcbiAgICAgKiAgIHRoaXMucGVyUGFnZSA9IHBlclBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHRoZSBjdXJyZW50IHBhZ2UgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGFnaW5hdG9yIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBwYWdpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBjdXJyZW50IGFuZCBuZXh0IHBhZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGFnaW5hdG9yIChwYWdpbmcpPVwicGFnaW5nSGFuZGxlcigkZXZlbnQpXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwYWdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlQ2FuY2VsbGFibGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHBhZ2luZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHBhZ2VzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGFnaW5hdG9yIChwYWdpbmdEb25lKT1cInBhZ2luZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGFnaW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBwYWdlcyBjYWxjdWxhdGVkIGZyb20gdG90YWxSZWNvcmRzIGFuZCBwZXJQYWdlXG4gICAgICovXG4gICAgcHVibGljIHRvdGFsUGFnZXM6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3BhZ2UgPSAwO1xuICAgIHByb3RlY3RlZCBfdG90YWxSZWNvcmRzOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9zZWxlY3RPcHRpb25zID0gWzUsIDEwLCAxNSwgMjUsIDUwLCAxMDAsIDUwMF07XG4gICAgcHJvdGVjdGVkIF9wZXJQYWdlID0gMTU7XG5cbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBDdXJyZW50UmVzb3VyY2VTdHJpbmdzLlBhZ2luYXRvclJlc1N0cmluZ3M7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7fTtcbiAgICBwcml2YXRlIGRlZmF1bHRTZWxlY3RWYWx1ZXMgPSBbNSwgMTAsIDE1LCAyNSwgNTAsIDEwMCwgNTAwXTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNsYXNzIG9mIHRoZSBJZ3hQYWdpbmF0b3JDb21wb25lbnQgYmFzZWRcbiAgICAgKiBvbiB0aGUgcHJvdmlkZWQgZGlzcGxheURlbnNpdHkuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnaW5hdG9yLS1jb3N5JylcbiAgICBwdWJsaWMgZ2V0IGNsYXNzQ29zeSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvc3k7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnaW5hdG9yLS1jb21wYWN0JylcbiAgICBwdWJsaWMgZ2V0IGNsYXNzQ29tcGFjdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnaW5hdG9yJylcbiAgICBwdWJsaWMgZ2V0IGNsYXNzQ29tZm9ydGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHksIHNldHMgY3VycmVudCBwYWdlIG9mIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YC5cbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAwLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgcGFnZSA9IHRoaXMucGFnaW5hdG9yLnBhZ2U7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYWdlID09PSB2YWx1ZSB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiB0aGlzLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxFdmVudEFyZ3M6IElQYWdlQ2FuY2VsbGFibGVFdmVudEFyZ3MgPSB7IGN1cnJlbnQ6IHRoaXMuX3BhZ2UsIG5leHQ6IHZhbHVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBhZ2VFdmVudEFyZ3MgPSB7IHByZXZpb3VzOiB0aGlzLl9wYWdlLCBjdXJyZW50OiB2YWx1ZSB9O1xuXG4gICAgICAgIHRoaXMucGFnaW5nLmVtaXQoY2FuY2VsRXZlbnRBcmdzKTtcbiAgICAgICAgaWYgKGNhbmNlbEV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYWdlID0gdmFsdWU7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuX3BhZ2UpO1xuXG4gICAgICAgIHRoaXMucGFnaW5nRG9uZS5lbWl0KGV2ZW50QXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5LCBzZXRzIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIHBlciBwYWdlIGluIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YC5cbiAgICAgKiBUaGUgZGVmYXVsdCBpcyAxNS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1zUGVyUGFnZSA9IHRoaXMucGFnaW5hdG9yLnBlclBhZ2U7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJQYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGVyUGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdGhpcy5wZXJQYWdlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlclBhZ2UgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB0aGlzLnBlclBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0T3B0aW9ucyA9IHRoaXMuc29ydFVuaXF1ZU9wdGlvbnModGhpcy5kZWZhdWx0U2VsZWN0VmFsdWVzLCB0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxSZWNvcmRzIC8gdGhpcy5fcGVyUGFnZSk7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsUGFnZXMgIT09IDAgJiYgdGhpcy5wYWdlID49IHRoaXMudG90YWxQYWdlcykge1xuICAgICAgICAgICAgdGhpcy5wYWdlID0gdGhpcy50b3RhbFBhZ2VzIC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHRvdGFsIHJlY29yZHMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b3RhbFJlY29yZHMgPSB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbFJlY29yZHMgLyB0aGlzLnBlclBhZ2UpO1xuICAgICAgICBpZiAodGhpcy5wYWdlID4gdGhpcy50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGN1c3RvbSBvcHRpb25zIGluIHRoZSBzZWxlY3Qgb2YgdGhlIHBhZ2luYXRvclxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgb3B0aW9ucyA9IHRoaXMucGFnaW5hdG9yLnNlbGVjdE9wdGlvbnM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RPcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0T3B0aW9ucyh2YWx1ZTogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RPcHRpb25zID0gdGhpcy5zb3J0VW5pcXVlT3B0aW9ucyh2YWx1ZSwgdGhpcy5fcGVyUGFnZSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdFZhbHVlcyA9IFsuLi52YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBjdXN0b20gT3ZlcmxheVNldHRpbmdzLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBhZ2luYXRvciBbb3ZlcmxheVNldHRpbmdzXSA9IFwiY3VzdG9tT3ZlcmxheVNldHRpbmdzXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBvdmVybGF5U2V0dGluZ3MoKTogT3ZlcmxheVNldHRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlTZXR0aW5ncztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG92ZXJsYXlTZXR0aW5ncyh2YWx1ZTogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX292ZXJsYXlTZXR0aW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgc2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElQYWdpbmF0b3JSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElQYWdpbmF0b3JSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMucGFnaW5hdG9yLmlzTGFzdFBhZ2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlICsgMSA+PSB0aGlzLnRvdGFsUGFnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBwYWdlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMucGFnaW5hdG9yLmlzRmlyc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UgPT09IDA7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBmaXJzdCBwYWdlciBidXR0b25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2VEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGaXJzdFBhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgbGFzdCBwYWdlciBidXR0b25zIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGFnZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xhc3RQYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgRGlzcGxheURlbnNpdHkgZm9yIHRoZSA8c2VsZWN0PiBpbnNpZGUgdGhlIHBhZ2luYXRvclxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnaW5hdG9yU2VsZWN0RGlzcGxheURlbnNpdHkoKTogRGlzcGxheURlbnNpdHkge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tZm9ydGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgLCBpZiB0aGUgcGFnaW5hdG9yIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IHBhZ2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucGFnaW5hdG9yLm5leHRQYWdlKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIG5leHRQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNMYXN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgYElneFBhZ2luYXRvckNvbXBvbmVudGAsIGlmIHRoZSBwYWdpbmF0b3IgaXMgbm90IGFscmVhZHkgYXQgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucGFnaW5hdG9yLnByZXZpb3VzUGFnZSgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgZGVzaXJlZCBwYWdlIGluZGV4LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnBhZ2luYXRvci5wYWdpbmF0ZSgxKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWxcbiAgICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHBhZ2luYXRlKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IHRoaXMudG90YWxQYWdlcyAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhZ2UgPSB2YWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0VW5pcXVlT3B0aW9ucyh2YWx1ZXM6IEFycmF5PG51bWJlcj4sIG5ld09wdGlvbjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi52YWx1ZXMsIG5ld09wdGlvbl0pKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgfVxufVxuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LXBhZ2Utc2l6ZScsXG4gICAgdGVtcGxhdGVVcmw6ICdwYWdlLXNpemUtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdlU2l6ZVNlbGVjdG9yQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtcGFnZS1zaXplJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXBhZ2Utc2l6ZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIHB1YmxpYyBwYWdpbmF0b3I6IElneFBhZ2luYXRvckNvbXBvbmVudCkgeyB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtcGFnZS1uYXYnLFxuICAgIHRlbXBsYXRlVXJsOiAncGFnZXIuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdlTmF2aWdhdGlvbkNvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2UtbmF2JylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LXBhZ2UtbmF2JztcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvbGUgPSAnbmF2aWdhdGlvbic7XG5cbiAgICBjb25zdHJ1Y3RvcihASG9zdCgpIHB1YmxpYyBwYWdpbmF0b3I6IElneFBhZ2luYXRvckNvbXBvbmVudCkgeyB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbaWd4UGFnaW5hdG9yQ29udGVudF0saWd4LXBhZ2luYXRvci1jb250ZW50XCI+PC9uZy1jb250ZW50PlxuXG48aWd4LXBhZ2Utc2l6ZSAqbmdJZj1cIiFjdXN0b21Db250ZW50XCI+PC9pZ3gtcGFnZS1zaXplPlxuPGlneC1wYWdlLW5hdiAqbmdJZj1cIiFjdXN0b21Db250ZW50XCI+PC9pZ3gtcGFnZS1uYXY+XG4iLCI8bGFiZWwgY2xhc3M9XCJpZ3gtcGFnZS1zaXplX19sYWJlbFwiPnt7IHBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9sYWJlbCB9fTwvbGFiZWw+XG48ZGl2IGNsYXNzPVwiaWd4LXBhZ2Utc2l6ZV9fc2VsZWN0XCI+XG4gICAgPGlneC1zZWxlY3QgW292ZXJsYXlTZXR0aW5nc109XCJwYWdpbmF0b3Iub3ZlcmxheVNldHRpbmdzXCIgWyhuZ01vZGVsKV09XCJwYWdpbmF0b3IucGVyUGFnZVwiXG4gICAgICAgIFtkaXNwbGF5RGVuc2l0eV09XCJwYWdpbmF0b3IucGFnaW5hdG9yU2VsZWN0RGlzcGxheURlbnNpdHlcIiB0eXBlPVwiYm9yZGVyXCI+XG4gICAgICAgIDxsYWJlbCBpZ3hMYWJlbCBbaGlkZGVuXT1cInRydWVcIj57eyBwYWdpbmF0b3IucmVzb3VyY2VTdHJpbmdzLmlneF9wYWdpbmF0b3JfbGFiZWwgfX08L2xhYmVsPlxuICAgICAgICA8aWd4LXNlbGVjdC1pdGVtIFt2YWx1ZV09XCJ2YWxcIiAqbmdGb3I9XCJsZXQgdmFsIG9mIHBhZ2luYXRvci5zZWxlY3RPcHRpb25zXCI+XG4gICAgICAgICAgICB7eyB2YWwgfX1cbiAgICAgICAgPC9pZ3gtc2VsZWN0LWl0ZW0+XG4gICAgPC9pZ3gtc2VsZWN0PlxuPC9kaXY+XG4iLCI8YnV0dG9uXG4gICAgW3RpdGxlXT1cInBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9maXJzdF9wYWdlX2J1dHRvbl90ZXh0XCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5hdG9yLmlzRmlyc3RQYWdlRGlzYWJsZWRcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicGFnaW5hdG9yLmlzRmlyc3RQYWdlRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJwYWdpbmF0b3IucGFnaW5hdGUoMClcIlxuICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgIGlneFJpcHBsZVxuICAgIFtpZ3hSaXBwbGVDZW50ZXJlZF09XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbj5cbiAgICA8aWd4LWljb24+Zmlyc3RfcGFnZTwvaWd4LWljb24+XG48L2J1dHRvbj5cbjxidXR0b25cbiAgICBbdGl0bGVdPVwicGFnaW5hdG9yLnJlc291cmNlU3RyaW5ncy5pZ3hfcGFnaW5hdG9yX3ByZXZpb3VzX3BhZ2VfYnV0dG9uX3RleHRcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNGaXJzdFBhZ2VEaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNGaXJzdFBhZ2VEaXNhYmxlZFwiXG4gICAgKGNsaWNrKT1cInBhZ2luYXRvci5wcmV2aW91c1BhZ2UoKVwiXG4gICAgaWd4QnV0dG9uPVwiaWNvblwiXG4gICAgaWd4UmlwcGxlXG4gICAgW2lneFJpcHBsZUNlbnRlcmVkXT1cInRydWVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuPlxuICAgIDxpZ3gtaWNvbj5jaGV2cm9uX2xlZnQ8L2lneC1pY29uPlxuPC9idXR0b24+XG48ZGl2IGNsYXNzPVwiaWd4LXBhZ2UtbmF2X190ZXh0XCIgYXJpYS1jdXJyZW50PVwicGFnZVwiPlxuICAgIDxzcGFuPnt7IHBhZ2luYXRvci5wYWdlICsgMSB9fTwvc3Bhbj5cbiAgICA8c3BhblxuICAgICAgICA+Jm5ic3A7e3tcbiAgICAgICAgICAgIHBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9wYWdlcl90ZXh0XG4gICAgICAgIH19Jm5ic3A7PC9zcGFuXG4gICAgPlxuICAgIDxzcGFuPnt7IHBhZ2luYXRvci50b3RhbFBhZ2VzIH19PC9zcGFuPlxuPC9kaXY+XG48YnV0dG9uXG4gICAgW3RpdGxlXT1cInBhZ2luYXRvci5yZXNvdXJjZVN0cmluZ3MuaWd4X3BhZ2luYXRvcl9uZXh0X3BhZ2VfYnV0dG9uX3RleHRcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNMYXN0UGFnZURpc2FibGVkXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInBhZ2luYXRvci5pc0xhc3RQYWdlRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJwYWdpbmF0b3IubmV4dFBhZ2UoKVwiXG4gICAgaWd4UmlwcGxlXG4gICAgW2lneFJpcHBsZUNlbnRlcmVkXT1cInRydWVcIlxuICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuPlxuICAgIDxpZ3gtaWNvbj5jaGV2cm9uX3JpZ2h0PC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuPGJ1dHRvblxuICAgIFt0aXRsZV09XCJwYWdpbmF0b3IucmVzb3VyY2VTdHJpbmdzLmlneF9wYWdpbmF0b3JfbGFzdF9wYWdlX2J1dHRvbl90ZXh0XCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5hdG9yLmlzTGFzdFBhZ2VEaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwYWdpbmF0b3IuaXNMYXN0UGFnZURpc2FibGVkXCJcbiAgICAoY2xpY2spPVwicGFnaW5hdG9yLnBhZ2luYXRlKHBhZ2luYXRvci50b3RhbFBhZ2VzIC0gMSlcIlxuICAgIGlneEJ1dHRvbj1cImljb25cIlxuICAgIGlneFJpcHBsZVxuICAgIFtpZ3hSaXBwbGVDZW50ZXJlZF09XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbj5cbiAgICA8aWd4LWljb24+bGFzdF9wYWdlPC9pZ3gtaWNvbj5cbjwvYnV0dG9uPlxuXG4iXX0=