@kephas/ngx-core
Version:
Provides integration capabilities with Angular 13+.
188 lines • 19.2 kB
JavaScript
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 { NotificationService } from '@kephas/ui';
import * as i0 from "@angular/core";
/**
* 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(NotificationService);
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.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WidgetBase, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
WidgetBase.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: WidgetBase, selector: "ng-component", inputs: { isVisible: "isVisible", readonly: "readonly" }, viewQueries: [{ propertyName: "childWidgets", predicate: WidgetBase, descendants: true }], usesOnChanges: true, ngImport: i0, template: '', isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: WidgetBase, decorators: [{
type: Component,
args: [{
template: ''
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }]; }, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0QmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlcGhhcy9uZ3gtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvd2lkZ2V0QmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUMvQyxLQUFLLEVBRVcsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQWEsU0FBUyxFQUM1RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFakQ7Ozs7O0dBS0c7QUFJSCxNQUFNLE9BQWdCLFVBQVU7SUFnQzVCOzs7OztPQUtHO0lBQ0gsWUFDb0IsVUFBc0IsRUFDdEIsZ0JBQWtDO1FBRGxDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQVo5QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFhdEIsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYyxDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUE0QjtRQUN6QyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxFQUFFO1lBQzlCLE9BQU87U0FDVjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFjO1FBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDM0IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQ0ksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBYztRQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzFCLE9BQU87U0FDVjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRO0lBQ1IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGVBQWU7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxXQUFXLENBQUMsT0FBc0I7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVc7SUFDWCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxpQkFBaUIsQ0FBQyxRQUFpQixFQUFFLFFBQWlCO0lBQ2hFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLHFCQUFxQixDQUFDLFFBQWdDLEVBQUUsUUFBZ0M7SUFDbEcsQ0FBQzs7dUdBNUtpQixVQUFVOzJGQUFWLFVBQVUsK0lBdURkLFVBQVUscUVBekRoQixFQUFFOzJGQUVRLFVBQVU7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7Z0lBeURPLFlBQVk7c0JBRGYsWUFBWTt1QkFBQyxVQUFVO2dCQXNCcEIsU0FBUztzQkFEWixLQUFLO2dCQW9CRixRQUFRO3NCQURYLEtBQUs7O0FBZ0ZWOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsYUFBd0I7SUFDbEQsT0FBTztRQUNILE9BQU8sRUFBRSxVQUFVO1FBQ25CLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQy9DLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsYUFBd0I7SUFDekQsT0FBTztRQUNILE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDNUMsS0FBSyxFQUFFLElBQUk7S0FDZCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBFbGVtZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIElucHV0LCBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsXHJcbiAgICBUeXBlLCBQcm92aWRlciwgZm9yd2FyZFJlZiwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4sIE9uRGVzdHJveSwgQ29tcG9uZW50XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAa2VwaGFzL2NvcmUnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGtlcGhhcy91aSc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYmFzZSBmdW5jdGlvbmFsaXR5IGZvciBhIHdpZGdldC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgV2lkZ2V0QmFzZVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXaWRnZXRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGxvZ2dlci5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7TG9nZ2VyfVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBub3RpZmljYXRpb24gc2VydmljZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAdHlwZSB7Tm90aWZpY2F0aW9uU2VydmljZX1cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uU2VydmljZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNoYW5nZSBkZXRlY3RvciBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBwcml2YXRlIF9pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2NoaWxkV2lkZ2V0cz86IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgV2lkZ2V0QmFzZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudFJlZn0gZWxlbWVudFJlZiBUaGUgZWxlbWVudCByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0ge1ZpZXdDb250YWluZXJSZWZ9IHZpZXdDb250YWluZXJSZWYgVGhlIHZpZXcgY29udGFpbmVyIHJlZmVyZW5jZS5cclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB2aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gaW5qZWN0b3IuZ2V0KExvZ2dlcik7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBpbmplY3Rvci5nZXQoTm90aWZpY2F0aW9uU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IGluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIGNoaWxkIGVkaXRvcnMgcXVlcnkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7UXVlcnlMaXN0PEVkaXRvckJhc2U8YW55Pj59XHJcbiAgICAgKiBAbWVtYmVyb2YgRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkcmVuKFdpZGdldEJhc2UpXHJcbiAgICBnZXQgY2hpbGRXaWRnZXRzKCk6IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkV2lkZ2V0cyE7XHJcbiAgICB9XHJcbiAgICBzZXQgY2hpbGRXaWRnZXRzKHZhbHVlOiBRdWVyeUxpc3Q8V2lkZ2V0QmFzZT4pIHtcclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRXaWRnZXRzID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2NoaWxkV2lkZ2V0cztcclxuICAgICAgICB0aGlzLl9jaGlsZFdpZGdldHMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLm9uQ2hpbGRXaWRnZXRzQ2hhbmdlZChvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB3aWRnZXQgaXMgdmlzaWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIFdpZGdldEJhc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZTtcclxuICAgIH1cclxuICAgIHNldCBpc1Zpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5faXNWaXNpYmxlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc1Zpc2libGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWRpdG9yIGFsbG93cyBlZGl0cyBvciBub3QuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBtZW1iZXJvZiBFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgfVxyXG4gICAgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlYWRvbmx5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3JlYWRvbmx5O1xyXG4gICAgICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5vblJlYWRPbmx5Q2hhbmdlZChvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG4gICAgICogZGVmYXVsdCBjaGFuZ2UgZGV0ZWN0b3IgaGFzIGNoZWNrZWQgdGhlIGRpcmVjdGl2ZSdzXHJcbiAgICAgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG4gICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHZpZXcgb3IgY29udGVudCBjaGlsZHJlbiBoYXZlIGJlZW4gY2hlY2tlZC5cclxuICAgICAqIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlIGRpcmVjdGl2ZSBpcyBpbnN0YW50aWF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIFdpZGdldEJhc2VcclxuICAgICAqL1xyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXJcclxuICAgICAqIEFuZ3VsYXIgaGFzIGNvbXBsZXRlZCBpbml0aWFsaXphdGlvbiBvZiBhIGNvbXBvbmVudCdzIHZpZXcuXHJcbiAgICAgKiBJdCBpcyBpbnZva2VkIG9ubHkgb25jZSB3aGVuIHRoZSB2aWV3IGlzIGluc3RhbnRpYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXHJcbiAgICAgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCBkYXRhLWJvdW5kIHByb3BlcnRpZXNcclxuICAgICAqIGlmIGF0IGxlYXN0IG9uZSBoYXMgY2hhbmdlZCwgYW5kIGJlZm9yZSB0aGUgdmlldyBhbmQgY29udGVudFxyXG4gICAgICogY2hpbGRyZW4gYXJlIGNoZWNrZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIGNoYW5nZWQgcHJvcGVydGllcy5cclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgcGVyZm9ybXMgY3VzdG9tIGNsZWFuLXVwLCBpbnZva2VkIGltbWVkaWF0ZWx5XHJcbiAgICAgKiBhZnRlciBhIGRpcmVjdGl2ZSwgcGlwZSwgb3Igc2VydmljZSBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuXHJcbiAgICAgKi9cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBvdmVycmlkZGVuIGluIGEgZGVyaXZlZCBjbGFzcywgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHJlYWQgb25seSBzdGF0ZSBjaGFuZ2VzLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQob2xkVmFsdWU6IGJvb2xlYW4sIG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgY2hpbGQgd2lkZ2V0cyBxdWVyeSBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7UXVlcnlMaXN0PEVkaXRvckJhc2U8YW55Pj59IG9sZFZhbHVlIFRoZSBvbGQgcXVlcnkuXHJcbiAgICAgKiBAcGFyYW0ge1F1ZXJ5TGlzdDxFZGl0b3JCYXNlPGFueT4+fSBuZXdWYWx1ZSBUaGUgbmV3IHF1ZXJ5LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvbkNoaWxkV2lkZ2V0c0NoYW5nZWQob2xkVmFsdWU/OiBRdWVyeUxpc3Q8V2lkZ2V0QmFzZT4sIG5ld1ZhbHVlPzogUXVlcnlMaXN0PFdpZGdldEJhc2U+KTogdm9pZCB7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBjb21wb25lbnQgYXMgYSBXaWRnZXRCYXNlLFxyXG4gKiB0byBiZSBhYmxlIHRvIGltcG9ydCBpdCBvdmVyIHRoaXMgYmFzZSBjbGFzcyBpbnN0ZWFkIG9mIG92ZXIgaXRzIG93biBjbGFzcy5cclxuICpcclxuICogRm9yIGV4YW1wbGUsIHVzZSBpdCBhcyBAVmlld0NoaWxkKFdpZGdldEJhc2UpIG9yIEBWaWV3Q2hpbGRyZW4oV2lkZ2V0QmFzZSkuXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICogQHBhcmFtIHtUeXBlPGFueT59IGNvbXBvbmVudFR5cGUgVGhlIGNvbXBvbmVudCB0eXBlLlxyXG4gKiBAcmV0dXJucyB7UHJvdmlkZXJ9IFRoZSBwcm92aWRlci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlV2lkZ2V0KGNvbXBvbmVudFR5cGU6IFR5cGU8YW55Pik6IFByb3ZpZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcHJvdmlkZTogV2lkZ2V0QmFzZSxcclxuICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBjb21wb25lbnRUeXBlKVxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNvbXBvbmVudCBhcyBhIE5HX1ZBTFVFX0FDQ0VTU09SLlxyXG4gKiBUaHVzLCBpdCBpcyBwb3NzaWJsZSB0byBiaW5kIGl0IGxpa2UgdGhpczpcclxuICogPG15LWNvbXBvbmVudCBbKG5nTW9kZWwpXT1cImJvdW5kUHJvcGVydHlcIj48L215LWNvbXBvbmVudD5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0ge1R5cGU8YW55Pn0gY29tcG9uZW50VHlwZSBUaGUgY29tcG9uZW50IHR5cGUuXHJcbiAqIEByZXR1cm5zIHtQcm92aWRlcn0gVGhlIHByb3ZpZGVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWYWx1ZUFjY2Vzc29yKGNvbXBvbmVudFR5cGU6IFR5cGU8YW55Pik6IFByb3ZpZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gY29tcG9uZW50VHlwZSksXHJcbiAgICAgICAgbXVsdGk6IHRydWVcclxuICAgIH07XHJcbn1cclxuIl19