fundamental-ngx
Version:
SAP Fundamentals, implemented in Angular
254 lines • 19.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ViewEncapsulation, ContentChild } from '@angular/core';
import { PopoverDirective } from './popover-directive/popover.directive';
import { PopoverDropdownComponent } from './popover-dropdown/popover-dropdown.component';
/** @type {?} */
let popoverUniqueId = 0;
/**
* The popover is a wrapping component that accepts a *control* as well as a *body*.
* The control is what will trigger the opening of the actual popover, which is called the body.
* By default, popovers are triggered by click. This can be customized through the *triggers* input.
* PopoverComponent is an abstraction of PopoverDirective.
*/
export class PopoverComponent {
constructor() {
/**
* Whether the popover should have an arrow.
*/
this.noArrow = true;
/**
* Whether the popover is disabled.
*/
this.disabled = false;
/**
* Whether the popover should be treated as a dropdown.
*/
this.isDropdown = false;
/**
* The trigger events that will open/close the popover.
* Accepts any [HTML DOM Events](https://www.w3schools.com/jsref/dom_obj_event.asp).
*/
this.triggers = ['click'];
/**
* Whether the popover is open. Can be used through two-way binding.
*/
this.isOpen = false;
/**
* The Popper.js options to attach to this popover.
* See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details.
*/
this.options = {
placement: 'bottom-start',
modifiers: {
preventOverflow: {
enabled: true,
escapeWithReference: true,
boundariesElement: 'scrollParent'
}
}
};
/**
* Whether the popover should be focusTrapped.
*/
this.focusTrapped = false;
/**
* Whether the popover should close when a click is made outside its boundaries.
*/
this.closeOnOutsideClick = true;
/**
* Whether the popover should close when the escape key is pressed.
*/
this.closeOnEscapeKey = true;
/**
* Event emitted when the state of the isOpen property changes.
*/
this.isOpenChange = new EventEmitter();
/**
* Id of the popover. If none is provided, one will be generated.
*/
this.id = 'fd-popover-' + popoverUniqueId++;
}
/**
* Toggles the popover open state.
* @return {?}
*/
toggle() {
if (this.isOpen) {
this.close();
}
else {
this.open();
}
}
/**
* Closes the popover.
* @return {?}
*/
close() {
if (this.isOpen) {
this.isOpen = false;
this.isOpenChange.emit(this.isOpen);
}
}
/**
* Opens the popover.
* @return {?}
*/
open() {
if (!this.isOpen) {
this.isOpen = true;
this.isOpenChange.emit(this.isOpen);
}
}
/**
* Forces an update of the popover's positioning calculation.
* @return {?}
*/
updatePopover() {
this.directiveRef.updatePopper();
}
/**
* Function is called every time popover changes open attribute
* @param {?} isOpen
* @return {?}
*/
openChanged(isOpen) {
this.isOpenChange.emit(isOpen);
this.updateDropdownIsOpen(isOpen);
}
/**
* @hidden
* Function that allows us to control aria-expanded on dropdown child
*
* @private
* @param {?} isOpen
* @return {?}
*/
updateDropdownIsOpen(isOpen) {
if (this.dropdownComponent) {
this.dropdownComponent.isOpen = isOpen;
}
}
}
PopoverComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-popover',
template: "<div #popoverContainer>\n <div class=\"fd-popover__control\"\n [attr.aria-expanded]=\"this.disabled ? false : isOpen\"\n [attr.aria-disabled]=\"this.disabled\"\n aria-haspopup=\"true\"\n [fdPopover]=\"popoverBody\"\n [(isOpen)]=\"isOpen\"\n (isOpenChange)=\"openChanged($event)\"\n [noArrow]=\"noArrow\"\n [disabled]=\"disabled\"\n [triggers]=\"triggers\"\n [placement]=\"placement\"\n [focusTrapped]=\"focusTrapped\"\n [options]=\"options\"\n [fillControlMode]=\"fillControlMode\"\n [closeOnOutsideClick]=\"closeOnOutsideClick\"\n [closeOnEscapeKey]=\"closeOnEscapeKey\"\n [appendTo]=\"(appendTo ? appendTo : popoverContainer)\">\n <ng-content select=\"fd-popover-control\"></ng-content>\n <ng-content select=\"fd-dropdown-control\"></ng-content>\n </div>\n <ng-template #popoverBody>\n <ng-container *ngTemplateOutlet=\"popoverBodyTpl\"></ng-container>\n </ng-template>\n</div>\n\n<ng-template #popoverBodyTpl>\n <div [attr.aria-hidden]=\"disabled ? true : !isOpen\">\n <ng-content select=\"fd-popover-body\"></ng-content>\n </div>\n</ng-template>\n",
host: {
'[class.fd-popover-custom]': 'true',
'[attr.id]': 'id'
},
encapsulation: ViewEncapsulation.None,
styles: [".fd-popover-custom{margin-right:0;display:inline-block}.fd-popover-custom .fd-dropdown{position:static}"]
}] }
];
PopoverComponent.propDecorators = {
directiveRef: [{ type: ViewChild, args: [PopoverDirective,] }],
dropdownComponent: [{ type: ContentChild, args: [PopoverDropdownComponent,] }],
noArrow: [{ type: Input }],
disabled: [{ type: Input }],
isDropdown: [{ type: Input }],
appendTo: [{ type: Input }],
triggers: [{ type: Input }],
placement: [{ type: Input }],
isOpen: [{ type: Input }],
options: [{ type: Input }],
focusTrapped: [{ type: Input }],
fillControlMode: [{ type: Input }],
closeOnOutsideClick: [{ type: Input }],
closeOnEscapeKey: [{ type: Input }],
isOpenChange: [{ type: Output }],
id: [{ type: Input }]
};
if (false) {
/**
* @hidden
* @type {?}
*/
PopoverComponent.prototype.directiveRef;
/**
* @hidden
* @type {?}
*/
PopoverComponent.prototype.dropdownComponent;
/**
* Whether the popover should have an arrow.
* @type {?}
*/
PopoverComponent.prototype.noArrow;
/**
* Whether the popover is disabled.
* @type {?}
*/
PopoverComponent.prototype.disabled;
/**
* Whether the popover should be treated as a dropdown.
* @type {?}
*/
PopoverComponent.prototype.isDropdown;
/**
* The element to which the popover should be appended.
* @type {?}
*/
PopoverComponent.prototype.appendTo;
/**
* The trigger events that will open/close the popover.
* Accepts any [HTML DOM Events](https://www.w3schools.com/jsref/dom_obj_event.asp).
* @type {?}
*/
PopoverComponent.prototype.triggers;
/**
* The placement of the popover. It can be one of: top, top-start, top-end, bottom,
* bottom-start, bottom-end, right, right-start, right-end, left, left-start, left-end.
* @type {?}
*/
PopoverComponent.prototype.placement;
/**
* Whether the popover is open. Can be used through two-way binding.
* @type {?}
*/
PopoverComponent.prototype.isOpen;
/**
* The Popper.js options to attach to this popover.
* See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details.
* @type {?}
*/
PopoverComponent.prototype.options;
/**
* Whether the popover should be focusTrapped.
* @type {?}
*/
PopoverComponent.prototype.focusTrapped;
/**
* Preset options for the popover body width.
* * `at-least` will apply a minimum width to the body equivalent to the width of the control.
* * `equal` will apply a width to the body equivalent to the width of the control.
* * Leave blank for no effect.
* @type {?}
*/
PopoverComponent.prototype.fillControlMode;
/**
* Whether the popover should close when a click is made outside its boundaries.
* @type {?}
*/
PopoverComponent.prototype.closeOnOutsideClick;
/**
* Whether the popover should close when the escape key is pressed.
* @type {?}
*/
PopoverComponent.prototype.closeOnEscapeKey;
/**
* Event emitted when the state of the isOpen property changes.
* @type {?}
*/
PopoverComponent.prototype.isOpenChange;
/**
* Id of the popover. If none is provided, one will be generated.
* @type {?}
*/
PopoverComponent.prototype.id;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUM3QyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0sdUNBQXVDLENBQUM7QUFDMUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7O0lBRXJGLGVBQWUsR0FBVyxDQUFDOzs7Ozs7O0FBa0IvQixNQUFNLE9BQU8sZ0JBQWdCO0lBVjdCOzs7O1FBb0JJLFlBQU8sR0FBWSxJQUFJLENBQUM7Ozs7UUFJeEIsYUFBUSxHQUFZLEtBQUssQ0FBQzs7OztRQUkxQixlQUFVLEdBQVksS0FBSyxDQUFDOzs7OztRQVM1QixhQUFRLEdBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7OztRQVMvQixXQUFNLEdBQVksS0FBSyxDQUFDOzs7OztRQUt4QixZQUFPLEdBQWtCO1lBQ3JCLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLFNBQVMsRUFBRTtnQkFDUCxlQUFlLEVBQUU7b0JBQ2IsT0FBTyxFQUFFLElBQUk7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtvQkFDekIsaUJBQWlCLEVBQUUsY0FBYztpQkFDcEM7YUFDSjtTQUNKLENBQUM7Ozs7UUFJRixpQkFBWSxHQUFZLEtBQUssQ0FBQzs7OztRQWE5Qix3QkFBbUIsR0FBWSxJQUFJLENBQUM7Ozs7UUFJcEMscUJBQWdCLEdBQVksSUFBSSxDQUFDOzs7O1FBSWpDLGlCQUFZLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7Ozs7UUFJbEUsT0FBRSxHQUFXLGFBQWEsR0FBRyxlQUFlLEVBQUUsQ0FBQztJQTBEbkQsQ0FBQzs7Ozs7SUFyRFUsTUFBTTtRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjthQUFNO1lBQ0gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7SUFDTCxDQUFDOzs7OztJQUtNLEtBQUs7UUFDUixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkM7SUFDTCxDQUFDOzs7OztJQUtNLElBQUk7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7Ozs7O0lBS00sYUFBYTtRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7Ozs7OztJQUtNLFdBQVcsQ0FBQyxNQUFlO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDOzs7Ozs7Ozs7SUFNTyxvQkFBb0IsQ0FBQyxNQUFlO1FBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQzFDO0lBQ0wsQ0FBQzs7O1lBakpKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIscXRDQUF1QztnQkFFdkMsSUFBSSxFQUFFO29CQUNGLDJCQUEyQixFQUFFLE1BQU07b0JBQ25DLFdBQVcsRUFBRSxJQUFJO2lCQUNwQjtnQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFDeEM7OzsyQkFJSSxTQUFTLFNBQUMsZ0JBQWdCO2dDQUcxQixZQUFZLFNBQUMsd0JBQXdCO3NCQUdyQyxLQUFLO3VCQUlMLEtBQUs7eUJBSUwsS0FBSzt1QkFJTCxLQUFLO3VCQUtMLEtBQUs7d0JBS0wsS0FBSztxQkFJTCxLQUFLO3NCQUtMLEtBQUs7MkJBYUwsS0FBSzs4QkFTTCxLQUFLO2tDQUlMLEtBQUs7K0JBSUwsS0FBSzsyQkFJTCxNQUFNO2lCQUlOLEtBQUs7Ozs7Ozs7SUEzRU4sd0NBQytCOzs7OztJQUUvQiw2Q0FBb0Y7Ozs7O0lBR3BGLG1DQUN3Qjs7Ozs7SUFHeEIsb0NBQzBCOzs7OztJQUcxQixzQ0FDNEI7Ozs7O0lBRzVCLG9DQUMrQjs7Ozs7O0lBSS9CLG9DQUMrQjs7Ozs7O0lBSS9CLHFDQUNxQjs7Ozs7SUFHckIsa0NBQ3dCOzs7Ozs7SUFJeEIsbUNBVUU7Ozs7O0lBR0Ysd0NBQzhCOzs7Ozs7OztJQVE5QiwyQ0FDaUM7Ozs7O0lBR2pDLCtDQUNvQzs7Ozs7SUFHcEMsNENBQ2lDOzs7OztJQUdqQyx3Q0FDa0U7Ozs7O0lBR2xFLDhCQUMrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiwgQ29udGVudENoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxhY2VtZW50LCBQb3BwZXJPcHRpb25zIH0gZnJvbSAncG9wcGVyLmpzJztcbmltcG9ydCB7IFBvcG92ZXJEaXJlY3RpdmUsIFBvcG92ZXJGaWxsTW9kZSB9IGZyb20gJy4vcG9wb3Zlci1kaXJlY3RpdmUvcG9wb3Zlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUG9wb3ZlckRyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9wb3BvdmVyLWRyb3Bkb3duL3BvcG92ZXItZHJvcGRvd24uY29tcG9uZW50JztcblxubGV0IHBvcG92ZXJVbmlxdWVJZDogbnVtYmVyID0gMDtcblxuLyoqXG4gKiBUaGUgcG9wb3ZlciBpcyBhIHdyYXBwaW5nIGNvbXBvbmVudCB0aGF0IGFjY2VwdHMgYSAqY29udHJvbCogYXMgd2VsbCBhcyBhICpib2R5Ki5cbiAqIFRoZSBjb250cm9sIGlzIHdoYXQgd2lsbCB0cmlnZ2VyIHRoZSBvcGVuaW5nIG9mIHRoZSBhY3R1YWwgcG9wb3Zlciwgd2hpY2ggaXMgY2FsbGVkIHRoZSBib2R5LlxuICogQnkgZGVmYXVsdCwgcG9wb3ZlcnMgYXJlIHRyaWdnZXJlZCBieSBjbGljay4gVGhpcyBjYW4gYmUgY3VzdG9taXplZCB0aHJvdWdoIHRoZSAqdHJpZ2dlcnMqIGlucHV0LlxuICogUG9wb3ZlckNvbXBvbmVudCBpcyBhbiBhYnN0cmFjdGlvbiBvZiBQb3BvdmVyRGlyZWN0aXZlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLXBvcG92ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wb3BvdmVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9wb3BvdmVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLmZkLXBvcG92ZXItY3VzdG9tXSc6ICd0cnVlJyxcbiAgICAgICAgJ1thdHRyLmlkXSc6ICdpZCdcbiAgICB9LFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCB7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoUG9wb3ZlckRpcmVjdGl2ZSlcbiAgICBkaXJlY3RpdmVSZWY6IFBvcG92ZXJEaXJlY3RpdmU7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAQ29udGVudENoaWxkKFBvcG92ZXJEcm9wZG93bkNvbXBvbmVudCkgZHJvcGRvd25Db21wb25lbnQ6IFBvcG92ZXJEcm9wZG93bkNvbXBvbmVudDtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBoYXZlIGFuIGFycm93LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbm9BcnJvdzogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcG9wb3ZlciBpcyBkaXNhYmxlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGRyb3Bkb3duLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNEcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBwb3BvdmVyIHNob3VsZCBiZSBhcHBlbmRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFwcGVuZFRvOiBIVE1MRWxlbWVudCB8ICdib2R5JztcblxuICAgIC8qKiBUaGUgdHJpZ2dlciBldmVudHMgdGhhdCB3aWxsIG9wZW4vY2xvc2UgdGhlIHBvcG92ZXIuXG4gICAgICogIEFjY2VwdHMgYW55IFtIVE1MIERPTSBFdmVudHNdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanNyZWYvZG9tX29ial9ldmVudC5hc3ApLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdHJpZ2dlcnM6IHN0cmluZ1tdID0gWydjbGljayddO1xuXG4gICAgLyoqIFRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcG92ZXIuIEl0IGNhbiBiZSBvbmUgb2Y6IHRvcCwgdG9wLXN0YXJ0LCB0b3AtZW5kLCBib3R0b20sXG4gICAgICogIGJvdHRvbS1zdGFydCwgYm90dG9tLWVuZCwgcmlnaHQsIHJpZ2h0LXN0YXJ0LCByaWdodC1lbmQsIGxlZnQsIGxlZnQtc3RhcnQsIGxlZnQtZW5kLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2VtZW50OiBQbGFjZW1lbnQ7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcG9wb3ZlciBpcyBvcGVuLiBDYW4gYmUgdXNlZCB0aHJvdWdoIHR3by13YXkgYmluZGluZy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRoZSBQb3BwZXIuanMgb3B0aW9ucyB0byBhdHRhY2ggdG8gdGhpcyBwb3BvdmVyLlxuICAgICAqIFNlZSB0aGUgW1BvcHBlci5qcyBEb2N1bWVudGF0aW9uXShodHRwczovL3BvcHBlci5qcy5vcmcvcG9wcGVyLWRvY3VtZW50YXRpb24uaHRtbCkgZm9yIGRldGFpbHMuICovXG4gICAgQElucHV0KClcbiAgICBvcHRpb25zOiBQb3BwZXJPcHRpb25zID0ge1xuICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnLFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXNjYXBlV2l0aFJlZmVyZW5jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogV2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgYmUgZm9jdXNUcmFwcGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNUcmFwcGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBQcmVzZXQgb3B0aW9ucyBmb3IgdGhlIHBvcG92ZXIgYm9keSB3aWR0aC5cbiAgICAgKiAqIGBhdC1sZWFzdGAgd2lsbCBhcHBseSBhIG1pbmltdW0gd2lkdGggdG8gdGhlIGJvZHkgZXF1aXZhbGVudCB0byB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2wuXG4gICAgICogKiBgZXF1YWxgIHdpbGwgYXBwbHkgYSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKiAqIExlYXZlIGJsYW5rIGZvciBubyBlZmZlY3QuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbE1vZGU6IFBvcG92ZXJGaWxsTW9kZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBjbG9zZSB3aGVuIGEgY2xpY2sgaXMgbWFkZSBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbk91dHNpZGVDbGljazogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgY2xvc2Ugd2hlbiB0aGUgZXNjYXBlIGtleSBpcyBwcmVzc2VkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbkVzY2FwZUtleTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgaXNPcGVuIHByb3BlcnR5IGNoYW5nZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgaXNPcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogSWQgb2YgdGhlIHBvcG92ZXIuIElmIG5vbmUgaXMgcHJvdmlkZWQsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlkOiBzdHJpbmcgPSAnZmQtcG9wb3Zlci0nICsgcG9wb3ZlclVuaXF1ZUlkKys7XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBwb3BvdmVyIG9wZW4gc3RhdGUuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgcG9wb3Zlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHBvcG92ZXIuXG4gICAgICovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2VzIGFuIHVwZGF0ZSBvZiB0aGUgcG9wb3ZlcidzIHBvc2l0aW9uaW5nIGNhbGN1bGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVQb3BvdmVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZVJlZi51cGRhdGVQb3BwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBwb3BvdmVyIGNoYW5nZXMgb3BlbiBhdHRyaWJ1dGVcbiAgICAgKi9cbiAgICBwdWJsaWMgb3BlbkNoYW5nZWQoaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQoaXNPcGVuKTtcbiAgICAgICAgdGhpcy51cGRhdGVEcm9wZG93bklzT3Blbihpc09wZW4pO1xuICAgIH1cblxuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiAgRnVuY3Rpb24gdGhhdCBhbGxvd3MgdXMgdG8gY29udHJvbCBhcmlhLWV4cGFuZGVkIG9uIGRyb3Bkb3duIGNoaWxkXG4gICAgICogKi9cbiAgICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duSXNPcGVuKGlzT3BlbjogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5kcm9wZG93bkNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkNvbXBvbmVudC5pc09wZW4gPSBpc09wZW47XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==