UNPKG

@maaxgr/ang-jsoneditor

Version:

This is a fork of mariohmol's [ang-jsoneditor](https://github.com/mariohmol/ang-jsoneditor) with support for Angular 11, 12, 13 and 14. This repository will probably become stale, when the original will be actively maintained again.

223 lines 23.2 kB
import { Component, Input, ViewChild, Output, EventEmitter, forwardRef, ChangeDetectionStrategy } from '@angular/core'; import JSONEditor from "jsoneditor"; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { JsonEditorOptions } from './jsoneditoroptions'; import * as i0 from "@angular/core"; export class JsonEditorComponent { constructor() { this.id = 'angjsoneditor' + Math.floor(Math.random() * 1000000); this.disabled = false; this.isFocused = false; this.optionsChanged = false; this._data = {}; this.options = new JsonEditorOptions(); this.debug = false; this.change = new EventEmitter(); this.jsonChange = new EventEmitter(); // Implemented as part of ControlValueAccessor. this.onTouched = () => { }; // Implemented as part of ControlValueAccessor. this.onChangeModel = (e) => { }; } set data(value) { this._data = value; if (this.editor) { this.editor.destroy(); this.ngOnInit(); } } ngOnInit() { let optionsBefore = this.options; if (!this.optionsChanged && this.editor) { optionsBefore = this.editor.options; } if (!this.options.onChangeJSON && this.jsonChange) { this.options.onChangeJSON = this.onChangeJSON.bind(this); } if (!this.options.onChange && this.change) { this.options.onChange = this.onChange.bind(this); } const optionsCopy = Object.assign({}, optionsBefore); // expandAll is an option only supported by ang-jsoneditor and not by the the original jsoneditor. delete optionsCopy.expandAll; if (this.debug) { console.log(optionsCopy, this._data); } if (!this.jsonEditorContainer.nativeElement) { console.error(`Can't find the ElementRef reference for jsoneditor)`); } if (optionsCopy.mode === 'text' || optionsCopy.mode === 'code') { optionsCopy.onChangeJSON = null; } this.editor = new JSONEditor(this.jsonEditorContainer.nativeElement, optionsCopy, this._data); if (this.options.expandAll) { this.editor.expandAll(); } } ngOnDestroy() { this.destroy(); } /** * ngModel * ControlValueAccessor */ // ControlValueAccessor implementation writeValue(value) { this.data = value; } // Implemented as part of ControlValueAccessor registerOnChange(fn) { this.onChangeModel = fn; } // Implemented as part of ControlValueAccessor. registerOnTouched(fn) { this.onTouched = fn; } // Implemented as part of ControlValueAccessor. setDisabledState(isDisabled) { this.disabled = isDisabled; } onChange(e) { if (this.editor) { try { const json = this.editor.get(); this.onChangeModel(json); this.change.emit(json); } catch (e) { if (this.debug) { console.log(e); } } } } onChangeJSON(e) { if (this.editor) { try { this.jsonChange.emit(this.editor.get()); } catch (e) { if (this.debug) { console.log(e); } } } } /** * JSON EDITOR FUNCTIONS */ collapseAll() { this.editor.collapseAll(); } expandAll() { this.editor.expandAll(); } focus() { this.editor.focus(); } get() { return this.editor.get(); } getMode() { return this.editor.getMode(); } getName() { return this.editor.getName(); } getText() { return this.editor.getText(); } set(json) { this.editor.set(json); } setMode(mode) { this.editor.setMode(mode); } setName(name) { this.editor.setName(name); } setSelection(start, end) { this.editor.setSelection(start, end); } getSelection() { return this.editor.getSelection(); } getValidateSchema() { return this.editor.validateSchema; } setSchema(schema, schemaRefs) { this.editor.setSchema(schema, schemaRefs); } search(query) { this.editor.search(query); } setOptions(newOptions) { if (this.editor) { this.editor.destroy(); } this.optionsChanged = true; this.options = newOptions; this.ngOnInit(); } update(json) { this.editor.update(json); } destroy() { this.editor?.destroy(); } getEditor() { return this.editor; } isValidJson() { try { JSON.parse(this.getText()); return true; } catch (e) { return false; } } } JsonEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: JsonEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); JsonEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: JsonEditorComponent, selector: "json-editor", inputs: { options: "options", data: "data", debug: "debug" }, outputs: { change: "change", jsonChange: "jsonChange" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => JsonEditorComponent), multi: true } ], viewQueries: [{ propertyName: "jsonEditorContainer", first: true, predicate: ["jsonEditorContainer"], descendants: true, static: true }], ngImport: i0, template: `<div [id]="id" #jsonEditorContainer></div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: JsonEditorComponent, decorators: [{ type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'json-editor', template: `<div [id]="id" #jsonEditorContainer></div>`, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => JsonEditorComponent), multi: true } ], preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return []; }, propDecorators: { jsonEditorContainer: [{ type: ViewChild, args: ['jsonEditorContainer', { static: true }] }], options: [{ type: Input }], data: [{ type: Input, args: ['data'] }], debug: [{ type: Input }], change: [{ type: Output }], jsonChange: [{ type: Output }] } }); export { JsonEditorOptions }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmctanNvbmVkaXRvci9zcmMvbGliL2pzb25lZGl0b3IvanNvbmVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBYyxLQUFLLEVBQXFCLFNBQVMsRUFDMUQsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQzFELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUE4QyxNQUFNLHFCQUFxQixDQUFDOztBQWlCcEcsTUFBTSxPQUFPLG1CQUFtQjtJQTRCOUI7UUExQk8sT0FBRSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNsRSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFWCxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUl0QixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBRWxCLFlBQU8sR0FBc0IsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBU3JELFVBQUssR0FBRyxLQUFLLENBQUM7UUFHdkIsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXBELGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQXFFeEQsK0NBQStDO1FBQ3ZDLGNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDekIsQ0FBQyxDQUFDO1FBRUYsK0NBQStDO1FBQ3ZDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUM5QixDQUFDLENBQUM7SUF4RUYsQ0FB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TUFBTTtnQkFRSixLQUFLO3NCQUFiLEtBQUs7Z0JBR04sTUFBTTtzQkFETCxNQUFNO2dCQUdQLFVBQVU7c0JBRFQsTUFBTTs7QUF3TVQsT0FBTyxFQUFFLGlCQUFpQixFQUE4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uRGVzdHJveSwgVmlld0NoaWxkLFxyXG4gIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgSlNPTkVkaXRvciBmcm9tIFwianNvbmVkaXRvclwiO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEpzb25FZGl0b3JPcHRpb25zLCBKc29uRWRpdG9yTW9kZSwgSnNvbkVkaXRvclRyZWVOb2RlLCBJRXJyb3IgfSBmcm9tICcuL2pzb25lZGl0b3JvcHRpb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2pzb24tZWRpdG9yJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgW2lkXT1cImlkXCIgI2pzb25FZGl0b3JDb250YWluZXI+PC9kaXY+YCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEpzb25FZGl0b3JDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF0sXHJcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBKc29uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGVkaXRvcjogYW55O1xyXG4gIHB1YmxpYyBpZCA9ICdhbmdqc29uZWRpdG9yJyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApO1xyXG4gIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgaXNGb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBvcHRpb25zQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdqc29uRWRpdG9yQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkganNvbkVkaXRvckNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBfZGF0YTogT2JqZWN0ID0ge307XHJcblxyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IEpzb25FZGl0b3JPcHRpb25zID0gbmV3IEpzb25FZGl0b3JPcHRpb25zKCk7XHJcbiAgQElucHV0KCdkYXRhJylcclxuICBzZXQgZGF0YSh2YWx1ZTogT2JqZWN0KSB7XHJcbiAgICB0aGlzLl9kYXRhID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcclxuICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KClcclxuICBqc29uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGxldCBvcHRpb25zQmVmb3JlID0gdGhpcy5vcHRpb25zO1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDaGFuZ2VkICYmIHRoaXMuZWRpdG9yKSB7XHJcbiAgICAgIG9wdGlvbnNCZWZvcmUgPSB0aGlzLmVkaXRvci5vcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zLm9uQ2hhbmdlSlNPTiAmJiB0aGlzLmpzb25DaGFuZ2UpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLm9uQ2hhbmdlSlNPTiA9IHRoaXMub25DaGFuZ2VKU09OLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5vbkNoYW5nZSAmJiB0aGlzLmNoYW5nZSkge1xyXG4gICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcHRpb25zQ29weSA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnNCZWZvcmUpO1xyXG5cclxuICAgIC8vIGV4cGFuZEFsbCBpcyBhbiBvcHRpb24gb25seSBzdXBwb3J0ZWQgYnkgYW5nLWpzb25lZGl0b3IgYW5kIG5vdCBieSB0aGUgdGhlIG9yaWdpbmFsIGpzb25lZGl0b3IuXHJcbiAgICBkZWxldGUgb3B0aW9uc0NvcHkuZXhwYW5kQWxsO1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2cob3B0aW9uc0NvcHksIHRoaXMuX2RhdGEpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmpzb25FZGl0b3JDb250YWluZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBDYW4ndCBmaW5kIHRoZSBFbGVtZW50UmVmIHJlZmVyZW5jZSBmb3IganNvbmVkaXRvcilgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9uc0NvcHkubW9kZSA9PT0gJ3RleHQnIHx8IG9wdGlvbnNDb3B5Lm1vZGUgPT09ICdjb2RlJykge1xyXG4gICAgICBvcHRpb25zQ29weS5vbkNoYW5nZUpTT04gPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lZGl0b3IgPSBuZXcgSlNPTkVkaXRvcih0aGlzLmpzb25FZGl0b3JDb250YWluZXIubmF0aXZlRWxlbWVudCwgb3B0aW9uc0NvcHksIHRoaXMuX2RhdGEpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXhwYW5kQWxsKSB7XHJcbiAgICAgIHRoaXMuZWRpdG9yLmV4cGFuZEFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBuZ01vZGVsXHJcbiAgICogQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICAgKi9cclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcclxuICAgIHRoaXMub25DaGFuZ2VNb2RlbCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbikge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7XHJcbiAgfTtcclxuXHJcbiAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cclxuICBwcml2YXRlIG9uQ2hhbmdlTW9kZWwgPSAoZSkgPT4ge1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBvbkNoYW5nZShlKSB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBqc29uID0gdGhpcy5lZGl0b3IuZ2V0KCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZU1vZGVsKGpzb24pO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoanNvbik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VKU09OKGUpIHtcclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuanNvbkNoYW5nZS5lbWl0KHRoaXMuZWRpdG9yLmdldCgpKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBKU09OIEVESVRPUiBGVU5DVElPTlNcclxuICAgKi9cclxuXHJcbiAgcHVibGljIGNvbGxhcHNlQWxsKCkge1xyXG4gICAgdGhpcy5lZGl0b3IuY29sbGFwc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBhbmRBbGwoKSB7XHJcbiAgICB0aGlzLmVkaXRvci5leHBhbmRBbGwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1cygpIHtcclxuICAgIHRoaXMuZWRpdG9yLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0KCk6IEpTT04ge1xyXG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1vZGUoKTogSnNvbkVkaXRvck1vZGUge1xyXG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldE1vZGUoKSBhcyBKc29uRWRpdG9yTW9kZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZ2V0TmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvci5nZXRUZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0KGpzb246IEpTT04pIHtcclxuICAgIHRoaXMuZWRpdG9yLnNldChqc29uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRNb2RlKG1vZGU6IEpzb25FZGl0b3JNb2RlKSB7XHJcbiAgICB0aGlzLmVkaXRvci5zZXRNb2RlKG1vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmVkaXRvci5zZXROYW1lKG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlbGVjdGlvbihzdGFydCwgZW5kKSB7XHJcbiAgICB0aGlzLmVkaXRvci5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0aW9uKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VmFsaWRhdGVTY2hlbWEoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvci52YWxpZGF0ZVNjaGVtYTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTY2hlbWEoc2NoZW1hOiBhbnksIHNjaGVtYVJlZnM6IGFueSkge1xyXG4gICAgdGhpcy5lZGl0b3Iuc2V0U2NoZW1hKHNjaGVtYSwgc2NoZW1hUmVmcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZWRpdG9yLnNlYXJjaChxdWVyeSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0T3B0aW9ucyhuZXdPcHRpb25zOiBKc29uRWRpdG9yT3B0aW9ucykge1xyXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zID0gbmV3T3B0aW9ucztcclxuICAgIHRoaXMubmdPbkluaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGUoanNvbjogSlNPTikge1xyXG4gICAgdGhpcy5lZGl0b3IudXBkYXRlKGpzb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmVkaXRvcj8uZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVkaXRvcigpe1xyXG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVmFsaWRKc29uKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgSlNPTi5wYXJzZSh0aGlzLmdldFRleHQoKSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgeyBKc29uRWRpdG9yT3B0aW9ucywgSnNvbkVkaXRvck1vZGUsIEpzb25FZGl0b3JUcmVlTm9kZSwgSUVycm9yIH07XHJcbiJdfQ==