ngx-dynamic-dashboard
Version:
an dashboard lib for angular 10
189 lines (188 loc) • 23.9 kB
JavaScript
import { ViewChild } from '@angular/core';
import { DynamicFormComponent } from '../../dynamic-form/dynamic-form.component';
/**
* Created by jayhamilton on 6/22/17.
*/
export class GadgetBase {
constructor(_gadgetInstanceService, _propertyService, changeDetectionRef, _optionsService) {
this._gadgetInstanceService = _gadgetInstanceService;
this._propertyService = _propertyService;
this.changeDetectionRef = changeDetectionRef;
this._optionsService = _optionsService;
/**
* Used to determine when to show the controls that appear in the gadgets
* heading area. This is set by the mouseover/mouseout events.
* @type {boolean}
*/
this.showControls = false;
/**
* determines whether to show the gadgets property page
* @type {boolean}
*/
this.inConfig = false;
/**
* Determines if a gadget is runnning or not
* @type {boolean}
*/
this.inRun = false;
/**
* When a gadget is manually put into run mode this property will be used to
* display a spinning icon and will be enabled between intiating an operation (run or stop)
* to the operation is enabled
* @type {boolean}
*/
this.actionInitiated = false;
/**
* Gadgets that are of type realtime have a run/stop set of controls.
* Those gadgets should set this property to true. This property's visibility
* will also be controlled by whether the gadget's configuration form is valid.
* @type {boolean}
*/
this.showOperationControls = false;
/**
* This property is used to simply allow the gadget to not show any run/stop controls.
* This is needed because the showOperationControls does something similar but not exactly the same.
* The showOperationControls property allows the gadgetBase to determine if the run control, if the gadget
* uses it, to be displayed when the gadget has a valid configuration.
*
* Default: true - Gadgets without a need for run/stop control should override this value.
* @type {boolean}
*/
this.gadgetHasOperationControls = true;
/**
* Most gadgets need configuration so gadgets that don't can override this property
* @type {boolean}
*/
this.showConfigurationControl = true;
// internally controls dynamic form properties
this.propertyPages = [];
this.errorExists = false;
this._optionsService.listenForGlobalOptionsChanges().subscribe(options => {
/**
* This is called when there is a change to the options tab within the configuration modal.
* The following method needs to also be called when the gadget is initially instantiated.
* When the gadget is instantiated the option values need to come from the persistent store.
*/
this.updateGadgetWithGlobalOptions(options);
});
this.updateGadgetWithGlobalOptions(this._optionsService.getBoardOptions());
}
ngOnInit() {
this.toggleConfigMode();
this.changeDetectionRef.detectChanges();
}
ngAfterViewInit() {
if (this.propertyPageForm) {
if (this.propertyPageForm.isPropertyPageValid) {
this.toggleConfigMode();
this.changeDetectionRef.detectChanges();
this.showOperationControls = true;
this.changeDetectionRef.detectChanges();
}
else {
this.showOperationControls = false;
this.changeDetectionRef.detectChanges();
}
}
this.preRun();
}
initializeState() {
}
toggleConfigMode() {
if (!this.inConfig) {
this.initializeProperties();
}
this.inConfig = !this.inConfig;
}
initializeProperties() {
if (this.propertyPages.length === 0 && this.config.propertyPages) {
this._propertyService.setPropertyPagesAndProperties(this.config.propertyPages, this.propertyPages);
}
}
handleError(error) {
this.inRun = false;
this.actionInitiated = false;
this.errorExists = true;
this.errorObject = error;
}
initializeRunState(forceRunState) {
this.errorExists = false;
this.actionInitiated = true;
this.inConfig = false;
if (forceRunState) {
this.setInRunState();
}
}
setInRunState() {
this.inRun = true;
this.actionInitiated = false;
}
setStopState(longRunningStopAction) {
/**
* If the gadget indicates longRunningStopAction then the gadget has to set this value to
* false once the operation is complete
*/
this.actionInitiated = longRunningStopAction;
this.inRun = false;
}
remove() {
this._gadgetInstanceService.removeInstance(this.instanceId);
}
showGadgetControls(enable) {
this.showControls = enable;
}
/**
* called from cell.component after the gadget is created during runtime
* intanceId, config, title and endpoint are common to all gadgets. Once the gadgets are configured
* we give them an opportunity to perform an action during the preRun() method. For example,
* the statistic gadget uses preRun() to make a single call to the endpoint to update its display.
* */
configureGadget(instanceId, config, tags) {
this.instanceId = instanceId;
this.config = config;
this.gadgetTags = tags.slice();
this.setTitle(this.getPropFromPropertyPages('title'));
this.setEndPoint(this.getPropFromPropertyPages('endpoint'));
/**
* Todo - remove this prerun call and refactor remaining code. Prerun was called twice and had an impact on the barchart api calls.
* API calls continued after route changes which is undesirable. See ngAfterViewInit where it is also called from.
*/
//this.preRun();
}
ngOnDestroy() {
}
updateGadgetWithGlobalOptions(options) {
this.globalOptions = Object.assign({}, options);
}
setEndPoint(endpoint) {
/*this._endPointService.getEndPoints().subscribe(data => {
if (data['endPoint']) {
data['endPoint'].forEach(item => {
if (item.name === endpoint) {
this.endpointObject = item;
}
});
}
});*/
}
getEndPoint() {
return this.endpointObject;
}
setTitle(title) {
this.title = title;
}
getPropFromPropertyPages(prop) {
for (let x = 0; x < this.config.propertyPages.length; x++) {
for (let i = 0; i < this.config.propertyPages[x].properties.length; i++) {
if (this.config.propertyPages[x].properties[i].key === prop) {
return this.config.propertyPages[x].properties[i].value;
}
}
}
return 'Unknown';
}
}
GadgetBase.propDecorators = {
propertyPageForm: [{ type: ViewChild, args: [DynamicFormComponent, { static: true },] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FkZ2V0LWJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2JlbmxpL3dvcmtzcGFjZXMvbmd4LWR5bmFtaWMtZGFzaGJvYXJkLWZyYW1ld29yay9wcm9qZWN0cy9uZ3gtZHluYW1pYy1kYXNoYm9hcmQvc3JjLyIsInNvdXJjZXMiOlsiZGFzaGJvYXJkL2dhZGdldHMvX2NvbW1vbi9nYWRnZXQtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQXNELFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUsvRTs7R0FFRztBQUVILE1BQU0sT0FBZ0IsVUFBVTtJQW1FNUIsWUFBZ0Msc0JBQTZDLEVBQzdDLGdCQUF1QyxFQUN2QyxrQkFBcUMsRUFDckMsZUFBK0I7UUFIL0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF1QjtRQUM3QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXVCO1FBQ3ZDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDckMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBL0QvRDs7OztXQUlHO1FBQ0gsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckI7OztXQUdHO1FBQ0gsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQjs7O1dBR0c7UUFDSCxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRWQ7Ozs7O1dBS0c7UUFDSCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4Qjs7Ozs7V0FLRztRQUNILDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5Qjs7Ozs7Ozs7V0FRRztRQUNILCtCQUEwQixHQUFHLElBQUksQ0FBQztRQUVsQzs7O1dBR0c7UUFDSCw2QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFFaEMsOENBQThDO1FBQzlDLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBSzFCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBUWhCLElBQUksQ0FBQyxlQUFlLENBQUMs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SUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRTtvQkFDekQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUMzRDthQUNKO1NBRUo7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDOzs7K0JBelBBLFNBQVMsU0FBQyxvQkFBb0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Vycm9yT2JqZWN0fSBmcm9tICcuLi8uLi9lcnJvci9lcnJvci1tb2RlbCc7XG5pbXBvcnQge0dhZGdldFByb3BlcnR5U2VydmljZX0gZnJvbSAnLi9nYWRnZXQtcHJvcGVydHkuc2VydmljZSc7XG5pbXBvcnQge0dhZGdldEluc3RhbmNlU2VydmljZX0gZnJvbSAnLi4vLi4vZ3JpZC9ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0R5bmFtaWNGb3JtQ29tcG9uZW50fSBmcm9tICcuLi8uLi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQge09wdGlvbnNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3RhYi1vcHRpb25zL3NlcnZpY2UnO1xuaW1wb3J0IHtJR2FkZ2V0fSBmcm9tICcuL2lnYWRnZXQnO1xuaW1wb3J0IHtFbmRQb2ludH0gZnJvbSAnLi9lbmRwb2ludC5tb2RlbCc7XG5cbi8qKlxuICogQ3JlYXRlZCBieSBqYXloYW1pbHRvbiBvbiA2LzIyLzE3LlxuICovXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBHYWRnZXRCYXNlIGltcGxlbWVudHMgSUdhZGdldCwgT25EZXN0cm95LCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICAgIEBWaWV3Q2hpbGQoRHluYW1pY0Zvcm1Db21wb25lbnQsIHtzdGF0aWM6IHRydWV9KSBwcm9wZXJ0eVBhZ2VGb3JtOiBEeW5hbWljRm9ybUNvbXBvbmVudDtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGluc3RhbmNlSWQ6IG51bWJlcjtcbiAgICBjb25maWc6IGFueTtcbiAgICBnYWRnZXRUYWdzOiBBcnJheTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hlbiB0byBzaG93IHRoZSBjb250cm9scyB0aGF0IGFwcGVhciBpbiB0aGUgZ2FkZ2V0c1xuICAgICAqIGhlYWRpbmcgYXJlYS4gVGhpcyBpcyBzZXQgYnkgdGhlIG1vdXNlb3Zlci9tb3VzZW91dCBldmVudHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgc2hvd0NvbnRyb2xzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgZ2FkZ2V0cyBwcm9wZXJ0eSBwYWdlXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5Db25maWcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBnYWRnZXQgaXMgcnVubm5pbmcgb3Igbm90XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW5SdW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBnYWRnZXQgaXMgbWFudWFsbHkgcHV0IGludG8gcnVuIG1vZGUgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG9cbiAgICAgKiBkaXNwbGF5IGEgc3Bpbm5pbmcgaWNvbiBhbmQgd2lsbCBiZSBlbmFibGVkIGJldHdlZW4gaW50aWF0aW5nIGFuIG9wZXJhdGlvbiAocnVuIG9yIHN0b3ApXG4gICAgICogdG8gdGhlIG9wZXJhdGlvbiBpcyBlbmFibGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgYWN0aW9uSW5pdGlhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHYWRnZXRzIHRoYXQgYXJlIG9mIHR5cGUgcmVhbHRpbWUgaGF2ZSBhIHJ1bi9zdG9wIHNldCBvZiBjb250cm9scy5cbiAgICAgKiBUaG9zZSBnYWRnZXRzIHNob3VsZCBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLiBUaGlzIHByb3BlcnR5J3MgdmlzaWJpbGl0eVxuICAgICAqIHdpbGwgYWxzbyBiZSBjb250cm9sbGVkIGJ5IHdoZXRoZXIgdGhlIGdhZGdldCdzIGNvbmZpZ3VyYXRpb24gZm9ybSBpcyB2YWxpZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzaG93T3BlcmF0aW9uQ29udHJvbHMgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gc2ltcGx5IGFsbG93IHRoZSBnYWRnZXQgdG8gbm90IHNob3cgYW55IHJ1bi9zdG9wIGNvbnRyb2xzLlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHNob3dPcGVyYXRpb25Db250cm9scyBkb2VzIHNvbWV0aGluZyBzaW1pbGFyIGJ1dCBub3QgZXhhY3RseSB0aGUgc2FtZS5cbiAgICAgKiBUaGUgc2hvd09wZXJhdGlvbkNvbnRyb2xzIHByb3BlcnR5IGFsbG93cyB0aGUgZ2FkZ2V0QmFzZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJ1biBjb250cm9sLCBpZiB0aGUgZ2FkZ2V0XG4gICAgICogdXNlcyBpdCwgdG8gYmUgZGlzcGxheWVkIHdoZW4gdGhlIGdhZGdldCBoYXMgYSB2YWxpZCBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogRGVmYXVsdDogdHJ1ZSAtIEdhZGdldHMgd2l0aG91dCBhIG5lZWQgZm9yIHJ1bi9zdG9wIGNvbnRyb2wgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdmFsdWUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2FkZ2V0SGFzT3BlcmF0aW9uQ29udHJvbHMgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogTW9zdCBnYWRnZXRzIG5lZWQgY29uZmlndXJhdGlvbiBzbyBnYWRnZXRzIHRoYXQgZG9uJ3QgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzaG93Q29uZmlndXJhdGlvbkNvbnRyb2wgPSB0cnVlO1xuXG4gICAgLy8gaW50ZXJuYWxseSBjb250cm9scyBkeW5hbWljIGZvcm0gcHJvcGVydGllc1xuICAgIHByb3BlcnR5UGFnZXM6IGFueVtdID0gW107XG5cbiAgICBlbmRwb2ludE9iamVjdDogRW5kUG9pbnQ7XG5cbiAgICBlcnJvck9iamVjdDogRXJyb3JPYmplY3Q7XG4gICAgZXJyb3JFeGlzdHMgPSBmYWxzZTtcbiAgICBnbG9iYWxPcHRpb25zOiBhbnk7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIF9nYWRnZXRJbnN0YW5jZVNlcnZpY2U6IEdhZGdldEluc3RhbmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wcm9wZXJ0eVNlcnZpY2U6IEdhZGdldFByb3BlcnR5U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdGlvblJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UubGlzdGVuRm9yR2xvYmFsT3B0aW9uc0NoYW5nZXMoKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSB0byB0aGUgb3B0aW9ucyB0YWIgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uIG1vZGFsLlxuICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBtZXRob2QgbmVlZHMgdG8gYWxzbyBiZSBjYWxsZWQgd2hlbiB0aGUgZ2FkZ2V0IGlzIGluaXRpYWxseSBpbnN0YW50aWF0ZWQuXG4gICAgICAgICAgICAgKiBXaGVuIHRoZSBnYWRnZXQgaXMgaW5zdGFudGlhdGVkIHRoZSBvcHRpb24gdmFsdWVzIG5lZWQgdG8gY29tZSBmcm9tIHRoZSBwZXJzaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlR2FkZ2V0V2l0aEdsb2JhbE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlR2FkZ2V0V2l0aEdsb2JhbE9wdGlvbnModGhpcy5fb3B0aW9uc1NlcnZpY2UuZ2V0Qm9hcmRPcHRpb25zKCkpXG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUNvbmZpZ01vZGUoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG5cblxuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eVBhZ2VGb3JtKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnR5UGFnZUZvcm0uaXNQcm9wZXJ0eVBhZ2VWYWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29uZmlnTW9kZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd09wZXJhdGlvbkNvbnRyb2xzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdGlvblJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd09wZXJhdGlvbkNvbnRyb2xzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb25SZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlUnVuKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRpYWxpemVTdGF0ZSgpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVDb25maWdNb2RlKCkge1xuXG4gICAgICAgIGlmICghdGhpcy5pbkNvbmZpZykge1xuXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVQcm9wZXJ0aWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbkNvbmZpZyA9ICF0aGlzLmluQ29uZmlnO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0aWFsaXplUHJvcGVydGllcygpIHtcblxuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eVBhZ2VzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmNvbmZpZy5wcm9wZXJ0eVBhZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0eVNlcnZpY2Uuc2V0UHJvcGVydHlQYWdlc0FuZFByb3BlcnRpZXModGhpcy5jb25maWcucHJvcGVydHlQYWdlcywgdGhpcy5wcm9wZXJ0eVBhZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBydW4oKTogdm9pZFxuXG4gICAgcHVibGljIGFic3RyYWN0IHN0b3AoKTogdm9pZFxuXG4gICAgcHVibGljIGFic3RyYWN0IHVwZGF0ZVByb3BlcnRpZXModXBkYXRlZFByb3BlcnRpZXM6IGFueSk6IHZvaWRcblxuICAgIHB1YmxpYyBhYnN0cmFjdCB1cGRhdGVEYXRhKGRhdGE6IGFueVtdKTogdm9pZFxuXG4gICAgcHVibGljIGFic3RyYWN0IHByZVJ1bigpOiB2b2lkXG5cbiAgICBwdWJsaWMgaGFuZGxlRXJyb3IoZXJyb3I6IEVycm9yT2JqZWN0KSB7XG5cblxuICAgICAgICB0aGlzLmluUnVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uSW5pdGlhdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3JFeGlzdHMgPSB0cnVlO1xuICAgICAgICB0aGlzLmVycm9yT2JqZWN0ID0gZXJyb3I7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVJ1blN0YXRlKGZvcmNlUnVuU3RhdGU6IGJvb2xlYW4pIHtcblxuICAgICAgICB0aGlzLmVycm9yRXhpc3RzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uSW5pdGlhdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbkNvbmZpZyA9IGZhbHNlO1xuICAgICAgICBpZiAoZm9yY2VSdW5TdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJblJ1blN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SW5SdW5TdGF0ZSgpIHtcblxuICAgICAgICB0aGlzLmluUnVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hY3Rpb25Jbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U3RvcFN0YXRlKGxvbmdSdW5uaW5nU3RvcEFjdGlvbjogYm9vbGVhbikge1xuICAgICAgICAvKipcbiAgICAgICAgICogIElmIHRoZSBnYWRnZXQgaW5kaWNhdGVzIGxvbmdSdW5uaW5nU3RvcEFjdGlvbiB0aGVuIHRoZSBnYWRnZXQgaGFzIHRvIHNldCB0aGlzIHZhbHVlIHRvXG4gICAgICAgICAqICBmYWxzZSBvbmNlIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aW9uSW5pdGlhdGVkID0gbG9uZ1J1bm5pbmdTdG9wQWN0aW9uO1xuICAgICAgICB0aGlzLmluUnVuID0gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLl9nYWRnZXRJbnN0YW5jZVNlcnZpY2UucmVtb3ZlSW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0dhZGdldENvbnRyb2xzKGVuYWJsZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNob3dDb250cm9scyA9IGVuYWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxsZWQgZnJvbSBjZWxsLmNvbXBvbmVudCBhZnRlciB0aGUgZ2FkZ2V0IGlzIGNyZWF0ZWQgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKiBpbnRhbmNlSWQsIGNvbmZpZywgdGl0bGUgYW5kIGVuZHBvaW50IGFyZSBjb21tb24gdG8gYWxsIGdhZGdldHMuIE9uY2UgdGhlIGdhZGdldHMgYXJlIGNvbmZpZ3VyZWRcbiAgICAgKiB3ZSBnaXZlIHRoZW0gYW4gb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBhbiBhY3Rpb24gZHVyaW5nIHRoZSBwcmVSdW4oKSBtZXRob2QuIEZvciBleGFtcGxlLFxuICAgICAqIHRoZSBzdGF0aXN0aWMgZ2FkZ2V0IHVzZXMgcHJlUnVuKCkgdG8gbWFrZSBhIHNpbmdsZSBjYWxsIHRvIHRoZSBlbmRwb2ludCB0byB1cGRhdGUgaXRzIGRpc3BsYXkuXG4gICAgICogKi9cbiAgICBwdWJsaWMgY29uZmlndXJlR2FkZ2V0KGluc3RhbmNlSWQ6IG51bWJlciwgY29uZmlnOiBhbnksIHRhZ3M6IEFycmF5PGFueT4pIHtcblxuICAgICAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5nYWRnZXRUYWdzID0gdGFncy5zbGljZSgpO1xuXG4gICAgICAgIHRoaXMuc2V0VGl0bGUodGhpcy5nZXRQcm9wRnJvbVByb3BlcnR5UGFnZXMoJ3RpdGxlJykpO1xuICAgICAgICB0aGlzLnNldEVuZFBvaW50KHRoaXMuZ2V0UHJvcEZyb21Qcm9wZXJ0eVBhZ2VzKCdlbmRwb2ludCcpKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogIFRvZG8gLSByZW1vdmUgdGhpcyBwcmVydW4gY2FsbCBhbmQgcmVmYWN0b3IgcmVtYWluaW5nIGNvZGUuIFByZXJ1biB3YXMgY2FsbGVkIHR3aWNlIGFuZCBoYWQgYW4gaW1wYWN0IG9uIHRoZSBiYXJjaGFydCBhcGkgY2FsbHMuXG4gICAgICAgICAqICBBUEkgY2FsbHMgY29udGludWVkIGFmdGVyIHJvdXRlIGNoYW5nZXMgd2hpY2ggaXMgdW5kZXNpcmFibGUuIFNlZSBuZ0FmdGVyVmlld0luaXQgd2hlcmUgaXQgaXMgYWxzbyBjYWxsZWQgZnJvbS5cbiAgICAgICAgICovXG4gICAgICAgIC8vdGhpcy5wcmVSdW4oKTtcblxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVHYWRnZXRXaXRoR2xvYmFsT3B0aW9ucyhvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldEVuZFBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcblxuICAgICAgICAvKnRoaXMuX2VuZFBvaW50U2VydmljZS5nZXRFbmRQb2ludHMoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChkYXRhWydlbmRQb2ludCddKSB7XG4gICAgICAgICAgICAgICAgZGF0YVsnZW5kUG9pbnQnXS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSBlbmRwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRwb2ludE9iamVjdCA9IGl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7Ki9cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RW5kUG9pbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZHBvaW50T2JqZWN0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UHJvcEZyb21Qcm9wZXJ0eVBhZ2VzKHByb3A6IHN0cmluZykge1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5jb25maWcucHJvcGVydHlQYWdlcy5sZW5ndGg7IHgrKykge1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLnByb3BlcnR5UGFnZXNbeF0ucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5UGFnZXNbeF0ucHJvcGVydGllc1tpXS5rZXkgPT09IHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3BlcnR5UGFnZXNbeF0ucHJvcGVydGllc1tpXS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH1cbn1cbiJdfQ==