@nomadreservations/ngx-codemirror
Version:
`@nomadreservations/ngx-codemirror` [CodeMirror (5.x)](http://codemirror.net/) code editor in your Angular application. Server Side Rendering(SSR) compliant and @angular 6+ Ready.
311 lines (301 loc) • 22.8 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('@angular/forms')) :
typeof define === 'function' && define.amd ? define('@nomadreservations/ngx-codemirror', ['exports', '@angular/core', 'rxjs', '@angular/forms'], factory) :
(factory((global.nomadreservations = global.nomadreservations || {}, global.nomadreservations['ngx-codemirror'] = {}),global.ng.core,global.rxjs,global.ng.forms));
}(this, (function (exports,core,rxjs,forms) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* Main Codemirror import, utilizing window's existence to determine if we're server side or not.
*/
var /** @type {?} */ CodeMirror = typeof window !== 'undefined' && typeof window.navigator !== 'undefined'
? require('codemirror')
: undefined;
/**
* Initialize Event for CodeMirror.Editor instance
*
* Holds a referencable pointer to the code mirror instance for users.
*/
var CodemirrorService = (function () {
function CodemirrorService() {
/**
* Codemirror instance subject
*
* Emits a refrence to the initialized CodeMirror.Editor once it's insantiated.
*/
this.instance$ = new rxjs.ReplaySubject();
}
CodemirrorService.decorators = [
{ type: core.Injectable },
];
return CodemirrorService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* Main Codemirror import, utilizing window's existence to determine if we're server side or not.
*/
var /** @type {?} */ CodeMirror$1 = typeof window !== 'undefined' && typeof window.navigator !== 'undefined'
? require('codemirror')
: undefined;
/**
* CodeMirror component
*
* **Usage** :
* ```html
* <ngx-codemirror [(ngModel)]="data" [config]="{...}" (init)="onInit" (blur)="onBlur" (focus)="onFocus" ...></ngx-codemirror>
* ```
*/
var CodemirrorComponent = (function () {
/**
* Constructor
*
* @param _zone NgZone injected for Initialization
*/
function CodemirrorComponent(_codeMirror, _zone) {
this._codeMirror = _codeMirror;
this._zone = _zone;
/**
* change output event, pass through from codemirror
*/
this.change = new core.EventEmitter();
/**
* focus output event, pass through from codemirror
*/
this.focus = new core.EventEmitter();
/**
* blur output event, pass through from codemirror
*/
this.blur = new core.EventEmitter();
/**
* cursorActivity output event, pass through from codemirror
*/
this.cursorActivity = new core.EventEmitter();
/**
* Value storage
*/
this._value = '';
}
Object.defineProperty(CodemirrorComponent.prototype, "value", {
/** Implements ControlValueAccessor.value */
get: /**
* Implements ControlValueAccessor.value
* @return {?}
*/ function () { return this._value; },
set: /**
* Implements ControlValueAccessor.value
* @param {?} v
* @return {?}
*/ function (v) {
if (v !== this._value) {
this._value = v;
this.onChange(v);
}
},
enumerable: true,
configurable: true
});
/**
* On component destroy
* @return {?}
*/
CodemirrorComponent.prototype.ngOnDestroy = /**
* On component destroy
* @return {?}
*/
function () {
};
/**
* On component view init
* @return {?}
*/
CodemirrorComponent.prototype.ngAfterViewInit = /**
* On component view init
* @return {?}
*/
function () {
this.config = this.config || {};
this.codemirrorInit(this.config);
};
/**
* Value update process
* @param {?} value
* @return {?}
*/
CodemirrorComponent.prototype.updateValue = /**
* Value update process
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
this.onTouched();
this.change.emit(value);
};
/**
* Implements ControlValueAccessor
* @param {?} value
* @return {?}
*/
CodemirrorComponent.prototype.writeValue = /**
* Implements ControlValueAccessor
* @param {?} value
* @return {?}
*/
function (value) {
this._value = value || '';
if (this._instance) {
this._instance.setValue(this._value);
}
};
/**
* Change event trigger
* @param {?} _
* @return {?}
*/
CodemirrorComponent.prototype.onChange = /**
* Change event trigger
* @param {?} _
* @return {?}
*/
function (_) { };
/**
* Dirty/touched event trigger
* @return {?}
*/
CodemirrorComponent.prototype.onTouched = /**
* Dirty/touched event trigger
* @return {?}
*/
function () { };
/**
* Implements ControlValueAccessor.registerOnChange
* @param {?} fn
* @return {?}
*/
CodemirrorComponent.prototype.registerOnChange = /**
* Implements ControlValueAccessor.registerOnChange
* @param {?} fn
* @return {?}
*/
function (fn) { this.onChange = fn; };
/**
* Implements ControlValueAccessor.registerOnTouched
* @param {?} fn
* @return {?}
*/
CodemirrorComponent.prototype.registerOnTouched = /**
* Implements ControlValueAccessor.registerOnTouched
* @param {?} fn
* @return {?}
*/
function (fn) { this.onTouched = fn; };
/**
* Initialize codemirror
* @param {?} config
* @return {?}
*/
CodemirrorComponent.prototype.codemirrorInit = /**
* Initialize codemirror
* @param {?} config
* @return {?}
*/
function (config) {
var _this = this;
if (CodeMirror$1) {
this._zone.runOutsideAngular(function () {
_this._instance = CodeMirror$1.fromTextArea(_this.host.nativeElement, config);
_this._instance.setValue(_this._value);
});
this._instance.on('change', function () {
_this.updateValue(_this._instance.getValue());
});
this._instance.on('focus', function (instance, event) {
_this.focus.emit({ instance: instance, event: event });
});
this._instance.on('cursorActivity', function (instance) {
_this.cursorActivity.emit({ instance: instance });
});
this._instance.on('blur', function (instance, event) {
_this.blur.emit({ instance: instance, event: event });
});
this._codeMirror.instance$.next(this._instance);
}
};
CodemirrorComponent.decorators = [
{ type: core.Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'ngx-codemirror',
providers: [
{
provide: forms.NG_VALUE_ACCESSOR,
// tslint:disable-next-line:no-forward-ref
useExisting: core.forwardRef(function () { return CodemirrorComponent; }),
multi: true
}
],
template: '<textarea #host></textarea>',
},] },
];
/** @nocollapse */
CodemirrorComponent.ctorParameters = function () {
return [
{ type: CodemirrorService, },
{ type: core.NgZone, },
];
};
CodemirrorComponent.propDecorators = {
"config": [{ type: core.Input },],
"change": [{ type: core.Output },],
"focus": [{ type: core.Output },],
"blur": [{ type: core.Output },],
"cursorActivity": [{ type: core.Output },],
"host": [{ type: core.ViewChild, args: ['host',] },],
"value": [{ type: core.Input },],
};
return CodemirrorComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* \@angular 5.x+ SSR ready CodeMirror wrapping module.
*/
var CodemirrorModule = (function () {
function CodemirrorModule() {
}
CodemirrorModule.decorators = [
{ type: core.NgModule, args: [{
providers: [
CodemirrorService
],
declarations: [CodemirrorComponent],
exports: [CodemirrorComponent],
entryComponents: [CodemirrorComponent]
},] },
];
return CodemirrorModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.CodemirrorComponent = CodemirrorComponent;
exports.CodemirrorModule = CodemirrorModule;
exports.CodemirrorService = CodemirrorService;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9tYWRyZXNlcnZhdGlvbnMtbmd4LWNvZGVtaXJyb3IudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9Abm9tYWRyZXNlcnZhdGlvbnMvbmd4LWNvZGVtaXJyb3Ivbmd4LWNvZGVtaXJyb3IvY29kZW1pcnJvci5zZXJ2aWNlLnRzIiwibmc6Ly9Abm9tYWRyZXNlcnZhdGlvbnMvbmd4LWNvZGVtaXJyb3Ivbmd4LWNvZGVtaXJyb3IvY29kZW1pcnJvci5jb21wb25lbnQudHMiLCJuZzovL0Bub21hZHJlc2VydmF0aW9ucy9uZ3gtY29kZW1pcnJvci9uZ3gtY29kZW1pcnJvci9jb2RlbWlycm9yLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ2NvZGVtaXJyb3InO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIE1haW4gQ29kZW1pcnJvciBpbXBvcnQsIHV0aWxpemluZyB3aW5kb3cncyBleGlzdGVuY2UgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIHNlcnZlciBzaWRlIG9yIG5vdC5cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmNvbnN0IENvZGVNaXJyb3I6IGFueSA9XG4gIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJ1xuICA/IHJlcXVpcmUoJ2NvZGVtaXJyb3InKVxuICA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBJbml0aWFsaXplIEV2ZW50IGZvciBDb2RlTWlycm9yLkVkaXRvciBpbnN0YW5jZVxuICpcbiAqIEhvbGRzIGEgcmVmZXJlbmNhYmxlIHBvaW50ZXIgdG8gdGhlIGNvZGUgbWlycm9yIGluc3RhbmNlIGZvciB1c2Vycy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIENvZGVtaXJyb3IgaW5zdGFuY2Ugc3ViamVjdFxuICAgKlxuICAgKiBFbWl0cyBhIHJlZnJlbmNlIHRvIHRoZSBpbml0aWFsaXplZCBDb2RlTWlycm9yLkVkaXRvciBvbmNlIGl0J3MgaW5zYW50aWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgaW5zdGFuY2UkOiBSZXBsYXlTdWJqZWN0PEVkaXRvcj4gPSBuZXcgUmVwbGF5U3ViamVjdDxFZGl0b3I+KCk7XG59XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnY29kZW1pcnJvcic7XG5pbXBvcnQgeyBDb2RlbWlycm9yU2VydmljZSB9IGZyb20gJy4vY29kZW1pcnJvci5zZXJ2aWNlJztcblxuLyoqXG4gKiBNYWluIENvZGVtaXJyb3IgaW1wb3J0LCB1dGlsaXppbmcgd2luZG93J3MgZXhpc3RlbmNlIHRvIGRldGVybWluZSBpZiB3ZSdyZSBzZXJ2ZXIgc2lkZSBvciBub3QuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBDb2RlTWlycm9yOiBhbnkgPVxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgPyByZXF1aXJlKCdjb2RlbWlycm9yJylcbiAgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ29kZU1pcnJvciBjb21wb25lbnRcbiAqXG4gKiAqKlVzYWdlKiogOlxuICogYGBgaHRtbFxuICogICA8bmd4LWNvZGVtaXJyb3IgWyhuZ01vZGVsKV09XCJkYXRhXCIgW2NvbmZpZ109XCJ7Li4ufVwiIChpbml0KT1cIm9uSW5pdFwiIChibHVyKT1cIm9uQmx1clwiIChmb2N1cyk9XCJvbkZvY3VzXCIgLi4uPjwvbmd4LWNvZGVtaXJyb3I+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICduZ3gtY29kZW1pcnJvcicsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb2RlbWlycm9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogJzx0ZXh0YXJlYSAjaG9zdD48L3RleHRhcmVhPicsXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKiBDb2RlbWlycm9yIGNvbmZpZyBvYmplY3QgKHNlZSBbZGV0YWlsc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb25maWcpKSAqL1xuICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBhbnk7XG4gIC8qKiBjaGFuZ2Ugb3V0cHV0IGV2ZW50LCBwYXNzIHRocm91Z2ggZnJvbSBjb2RlbWlycm9yICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogZm9jdXMgb3V0cHV0IGV2ZW50LCBwYXNzIHRocm91Z2ggZnJvbSBjb2RlbWlycm9yICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBibHVyIG91dHB1dCBldmVudCwgcGFzcyB0aHJvdWdoIGZyb20gY29kZW1pcnJvciAqL1xuICBAT3V0cHV0KCkgcHVibGljIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBjdXJzb3JBY3Rpdml0eSBvdXRwdXQgZXZlbnQsIHBhc3MgdGhyb3VnaCBmcm9tIGNvZGVtaXJyb3IgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBjdXJzb3JBY3Rpdml0eSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIEhvc3QgZWxlbWVudCBmb3IgY29kZW1pcnJvciB0byBhdHRhY2ggdG8gKi9cbiAgQFZpZXdDaGlsZCgnaG9zdCcpIHB1YmxpYyBob3N0OiBFbGVtZW50UmVmO1xuXG4gIC8qKiBDdXJyZW50IGVkaXRvciBpbnN0YW5jZSAqL1xuICBwcml2YXRlIF9pbnN0YW5jZTogYW55O1xuXG4gIC8qKiBWYWx1ZSBzdG9yYWdlICovXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqXG4gICAqIEBwYXJhbSBfem9uZSBOZ1pvbmUgaW5qZWN0ZWQgZm9yIEluaXRpYWxpemF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jb2RlTWlycm9yOiBDb2RlbWlycm9yU2VydmljZSxcbiAgICBwcml2YXRlIF96b25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIC8qKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLnZhbHVlICovXG4gIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG5cbiAgLyoqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IudmFsdWUgKi9cbiAgQElucHV0KCkgc2V0IHZhbHVlKHYpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2Uodik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIGNvbXBvbmVudCBkZXN0cm95XG4gICAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgdmlldyBpbml0XG4gICAqL1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5jb25maWcgfHwge307XG4gICAgdGhpcy5jb2RlbWlycm9ySW5pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsdWUgdXBkYXRlIHByb2Nlc3NcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvclxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZS5zZXRWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoYW5nZSBldmVudCB0cmlnZ2VyICovXG4gIHB1YmxpYyAgb25DaGFuZ2UoXzogYW55KSB7fVxuICAvKiogRGlydHkvdG91Y2hlZCBldmVudCB0cmlnZ2VyICovXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7fVxuICAvKiogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uQ2hhbmdlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIC8qKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBjb2RlbWlycm9yXG4gICAqL1xuICBwcml2YXRlIGNvZGVtaXJyb3JJbml0KGNvbmZpZzogYW55KSB7XG4gICAgaWYgKENvZGVNaXJyb3IpIHtcbiAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB0aGlzLl9pbnN0YW5jZS5zZXRWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faW5zdGFuY2Uub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLl9pbnN0YW5jZS5nZXRWYWx1ZSgpKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZS5vbignZm9jdXMnLCAoaW5zdGFuY2U6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZvY3VzLmVtaXQoe2luc3RhbmNlLCBldmVudH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2luc3RhbmNlLm9uKCdjdXJzb3JBY3Rpdml0eScsIChpbnN0YW5jZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkuZW1pdCh7aW5zdGFuY2V9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZS5vbignYmx1cicsIChpbnN0YW5jZTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYmx1ci5lbWl0KHtpbnN0YW5jZSwgZXZlbnR9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jb2RlTWlycm9yLmluc3RhbmNlJC5uZXh0KHRoaXMuX2luc3RhbmNlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvZGVtaXJyb3JDb21wb25lbnQgfSBmcm9tICcuL2NvZGVtaXJyb3IuY29tcG9uZW50JztcbmltcG9ydCB7IENvZGVtaXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi9jb2RlbWlycm9yLnNlcnZpY2UnO1xuXG4vKipcbiAqIEBhbmd1bGFyIDUueCsgU1NSIHJlYWR5IENvZGVNaXJyb3Igd3JhcHBpbmcgbW9kdWxlLlxuICovXG5ATmdNb2R1bGUoe1xuICBwcm92aWRlcnM6IFtcbiAgICBDb2RlbWlycm9yU2VydmljZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtDb2RlbWlycm9yQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0NvZGVtaXJyb3JDb21wb25lbnRdLFxuICBlbnRyeUNvbXBvbmVudHM6IFtDb2RlbWlycm9yQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBDb2RlbWlycm9yTW9kdWxlIHt9XG4iXSwibmFtZXMiOlsiUmVwbGF5U3ViamVjdCIsIkluamVjdGFibGUiLCJDb2RlTWlycm9yIiwiRXZlbnRFbWl0dGVyIiwiQ29tcG9uZW50IiwiTkdfVkFMVUVfQUNDRVNTT1IiLCJmb3J3YXJkUmVmIiwiTmdab25lIiwiSW5wdXQiLCJPdXRwdXQiLCJWaWV3Q2hpbGQiLCJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUVBOzs7SUFPQSxxQkFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxXQUFXO1VBQ3RFLE9BQU8sQ0FBQyxZQUFZLENBQUM7VUFDckIsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7OzZCQWM4QixJ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