survey-creator-angular
Version:
Use SurveyJS Creator to create or edit JSON for SurveyJS Form Library.
123 lines • 20.1 kB
JavaScript
import { Component, Input, ViewChild } from "@angular/core";
import { StringEditorViewModelBase, editableStringRendererName } from "survey-creator-core";
import { CreatorModelComponent } from "./creator-model.component";
import { AngularComponentFactory } from "survey-angular-ui";
import * as i0 from "@angular/core";
import * as i1 from "survey-angular-ui";
import * as i2 from "@angular/common";
export class StringEditorComponent extends CreatorModelComponent {
constructor(cdr, vcr, ngZone) {
super(cdr, vcr);
this.ngZone = ngZone;
this.justFocused = false;
this.onChangeHandler = () => {
this.detectChanges();
};
}
createModel() {
this.baseModel = new StringEditorViewModelBase(this.locString, this.creator);
this.baseModel.setLocString(this.locString);
this.baseModel.blurEditor = () => {
this.container.nativeElement.blur();
this.container.nativeElement.spellcheck = false;
};
this.baseModel.getEditorElement = () => this.container.nativeElement;
this.ngZone.runOutsideAngular(() => {
setTimeout(() => this.baseModel.afterRender());
});
}
get locString() {
return this.model.locStr;
}
get creator() {
return this.model.creator;
}
getModel() {
return this.baseModel;
}
getPropertiesToTrack() {
return ["creator", "locString"];
}
get placeholder() {
return this.baseModel.placeholder;
}
get contentEditable() {
return this.baseModel.contentEditable;
}
get characterCounter() {
return this.baseModel.characterCounter;
}
get showCharacterCounter() {
return this.baseModel.showCharacterCounter;
}
get getCharacterCounterClass() {
return this.baseModel.getCharacterCounterClass;
}
get className() {
return this.baseModel.className(this.locString.renderedHtml);
}
get errorText() {
return this.baseModel.errorText;
}
onBlur(event) {
this.container.nativeElement.spellcheck = false;
this.locString.__isEditing = false;
this.justFocused = false;
this.baseModel.onBlur(event);
return this.baseModel.errorText;
}
onFocus(event) {
this.baseModel.onFocus(event);
this.justFocused = true;
}
onPaste(event) {
this.baseModel.onPaste(event);
}
done(event) {
this.baseModel.done(event);
this.locString.__isEditing = false;
}
edit(event) {
this.container.nativeElement.focus();
this.locString.__isEditing = true;
this.baseModel.onClick(event);
}
ngOnInit() {
var _a;
super.ngOnInit();
(_a = this.locString) === null || _a === void 0 ? void 0 : _a.onStringChanged.add(this.onChangeHandler);
}
ngAfterViewInit() {
if (this.locString.__isEditing) {
this.container.nativeElement.focus();
}
}
ngOnDestroy() {
var _a;
this.baseModel.blurEditor = undefined;
this.baseModel.getEditorElement = undefined;
this.baseModel.dispose();
(_a = this.locString) === null || _a === void 0 ? void 0 : _a.onStringChanged.remove(this.onChangeHandler);
super.ngOnDestroy();
}
get ariaLabel() {
return this.placeholder || "content editable";
}
}
StringEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: StringEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
StringEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: StringEditorComponent, selector: "svc-string-edtior", inputs: { model: "model" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #template>\n <span [class]=\"className\">\n <span class=\"svc-string-editor__content\">\n <div class=\"svc-string-editor__border svc-string-editor__border--hover\"></div>\n <div class=\"svc-string-editor__border svc-string-editor__border--focus\"></div>\n <span class=\"svc-string-editor__input\">\n <span role=\"textbox\" *ngIf=\"!locString.hasHtml\" class=\"sv-string-editor\" spellcheck=\"false\"\n (focus)=\"onFocus($event)\" (paste)=\"onPaste($event)\" (blur)=\"onBlur($event)\" (input)=\"baseModel.onInput($event)\" (keydown)=\"baseModel.onKeyDown($event)\" (keyup)=\"baseModel.onKeyUp($event)\" (compositionstart)=\"baseModel.onCompositionStart($event)\" (compositionend)=\"baseModel.onCompositionEnd($event)\" (mouseup)=\"baseModel.onMouseUp($event)\" (click)=\"edit($event)\" [textContent]=\"locString.renderedHtml\" [attr.aria-placeholder]=\"placeholder\" [attr.aria-label]=\"ariaLabel\" [attr.contenteditable]=\"contentEditable\" #container></span>\n <span role=\"textbox\" *ngIf=\"locString.hasHtml\" class=\"sv-string-editor sv-string-editor--html\" spellcheck=\"false\"\n (focus)=\"onFocus($event)\" (blur)=\"onBlur($event)\" (keydown)=\"baseModel.onKeyDown($event)\" (keyup)=\"baseModel.onKeyUp($event)\" (compositionstart)=\"baseModel.onCompositionStart($event)\" (compositionend)=\"baseModel.onCompositionEnd($event)\" (mouseup)=\"baseModel.onMouseUp($event)\"\n (click)=\"edit($event)\" [attr.aria-placeholder]=\"placeholder\" [attr.aria-label]=\"ariaLabel\" [attr.contenteditable]=\"contentEditable\" [innerHtml]=\"locString.renderedHtml | safeHtml\" #container></span>\n <sv-ng-character-counter *ngIf=\"showCharacterCounter\" [counter]=\"characterCounter\" [remainingCharacterCounter]=\"getCharacterCounterClass\"></sv-ng-character-counter>\n </span>\n </span>\n <span *ngIf=\"errorText\" class=\"svc-string-editor__error\">{{errorText}}</span>\n </span>\n</ng-template>", styles: [":host { display: none; }"], components: [{ type: i1.CharacterCounterComponent, selector: "sv-ng-character-counter", inputs: ["counter", "remainingCharacterCounter"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "safeHtml": i1.SafeHtmlPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: StringEditorComponent, decorators: [{
type: Component,
args: [{
selector: "svc-string-edtior",
templateUrl: "./string-editor.component.html",
styles: [":host { display: none; }"]
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i0.NgZone }]; }, propDecorators: { model: [{
type: Input
}], container: [{
type: ViewChild,
args: ["container"]
}] } });
AngularComponentFactory.Instance.registerComponent(editableStringRendererName, StringEditorComponent);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyaW5nLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi9zcmMvc3RyaW5nLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUVwSSxPQUFPLEVBQUUseUJBQXlCLEVBQXNCLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFPNUQsTUFBTSxPQUFPLHFCQUFzQixTQUFRLHFCQUFnRDtJQUt6RixZQUFZLEdBQXNCLEVBQUUsR0FBcUIsRUFBVSxNQUFjO1FBQy9FLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFEaUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUh6RSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQW9EckMsb0JBQWUsR0FBRyxHQUFTLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztJQWpERixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FB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QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgTmdab25lLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcsIENoYXJhY3RlckNvdW50ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFN0cmluZ0VkaXRvclZpZXdNb2RlbEJhc2UsIFN1cnZleUNyZWF0b3JNb2RlbCwgZWRpdGFibGVTdHJpbmdSZW5kZXJlck5hbWUgfSBmcm9tIFwic3VydmV5LWNyZWF0b3ItY29yZVwiO1xuaW1wb3J0IHsgQ3JlYXRvck1vZGVsQ29tcG9uZW50IH0gZnJvbSBcIi4vY3JlYXRvci1tb2RlbC5jb21wb25lbnRcIjtcbmltcG9ydCB7IEFuZ3VsYXJDb21wb25lbnRGYWN0b3J5IH0gZnJvbSBcInN1cnZleS1hbmd1bGFyLXVpXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJzdmMtc3RyaW5nLWVkdGlvclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3N0cmluZy1lZGl0b3IuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVzOiBbXCI6aG9zdCB7IGRpc3BsYXk6IG5vbmU7IH1cIl1cbn0pXG5leHBvcnQgY2xhc3MgU3RyaW5nRWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgQ3JlYXRvck1vZGVsQ29tcG9uZW50PFN0cmluZ0VkaXRvclZpZXdNb2RlbEJhc2U+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHB1YmxpYyBiYXNlTW9kZWwhOiBTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlO1xuICBwcml2YXRlIGp1c3RGb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vZGVsITogYW55O1xuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBjb25zdHJ1Y3RvcihjZHI6IENoYW5nZURldGVjdG9yUmVmLCB2Y3I6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcbiAgICBzdXBlcihjZHIsIHZjcik7XG4gIH1cbiAgcHVibGljIGNyZWF0ZU1vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuYmFzZU1vZGVsID0gbmV3IFN0cmluZ0VkaXRvclZpZXdNb2RlbEJhc2UodGhpcy5sb2NTdHJpbmcsIHRoaXMuY3JlYXRvcik7XG4gICAgdGhpcy5iYXNlTW9kZWwuc2V0TG9jU3RyaW5nKHRoaXMubG9jU3RyaW5nKTtcbiAgICB0aGlzLmJhc2VNb2RlbC5ibHVyRWRpdG9yID0gKCkgPT4ge1xuICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNwZWxsY2hlY2sgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuYmFzZU1vZGVsLmdldEVkaXRvckVsZW1lbnQgPSAoKSA9PiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5iYXNlTW9kZWwuYWZ0ZXJSZW5kZXIoKSk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NTdHJpbmcoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmxvY1N0cjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNyZWF0b3IoKTogU3VydmV5Q3JlYXRvck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5jcmVhdG9yO1xuICB9XG4gIHByb3RlY3RlZCBnZXRNb2RlbCgpOiBTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlTW9kZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb3BlcnRpZXNUb1RyYWNrKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1wiY3JlYXRvclwiLCBcImxvY1N0cmluZ1wiXTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLnBsYWNlaG9sZGVyO1xuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudEVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5jb250ZW50RWRpdGFibGU7XG4gIH1cbiAgcHVibGljIGdldCBjaGFyYWN0ZXJDb3VudGVyKCk6IENoYXJhY3RlckNvdW50ZXIge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5jaGFyYWN0ZXJDb3VudGVyO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0NoYXJhY3RlckNvdW50ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLnNob3dDaGFyYWN0ZXJDb3VudGVyO1xuICB9XG4gIHB1YmxpYyBnZXQgZ2V0Q2hhcmFjdGVyQ291bnRlckNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmdldENoYXJhY3RlckNvdW50ZXJDbGFzcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmNsYXNzTmFtZSh0aGlzLmxvY1N0cmluZy5yZW5kZXJlZEh0bWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgZXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmVycm9yVGV4dDtcbiAgfVxuICBvbkNoYW5nZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIHB1YmxpYyBvbkJsdXIoZXZlbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zcGVsbGNoZWNrID0gZmFsc2U7XG4gICAgKDxhbnk+dGhpcy5sb2NTdHJpbmcpLl9faXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZU1vZGVsLm9uQmx1cihldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmVycm9yVGV4dDtcbiAgfVxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5iYXNlTW9kZWwub25Gb2N1cyhldmVudCk7XG4gICAgdGhpcy5qdXN0Rm9jdXNlZCA9IHRydWU7XG4gIH1cbiAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuYmFzZU1vZGVsLm9uUGFzdGUoZXZlbnQpO1xuICB9XG4gIHB1YmxpYyBkb25lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2VNb2RlbC5kb25lKGV2ZW50KTtcbiAgICAoPGFueT50aGlzLmxvY1N0cmluZykuX19pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZWRpdChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICg8YW55PnRoaXMubG9jU3RyaW5nKS5fX2lzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5iYXNlTW9kZWwub25DbGljayhldmVudCk7XG4gIH1cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmxvY1N0cmluZz8ub25TdHJpbmdDaGFuZ2VkLmFkZCh0aGlzLm9uQ2hhbmdlSGFuZGxlcik7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICgoPGFueT50aGlzLmxvY1N0cmluZykuX19pc0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5iYXNlTW9kZWwuYmx1ckVkaXRvciA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgdGhpcy5iYXNlTW9kZWwuZ2V0RWRpdG9yRWxlbWVudCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgdGhpcy5iYXNlTW9kZWwuZGlzcG9zZSgpO1xuICAgIHRoaXMubG9jU3RyaW5nPy5vblN0cmluZ0NoYW5nZWQucmVtb3ZlKHRoaXMub25DaGFuZ2VIYW5kbGVyKTtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlciB8fCBcImNvbnRlbnQgZWRpdGFibGVcIjtcbiAgfVxufVxuXG5Bbmd1bGFyQ29tcG9uZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckNvbXBvbmVudChlZGl0YWJsZVN0cmluZ1JlbmRlcmVyTmFtZSwgU3RyaW5nRWRpdG9yQ29tcG9uZW50KTsiLCI8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICA8c3BhbiBbY2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzdmMtc3RyaW5nLWVkaXRvcl9fY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN2Yy1zdHJpbmctZWRpdG9yX19ib3JkZXIgc3ZjLXN0cmluZy1lZGl0b3JfX2JvcmRlci0taG92ZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN2Yy1zdHJpbmctZWRpdG9yX19ib3JkZXIgc3ZjLXN0cmluZy1lZGl0b3JfX2JvcmRlci0tZm9jdXNcIj48L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmMtc3RyaW5nLWVkaXRvcl9faW5wdXRcIj5cbiAgICAgICAgICA8c3BhbiByb2xlPVwidGV4dGJveFwiICpuZ0lmPVwiIWxvY1N0cmluZy5oYXNIdG1sXCIgY2xhc3M9XCJzdi1zdHJpbmctZWRpdG9yXCIgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiICAoaW5wdXQpPVwiYmFzZU1vZGVsLm9uSW5wdXQoJGV2ZW50KVwiIChrZXlkb3duKT1cImJhc2VNb2RlbC5vbktleURvd24oJGV2ZW50KVwiIChrZXl1cCk9XCJiYXNlTW9kZWwub25LZXlVcCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uc3RhcnQpPVwiYmFzZU1vZGVsLm9uQ29tcG9zaXRpb25TdGFydCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uZW5kKT1cImJhc2VNb2RlbC5vbkNvbXBvc2l0aW9uRW5kKCRldmVudClcIiAobW91c2V1cCk9XCJiYXNlTW9kZWwub25Nb3VzZVVwKCRldmVudClcIiAoY2xpY2spPVwiZWRpdCgkZXZlbnQpXCIgW3RleHRDb250ZW50XT1cImxvY1N0cmluZy5yZW5kZXJlZEh0bWxcIiBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIiBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiY29udGVudEVkaXRhYmxlXCIgI2NvbnRhaW5lcj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gcm9sZT1cInRleHRib3hcIiAqbmdJZj1cImxvY1N0cmluZy5oYXNIdG1sXCIgY2xhc3M9XCJzdi1zdHJpbmctZWRpdG9yIHN2LXN0cmluZy1lZGl0b3ItLWh0bWxcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiIChrZXlkb3duKT1cImJhc2VNb2RlbC5vbktleURvd24oJGV2ZW50KVwiIChrZXl1cCk9XCJiYXNlTW9kZWwub25LZXlVcCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uc3RhcnQpPVwiYmFzZU1vZGVsLm9uQ29tcG9zaXRpb25TdGFydCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uZW5kKT1cImJhc2VNb2RlbC5vbkNvbXBvc2l0aW9uRW5kKCRldmVudClcIiAobW91c2V1cCk9XCJiYXNlTW9kZWwub25Nb3VzZVVwKCRldmVudClcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0KCRldmVudClcIiBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIiBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiY29udGVudEVkaXRhYmxlXCIgW2lubmVySHRtbF09XCJsb2NTdHJpbmcucmVuZGVyZWRIdG1sIHwgc2FmZUh0bWxcIiAjY29udGFpbmVyPjwvc3Bhbj5cbiAgICAgICAgICA8c3YtbmctY2hhcmFjdGVyLWNvdW50ZXIgKm5nSWY9XCJzaG93Q2hhcmFjdGVyQ291bnRlclwiIFtjb3VudGVyXT1cImNoYXJhY3RlckNvdW50ZXJcIiBbcmVtYWluaW5nQ2hhcmFjdGVyQ291bnRlcl09XCJnZXRDaGFyYWN0ZXJDb3VudGVyQ2xhc3NcIj48L3N2LW5nLWNoYXJhY3Rlci1jb3VudGVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiZXJyb3JUZXh0XCIgY2xhc3M9XCJzdmMtc3RyaW5nLWVkaXRvcl9fZXJyb3JcIj57e2Vycm9yVGV4dH19PC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPiJdfQ==