igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
647 lines • 43 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { CommonModule } from '@angular/common';
import { Component, ContentChild, ContentChildren, ElementRef, HostBinding, HostListener, Input, NgModule, QueryList, Inject, Optional } from '@angular/core';
import { IgxHintDirective } from '../directives/hint/hint.directive';
import { IgxInputDirective, IgxInputState } from '../directives/input/input.directive';
import { IgxLabelDirective } from '../directives/label/label.directive';
import { IgxPrefixDirective, IgxPrefixModule } from '../directives/prefix/prefix.directive';
import { IgxSuffixDirective, IgxSuffixModule } from '../directives/suffix/suffix.directive';
import { DisplayDensity, DisplayDensityToken, DisplayDensityBase } from '../core/displayDensity';
import { IgxInputGroupBase } from './input-group.common';
/** @type {?} */
var NEXT_ID = 0;
/** @enum {number} */
var IgxInputGroupType = {
LINE: 0,
BOX: 1,
BORDER: 2,
SEARCH: 3,
};
IgxInputGroupType[IgxInputGroupType.LINE] = 'LINE';
IgxInputGroupType[IgxInputGroupType.BOX] = 'BOX';
IgxInputGroupType[IgxInputGroupType.BORDER] = 'BORDER';
IgxInputGroupType[IgxInputGroupType.SEARCH] = 'SEARCH';
var IgxInputGroupComponent = /** @class */ (function (_super) {
tslib_1.__extends(IgxInputGroupComponent, _super);
function IgxInputGroupComponent(_element, _displayDensityOptions) {
var _this = _super.call(this, _displayDensityOptions) || this;
_this._element = _element;
_this._displayDensityOptions = _displayDensityOptions;
_this._type = IgxInputGroupType.LINE;
_this._filled = false;
_this._supressInputAutofocus = false;
/**
* An \@Input property that sets the value of `id` attribute. If not provided it will be automatically generated.
* ```html
* <igx-input-group [id]="'igx-input-group-55'"></igx-input-group>
* ```
*/
_this.id = "igx-input-group-" + NEXT_ID++;
/**
* Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`.
* By default applied the class is applied.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* this.inputGroup.defaultClass = false;
* ```
* }
*/
_this.defaultClass = true;
/**
* @hidden
*/
_this.hasPlaceholder = false;
/**
* @hidden
*/
_this.isRequired = false;
/**
* @hidden
*/
_this.isFocused = false;
/**
* @hidden
*/
_this.isBox = false;
/**
* @hidden
*/
_this.isBorder = false;
/**
* @hidden
*/
_this.isSearch = false;
/**
* An \@Input property that disables the `IgxInputGroupComponent`.
* ```html
* <igx-input-group [disabled]="'true'"></igx-input-group>
* ```
*/
_this.disabled = false;
/**
* @hidden
*/
_this.hasWarning = false;
_this.element = _element;
return _this;
}
Object.defineProperty(IgxInputGroupComponent.prototype, "validClass", {
/**
* @hidden
*/
get: /**
* @hidden
* @return {?}
*/
function () {
return this.input.valid === IgxInputState.VALID;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "invalidClass", {
/**
* @hidden
*/
get: /**
* @hidden
* @return {?}
*/
function () {
return this.input.valid === IgxInputState.INVALID;
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
/**
* @hidden
* @param {?} event
* @return {?}
*/
IgxInputGroupComponent.prototype.onClick = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
if (!this._supressInputAutofocus) {
this.input.focus();
}
};
Object.defineProperty(IgxInputGroupComponent.prototype, "type", {
/**
* Returns the type of the `IgxInputGroupComponent`. How the input is styled.
* Values are `line` - 0, `box` - 1, `border` - 2 and `search` - 3. The default is `line`.
* ```typescript
*@ViewChild("MyInputGroup")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let inputType = this.inputGroup.type;
*}
* ```
*/
get: /**
* Returns the type of the `IgxInputGroupComponent`. How the input is styled.
* Values are `line` - 0, `box` - 1, `border` - 2 and `search` - 3. The default is `line`.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let inputType = this.inputGroup.type;
* }
* ```
* @return {?}
*/
function () {
return this._type.toString();
},
/**
* An @Input property that sets how the input will be styled.
* The allowed values are `line`, `box`, `border` and `search`. The default is `line`.
* ```html
*<igx-input-group [type]="'search'">
* ```
*/
set: /**
* An \@Input property that sets how the input will be styled.
* The allowed values are `line`, `box`, `border` and `search`. The default is `line`.
* ```html
* <igx-input-group [type]="'search'">
* ```
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var type = ((/** @type {?} */ (IgxInputGroupType)))[value.toUpperCase()];
if (type !== undefined) {
this.isBox = this.isBorder = this.isSearch = false;
switch (type) {
case IgxInputGroupType.BOX:
this.isBox = true;
break;
case IgxInputGroupType.BORDER:
this.isBorder = true;
break;
case IgxInputGroupType.SEARCH:
this.isSearch = true;
break;
default: break;
}
this._type = type;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "supressInputAutofocus", {
/**
* Returns whether the input element of the input group will be automatically focused on click.
* ```typescript
* let supressInputAutofocus = this.inputGroup.supressInputAutofocus;
* ```
*/
get: /**
* Returns whether the input element of the input group will be automatically focused on click.
* ```typescript
* let supressInputAutofocus = this.inputGroup.supressInputAutofocus;
* ```
* @return {?}
*/
function () {
return this._supressInputAutofocus;
},
/**
* Sets whether the input element of the input group will be automatically focused on click.
* ```html
* <igx-input-group [supressInputAutofocus]="true"></igx-input-group>
* ```
*/
set: /**
* Sets whether the input element of the input group will be automatically focused on click.
* ```html
* <igx-input-group [supressInputAutofocus]="true"></igx-input-group>
* ```
* @param {?} value
* @return {?}
*/
function (value) {
this._supressInputAutofocus = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isFilled", {
/**
*@hidden
*/
get: /**
* @hidden
* @return {?}
*/
function () {
return this._filled || (this.input && this.input.value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityCosy", {
/**
*@hidden
*/
get: /**
* @hidden
* @return {?}
*/
function () {
return this.displayDensity === DisplayDensity.cosy;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityComfortable", {
/**
*@hidden
*/
get: /**
* @hidden
* @return {?}
*/
function () {
return this.displayDensity === DisplayDensity.comfortable;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isDisplayDensityCompact", {
/**
*@hidden
*/
get: /**
* @hidden
* @return {?}
*/
function () {
return this.displayDensity === DisplayDensity.compact;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "hasHints", {
/**
* Returns whether the `IgxInputGroupComponent` has hints.
* ```typescript
*@ViewChild("MyInputGroup")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let inputHints = this.inputGroup.hasHints;
*}
* ```
*/
get: /**
* Returns whether the `IgxInputGroupComponent` has hints.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let inputHints = this.inputGroup.hasHints;
* }
* ```
* @return {?}
*/
function () {
return this.hints.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "hasBorder", {
/**
* Returns whether the `IgxInputGroupComponent` has border.
* ```typescript
*@ViewChild("MyInputGroup")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let inputBroder = this.inputGroup.hasBorder;
*}
* ```
*/
get: /**
* Returns whether the `IgxInputGroupComponent` has border.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let inputBroder = this.inputGroup.hasBorder;
* }
* ```
* @return {?}
*/
function () {
return this._type === IgxInputGroupType.LINE ||
this._type === IgxInputGroupType.BOX;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeLine", {
/**
* Returns whether the `IgxInputGroupComponent` type is line.
* ```typescript
*@ViewChild("MyInputGroup1")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let isTypeLine = this.inputGroup.isTypeLine;
*}
* ```
*/
get: /**
* Returns whether the `IgxInputGroupComponent` type is line.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeLine = this.inputGroup.isTypeLine;
* }
* ```
* @return {?}
*/
function () {
return this._type === IgxInputGroupType.LINE;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeBox", {
/**
* Returns whether the `IgxInputGroupComponent` type is box.
* ```typescript
*@ViewChild("MyInputGroup1")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let isTypeBox = this.inputGroup.isTypeBox;
*}
*```
*/
get: /**
* Returns whether the `IgxInputGroupComponent` type is box.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeBox = this.inputGroup.isTypeBox;
* }
* ```
* @return {?}
*/
function () {
return this._type === IgxInputGroupType.BOX;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeBorder", {
/**
* Returns whether the `IgxInputGroupComponent` type is border.
* ```typescript
*@ViewChild("MyInputGroup1")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let isTypeBorder = this.inputGroup.isTypeBorder;
*}
* ```
*/
get: /**
* Returns whether the `IgxInputGroupComponent` type is border.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeBorder = this.inputGroup.isTypeBorder;
* }
* ```
* @return {?}
*/
function () {
return this._type === IgxInputGroupType.BORDER;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "isTypeSearch", {
/**
* Returns whether the `IgxInputGroupComponent` type is search.
* ```typescript
*@ViewChild("MyInputGroup1")
*public inputGroup: IgxInputGroupComponent;
*ngAfterViewInit(){
* let isTypeSearch = this.inputGroup.isTypeSearch;
*}
* ```
*/
get: /**
* Returns whether the `IgxInputGroupComponent` type is search.
* ```typescript
* \@ViewChild("MyInputGroup1")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* let isTypeSearch = this.inputGroup.isTypeSearch;
* }
* ```
* @return {?}
*/
function () {
return this._type === IgxInputGroupType.SEARCH;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputGroupComponent.prototype, "filled", {
get: /**
* @return {?}
*/
function () {
return this._filled;
},
set: /**
* @param {?} val
* @return {?}
*/
function (val) {
this._filled = val;
},
enumerable: true,
configurable: true
});
IgxInputGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'igx-input-group',
template: "<div class=\"igx-input-group__wrapper\" *ngIf=\"isTypeBox; else bundle\">\n <ng-container *ngTemplateOutlet=\"bundle\"></ng-container>\n</div>\n<div class=\"igx-input-group__hint\">\n <ng-content select=\"igx-hint,[igxHint]\"></ng-content>\n</div>\n<ng-template #bundle>\n <div class=\"igx-input-group__bundle\">\n <ng-content select=\"igx-prefix,[igxPrefix]\"></ng-content>\n <div class=\"igx-input-group__bundle-main\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n <ng-content select=\"[igxInput]\"></ng-content>\n </div>\n <ng-content select=\"igx-suffix,[igxSuffix]\"></ng-content>\n </div>\n <div class=\"igx-input-group__border\" *ngIf=\"hasBorder\"></div>\n</ng-template>\n",
providers: [{ provide: IgxInputGroupBase, useExisting: IgxInputGroupComponent }]
}] }
];
/** @nocollapse */
IgxInputGroupComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
]; };
IgxInputGroupComponent.propDecorators = {
id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
defaultClass: [{ type: HostBinding, args: ['class.igx-input-group',] }],
hasPlaceholder: [{ type: HostBinding, args: ['class.igx-input-group--placeholder',] }],
isRequired: [{ type: HostBinding, args: ['class.igx-input-group--required',] }],
isFocused: [{ type: HostBinding, args: ['class.igx-input-group--focused',] }],
isBox: [{ type: HostBinding, args: ['class.igx-input-group--box',] }],
isBorder: [{ type: HostBinding, args: ['class.igx-input-group--border',] }],
isSearch: [{ type: HostBinding, args: ['class.igx-input-group--search',] }],
disabled: [{ type: HostBinding, args: ['class.igx-input-group--disabled',] }, { type: Input }],
validClass: [{ type: HostBinding, args: ['class.igx-input-group--valid',] }],
invalidClass: [{ type: HostBinding, args: ['class.igx-input-group--invalid',] }],
hasWarning: [{ type: HostBinding, args: ['class.igx-input-group--warning',] }],
hints: [{ type: ContentChildren, args: [IgxHintDirective, { read: IgxHintDirective },] }],
input: [{ type: ContentChild, args: [IgxInputDirective, { read: IgxInputDirective },] }],
onClick: [{ type: HostListener, args: ['click', ['$event'],] }],
type: [{ type: Input, args: ['type',] }],
supressInputAutofocus: [{ type: Input }],
isFilled: [{ type: HostBinding, args: ['class.igx-input-group--filled',] }],
isDisplayDensityCosy: [{ type: HostBinding, args: ['class.igx-input-group--cosy',] }],
isDisplayDensityComfortable: [{ type: HostBinding, args: ['class.igx-input-group--comfortable',] }],
isDisplayDensityCompact: [{ type: HostBinding, args: ['class.igx-input-group--compact',] }]
};
return IgxInputGroupComponent;
}(DisplayDensityBase));
export { IgxInputGroupComponent };
if (false) {
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._type;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._filled;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._supressInputAutofocus;
/**
* An ElementRef property of the `IgxInputGroupComponent`.
* @type {?}
*/
IgxInputGroupComponent.prototype.element;
/**
* An \@Input property that sets the value of `id` attribute. If not provided it will be automatically generated.
* ```html
* <igx-input-group [id]="'igx-input-group-55'"></igx-input-group>
* ```
* @type {?}
*/
IgxInputGroupComponent.prototype.id;
/**
* Property that enables/disables the autogenerated class of the `IgxInputGroupComponent`.
* By default applied the class is applied.
* ```typescript
* \@ViewChild("MyInputGroup")
* public inputGroup: IgxInputGroupComponent;
* ngAfterViewInit(){
* this.inputGroup.defaultClass = false;
* ```
* }
* @type {?}
*/
IgxInputGroupComponent.prototype.defaultClass;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.hasPlaceholder;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isRequired;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isFocused;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isBox;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isBorder;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.isSearch;
/**
* An \@Input property that disables the `IgxInputGroupComponent`.
* ```html
* <igx-input-group [disabled]="'true'"></igx-input-group>
* ```
* @type {?}
*/
IgxInputGroupComponent.prototype.disabled;
/**
* @hidden
* @type {?}
*/
IgxInputGroupComponent.prototype.hasWarning;
/**
* @hidden
* @type {?}
* @protected
*/
IgxInputGroupComponent.prototype.hints;
/**
* @hidden
* @type {?}
* @protected
*/
IgxInputGroupComponent.prototype.input;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._element;
/**
* @type {?}
* @private
*/
IgxInputGroupComponent.prototype._displayDensityOptions;
}
/**
* @hidden
*/
var IgxInputGroupModule = /** @class */ (function () {
function IgxInputGroupModule() {
}
IgxInputGroupModule.decorators = [
{ type: NgModule, args: [{
declarations: [IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective],
exports: [IgxInputGroupComponent, IgxHintDirective, IgxInputDirective, IgxLabelDirective, IgxPrefixDirective, IgxSuffixDirective],
imports: [CommonModule, IgxPrefixModule, IgxSuffixModule]
},] }
];
return IgxInputGroupModule;
}());
export { IgxInputGroupModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBMEIsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7SUFFckQsT0FBTyxHQUFHLENBQUM7OztJQUdYLE9BQUk7SUFDSixNQUFHO0lBQ0gsU0FBTTtJQUNOLFNBQU07Ozs7OztBQUdWO0lBSzRDLGtEQUFrQjtJQThOMUQsZ0NBQW9CLFFBQW9CLEVBQ2Esc0JBQThDO1FBRG5HLFlBRUksa0JBQU0sc0JBQXNCLENBQUMsU0FFaEM7UUFKbUIsY0FBUSxHQUFSLFFBQVEsQ0FBWTtR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QVksRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2lCQUM1RDs7SUFDa0MsMEJBQUM7Q0FBQSxBQUxwQyxJQUtvQztTQUF2QixtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBRdWVyeUxpc3QsXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4SGludERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaGludC9oaW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4SW5wdXRTdGF0ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneExhYmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9sYWJlbC9sYWJlbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlLCBJZ3hQcmVmaXhNb2R1bGV9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcHJlZml4L3ByZWZpeC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4U3VmZml4RGlyZWN0aXZlLCBJZ3hTdWZmaXhNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3N1ZmZpeC9zdWZmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5LCBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneElucHV0R3JvdXBCYXNlIH0gZnJvbSAnLi9pbnB1dC1ncm91cC5jb21tb24nO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbmVudW0gSWd4SW5wdXRHcm91cFR5cGUge1xuICAgIExJTkUsXG4gICAgQk9YLFxuICAgIEJPUkRFUixcbiAgICBTRUFSQ0hcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtaW5wdXQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnaW5wdXQtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogSWd4SW5wdXRHcm91cEJhc2UsIHVzZUV4aXN0aW5nOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH1dXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0R3JvdXBDb21wb25lbnQgZXh0ZW5kcyBEaXNwbGF5RGVuc2l0eUJhc2UgaW1wbGVtZW50cyBJZ3hJbnB1dEdyb3VwQmFzZSB7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IElneElucHV0R3JvdXBUeXBlLkxJTkU7XG4gICAgcHJpdmF0ZSBfZmlsbGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3VwcmVzc0lucHV0QXV0b2ZvY3VzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBbiBFbGVtZW50UmVmIHByb3BlcnR5IG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuXG4gICAgICovXG4gICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiBgaWRgIGF0dHJpYnV0ZS4gSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtaW5wdXQtZ3JvdXAgW2lkXT1cIidpZ3gtaW5wdXQtZ3JvdXAtNTUnXCI+PC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtaW5wdXQtZ3JvdXAtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIFByb3BlcnR5IHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB0aGUgYXV0b2dlbmVyYXRlZCBjbGFzcyBvZiB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgLlxuICAgICAqIEJ5IGRlZmF1bHQgYXBwbGllZCB0aGUgY2xhc3MgaXMgYXBwbGllZC5cbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICp0aGlzLmlucHV0R3JvdXAuZGVmYXVsdENsYXNzID0gZmFsc2U7XG4gICAgICpgYGBcbiAgICAgKn1cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cCcpXG4gICAgcHVibGljIGRlZmF1bHRDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLXBsYWNlaG9sZGVyJylcbiAgICBwdWJsaWMgaGFzUGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tcmVxdWlyZWQnKVxuICAgIHB1YmxpYyBpc1JlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWZvY3VzZWQnKVxuICAgIHB1YmxpYyBpc0ZvY3VzZWQgPSBmYWxzZTtcblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1ib3gnKVxuICAgIHB1YmxpYyBpc0JveCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1ib3JkZXInKVxuICAgIHB1YmxpYyBpc0JvcmRlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1zZWFyY2gnKVxuICAgIHB1YmxpYyBpc1NlYXJjaCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgZGlzYWJsZXMgdGhlIGBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50YC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1pbnB1dC1ncm91cCBbZGlzYWJsZWRdPVwiJ3RydWUnXCI+PC9pZ3gtaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWRpc2FibGVkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS12YWxpZCcpXG4gICAgcHVibGljIGdldCB2YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC52YWxpZCA9PT0gSWd4SW5wdXRTdGF0ZS5WQUxJRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXAtLWludmFsaWQnKVxuICAgIHB1YmxpYyBnZXQgaW52YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC52YWxpZCA9PT0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0td2FybmluZycpXG4gICAgcHVibGljIGhhc1dhcm5pbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhpbnREaXJlY3RpdmUsIHsgcmVhZDogSWd4SGludERpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBoaW50czogUXVlcnlMaXN0PElneEhpbnREaXJlY3RpdmU+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4SW5wdXREaXJlY3RpdmUsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgaW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fc3VwcmVzc0lucHV0QXV0b2ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGhvdyB0aGUgaW5wdXQgd2lsbCBiZSBzdHlsZWQuXG4gICAgICogVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSBgbGluZWAsIGBib3hgLCBgYm9yZGVyYCBhbmQgYHNlYXJjaGAuIFRoZSBkZWZhdWx0IGlzIGBsaW5lYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICo8aWd4LWlucHV0LWdyb3VwIFt0eXBlXT1cIidzZWFyY2gnXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KCd0eXBlJylcbiAgICBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHR5cGU6IElneElucHV0R3JvdXBUeXBlID0gKElneElucHV0R3JvdXBUeXBlIGFzIGFueSlbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNCb3ggPSB0aGlzLmlzQm9yZGVyID0gdGhpcy5pc1NlYXJjaCA9IGZhbHNlO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1g6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb3ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIElneElucHV0R3JvdXBUeXBlLkJPUkRFUjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0JvcmRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSWd4SW5wdXRHcm91cFR5cGUuU0VBUkNIOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2VhcmNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbnB1dCBlbGVtZW50IG9mIHRoZSBpbnB1dCBncm91cCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZm9jdXNlZCBvbiBjbGljay5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IHRoaXMuaW5wdXRHcm91cC5zdXByZXNzSW5wdXRBdXRvZm9jdXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1cHJlc3NJbnB1dEF1dG9mb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGlucHV0IGVsZW1lbnQgb2YgdGhlIGlucHV0IGdyb3VwIHdpbGwgYmUgYXV0b21hdGljYWxseSBmb2N1c2VkIG9uIGNsaWNrLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWlucHV0LWdyb3VwIFtzdXByZXNzSW5wdXRBdXRvZm9jdXNdPVwidHJ1ZVwiPjwvaWd4LWlucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc3VwcmVzc0lucHV0QXV0b2ZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3N1cHJlc3NJbnB1dEF1dG9mb2N1cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWlucHV0LWdyb3VwLS1maWxsZWQnKVxuICAgIGdldCBpc0ZpbGxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxlZCB8fCAodGhpcy5pbnB1dCAmJiB0aGlzLmlucHV0LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29zeScpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb3N5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29zeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29tZm9ydGFibGUnKVxuICAgIGdldCBpc0Rpc3BsYXlEZW5zaXR5Q29tZm9ydGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cC0tY29tcGFjdCcpXG4gICAgZ2V0IGlzRGlzcGxheURlbnNpdHlDb21wYWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tcGFjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAuIEhvdyB0aGUgaW5wdXQgaXMgc3R5bGVkLlxuICAgICAqIFZhbHVlcyBhcmUgYGxpbmVgIC0gMCwgYGJveGAgLSAxLCBgYm9yZGVyYCAtIDIgIGFuZCBgc2VhcmNoYCAtIDMuIFRoZSBkZWZhdWx0IGlzIGBsaW5lYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlJbnB1dEdyb3VwXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpbnB1dFR5cGUgPSB0aGlzLmlucHV0R3JvdXAudHlwZTtcbiAgICAgKn1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByaXZhdGUgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucykge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgaGFzIGhpbnRzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXBcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlucHV0SGludHMgPSB0aGlzLmlucHV0R3JvdXAuaGFzSGludHM7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGhhc0hpbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oaW50cy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIGhhcyBib3JkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cFwiKVxuICAgICAqcHVibGljIGlucHV0R3JvdXA6IElneElucHV0R3JvdXBDb21wb25lbnQ7XG4gICAgICpuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgKiAgICBsZXQgaW5wdXRCcm9kZXIgPSB0aGlzLmlucHV0R3JvdXAuaGFzQm9yZGVyO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBoYXNCb3JkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5MSU5FIHx8XG4gICAgICAgICAgICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBsaW5lLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVMaW5lID0gdGhpcy5pbnB1dEdyb3VwLmlzVHlwZUxpbmU7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1R5cGVMaW5lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIHRoaXMuX3R5cGUgPT09IElneElucHV0R3JvdXBUeXBlLkxJTkU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBib3guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZUJveCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVCb3g7XG4gICAgICp9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNUeXBlQm94KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZSA9PT0gSWd4SW5wdXRHcm91cFR5cGUuQk9YO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYElneElucHV0R3JvdXBDb21wb25lbnRgIHR5cGUgaXMgYm9yZGVyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUlucHV0R3JvdXAxXCIpXG4gICAgICpwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIGxldCBpc1R5cGVCb3JkZXIgPSB0aGlzLmlucHV0R3JvdXAuaXNUeXBlQm9yZGVyO1xuICAgICAqfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc1R5cGVCb3JkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5CT1JERVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4SW5wdXRHcm91cENvbXBvbmVudGAgdHlwZSBpcyBzZWFyY2guXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15SW5wdXRHcm91cDFcIilcbiAgICAgKnB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgICAqbmdBZnRlclZpZXdJbml0KCl7XG4gICAgICogICAgbGV0IGlzVHlwZVNlYXJjaCA9IHRoaXMuaW5wdXRHcm91cC5pc1R5cGVTZWFyY2g7XG4gICAgICp9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGlzVHlwZVNlYXJjaCgpIHtcbiAgICAgICAgcmV0dXJuICB0aGlzLl90eXBlID09PSBJZ3hJbnB1dEdyb3VwVHlwZS5TRUFSQ0g7XG4gICAgfVxuXG4gICAgZ2V0IGZpbGxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGxlZDtcbiAgICB9XG5cbiAgICBzZXQgZmlsbGVkKHZhbCkge1xuICAgICAgICB0aGlzLl9maWxsZWQgPSB2YWw7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hIaW50RGlyZWN0aXZlLCBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4TGFiZWxEaXJlY3RpdmVdLFxuICAgIGV4cG9ydHM6IFtJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCAgSWd4SGludERpcmVjdGl2ZSwgSWd4SW5wdXREaXJlY3RpdmUsIElneExhYmVsRGlyZWN0aXZlLCBJZ3hQcmVmaXhEaXJlY3RpdmUsIElneFN1ZmZpeERpcmVjdGl2ZV0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWd4UHJlZml4TW9kdWxlLCBJZ3hTdWZmaXhNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIElneElucHV0R3JvdXBNb2R1bGUgeyB9XG4iXX0=