@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
155 lines • 21.3 kB
JavaScript
import { Directive, ElementRef, Injector, Renderer2 } from '@angular/core';
import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level';
import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging';
import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { NgLifecycleBaseComponent } from './ng-lifecycle-base.component';
import * as i0 from "@angular/core";
/**
* A base class for all components.
* - TResourceStrings The typed interface for resource strings.
*/
// eslint-disable-next-line @angular-eslint/directive-class-suffix
export class BaseComponent extends NgLifecycleBaseComponent {
/**
* Initializes a new instance of the {BaseComponent} class.
* @param injector The angular injection service. required by @SmeInjectableBase() decorator
*/
constructor(injector) {
super(injector);
this.renderer = injector.get(Renderer2);
this.hostElement = injector.get(ElementRef);
// load the strings for the application
this.strings = MsftSme.self().Resources.strings;
// initialize subscriptions to empty
this.subscriptions = [];
// setup component id and idBag
this.componentId = `component-${BaseComponent.nextComponentId++}`;
this.idBag = this.createIdBag();
MsftSme.forEachKey(this.idBag, (key) => {
this.idBag[key] = `${this.componentId}-${key}`;
});
// setup initial host classes on this element
this.applyInitialHostClasses();
}
/**
* Implementation of angular OnDestroy interface
* derived classes are always expected to call super.ngOnDestroy() when overriding
*/
ngOnDestroy() {
this.subscriptions.forEach((subscription) => {
if (subscription && !subscription.closed) {
subscription.unsubscribe();
}
});
super.ngOnDestroy();
}
/**
* Creates the idBag used by this component to store unique element ids
* Derived classes are always expected to call super.createIdBag() when overriding
*/
createIdBag() {
return {};
}
/**
* Gets the initial host classes to be applied to this element
* Derived classes are always expected to call super.getInitialHostClasses() when overriding
*/
getInitialHostClasses() {
return [];
}
/**
* Shortcut to get an attribute on the host element
* @param name The name of the attribute
*/
getAttribute(name) {
return this.hostElement.nativeElement.getAttribute(name);
}
/**
* Shortcut to set an attribute on the host element
* @param name The name of the attribute
* @param value The value of the attribute
*/
setAttribute(name, value) {
this.renderer.setAttribute(this.hostElement.nativeElement, name, value);
}
/**
* Shortcut to remove an attribute on the host element
* @param name The name of the attribute
*/
removeAttribute(name) {
this.renderer.removeAttribute(this.hostElement.nativeElement, name);
}
/**
* Shortcut to add a class on the host element
* @param className The name of the attribute
*/
addClass(className) {
this.renderer.addClass(this.hostElement.nativeElement, className);
}
/**
* Shortcut to remove a class on the host element
* @param className The name of the class
*/
removeClass(className) {
this.renderer.removeClass(this.hostElement.nativeElement, className);
}
/**
* Shortcut to set a style on the host element
* @param style The name of the style
* @param value The new value
*/
setStyle(style, value) {
this.renderer.setStyle(this.hostElement.nativeElement, style, value);
}
/**
* Shortcut to remove a style on the host element
* @param style The name of the style
*/
removeStyle(style) {
this.renderer.removeStyle(this.hostElement.nativeElement, style);
}
/**
* Shortcut to log a record. The source name is automatically picked up from the class instance
* @param message the message of the log record
* @param level (optional) the log level (defaults to Debug)
* @param params (optional) the parameters to log
* @param source (optional) the source of the log message. Defaults to the name of the constructor that instantiated this instance
* @return Promise<any> settle to resolve if buffered.
*/
log(message, level = LogLevel.Debug, params, source = this.logSourceName) {
return Logging.log({
level: level,
message: message,
localParams: params,
source: source
});
}
/**
* Applies the initial classes to this components host element.
* We preserve any custom classes by removing them, applying the base classes and reapplying the custom classes.
*/
applyInitialHostClasses() {
const customClasses = Dom.getClasses(this.hostElement.nativeElement);
customClasses.forEach(c => this.renderer.removeClass(this.hostElement.nativeElement, c));
this.getInitialHostClasses()
.concat(customClasses)
.forEach(c => this.renderer.addClass(this.hostElement.nativeElement, c));
}
}
/**
* Static constant to provide unique ids for each component
* @see {componentId}
*/
BaseComponent.nextComponentId = 0;
/** @nocollapse */ BaseComponent.ɵfac = function BaseComponent_Factory(t) { return new (t || BaseComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ BaseComponent.ɵdir = /** @pureOrBreakMyCode */ i0.ɵɵdefineDirective({ type: BaseComponent, features: [i0.ɵɵInheritDefinitionFeature] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseComponent, [{
type: Directive
}], function () { return [{ type: i0.Injector }]; }, null); })();
/**
* Internal base component for SME Core controls. It simply removes the need to supply the string type parameter
* This class is exported from this file, but not meant to be exported from index.ts bundles.
*/
export class CoreBaseComponent extends BaseComponent {
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9jb21tb24vYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUd2RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUFFekU7OztHQUdHO0FBRUgsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBZ0IsYUFBZ0MsU0FBUSx3QkFBd0I7SUE2Q2xGOzs7T0FHRztJQUNILFlBQVksUUFBa0I7UUFDMUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWhCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUMsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQXFCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBRWxFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV4QiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLGFBQWEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcs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Q3JFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxxQkFBcUIsRUFBRTthQUN2QixNQUFNLENBQUMsYUFBYSxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQzs7QUF4TEQ7OztHQUdHO0FBQ1ksNkJBQWUsR0FBRyxDQUFDLENBQUM7NkZBTmpCLGFBQWE7K0ZBQWIsYUFBYTt1RkFBYixhQUFhO2NBRmxDLFNBQVM7O0FBK0xWOzs7R0FHRztBQUNILE1BQU0sT0FBZ0IsaUJBQWtCLFNBQVEsYUFBc0I7Q0FFckUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nLWxldmVsJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTdHJpbmdzIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3N0cmluZ3MnO1xyXG5pbXBvcnQgeyBOZ0xpZmVjeWNsZUJhc2VDb21wb25lbnQgfSBmcm9tICcuL25nLWxpZmVjeWNsZS1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQSBiYXNlIGNsYXNzIGZvciBhbGwgY29tcG9uZW50cy5cclxuICogLSBUUmVzb3VyY2VTdHJpbmdzIFRoZSB0eXBlZCBpbnRlcmZhY2UgZm9yIHJlc291cmNlIHN0cmluZ3MuXHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtY2xhc3Mtc3VmZml4XHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29tcG9uZW50PFRSZXNvdXJjZVN0cmluZ3M+IGV4dGVuZHMgTmdMaWZlY3ljbGVCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBjb25zdGFudCB0byBwcm92aWRlIHVuaXF1ZSBpZHMgZm9yIGVhY2ggY29tcG9uZW50XHJcbiAgICAgKiBAc2VlIHtjb21wb25lbnRJZH1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dENvbXBvbmVudElkID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGxvZ1NvdXJjZU5hbWU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5nczogVFJlc291cmNlU3RyaW5ncztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgYmFnIG9mIGlkcyBnZW5lcmF0ZWQgdXNpbmcgQHNlZSB7Y29tcG9uZW50SWR9IGFuZCB0aGUgbWFwIHJldHVybmVkIGZyb20gQHNlZSB7Y3JlYXRlSWRCYWd9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpZEJhZzogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBjb21wb25lbnQuXHJcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNvbnRyb2xzIG5lZWQgdG8gdXNlIGFuIElEIChzdWNoIGFzIGluIGZvcm1zKSBidXQgbWF5IGFwcGVhciBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBwYWdlLlxyXG4gICAgICogVXNpbmcgdGhpcyBJRCBhcyB0aGUgYmFzaXMgZm9yIHRoZSBjb250cm9scyBpbnRlcm5hbCBJRHMgZ2VuZXJhdGVkIGluIEBzZWUge2NyZWF0ZUlkQmFnfSBrZWVwcyB0aGUgSURzIHVuaXF1ZS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNvbXBvbmVudElkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWluZXIgZm9yIGFjdGl2ZSBzdWJzY3JpcHRpb25zIHRoYXQgc2hvdWxkIGJlIGNsZWFuZWQgdXAgaW4gdGhlIE9uRGVzdHJveSBjYWxsLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW5ndWxhciByZW5kZXJlciBzZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGVsZW1lbnQgcmVmZXJlbmNlIGZvciB0aGlzIGNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgaG9zdEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0Jhc2VDb21wb25lbnR9IGNsYXNzLlxyXG4gICAgICogQHBhcmFtIGluamVjdG9yIFRoZSBhbmd1bGFyIGluamVjdGlvbiBzZXJ2aWNlLiByZXF1aXJlZCBieSBAU21lSW5qZWN0YWJsZUJhc2UoKSBkZWNvcmF0b3JcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gaW5qZWN0b3IuZ2V0KFJlbmRlcmVyMik7XHJcbiAgICAgICAgdGhpcy5ob3N0RWxlbWVudCA9IGluamVjdG9yLmdldChFbGVtZW50UmVmKTtcclxuXHJcbiAgICAgICAgLy8gbG9hZCB0aGUgc3RyaW5ncyBmb3IgdGhlIGFwcGxpY2F0aW9uXHJcbiAgICAgICAgdGhpcy5zdHJpbmdzID0gPFRSZXNvdXJjZVN0cmluZ3M+TXNmdFNtZS5zZWxmKCkuUmVzb3VyY2VzLnN0cmluZ3M7XHJcblxyXG4gICAgICAgIC8vIGluaXRpYWxpemUgc3Vic2NyaXB0aW9ucyB0byBlbXB0eVxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICAvLyBzZXR1cCBjb21wb25lbnQgaWQgYW5kIGlkQmFnXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRJZCA9IGBjb21wb25lbnQtJHtCYXNlQ29tcG9uZW50Lm5leHRDb21wb25lbnRJZCsrfWA7XHJcbiAgICAgICAgdGhpcy5pZEJhZyA9IHRoaXMuY3JlYXRlSWRCYWcoKTtcclxuICAgICAgICBNc2Z0U21lLmZvckVhY2hLZXkodGhpcy5pZEJhZywgKGtleSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlkQmFnW2tleV0gPSBgJHt0aGlzLmNvbXBvbmVudElkfS0ke2tleX1gO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBzZXR1cCBpbml0aWFsIGhvc3QgY2xhc3NlcyBvbiB0aGlzIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmFwcGx5SW5pdGlhbEhvc3RDbGFzc2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmd1bGFyIE9uRGVzdHJveSBpbnRlcmZhY2VcclxuICAgICAqIGRlcml2ZWQgY2xhc3NlcyBhcmUgYWx3YXlzIGV4cGVjdGVkIHRvIGNhbGwgc3VwZXIubmdPbkRlc3Ryb3koKSB3aGVuIG92ZXJyaWRpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHtcclxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHNcclxuICAgICAqIERlcml2ZWQgY2xhc3NlcyBhcmUgYWx3YXlzIGV4cGVjdGVkIHRvIGNhbGwgc3VwZXIuY3JlYXRlSWRCYWcoKSB3aGVuIG92ZXJyaWRpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUlkQmFnKCk6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGluaXRpYWwgaG9zdCBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBlbGVtZW50XHJcbiAgICAgKiBEZXJpdmVkIGNsYXNzZXMgYXJlIGFsd2F5cyBleHBlY3RlZCB0byBjYWxsIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpIHdoZW4gb3ZlcnJpZGluZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG9ydGN1dCB0byBnZXQgYW4gYXR0cmlidXRlIG9uIHRoZSBob3N0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvcnRjdXQgdG8gc2V0IGFuIGF0dHJpYnV0ZSBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3J0Y3V0IHRvIHJlbW92ZSBhbiBhdHRyaWJ1dGUgb24gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlQXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG9ydGN1dCB0byBhZGQgYSBjbGFzcyBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFkZENsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG9ydGN1dCB0byByZW1vdmUgYSBjbGFzcyBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBjbGFzc1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3J0Y3V0IHRvIHNldCBhIHN0eWxlIG9uIHRoZSBob3N0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBzdHlsZSBUaGUgbmFtZSBvZiB0aGUgc3R5bGVcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzZXRTdHlsZShzdHlsZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHN0eWxlLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG9ydGN1dCB0byByZW1vdmUgYSBzdHlsZSBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0gc3R5bGUgVGhlIG5hbWUgb2YgdGhlIHN0eWxlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVTdHlsZShzdHlsZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3J0Y3V0IHRvIGxvZyBhIHJlY29yZC4gVGhlIHNvdXJjZSBuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcGlja2VkIHVwIGZyb20gdGhlIGNsYXNzIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSBvZiB0aGUgbG9nIHJlY29yZFxyXG4gICAgICogQHBhcmFtIGxldmVsIChvcHRpb25hbCkgdGhlIGxvZyBsZXZlbCAoZGVmYXVsdHMgdG8gRGVidWcpXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zIChvcHRpb25hbCkgdGhlIHBhcmFtZXRlcnMgdG8gbG9nXHJcbiAgICAgKiBAcGFyYW0gc291cmNlIChvcHRpb25hbCkgdGhlIHNvdXJjZSBvZiB0aGUgbG9nIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGluc3RhbmNlXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8YW55PiBzZXR0bGUgdG8gcmVzb2x2ZSBpZiBidWZmZXJlZC5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGxvZyhtZXNzYWdlOiBzdHJpbmcsIGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLkRlYnVnLCBwYXJhbXM/OiBhbnksIHNvdXJjZTogc3RyaW5nID0gdGhpcy5sb2dTb3VyY2VOYW1lKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGxvY2FsUGFyYW1zOiBwYXJhbXMsXHJcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWVzIHRoZSBpbml0aWFsIGNsYXNzZXMgdG8gdGhpcyBjb21wb25lbnRzIGhvc3QgZWxlbWVudC5cclxuICAgICAqIFdlIHByZXNlcnZlIGFueSBjdXN0b20gY2xhc3NlcyBieSByZW1vdmluZyB0aGVtLCBhcHBseWluZyB0aGUgYmFzZSBjbGFzc2VzIGFuZCByZWFwcGx5aW5nIHRoZSBjdXN0b20gY2xhc3Nlcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhcHBseUluaXRpYWxIb3N0Q2xhc3NlcygpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21DbGFzc2VzID0gRG9tLmdldENsYXNzZXModGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICBjdXN0b21DbGFzc2VzLmZvckVhY2goYyA9PiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgYykpO1xyXG4gICAgICAgIHRoaXMuZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKClcclxuICAgICAgICAgICAgLmNvbmNhdChjdXN0b21DbGFzc2VzKVxyXG4gICAgICAgICAgICAuZm9yRWFjaChjID0+IHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCBjKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbCBiYXNlIGNvbXBvbmVudCBmb3IgU01FIENvcmUgY29udHJvbHMuIEl0IHNpbXBseSByZW1vdmVzIHRoZSBuZWVkIHRvIHN1cHBseSB0aGUgc3RyaW5nIHR5cGUgcGFyYW1ldGVyXHJcbiAqIFRoaXMgY2xhc3MgaXMgZXhwb3J0ZWQgZnJvbSB0aGlzIGZpbGUsIGJ1dCBub3QgbWVhbnQgdG8gYmUgZXhwb3J0ZWQgZnJvbSBpbmRleC50cyBidW5kbGVzLlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvcmVCYXNlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudDxTdHJpbmdzPiB7XHJcbiAgICAvLyBTaG91bGQgUmVtYWluIEVtcHR5LlxyXG59XHJcbiJdfQ==