@vismaux/ngx-nordic-cool
Version:
Common Nordic-Cool components for Angular.
172 lines • 22 kB
JavaScript
import { Directive, HostBinding, HostListener, Input, Optional, } from '@angular/core';
import { takeUntil } from 'rxjs/operators';
import { FormControl, FormGroupDirective, NgControl, } from '@angular/forms';
import { NcTooltipDirective } from '../tooltip';
import { NcErrorTooltipContentComponent } from './error-tooltip-content.component';
import { NcErrorsComponent } from './error-messages';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
import * as i2 from "@angular/forms";
// Increasing integer for generating unique ids for error message component.
let nextErrorMessageId = 0;
export class NcErrorTooltipDirective extends NcTooltipDirective {
constructor(elRef, overlay, ngZone, implicitNgControl, ngForm, controlContainer) {
super(elRef, overlay, ngZone);
this.implicitNgControl = implicitNgControl;
this.ngForm = ngForm;
this.controlContainer = controlContainer;
this.inFocus = false;
this.formSubmitted = false;
this.contentInstance = null;
this._errorMessages = {};
this.errorMessagesSub = new Subscription();
this.errorMessageId = `nc-error-message-${++nextErrorMessageId}`;
this.errorMessages = '';
this.customErrors = null;
this.disabled = true;
this.style = 'error';
this.content = '';
}
ngOnInit() {
if (!this.ngControl) {
throw new Error(`[ncErrorTooltip] only works with angular form controls. Make sure [(ngModel)] or [formControl] is used.`);
}
this.ngControl.statusChanges
.pipe(takeUntil(this.destroyed$))
.subscribe(() => this.checkTooltipState());
this.formContainer?.ngSubmit
.pipe(takeUntil(this.destroyed$))
.subscribe(() => {
this.formSubmitted = true;
this.checkTooltipState();
});
}
ngDoCheck() {
if (this.formContainer &&
this.formContainer.submitted !== this.formSubmitted) {
// `NgForm` doesn't provide `reset` observable,
// so this must be manually checked on every change-detection run ;(
this.formSubmitted = this.formContainer.submitted;
this.checkTooltipState();
}
}
ngOnChanges(changes) {
this.checkTooltipState();
if (changes['errorMessages']) {
this.errorMessagesSub?.unsubscribe();
if (this.errorMessages instanceof NcErrorsComponent) {
this.errorMessagesSub = this.errorMessages.errors$
.pipe(takeUntil(this.destroyed$))
.subscribe((errorMessages) => {
this._errorMessages = errorMessages;
this.updateErrorMessages();
});
}
else {
this._errorMessages = {};
this.updateErrorMessages();
}
}
}
onFocus() {
this.inFocus = true;
this.checkTooltipState();
}
onBlur() {
this.inFocus = false;
this.checkTooltipState();
}
hide() {
// overriding this method to prevent default tooltip closing behaviour
}
get ngControl() {
if (this.explicitNgControl instanceof NgControl ||
this.explicitNgControl instanceof FormControl) {
return this.explicitNgControl;
}
return this.implicitNgControl;
}
get formContainer() {
if (this.controlContainer &&
this.controlContainer.formDirective instanceof FormGroupDirective) {
return this.controlContainer.formDirective;
}
return this.ngForm;
}
checkTooltipState() {
const hasCustomError = Object.values(this.customErrors ?? {}).some((e) => e !== null && e !== undefined);
this.hasError =
(this.ngControl.invalid || hasCustomError) &&
((this.ngControl.touched && this.ngControl.dirty) || this.formSubmitted);
const shouldBeVisible = this.hasError && this.inFocus;
if (shouldBeVisible) {
this.show();
this.createContentInstance();
this.updateErrorMessages();
}
else {
super.hide();
this.contentInstance = null;
}
}
createContentInstance() {
if (!this.contentInstance) {
this.contentInstance = this.projectComponent(NcErrorTooltipContentComponent);
this.contentInstance.errorMessageId = this.errorMessageId;
}
return this.contentInstance;
}
updateErrorMessages() {
if (!this.contentInstance) {
return;
}
this.contentInstance.errors = this.getErrors();
this.contentInstance.errorMessages = this._errorMessages;
this.contentInstance.cd.detectChanges();
}
getErrors() {
const customErrors = Object.entries(this.customErrors ?? {}).reduce((l, [key, err]) => err !== null && err !== undefined ? { ...l, [key]: err } : l, {});
return { ...this.ngControl.errors, ...customErrors };
}
}
NcErrorTooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcErrorTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.NgZone }, { token: i2.NgControl, optional: true }, { token: i2.NgForm, optional: true }, { token: i2.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
NcErrorTooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.3", type: NcErrorTooltipDirective, selector: "[ncErrorTooltip]", inputs: { errorMessages: ["ncErrorTooltip", "errorMessages"], explicitNgControl: ["ncErrorTooltipControl", "explicitNgControl"], customErrors: ["ncErrorTooltipCustom", "customErrors"] }, host: { listeners: { "focusin": "onFocus()", "focusout": "onBlur()" }, properties: { "attr.aria-invalid": "this.hasError", "class.has-error": "this.hasError", "attr.aria-errormessage": "this.errorMessageId" } }, exportAs: ["ncErrorTooltip"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcErrorTooltipDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncErrorTooltip]',
exportAs: 'ncErrorTooltip',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.NgZone }, { type: i2.NgControl, decorators: [{
type: Optional
}] }, { type: i2.NgForm, decorators: [{
type: Optional
}] }, { type: i2.ControlContainer, decorators: [{
type: Optional
}] }]; }, propDecorators: { hasError: [{
type: HostBinding,
args: ['attr.aria-invalid']
}, {
type: HostBinding,
args: ['class.has-error']
}], errorMessageId: [{
type: HostBinding,
args: ['attr.aria-errormessage']
}], errorMessages: [{
type: Input,
args: ['ncErrorTooltip']
}], explicitNgControl: [{
type: Input,
args: ['ncErrorTooltipControl']
}], customErrors: [{
type: Input,
args: ['ncErrorTooltipCustom']
}], onFocus: [{
type: HostListener,
args: ['focusin']
}], onBlur: [{
type: HostListener,
args: ['focusout']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItdG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9yZGljLWNvb2wvc3JjL2xpYi9lcnJvci10b29sdGlwL2Vycm9yLXRvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBSUwsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBRUwsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixTQUFTLEdBRVYsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkYsT0FBTyxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RFLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFFaEQsNEVBQTRFO0FBQzVFLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBTTNCLE1BQU0sT0FBTyx1QkFDWCxTQUFRLGtCQUFrQjtJQXFCMUIsWUFDRSxLQUE4QixFQUM5QixPQUFnQixFQUNoQixNQUFjLEVBQ00saUJBQTZCLEVBQzdCLE1BQWUsRUFDZixnQkFBbUM7UUFFdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFKVixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUF4QmpELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsa0JBQWEsR0FBRyxLQUFL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a0I7b0JBQzVCLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzswQkEyQkksUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs0Q0FoQlgsUUFBUTtzQkFGUCxXQUFXO3VCQUFDLG1CQUFtQjs7c0JBQy9CLFdBQVc7dUJBQUMsaUJBQWlCO2dCQUlyQixjQUFjO3NCQUR0QixXQUFXO3VCQUFDLHdCQUF3QjtnQkFHWixhQUFhO3NCQUFyQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDUyxpQkFBaUI7c0JBQWhELEtBQUs7dUJBQUMsdUJBQXVCO2dCQUNDLFlBQVk7c0JBQTFDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQW9FN0IsT0FBTztzQkFETixZQUFZO3VCQUFDLFNBQVM7Z0JBT3ZCLE1BQU07c0JBREwsWUFBWTt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5nQ29udHJvbCxcbiAgTmdGb3JtLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOY1Rvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IE5jRXJyb3JUb29sdGlwQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vZXJyb3ItdG9vbHRpcC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOY0Vycm9yTWVzc2FnZXMsIE5jRXJyb3JzQ29tcG9uZW50IH0gZnJvbSAnLi9lcnJvci1tZXNzYWdlcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLy8gSW5jcmVhc2luZyBpbnRlZ2VyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBpZHMgZm9yIGVycm9yIG1lc3NhZ2UgY29tcG9uZW50LlxubGV0IG5leHRFcnJvck1lc3NhZ2VJZCA9IDA7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuY0Vycm9yVG9vbHRpcF0nLFxuICBleHBvcnRBczogJ25jRXJyb3JUb29sdGlwJyxcbn0pXG5leHBvcnQgY2xhc3MgTmNFcnJvclRvb2x0aXBEaXJlY3RpdmVcbiAgZXh0ZW5kcyBOY1Rvb2x0aXBEaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICBwcml2YXRlIGluRm9jdXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmb3JtU3VibWl0dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY29udGVudEluc3RhbmNlOiBOY0Vycm9yVG9vbHRpcENvbnRlbnRDb21wb25lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlczogTmNFcnJvck1lc3NhZ2VzIHwge30gPSB7fTtcbiAgcHJpdmF0ZSBlcnJvck1lc3NhZ2VzU3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWludmFsaWQnKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhcy1lcnJvcicpXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWVycm9ybWVzc2FnZScpXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZUlkID0gYG5jLWVycm9yLW1lc3NhZ2UtJHsrK25leHRFcnJvck1lc3NhZ2VJZH1gO1xuXG4gIEBJbnB1dCgnbmNFcnJvclRvb2x0aXAnKSBlcnJvck1lc3NhZ2VzOiBOY0Vycm9yc0NvbXBvbmVudCB8IHN0cmluZyA9ICcnO1xuICBASW5wdXQoJ25jRXJyb3JUb29sdGlwQ29udHJvbCcpIGV4cGxpY2l0TmdDb250cm9sPzogTmdDb250cm9sIHwgRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgnbmNFcnJvclRvb2x0aXBDdXN0b20nKSBjdXN0b21FcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9XG4gICAgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGltcGxpY2l0TmdDb250cm9sPzogTmdDb250cm9sLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmdGb3JtPzogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcj86IENvbnRyb2xDb250YWluZXJcbiAgKSB7XG4gICAgc3VwZXIoZWxSZWYsIG92ZXJsYXksIG5nWm9uZSk7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5zdHlsZSA9ICdlcnJvcic7XG4gICAgdGhpcy5jb250ZW50ID0gJyc7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbbmNFcnJvclRvb2x0aXBdIG9ubHkgd29ya3Mgd2l0aCBhbmd1bGFyIGZvcm0gY29udHJvbHMuIE1ha2Ugc3VyZSBbKG5nTW9kZWwpXSBvciBbZm9ybUNvbnRyb2xdIGlzIHVzZWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAodGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcyBhcyBPYnNlcnZhYmxlPHVua25vd24+KVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hlY2tUb29sdGlwU3RhdGUoKSk7XG5cbiAgICB0aGlzLmZvcm1Db250YWluZXI/Lm5nU3VibWl0XG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoZWNrVG9vbHRpcFN0YXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm1Db250YWluZXIgJiZcbiAgICAgIHRoaXMuZm9ybUNvbnRhaW5lci5zdWJtaXR0ZWQgIT09IHRoaXMuZm9ybVN1Ym1pdHRlZFxuICAgICkge1xuICAgICAgLy8gYE5nRm9ybWAgZG9lc24ndCBwcm92aWRlIGByZXNldGAgb2JzZXJ2YWJsZSxcbiAgICAgIC8vIHNvIHRoaXMgbXVzdCBiZSBtYW51YWxseSBjaGVja2VkIG9uIGV2ZXJ5IGNoYW5nZS1kZXRlY3Rpb24gcnVuIDsoXG4gICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSB0aGlzLmZvcm1Db250YWluZXIuc3VibWl0dGVkO1xuICAgICAgdGhpcy5jaGVja1Rvb2x0aXBTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmNoZWNrVG9vbHRpcFN0YXRlKCk7XG5cbiAgICBpZiAoY2hhbmdlc1snZXJyb3JNZXNzYWdlcyddKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2VzIGluc3RhbmNlb2YgTmNFcnJvcnNDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzU3ViID0gdGhpcy5lcnJvck1lc3NhZ2VzLmVycm9ycyRcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChlcnJvck1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2VzID0gZXJyb3JNZXNzYWdlcztcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRXJyb3JNZXNzYWdlcygpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1c2luJylcbiAgb25Gb2N1cygpIHtcbiAgICB0aGlzLmluRm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tUb29sdGlwU3RhdGUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JylcbiAgb25CbHVyKCkge1xuICAgIHRoaXMuaW5Gb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuY2hlY2tUb29sdGlwU3RhdGUoKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgLy8gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB0byBwcmV2ZW50IGRlZmF1bHQgdG9vbHRpcCBjbG9zaW5nIGJlaGF2aW91clxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbmdDb250cm9sKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZXhwbGljaXROZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ0NvbnRyb2wgfHxcbiAgICAgIHRoaXMuZXhwbGljaXROZ0NvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwbGljaXROZ0NvbnRyb2w7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmltcGxpY2l0TmdDb250cm9sO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZm9ybUNvbnRhaW5lcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbnRyb2xDb250YWluZXIgJiZcbiAgICAgIHRoaXMuY29udHJvbENvbnRhaW5lci5mb3JtRGlyZWN0aXZlIGluc3RhbmNlb2YgRm9ybUdyb3VwRGlyZWN0aXZlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250cm9sQ29udGFpbmVyLmZvcm1EaXJlY3RpdmU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5nRm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUb29sdGlwU3RhdGUoKSB7XG4gICAgY29uc3QgaGFzQ3VzdG9tRXJyb3IgPSBPYmplY3QudmFsdWVzKHRoaXMuY3VzdG9tRXJyb3JzID8/IHt9KS5zb21lKFxuICAgICAgKGUpID0+IGUgIT09IG51bGwgJiYgZSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgICB0aGlzLmhhc0Vycm9yID1cbiAgICAgICh0aGlzLm5nQ29udHJvbC5pbnZhbGlkIHx8IGhhc0N1c3RvbUVycm9yKSAmJlxuICAgICAgKCh0aGlzLm5nQ29udHJvbC50b3VjaGVkICYmIHRoaXMubmdDb250cm9sLmRpcnR5KSB8fCB0aGlzLmZvcm1TdWJtaXR0ZWQpO1xuXG4gICAgY29uc3Qgc2hvdWxkQmVWaXNpYmxlID0gdGhpcy5oYXNFcnJvciAmJiB0aGlzLmluRm9jdXM7XG4gICAgaWYgKHNob3VsZEJlVmlzaWJsZSkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB0aGlzLmNyZWF0ZUNvbnRlbnRJbnN0YW5jZSgpO1xuICAgICAgdGhpcy51cGRhdGVFcnJvck1lc3NhZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmhpZGUoKTtcbiAgICAgIHRoaXMuY29udGVudEluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbnRlbnRJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudEluc3RhbmNlKSB7XG4gICAgICB0aGlzLmNvbnRlbnRJbnN0YW5jZSA9IHRoaXMucHJvamVjdENvbXBvbmVudChcbiAgICAgICAgTmNFcnJvclRvb2x0aXBDb250ZW50Q29tcG9uZW50XG4gICAgICApO1xuICAgICAgdGhpcy5jb250ZW50SW5zdGFuY2UuZXJyb3JNZXNzYWdlSWQgPSB0aGlzLmVycm9yTWVzc2FnZUlkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250ZW50SW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVycm9yTWVzc2FnZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRJbnN0YW5jZS5lcnJvcnMgPSB0aGlzLmdldEVycm9ycygpO1xuICAgIHRoaXMuY29udGVudEluc3RhbmNlLmVycm9yTWVzc2FnZXMgPSB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICAgIHRoaXMuY29udGVudEluc3RhbmNlLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JzKCkge1xuICAgIGNvbnN0IGN1c3RvbUVycm9ycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tRXJyb3JzID8/IHt9KS5yZWR1Y2UoXG4gICAgICAobCwgW2tleSwgZXJyXSkgPT5cbiAgICAgICAgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8geyAuLi5sLCBba2V5XTogZXJyIH0gOiBsLFxuICAgICAge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHsgLi4udGhpcy5uZ0NvbnRyb2wuZXJyb3JzLCAuLi5jdXN0b21FcnJvcnMgfTtcbiAgfVxufVxuIl19