@handsontable/angular-wrapper
Version:
Best Data Grid for Angular with Spreadsheet Look and Feel.
180 lines • 23.6 kB
JavaScript
import Handsontable from 'handsontable/base';
import { createComponent, } from '@angular/core';
import { CustomEditorPlaceholderComponent } from './custom-editor-placeholder.component';
import { take } from 'rxjs/operators';
/**
* Adapter for BaseEditor from Handsontable.
*/
export class BaseEditorAdapter extends Handsontable.editors.BaseEditor {
/** Reference to the custom editor component. */
_componentRef;
/** Reference to the editor placeholder component. */
_editorPlaceHolderRef;
/** Flag indicating whether the placeholder is ready. */
_isPlaceholderReady = false;
/** Subscription for the finish edit event. */
_finishEditSubscription;
/** Subscription for the cancel edit event. */
_cancelEditSubscription;
/**
* Creates an instance of BaseEditorAdapter.
* @param instance The Handsontable instance.
*/
constructor(instance) {
super(instance);
this.hot.addHook('afterRowResize', this.onAfterRowResize.bind(this));
this.hot.addHook('afterColumnResize', this.onAfterColumnResize.bind(this));
this.hot.addHook('afterDestroy', this.onAfterDestroy.bind(this));
}
/**
* Prepares the editor for editing. Parameters are passed from Handsontable.
* @param row The row index.
* @param column The column index.
* @param prop The property name.
* @param TD The table cell element.
* @param originalValue The original value of the cell.
* @param cellProperties The cell properties.
*/
prepare(row, column, prop, TD, originalValue, cellProperties) {
if (!this.isOpened()) {
super.prepare(row, column, prop, TD, originalValue, cellProperties);
const columnMeta = this.hot.getColumnMeta(column);
if (!this._isPlaceholderReady) {
this.createEditorPlaceholder(columnMeta._environmentInjector);
this._isPlaceholderReady = true;
}
this._componentRef = columnMeta._editorComponentReference;
if (this._finishEditSubscription) {
this._finishEditSubscription.unsubscribe();
this._finishEditSubscription = undefined;
}
if (this._cancelEditSubscription) {
this._cancelEditSubscription.unsubscribe();
this._cancelEditSubscription = undefined;
}
this._finishEditSubscription = this._componentRef.instance.finishEdit
.pipe(take(1))
.subscribe(() => {
this.finishEditing();
});
this._cancelEditSubscription = this._componentRef.instance.cancelEdit
.pipe(take(1))
.subscribe(() => {
this.cancelChanges();
});
}
}
/**
* Closes the editor. This event is triggered by Handsontable.
*/
close() {
if (this.isOpened()) {
this.resetEditorState();
this._editorPlaceHolderRef.changeDetectorRef.detectChanges();
this._editorPlaceHolderRef.instance.detachEditor();
this._componentRef.instance.onClose();
}
}
/**
* Focuses the editor. This event is triggered by Handsontable.
*/
focus() {
this._componentRef.instance.onFocus();
}
/**
* Gets the value from the editor.
* @returns The value from the editor.
*/
getValue() {
return this._componentRef.instance?.getValue();
}
/**
* Opens the editor. This event is triggered by Handsontable.
* When opening, we set the shortcut context to 'editor'.
* This allows the built-in keyboard shortcuts to operate within the editor.
* @param event The event that triggered the opening of the editor.
* @remarks When entering edit mode using double-click, keyboard shortcuts do not work.
*/
open(event) {
this.hot.getShortcutManager().setActiveContextName('editor');
this.applyPropsToEditor();
this._componentRef.instance.onOpen(event);
}
/**
* Sets the value for the custom editor.
* @param newValue The value to set.
*/
setValue(newValue) {
this._componentRef.instance?.setValue(newValue);
this._componentRef.changeDetectorRef.detectChanges();
}
/**
* Applies properties to the custom editor and editor placeholder.
*/
applyPropsToEditor() {
const rect = this.getEditedCellRect();
if (!this.isInFullEditMode()) {
this._componentRef.instance.setValue(null);
}
this._componentRef.setInput('originalValue', this.originalValue);
this._componentRef.setInput('row', this.row);
this._componentRef.setInput('column', this.col);
this._componentRef.setInput('prop', this.prop);
this._componentRef.setInput('cellProperties', this.cellProperties);
this._editorPlaceHolderRef.setInput('top', rect.top);
this._editorPlaceHolderRef.setInput('left', rect.start);
this._editorPlaceHolderRef.setInput('height', rect.height);
this._editorPlaceHolderRef.setInput('width', rect.width);
this._editorPlaceHolderRef.setInput('isVisible', true);
this._editorPlaceHolderRef.setInput('componentRef', this._componentRef);
this._editorPlaceHolderRef.changeDetectorRef.detectChanges();
}
/**
* Creates the editor placeholder and append it to hot rootElement.
* @param injector The environment injector.
*/
createEditorPlaceholder(injector) {
this._editorPlaceHolderRef = createComponent(CustomEditorPlaceholderComponent, {
environmentInjector: injector,
});
this.hot.rootElement.appendChild(this._editorPlaceHolderRef.location.nativeElement);
}
/**
* Handles the after column resize event.
* Helps adjust the editor size to the column size and update its position.
*/
onAfterColumnResize() {
if (this.isOpened()) {
this.applyPropsToEditor();
}
}
/**
* Handles the after row resize event.
* Helps adjust the editor size to the column size and update its position.
*/
onAfterRowResize() {
if (this.isOpened()) {
this.applyPropsToEditor();
}
}
/**
* Handles the after destroy event.
*/
onAfterDestroy() {
this._editorPlaceHolderRef?.destroy();
}
/**
* Resets the editor placeholder state.
* We need to reset the editor placeholder state because we use it
* to store multiple references to the custom editor.
*/
resetEditorState() {
this._editorPlaceHolderRef.setInput('top', undefined);
this._editorPlaceHolderRef.setInput('left', undefined);
this._editorPlaceHolderRef.setInput('height', undefined);
this._editorPlaceHolderRef.setInput('width', undefined);
this._editorPlaceHolderRef.setInput('isVisible', false);
this._editorPlaceHolderRef.setInput('componentRef', undefined);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1lZGl0b3ItYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2VkaXRvci9iYXNlLWVkaXRvci1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFFTCxlQUFlLEdBRWhCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBSXpGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVU7SUFDcEUsZ0RBQWdEO0lBQ3hDLGFBQWEsQ0FBNkM7SUFFbEUscURBQXFEO0lBQzdDLHFCQUFxQixDQUFpRDtJQUU5RSx3REFBd0Q7SUFDaEQsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXBDLDhDQUE4QztJQUN0Qyx1QkFBdUIsQ0FBZ0I7SUFFL0MsOENBQThDO0lBQ3RDLHVCQUF1QixDQUFnQjtJQUUvQzs7O09BR0c7SUFDSCxZQUFZLFFBQTJCO1FBQ3JDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVoQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJ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QUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEhhbmRzb250YWJsZSBmcm9tICdoYW5kc29udGFibGUvYmFzZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIGNyZWF0ZUNvbXBvbmVudCxcbiAgRW52aXJvbm1lbnRJbmplY3Rvcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXN0b21FZGl0b3JQbGFjZWhvbGRlckNvbXBvbmVudCB9IGZyb20gJy4vY3VzdG9tLWVkaXRvci1wbGFjZWhvbGRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29sdW1uU2V0dGluZ3NJbnRlcm5hbCB9IGZyb20gJy4uL21vZGVscy9jb2x1bW4tc2V0dGluZ3MnO1xuaW1wb3J0IHsgSG90Q2VsbEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vaG90LWNlbGwtZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogQWRhcHRlciBmb3IgQmFzZUVkaXRvciBmcm9tIEhhbmRzb250YWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VFZGl0b3JBZGFwdGVyIGV4dGVuZHMgSGFuZHNvbnRhYmxlLmVkaXRvcnMuQmFzZUVkaXRvciB7XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGN1c3RvbSBlZGl0b3IgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9jb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8SG90Q2VsbEVkaXRvckNvbXBvbmVudDxhbnk+PjtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9lZGl0b3JQbGFjZUhvbGRlclJlZjogQ29tcG9uZW50UmVmPEN1c3RvbUVkaXRvclBsYWNlaG9sZGVyQ29tcG9uZW50PjtcblxuICAvKiogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIGlzIHJlYWR5LiAqL1xuICBwcml2YXRlIF9pc1BsYWNlaG9sZGVyUmVhZHkgPSBmYWxzZTtcblxuICAvKiogU3Vic2NyaXB0aW9uIGZvciB0aGUgZmluaXNoIGVkaXQgZXZlbnQuICovXG4gIHByaXZhdGUgX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqIFN1YnNjcmlwdGlvbiBmb3IgdGhlIGNhbmNlbCBlZGl0IGV2ZW50LiAqL1xuICBwcml2YXRlIF9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJhc2VFZGl0b3JBZGFwdGVyLlxuICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEhhbmRzb250YWJsZSBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlOiBIYW5kc29udGFibGUuQ29yZSkge1xuICAgIHN1cGVyKGluc3RhbmNlKTtcblxuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyUm93UmVzaXplJywgdGhpcy5vbkFmdGVyUm93UmVzaXplLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyQ29sdW1uUmVzaXplJywgdGhpcy5vbkFmdGVyQ29sdW1uUmVzaXplLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyRGVzdHJveScsIHRoaXMub25BZnRlckRlc3Ryb3kuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgdGhlIGVkaXRvciBmb3IgZWRpdGluZy4gUGFyYW1ldGVycyBhcmUgcGFzc2VkIGZyb20gSGFuZHNvbnRhYmxlLlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgaW5kZXguXG4gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBpbmRleC5cbiAgICogQHBhcmFtIHByb3AgVGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSBURCBUaGUgdGFibGUgY2VsbCBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3JpZ2luYWxWYWx1ZSBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGNlbGwuXG4gICAqIEBwYXJhbSBjZWxsUHJvcGVydGllcyBUaGUgY2VsbCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZShcbiAgICByb3c6IG51bWJlcixcbiAgICBjb2x1bW46IG51bWJlcixcbiAgICBwcm9wOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgVEQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50LFxuICAgIG9yaWdpbmFsVmFsdWU6IGFueSxcbiAgICBjZWxsUHJvcGVydGllczogSGFuZHNvbnRhYmxlLkNlbGxQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICBzdXBlci5wcmVwYXJlKHJvdywgY29sdW1uLCBwcm9wLCBURCwgb3JpZ2luYWxWYWx1ZSwgY2VsbFByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgY29sdW1uTWV0YTogQ29sdW1uU2V0dGluZ3NJbnRlcm5hbCA9IHRoaXMuaG90LmdldENvbHVtbk1ldGEoXG4gICAgICAgIGNvbHVtblxuICAgICAgKSBhcyBDb2x1bW5TZXR0aW5nc0ludGVybmFsO1xuXG4gICAgICBpZiAoIXRoaXMuX2lzUGxhY2Vob2xkZXJSZWFkeSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvclBsYWNlaG9sZGVyKGNvbHVtbk1ldGEuX2Vudmlyb25tZW50SW5qZWN0b3IpO1xuICAgICAgICB0aGlzLl9pc1BsYWNlaG9sZGVyUmVhZHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBjb2x1bW5NZXRhLl9lZGl0b3JDb21wb25lbnRSZWZlcmVuY2U7XG5cbiAgICAgIGlmICh0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZmluaXNoRWRpdFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsRWRpdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaEVkaXRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maW5pc2hFZGl0aW5nKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmNhbmNlbEVkaXRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYW5jZWxDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5yZXNldEVkaXRvclN0YXRlKCk7XG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5pbnN0YW5jZS5kZXRhY2hFZGl0b3IoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5vbkNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uRm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IuXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U/LmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKiBXaGVuIG9wZW5pbmcsIHdlIHNldCB0aGUgc2hvcnRjdXQgY29udGV4dCB0byAnZWRpdG9yJy5cbiAgICogVGhpcyBhbGxvd3MgdGhlIGJ1aWx0LWluIGtleWJvYXJkIHNob3J0Y3V0cyB0byBvcGVyYXRlIHdpdGhpbiB0aGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBvcGVuaW5nIG9mIHRoZSBlZGl0b3IuXG4gICAqIEByZW1hcmtzIFdoZW4gZW50ZXJpbmcgZWRpdCBtb2RlIHVzaW5nIGRvdWJsZS1jbGljaywga2V5Ym9hcmQgc2hvcnRjdXRzIGRvIG5vdCB3b3JrLlxuICAgKi9cbiAgb3BlbihldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ob3QuZ2V0U2hvcnRjdXRNYW5hZ2VyKCkuc2V0QWN0aXZlQ29udGV4dE5hbWUoJ2VkaXRvcicpO1xuICAgIHRoaXMuYXBwbHlQcm9wc1RvRWRpdG9yKCk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uT3BlbihldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBjdXN0b20gZWRpdG9yLlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFZhbHVlKG5ld1ZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlPy5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHByb3BlcnRpZXMgdG8gdGhlIGN1c3RvbSBlZGl0b3IgYW5kIGVkaXRvciBwbGFjZWhvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlQcm9wc1RvRWRpdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldEVkaXRlZENlbGxSZWN0KCk7XG5cbiAgICBpZiAoIXRoaXMuaXNJbkZ1bGxFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcG9uZW50UmVmLnNldElucHV0KCdvcmlnaW5hbFZhbHVlJywgdGhpcy5vcmlnaW5hbFZhbHVlKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3JvdycsIHRoaXMucm93KTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbHVtbicsIHRoaXMuY29sKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3Byb3AnLCB0aGlzLnByb3ApO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgnY2VsbFByb3BlcnRpZXMnLCB0aGlzLmNlbGxQcm9wZXJ0aWVzKTtcblxuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd0b3AnLCByZWN0LnRvcCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2xlZnQnLCByZWN0LnN0YXJ0KTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdpc1Zpc2libGUnLCB0cnVlKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnY29tcG9uZW50UmVmJywgdGhpcy5fY29tcG9uZW50UmVmKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIGFuZCBhcHBlbmQgaXQgdG8gaG90IHJvb3RFbGVtZW50LlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgVGhlIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0b3JQbGFjZWhvbGRlcihpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3Rvcik6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmID0gY3JlYXRlQ29tcG9uZW50KFxuICAgICAgQ3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGluamVjdG9yIGFzIEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaG90LnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKFxuICAgICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgY29sdW1uIHJlc2l6ZSBldmVudC5cbiAgICogSGVscHMgYWRqdXN0IHRoZSBlZGl0b3Igc2l6ZSB0byB0aGUgY29sdW1uIHNpemUgYW5kIHVwZGF0ZSBpdHMgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJDb2x1bW5SZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgcm93IHJlc2l6ZSBldmVudC5cbiAgICogSGVscHMgYWRqdXN0IHRoZSBlZGl0b3Igc2l6ZSB0byB0aGUgY29sdW1uIHNpemUgYW5kIHVwZGF0ZSBpdHMgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJSb3dSZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgZGVzdHJveSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlckRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWY/LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVkaXRvciBwbGFjZWhvbGRlciBzdGF0ZS5cbiAgICogV2UgbmVlZCB0byByZXNldCB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIHN0YXRlIGJlY2F1c2Ugd2UgdXNlIGl0XG4gICAqIHRvIHN0b3JlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIGN1c3RvbSBlZGl0b3IuXG4gICAqL1xuICBwcml2YXRlIHJlc2V0RWRpdG9yU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3RvcCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2xlZnQnLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdoZWlnaHQnLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd3aWR0aCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2lzVmlzaWJsZScsIGZhbHNlKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnY29tcG9uZW50UmVmJywgdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19