@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
281 lines (280 loc) • 20.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { Component, Input, EventEmitter, Output, forwardRef, ViewChild, ElementRef, Renderer2 } from '@angular/core';
import { AsiFileService } from './../../services/asi-file.service';
import * as nh from '../../native-helper';
export class AsiFileChooserComponent extends DefaultControlValueAccessor {
/**
* @param {?} fileService
* @param {?} renderer
* @param {?} elementRef
*/
constructor(fileService, renderer, elementRef) {
super();
this.fileService = fileService;
this.renderer = renderer;
this.elementRef = elementRef;
/**
* Label position
*/
this.labelPosition = 'top';
/**
* Preload filechooser with an url
*/
this.fileSrc = null;
/**
* Allow you to force the name of the file
*/
this.fileName = null;
/**
* By default we dont block the file is the user select a wrong type
*/
this.blockImport = false;
/**
* Icon to display
*/
this.icon = 'fa fa-paperclip';
/**
* Event emitted when an error occured with the selected file
*/
this.onError = new EventEmitter();
this.acceptAttribute = '';
this.dragging = false;
this.loaded = false;
this.fileLoaded = false;
}
/**
* @return {?}
*/
ngOnInit() {
this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition);
if (this.fileSrc != null) {
this.fileService.getFileAsBlob(this.fileSrc).subscribe(blob => {
/** @type {?} */
const fileName = this.fileName || this.fileSrc.split('/').pop();
/** @type {?} */
const file = new Blob([blob], { type: blob.type });
file.name = fileName;
this.value = file;
});
}
}
/**
* @return {?}
*/
ngOnChanges() {
if (nh.isArray(this.accept)) {
(/** @type {?} */ (this.accept)).forEach((accept) => {
this.acceptAttribute += accept.extension + ', ' + accept.mimeType + ',';
});
}
else if (this.accept != null) {
/** @type {?} */
const aAccept = (/** @type {?} */ (this.accept));
this.acceptAttribute = aAccept.extension + ', ' + aAccept.mimeType;
}
}
/**
* @return {?}
*/
openFileInput() {
this.fileInput.nativeElement.value = null;
this.fileInput.nativeElement.click();
}
/**
* @return {?}
*/
getFileUrl() {
return this.fileService.getFileUrl(this.value);
}
/**
* @return {?}
*/
clean() {
this.value = null;
}
/**
* @return {?}
*/
handleDragEnter() {
this.dragging = true;
}
/**
* @return {?}
*/
handleDragLeave() {
this.dragging = false;
}
/**
* @param {?} e
* @return {?}
*/
handleDrop(e) {
e.preventDefault();
this.dragging = false;
this.handleInputChange(e);
}
/**
* @return {?}
*/
handleFileLoad() {
this.fileLoaded = true;
}
/**
* @param {?} event
* @return {?}
*/
handleInputChange(event) {
/** @type {?} */
const file = event.dataTransfer ? event.dataTransfer.files[0] : event.target.files[0];
if (this.blockImport && !this.isValideMimeType(file.type)) {
this.onError.emit({
error: 'FORMAT',
file: file
});
return;
}
this.loaded = false;
this.value = file;
}
/**
* @return {?}
*/
downloadForIE() {
if (navigator.msSaveBlob) {
navigator.msSaveBlob(this.value, this.value.name);
}
}
/**
* @param {?} mimeType
* @return {?}
*/
isValideMimeType(mimeType) {
if (!this.accept) {
return true;
}
if (nh.isArray(this.accept)) {
/** @type {?} */
const accepts = /** @type {?} */ (this.accept);
for (let accept of accepts) {
if (accept.mimeType === mimeType) {
return true;
}
}
}
else {
/** @type {?} */
const aAccept = (/** @type {?} */ (this.accept));
return aAccept.mimeType === mimeType;
}
return false;
}
}
AsiFileChooserComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-file-chooser',
host: { 'class': 'asi-component asi-file-chooser' },
template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n<div class=\"asi-file-chooser-container\">\n <label ondragover=\"return false;\" [class.loaded]=\"loaded\" (dragenter)=\"handleDragEnter()\" (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\">\n <asi-button size=\"small\" class=\"asi-focus-error\" (click)=\"openFileInput()\">\n <asi-fa-icon [icon]=\"icon\" size=\"2x\"></asi-fa-icon>\n </asi-button>\n <input #fileInput type=\"file\" [attr.id]=\"id\" [attr.name]=\"name\" [disabled]=\"disabled\" name=\"file\" [accept]=\"acceptAttribute\" (change)=\"handleInputChange($event)\" />\n </label>\n <div class=\"file-link\" *ngIf=\"value != null\">\n <a [title]=\"value.name\" (click)=\"downloadForIE()\" [innerHTML]=\"value.name\" [download]=\"value.name\" [href]=\"getFileUrl()\" target=\"_empty\"></a>\n <asi-fa-icon (onClick)=\"clean()\" icon=\"fa fa-trash-o\" size=\"lg\"></asi-fa-icon>\n </div>\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AsiFileChooserComponent),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiFileChooserComponent.ctorParameters = () => [
{ type: AsiFileService },
{ type: Renderer2 },
{ type: ElementRef }
];
AsiFileChooserComponent.propDecorators = {
id: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
labelPosition: [{ type: Input }],
fileSrc: [{ type: Input }],
fileName: [{ type: Input }],
accept: [{ type: Input }],
blockImport: [{ type: Input }],
icon: [{ type: Input }],
onError: [{ type: Output }],
fileInput: [{ type: ViewChild, args: ['fileInput',] }]
};
if (false) {
/**
* html id
* @type {?}
*/
AsiFileChooserComponent.prototype.id;
/**
* html name
* @type {?}
*/
AsiFileChooserComponent.prototype.name;
/**
* Label to display (is translated)
* @type {?}
*/
AsiFileChooserComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiFileChooserComponent.prototype.labelPosition;
/**
* Preload filechooser with an url
* @type {?}
*/
AsiFileChooserComponent.prototype.fileSrc;
/**
* Allow you to force the name of the file
* @type {?}
*/
AsiFileChooserComponent.prototype.fileName;
/**
* Liste of mimetype : "application/pdf" used to display a correct selection view
* @type {?}
*/
AsiFileChooserComponent.prototype.accept;
/**
* By default we dont block the file is the user select a wrong type
* @type {?}
*/
AsiFileChooserComponent.prototype.blockImport;
/**
* Icon to display
* @type {?}
*/
AsiFileChooserComponent.prototype.icon;
/**
* Event emitted when an error occured with the selected file
* @type {?}
*/
AsiFileChooserComponent.prototype.onError;
/** @type {?} */
AsiFileChooserComponent.prototype.acceptAttribute;
/** @type {?} */
AsiFileChooserComponent.prototype.fileInput;
/** @type {?} */
AsiFileChooserComponent.prototype.dragging;
/** @type {?} */
AsiFileChooserComponent.prototype.loaded;
/** @type {?} */
AsiFileChooserComponent.prototype.fileLoaded;
/** @type {?} */
AsiFileChooserComponent.prototype.file;
/** @type {?} */
AsiFileChooserComponent.prototype.fileService;
/** @type {?} */
AsiFileChooserComponent.prototype.renderer;
/** @type {?} */
AsiFileChooserComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWZpbGUtY2hvb3Nlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWZpbGUtY2hvb3Nlci9hc2ktZmlsZS1jaG9vc2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBRUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQ3ZDLFNBQVMsRUFBVSxVQUFVLEVBQUUsU0FBUyxFQUNwRCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFbkUsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWMxQyxNQUFNLDhCQUErQixTQUFRLDJCQUEyQjs7Ozs7O0lBa0N0RSxZQUFvQixXQUEyQixFQUNyQyxVQUNBO1FBQ1IsS0FBSyxFQUFFLENBQUM7UUFIVSxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDckMsYUFBUSxHQUFSLFFBQVE7UUFDUixlQUFVLEdBQVYsVUFBVTs7Ozs2QkEzQjJFLEtBQUs7Ozs7dUJBRXpFLElBQUk7Ozs7d0JBRUgsSUFBSTs7OzsyQkFJVCxLQUFLOzs7O29CQUVaLGlCQUFpQjs7Ozt1QkFHYixJQUFJLFlBQVksRUFBTzsrQkFFekIsRUFBRTt3QkFJVCxLQUFLO3NCQUNQLEtBQUs7MEJBQ0QsS0FBSztLQVFqQjs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JGLEVB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QWtCO2dCQUM1QixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUU7Z0JBQ25ELGsrQkFBZ0Q7Z0JBQ2hELFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFDO3dCQUN0RCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjthQUNGOzs7O1lBZlEsY0FBYztZQUZxQixTQUFTO1lBQXJCLFVBQVU7OztpQkFxQnZDLEtBQUs7bUJBRUwsS0FBSztvQkFFTCxLQUFLOzRCQUVMLEtBQUs7c0JBRUwsS0FBSzt1QkFFTCxLQUFLO3FCQUVMLEtBQUs7MEJBRUwsS0FBSzttQkFFTCxLQUFLO3NCQUdMLE1BQU07d0JBSU4sU0FBUyxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc2lNaW1lVHlwZSB9IGZyb20gJy4vYXNpLWZpbGUtY2hvb3Nlci1jb25zdGFudHMnO1xuaW1wb3J0IHsgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vLi4vY29tbW9uL2RlZmF1bHQtY29udHJvbC12YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgZm9yd2FyZFJlZixcbiAgT25DaGFuZ2VzLCBWaWV3Q2hpbGQsIE9uSW5pdCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXNpRmlsZVNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL2FzaS1maWxlLnNlcnZpY2UnO1xuXG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi9uYXRpdmUtaGVscGVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXNpLWZpbGUtY2hvb3NlcicsXG4gIGhvc3Q6IHsgJ2NsYXNzJzogJ2FzaS1jb21wb25lbnQgYXNpLWZpbGUtY2hvb3NlcicgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FzaS1maWxlLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUZpbGVDaG9vc2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzaUZpbGVDaG9vc2VyQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuXG4gIC8qKiBodG1sIGlkICovXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICAgLyoqIExhYmVsIHRvIGRpc3BsYXkgKGlzIHRyYW5zbGF0ZWQpICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBMYWJlbCBwb3NpdGlvbiAqL1xuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdib3R0b20tY2VudGVyJyB8ICd0b3AtY2VudGVyJyA9ICd0b3AnO1xuICAvKiogUHJlbG9hZCBmaWxlY2hvb3NlciB3aXRoIGFuIHVybCAqL1xuICBASW5wdXQoKSBmaWxlU3JjOiBzdHJpbmcgPSBudWxsO1xuICAvKiogQWxsb3cgeW91IHRvIGZvcmNlIHRoZSBuYW1lIG9mIHRoZSBmaWxlICovXG4gIEBJbnB1dCgpIGZpbGVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICAvKiogTGlzdGUgb2YgbWltZXR5cGUgOiBcImFwcGxpY2F0aW9uL3BkZlwiIHVzZWQgdG8gZGlzcGxheSBhIGNvcnJlY3Qgc2VsZWN0aW9uIHZpZXcgKi9cbiAgQElucHV0KCkgYWNjZXB0OiBBcnJheTxBc2lNaW1lVHlwZT4gfCBBc2lNaW1lVHlwZTtcbiAgLyoqIEJ5IGRlZmF1bHQgd2UgZG9udCBibG9jayB0aGUgZmlsZSBpcyB0aGUgdXNlciBzZWxlY3QgYSB3cm9uZyB0eXBlICovXG4gIEBJbnB1dCgpIGJsb2NrSW1wb3J0ID0gZmFsc2U7XG4gIC8qKiBJY29uIHRvIGRpc3BsYXkgKi9cbiAgQElucHV0KCkgaWNvbiA9ICdmYSBmYS1wYXBlcmNsaXAnO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJlZCB3aXRoIHRoZSBzZWxlY3RlZCBmaWxlICovXG4gIEBPdXRwdXQoKSBvbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgYWNjZXB0QXR0cmlidXRlID0gJyc7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0OiBhbnk7XG5cbiAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgbG9hZGVkID0gZmFsc2U7XG4gIGZpbGVMb2FkZWQgPSBmYWxzZTtcblxuICBmaWxlOiBGaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZVNlcnZpY2U6IEFzaUZpbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xhYmVsLScgKyB0aGlzLmxhYmVsUG9zaXRpb24pO1xuICAgIGlmICh0aGlzLmZpbGVTcmMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5maWxlU2VydmljZS5nZXRGaWxlQXNCbG9iKHRoaXMuZmlsZVNyYykuc3Vic2NyaWJlKGJsb2IgPT4ge1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuZmlsZU5hbWUgfHwgdGhpcy5maWxlU3JjLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGU6IGFueSA9IG5ldyBCbG9iKFtibG9iXSwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XG4gICAgICAgIGZpbGUubmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmIChuaC5pc0FycmF5KHRoaXMuYWNjZXB0KSkge1xuICAgICAgKDxBcnJheTxBc2lNaW1lVHlwZT4+dGhpcy5hY2NlcHQpLmZvckVhY2goKGFjY2VwdCkgPT4ge1xuICAgICAgICB0aGlzLmFjY2VwdEF0dHJpYnV0ZSArPSBhY2NlcHQuZXh0ZW5zaW9uICsgJywgJyArIGFjY2VwdC5taW1lVHlwZSArICcsJztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgYUFjY2VwdDogQXNpTWltZVR5cGUgPSAoPEFzaU1pbWVUeXBlPnRoaXMuYWNjZXB0KTtcbiAgICAgIHRoaXMuYWNjZXB0QXR0cmlidXRlID0gYUFjY2VwdC5leHRlbnNpb24gKyAnLCAnICsgYUFjY2VwdC5taW1lVHlwZTtcbiAgICB9XG4gIH1cblxuICBvcGVuRmlsZUlucHV0KCkge1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIGdldEZpbGVVcmwoKTogU2FmZVJlc291cmNlVXJsIHtcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZS5nZXRGaWxlVXJsKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgY2xlYW4oKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBoYW5kbGVEcmFnRW50ZXIoKSB7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVEcmFnTGVhdmUoKSB7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlRHJvcChlOiBFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5oYW5kbGVJbnB1dENoYW5nZShlKTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVMb2FkKCkge1xuICAgIHRoaXMuZmlsZUxvYWRlZCA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVJbnB1dENoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2ZlciA/IGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc1swXSA6IGV2ZW50LnRhcmdldC5maWxlc1swXTtcblxuICAgIGlmICh0aGlzLmJsb2NrSW1wb3J0ICYmICF0aGlzLmlzVmFsaWRlTWltZVR5cGUoZmlsZS50eXBlKSkge1xuICAgICAgdGhpcy5vbkVycm9yLmVtaXQoe1xuICAgICAgICBlcnJvcjogJ0ZPUk1BVCcsXG4gICAgICAgIGZpbGU6IGZpbGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMudmFsdWUgPSBmaWxlO1xuICB9XG5cbiAgZG93bmxvYWRGb3JJRSgpIHtcbiAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKHRoaXMudmFsdWUsIHRoaXMudmFsdWUubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkZU1pbWVUeXBlKG1pbWVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWNjZXB0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5oLmlzQXJyYXkodGhpcy5hY2NlcHQpKSB7XG4gICAgICBjb25zdCBhY2NlcHRzID0gPEFycmF5PEFzaU1pbWVUeXBlPj50aGlzLmFjY2VwdDtcbiAgICAgIGZvciAobGV0IGFjY2VwdCBvZiBhY2NlcHRzKSB7XG4gICAgICAgIGlmIChhY2NlcHQubWltZVR5cGUgPT09IG1pbWVUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYUFjY2VwdDogQXNpTWltZVR5cGUgPSAoPEFzaU1pbWVUeXBlPnRoaXMuYWNjZXB0KTtcbiAgICAgIHJldHVybiBhQWNjZXB0Lm1pbWVUeXBlID09PSBtaW1lVHlwZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==