UNPKG

@kephas/angular

Version:

Provides integration capabilities with Angular.

186 lines 18.2 kB
import { ElementRef, ViewContainerRef, ChangeDetectorRef, Input, forwardRef, QueryList, ViewChildren, Component } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Logger } from '@kephas/core'; import { Notification } from '@kephas/ui'; /** * Provides base functionality for a widget. * * @export * @class WidgetBase */ export class WidgetBase { /** * Creates an instance of WidgetBase. * @param {ElementRef} elementRef The element reference. * @param {ViewContainerRef} viewContainerRef The view container reference. * @memberof WidgetBase */ constructor(elementRef, viewContainerRef) { this.elementRef = elementRef; this.viewContainerRef = viewContainerRef; this._isVisible = true; this._readonly = false; const injector = viewContainerRef.injector; this.logger = injector.get(Logger); this.notification = injector.get(Notification); this.changeDetector = injector.get(ChangeDetectorRef); } /** * Gets or sets the child editors query. * * @readonly * @type {QueryList<EditorBase<any>>} * @memberof EditorBase */ get childWidgets() { return this._childWidgets; } set childWidgets(value) { if (this._childWidgets === value) { return; } const oldValue = this._childWidgets; this._childWidgets = value; this.onChildWidgetsChanged(oldValue, value); } /** * Gets or sets a value indicating whether the widget is visible. * * @readonly * @type {boolean} * @memberof WidgetBase */ get isVisible() { return this._isVisible; } set isVisible(value) { if (this._isVisible === value) { return; } this._isVisible = value; } /** * Gets or sets a value indicating whether the editor allows edits or not. * * @readonly * @type {boolean} * @memberof EditorBase */ get readonly() { return this._readonly; } set readonly(value) { if (this._readonly === value) { return; } const oldValue = this._readonly; this._readonly = value; this.onReadOnlyChanged(oldValue, value); } /** * A callback method that is invoked immediately after the * default change detector has checked the directive's * data-bound properties for the first time, * and before any of the view or content children have been checked. * It is invoked only once when the directive is instantiated. * * @memberof WidgetBase */ ngOnInit() { } /** * A callback method that is invoked immediately after * Angular has completed initialization of a component's view. * It is invoked only once when the view is instantiated. * * @memberof WidgetBase */ ngAfterViewInit() { } /** * A callback method that is invoked immediately after the * default change detector has checked data-bound properties * if at least one has changed, and before the view and content * children are checked. * * @param changes The changed properties. * @memberof WidgetBase */ ngOnChanges(changes) { } /** * A callback method that performs custom clean-up, invoked immediately * after a directive, pipe, or service instance is destroyed. */ ngOnDestroy() { } /** * When overridden in a derived class, this method is called when the read only state changes. * * @protected * @param {boolean} oldValue The old value. * @param {boolean} newValue The new value. * * @memberof WidgetBase */ onReadOnlyChanged(oldValue, newValue) { } /** * When overridden in a derived class, this method is called when the child widgets query changed. * * @protected * @param {QueryList<EditorBase<any>>} oldValue The old query. * @param {QueryList<EditorBase<any>>} newValue The new query. * * @memberof EditorBase */ onChildWidgetsChanged(oldValue, newValue) { } } WidgetBase.decorators = [ { type: Component, args: [{ template: '' },] } ]; WidgetBase.ctorParameters = () => [ { type: ElementRef }, { type: ViewContainerRef } ]; WidgetBase.propDecorators = { childWidgets: [{ type: ViewChildren, args: [WidgetBase,] }], isVisible: [{ type: Input }], readonly: [{ type: Input }] }; /** * This function provides the component as a WidgetBase, * to be able to import it over this base class instead of over its own class. * * For example, use it as @ViewChild(WidgetBase) or @ViewChildren(WidgetBase). * * @export * @param {Type<any>} componentType The component type. * @returns {Provider} The provider. */ export function provideWidget(componentType) { return { provide: WidgetBase, useExisting: forwardRef(() => componentType) }; } /** * This function provides the component as a NG_VALUE_ACCESSOR. * Thus, it is possible to bind it like this: * <my-component [(ngModel)]="boundProperty"></my-component> * * @export * @param {Type<any>} componentType The component type. * @returns {Provider} The provider. */ export function provideValueAccessor(componentType) { return { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => componentType), multi: true }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0QmFzZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3dpZGdldEJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFDL0MsS0FBSyxFQUVXLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFhLFNBQVMsRUFDNUUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTFDOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFnQixVQUFVO0lBZ0M1Qjs7Ozs7T0FLRztJQUNILFlBQ29CLFVBQXNCLEVBQ3RCLGdCQUFrQztRQURsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFaOUMsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBYXRCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUNJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFjLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksWUFBWSxDQUFDLEtBQTRCO1FBQ3pDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLEVBQUU7WUFDOUIsT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUNJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLEtBQWM7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUMzQixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7WUFDMUIsT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFFBQVE7SUFDUixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZTtJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFdBQVcsQ0FBQyxPQUFzQjtJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztJQUNYLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGlCQUFpQixDQUFDLFFBQWlCLEVBQUUsUUFBaUI7SUFDaEUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ08scUJBQXFCLENBQUMsUUFBZ0MsRUFBRSxRQUFnQztJQUNsRyxDQUFDOzs7WUEvS0osU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxFQUFFO2FBQ2I7OztZQWpCRyxVQUFVO1lBQUUsZ0JBQWdCOzs7MkJBeUUzQixZQUFZLFNBQUMsVUFBVTt3QkFxQnZCLEtBQUs7dUJBbUJMLEtBQUs7O0FBZ0ZWOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsYUFBd0I7SUFDbEQsT0FBTztRQUNILE9BQU8sRUFBRSxVQUFVO1FBQ25CLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQy9DLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsYUFBd0I7SUFDekQsT0FBTztRQUNILE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDNUMsS0FBSyxFQUFFLElBQUk7S0FDZCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBFbGVtZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIElucHV0LCBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsXHJcbiAgICBUeXBlLCBQcm92aWRlciwgZm9yd2FyZFJlZiwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4sIE9uRGVzdHJveSwgQ29tcG9uZW50XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAa2VwaGFzL2NvcmUnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICdAa2VwaGFzL3VpJztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgd2lkZ2V0LlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBXaWRnZXRCYXNlXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdpZGdldEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbG9nZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtMb2dnZXJ9XHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtOb3RpZmljYXRpb259XHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNoYW5nZSBkZXRlY3RvciBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBwcml2YXRlIF9pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2NoaWxkV2lkZ2V0cz86IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgV2lkZ2V0QmFzZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudFJlZn0gZWxlbWVudFJlZiBUaGUgZWxlbWVudCByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0ge1ZpZXdDb250YWluZXJSZWZ9IHZpZXdDb250YWluZXJSZWYgVGhlIHZpZXcgY29udGFpbmVyIHJlZmVyZW5jZS5cclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB2aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gaW5qZWN0b3IuZ2V0KExvZ2dlcik7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBpbmplY3Rvci5nZXQoTm90aWZpY2F0aW9uKTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgY2hpbGQgZWRpdG9ycyBxdWVyeS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtRdWVyeUxpc3Q8RWRpdG9yQmFzZTxhbnk+Pn1cclxuICAgICAqIEBtZW1iZXJvZiBFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGRyZW4oV2lkZ2V0QmFzZSlcclxuICAgIGdldCBjaGlsZFdpZGdldHMoKTogUXVlcnlMaXN0PFdpZGdldEJhc2U+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRXaWRnZXRzITtcclxuICAgIH1cclxuICAgIHNldCBjaGlsZFdpZGdldHModmFsdWU6IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPikge1xyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFdpZGdldHMgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2hpbGRXaWRnZXRzO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkV2lkZ2V0cyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMub25DaGlsZFdpZGdldHNDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHdpZGdldCBpcyB2aXNpYmxlLlxyXG4gICAgICpcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xyXG4gICAgfVxyXG4gICAgc2V0IGlzVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2lzVmlzaWJsZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlZGl0b3IgYWxsb3dzIGVkaXRzIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIEVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICB9XHJcbiAgICBzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVhZG9ubHkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLm9uUmVhZE9ubHlDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXHJcbiAgICAgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuICAgICAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcbiAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgdmlldyBvciBjb250ZW50IGNoaWxkcmVuIGhhdmUgYmVlbiBjaGVja2VkLlxyXG4gICAgICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlclxyXG4gICAgICogQW5ndWxhciBoYXMgY29tcGxldGVkIGluaXRpYWxpemF0aW9uIG9mIGEgY29tcG9uZW50J3Mgdmlldy5cclxuICAgICAqIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlIHZpZXcgaXMgaW5zdGFudGlhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuICAgICAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjaGVja2VkIGRhdGEtYm91bmQgcHJvcGVydGllc1xyXG4gICAgICogaWYgYXQgbGVhc3Qgb25lIGhhcyBjaGFuZ2VkLCBhbmQgYmVmb3JlIHRoZSB2aWV3IGFuZCBjb250ZW50XHJcbiAgICAgKiBjaGlsZHJlbiBhcmUgY2hlY2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgY2hhbmdlZCBwcm9wZXJ0aWVzLlxyXG4gICAgICogQG1lbWJlcm9mIFdpZGdldEJhc2VcclxuICAgICAqL1xyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBwZXJmb3JtcyBjdXN0b20gY2xlYW4tdXAsIGludm9rZWQgaW1tZWRpYXRlbHlcclxuICAgICAqIGFmdGVyIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGluc3RhbmNlIGlzIGRlc3Ryb3llZC5cclxuICAgICAqL1xyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvbmx5IHN0YXRlIGNoYW5nZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZChvbGRWYWx1ZTogYm9vbGVhbiwgbmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gb3ZlcnJpZGRlbiBpbiBhIGRlcml2ZWQgY2xhc3MsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCB3aWRnZXRzIHF1ZXJ5IGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtRdWVyeUxpc3Q8RWRpdG9yQmFzZTxhbnk+Pn0gb2xkVmFsdWUgVGhlIG9sZCBxdWVyeS5cclxuICAgICAqIEBwYXJhbSB7UXVlcnlMaXN0PEVkaXRvckJhc2U8YW55Pj59IG5ld1ZhbHVlIFRoZSBuZXcgcXVlcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIEVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uQ2hpbGRXaWRnZXRzQ2hhbmdlZChvbGRWYWx1ZT86IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPiwgbmV3VmFsdWU/OiBRdWVyeUxpc3Q8V2lkZ2V0QmFzZT4pOiB2b2lkIHtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNvbXBvbmVudCBhcyBhIFdpZGdldEJhc2UsXHJcbiAqIHRvIGJlIGFibGUgdG8gaW1wb3J0IGl0IG92ZXIgdGhpcyBiYXNlIGNsYXNzIGluc3RlYWQgb2Ygb3ZlciBpdHMgb3duIGNsYXNzLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgdXNlIGl0IGFzIEBWaWV3Q2hpbGQoV2lkZ2V0QmFzZSkgb3IgQFZpZXdDaGlsZHJlbihXaWRnZXRCYXNlKS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0ge1R5cGU8YW55Pn0gY29tcG9uZW50VHlwZSBUaGUgY29tcG9uZW50IHR5cGUuXHJcbiAqIEByZXR1cm5zIHtQcm92aWRlcn0gVGhlIHByb3ZpZGVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVXaWRnZXQoY29tcG9uZW50VHlwZTogVHlwZTxhbnk+KTogUHJvdmlkZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwcm92aWRlOiBXaWRnZXRCYXNlLFxyXG4gICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IGNvbXBvbmVudFR5cGUpXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgY29tcG9uZW50IGFzIGEgTkdfVkFMVUVfQUNDRVNTT1IuXHJcbiAqIFRodXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJpbmQgaXQgbGlrZSB0aGlzOlxyXG4gKiA8bXktY29tcG9uZW50IFsobmdNb2RlbCldPVwiYm91bmRQcm9wZXJ0eVwiPjwvbXktY29tcG9uZW50PlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBwYXJhbSB7VHlwZTxhbnk+fSBjb21wb25lbnRUeXBlIFRoZSBjb21wb25lbnQgdHlwZS5cclxuICogQHJldHVybnMge1Byb3ZpZGVyfSBUaGUgcHJvdmlkZXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVZhbHVlQWNjZXNzb3IoY29tcG9uZW50VHlwZTogVHlwZTxhbnk+KTogUHJvdmlkZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBjb21wb25lbnRUeXBlKSxcclxuICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfTtcclxufVxyXG4iXX0=