ngx-edu-components
Version:
Set of extra angular material components.
202 lines • 18.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
import { CropperComponent } from 'angular-cropperjs';
import { NgxEduCropperOptions } from './ngx-edu-cropper-options';
/**
* INSTRUCCIONES DE USO
*
* Instalar:
* npm install angular-cropperjs --save
* npm install cropperjs --save
*
* Configurar en angular.json
* en styles > "node_modules/cropperjs/dist/cropper.css"
* en scripts > "node_modules/cropperjs/dist/cropper.js"
*
* Importar en módulo ImageToolsModule en tu módulo
*
* INPUTS
* imageUrl: Url de la imagen a recortar.
* minContainerHeight: Alto mínimo del contenedor (No puede ser inferior a 325). Valor por defecto: 325.
*
* OUTPUTS
* onChange(EventEmitter<ImageCropperToolResponse>): Cuando se aplican los cambios devuelve un canvas
* con la imagen recortada para mostrar dentro de un div y blob que se puede utilizar para subir el archivo
* utilizando FormData, cuando se realiza algun cambio devuelve null hasta que se apliquen nuevamente los cambios.
*
* EXAMPLE
* <ngx-edu-cropper [imageUrl]="imageUrl" [minContainerHeight]="325" (onChange)="onChange($event)"></ngx-edu-cropper>
*/
export class NgxEduCropperComponent {
constructor() {
this.ngxEduCropperOptions = new NgxEduCropperOptions();
this.imageUrl = '';
this.minContainerHeight = 325;
this.onChange = new EventEmitter();
this.setImageCropperToolEvents();
}
/**
* @return {?}
*/
ngOnInit() {
if (this.minContainerHeight < 325) {
this.minContainerHeight = 325;
}
this.ngxEduCropperOptions.minContainerHeight = this.minContainerHeight;
}
/**
* @return {?}
*/
ngOnChanges() {
}
/**
* @return {?}
*/
ngOnDestroy() {
}
/**
* @return {?}
*/
setImageCropperToolEvents() {
this.ngxEduCropperOptions.cropstart = (/**
* @param {?} e
* @return {?}
*/
(e) => {
this.onChange.emit(null);
});
this.ngxEduCropperOptions.cropmove = (/**
* @param {?} e
* @return {?}
*/
(e) => {
this.onChange.emit(null);
});
this.ngxEduCropperOptions.cropend = (/**
* @param {?} e
* @return {?}
*/
(e) => {
this.onChange.emit(null);
});
this.ngxEduCropperOptions.zoom = (/**
* @param {?} e
* @return {?}
*/
(e) => {
this.onChange.emit(null);
});
}
/**
* @param {?} dragMode
* @return {?}
*/
setDragMode(dragMode) {
/** @type {?} */
const cropperDragMode = (/** @type {?} */ (dragMode));
this.angularCropper.cropper.setDragMode(cropperDragMode);
}
/**
* @param {?} ratio
* @return {?}
*/
zoom(ratio) {
this.angularCropper.cropper.zoom(ratio);
this.onChange.emit(null);
}
/**
* @param {?} degree
* @return {?}
*/
rotate(degree) {
this.angularCropper.cropper.rotate(degree);
this.onChange.emit(null);
}
/**
* @param {?} offsetX
* @param {?} offsetY
* @return {?}
*/
move(offsetX, offsetY) {
this.angularCropper.cropper.move(offsetX, offsetY);
this.onChange.emit(null);
}
/**
* @return {?}
*/
disable() {
this.angularCropper.cropper.disable();
this.onChange.emit(null);
}
/**
* @return {?}
*/
enable() {
this.angularCropper.cropper.enable();
this.onChange.emit(null);
}
/**
* @return {?}
*/
reset() {
this.angularCropper.cropper.reset();
this.onChange.emit(null);
}
/**
* @return {?}
*/
clear() {
this.angularCropper.cropper.clear();
this.onChange.emit(null);
}
/**
* @return {?}
*/
crop() {
this.angularCropper.cropper.crop();
/** @type {?} */
const canvas = this.angularCropper.cropper.getCroppedCanvas();
canvas.toBlob((/**
* @param {?} blob
* @return {?}
*/
(blob) => {
console.log('NgxEduCropperComponent > crop > blob', blob);
this.onChange.emit({
canvas: canvas,
blob: blob
});
}));
}
}
NgxEduCropperComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-edu-cropper',
template: "<div fxLayout=\"row\">\r\n <div fxFlex=\"80px\">\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Modo mover\" (click)=\"setDragMode('move')\">\r\n <mat-icon>open_with</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Modo recorte\" (click)=\"setDragMode('crop')\">\r\n <mat-icon>crop</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Acercarse\" (click)=\"zoom(0.1)\">\r\n <mat-icon>zoom_in</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Alejarse\" (click)=\"zoom(-0.1)\">\r\n <mat-icon>zoom_out</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Rotar a la izquierda\" (click)=\"rotate(-90)\">\r\n <mat-icon>rotate_left</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Rotar a la derecha\" (click)=\"rotate(90)\">\r\n <mat-icon>rotate_right</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Mover a la izquierda\" (click)=\"move(-10, 0)\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Mover a la derecha\" (click)=\"move(10, 0)\">\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Mover arriba\" (click)=\"move(0, -10)\">\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Mover abajo\" (click)=\"move(0, 10)\">\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Bloquear\" (click)=\"disable()\">\r\n <mat-icon>lock</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Desbloquear\" (click)=\"enable()\">\r\n <mat-icon>lock_open</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Reiniciar\" (click)=\"reset()\">\r\n <mat-icon>cached</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Limpiar\" (click)=\"clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Aplicar cambios\" (click)=\"crop()\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n <div fxFlex>\r\n <angular-cropper #angularCropper [cropperOptions]=\"ngxEduCropperOptions\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n </div>\r\n</div>",
styles: [""]
}] }
];
/** @nocollapse */
NgxEduCropperComponent.ctorParameters = () => [];
NgxEduCropperComponent.propDecorators = {
angularCropper: [{ type: ViewChild, args: ['angularCropper',] }],
imageUrl: [{ type: Input }],
minContainerHeight: [{ type: Input }],
onChange: [{ type: Output }]
};
if (false) {
/** @type {?} */
NgxEduCropperComponent.prototype.angularCropper;
/** @type {?} */
NgxEduCropperComponent.prototype.ngxEduCropperOptions;
/** @type {?} */
NgxEduCropperComponent.prototype.imageUrl;
/** @type {?} */
NgxEduCropperComponent.prototype.minContainerHeight;
/** @type {?} */
NgxEduCropperComponent.prototype.onChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVkdS1jcm9wcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1lZHUtY29tcG9uZW50cy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtZWR1LWNyb3BwZXIvbmd4LWVkdS1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBZ0MsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDakUsTUFBTSxPQUFPLHNCQUFzQjtJQU8vQjtRQUNJLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQzFELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUM7U0FDakM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzNFLENBQUM7Ozs7SUFFRCxXQUFXO0lBRVgsQ0FBQzs7OztJQUVELFdBQVc7SUFFWCxDQUFDOzs7O0lBRUQseUJBQXlCO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTOzs7O1FBQUcsQ0FBQyxD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QUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDZixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsSUFBSTthQUNiLENBQUMsQ0FBQztRQUNQLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7O1lBcEdKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQix5bkdBQTZDOzthQUVoRDs7Ozs7NkJBRUksU0FBUyxTQUFDLGdCQUFnQjt1QkFFMUIsS0FBSztpQ0FDTCxLQUFLO3VCQUNMLE1BQU07Ozs7SUFKUCxnREFBcUU7O0lBQ3JFLHNEQUEyQzs7SUFDM0MsMENBQTBCOztJQUMxQixvREFBb0M7O0lBQ3BDLDBDQUF3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJ2FuZ3VsYXItY3JvcHBlcmpzJztcclxuaW1wb3J0IHsgTmd4RWR1Q3JvcHBlck9wdGlvbnMgfSBmcm9tICcuL25neC1lZHUtY3JvcHBlci1vcHRpb25zJztcclxuaW1wb3J0IHsgTmd4RWR1Q3JvcHBlclJlc3BvbnNlIH0gZnJvbSAnLi9uZ3gtZWR1LWNyb3BwZXItcmVzcG9uc2UnO1xyXG5cclxuLyoqXHJcbiAqIElOU1RSVUNDSU9ORVMgREUgVVNPXHJcbiAqIFxyXG4gKiBJbnN0YWxhcjpcclxuICogIG5wbSBpbnN0YWxsIGFuZ3VsYXItY3JvcHBlcmpzIC0tc2F2ZVxyXG4gKiAgbnBtIGluc3RhbGwgY3JvcHBlcmpzIC0tc2F2ZVxyXG4gKiBcclxuICogQ29uZmlndXJhciBlbiBhbmd1bGFyLmpzb25cclxuICogIGVuIHN0eWxlcyA+IFwibm9kZV9tb2R1bGVzL2Nyb3BwZXJqcy9kaXN0L2Nyb3BwZXIuY3NzXCJcclxuICogIGVuIHNjcmlwdHMgPiBcIm5vZGVfbW9kdWxlcy9jcm9wcGVyanMvZGlzdC9jcm9wcGVyLmpzXCJcclxuICogXHJcbiAqIEltcG9ydGFyIGVuIG3Ds2R1bG8gSW1hZ2VUb29sc01vZHVsZSBlbiB0dSBtw7NkdWxvXHJcbiAqIFxyXG4gKiBJTlBVVFNcclxuICogaW1hZ2VVcmw6IFVybCBkZSBsYSBpbWFnZW4gYSByZWNvcnRhci5cclxuICogbWluQ29udGFpbmVySGVpZ2h0OiBBbHRvIG3DrW5pbW8gZGVsIGNvbnRlbmVkb3IgKE5vIHB1ZWRlIHNlciBpbmZlcmlvciBhIDMyNSkuIFZhbG9yIHBvciBkZWZlY3RvOiAzMjUuXHJcbiAqIFxyXG4gKiBPVVRQVVRTXHJcbiAqIG9uQ2hhbmdlKEV2ZW50RW1pdHRlcjxJbWFnZUNyb3BwZXJUb29sUmVzcG9uc2U+KTogQ3VhbmRvIHNlIGFwbGljYW4gbG9zIGNhbWJpb3MgZGV2dWVsdmUgdW4gY2FudmFzXHJcbiAqIGNvbiBsYSBpbWFnZW4gcmVjb3J0YWRhIHBhcmEgbW9zdHJhciBkZW50cm8gZGUgdW4gZGl2IHkgYmxvYiBxdWUgc2UgcHVlZGUgdXRpbGl6YXIgcGFyYSBzdWJpciBlbCBhcmNoaXZvXHJcbiAqIHV0aWxpemFuZG8gRm9ybURhdGEsIGN1YW5kbyBzZSByZWFsaXphIGFsZ3VuIGNhbWJpbyBkZXZ1ZWx2ZSBudWxsIGhhc3RhIHF1ZSBzZSBhcGxpcXVlbiBudWV2YW1lbnRlIGxvcyBjYW1iaW9zLlxyXG4gKiBcclxuICogRVhBTVBMRVxyXG4gKiA8bmd4LWVkdS1jcm9wcGVyIFtpbWFnZVVybF09XCJpbWFnZVVybFwiIFttaW5Db250YWluZXJIZWlnaHRdPVwiMzI1XCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIj48L25neC1lZHUtY3JvcHBlcj5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZ3gtZWR1LWNyb3BwZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICduZ3gtZWR1LWNyb3BwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJ25neC1lZHUtY3JvcHBlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hFZHVDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICBAVmlld0NoaWxkKCdhbmd1bGFyQ3JvcHBlcicpIHB1YmxpYyBhbmd1bGFyQ3JvcHBlcjogQ3JvcHBlckNvbXBvbmVudDtcclxuICAgIG5neEVkdUNyb3BwZXJPcHRpb25zOiBOZ3hFZHVDcm9wcGVyT3B0aW9ucztcclxuICAgIEBJbnB1dCgpIGltYWdlVXJsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBtaW5Db250YWluZXJIZWlnaHQ6IG51bWJlcjtcclxuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPE5neEVkdUNyb3BwZXJSZXNwb25zZT47XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5uZ3hFZHVDcm9wcGVyT3B0aW9ucyA9IG5ldyBOZ3hFZHVDcm9wcGVyT3B0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VVcmwgPSAnJztcclxuICAgICAgICB0aGlzLm1pbkNvbnRhaW5lckhlaWdodCA9IDMyNTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3hFZHVDcm9wcGVyUmVzcG9uc2U+KCk7XHJcbiAgICAgICAgdGhpcy5zZXRJbWFnZUNyb3BwZXJUb29sRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWluQ29udGFpbmVySGVpZ2h0IDwgMzI1KSB7XHJcbiAgICAgICAgICAgIHRoaXMubWluQ29udGFpbmVySGVpZ2h0ID0gMzI1O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLm1pbkNvbnRhaW5lckhlaWdodCA9IHRoaXMubWluQ29udGFpbmVySGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW1hZ2VDcm9wcGVyVG9vbEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLmNyb3BzdGFydCA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMubmd4RWR1Q3JvcHBlck9wdGlvbnMuY3JvcG1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLmNyb3BlbmQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLnpvb20gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREcmFnTW9kZShkcmFnTW9kZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgY3JvcHBlckRyYWdNb2RlID0gPENyb3BwZXIuRHJhZ01vZGU+IGRyYWdNb2RlO1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5zZXREcmFnTW9kZShjcm9wcGVyRHJhZ01vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHpvb20ocmF0aW86IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKHJhdGlvKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm90YXRlKGRlZ3JlZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLnJvdGF0ZShkZWdyZWUpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3ZlKG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5tb3ZlKG9mZnNldFgsIG9mZnNldFkpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JvcCgpIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuY3JvcCgpO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKCk7XHJcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTmd4RWR1Q3JvcHBlckNvbXBvbmVudCA+IGNyb3AgPiBibG9iJywgYmxvYik7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBjYW52YXM6IGNhbnZhcyxcclxuICAgICAgICAgICAgICAgIGJsb2I6IGJsb2JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19