@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
269 lines (268 loc) • 23.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { map, tap } from 'rxjs/operators';
/**
* Service de gestion de fichier
*/
export class AsiFileService {
/**
* @param {?} http
* @param {?} sanitizer
*/
constructor(http, sanitizer) {
this.http = http;
this.sanitizer = sanitizer;
}
/**
* @param {?} file
* @param {?=} sanitize
* @return {?}
*/
fileToBase64(file, sanitize) {
return this.toBase64(file, sanitize);
}
/**
* @param {?} file
* @param {?=} sanitize
* @return {?}
*/
fileToBase64Url(file, sanitize) {
return this.toBase64Url(file, sanitize);
}
/**
* @param {?} file
* @return {?}
*/
fileToBase64Data(file) {
return this.toBase64Data(file);
}
/**
* @param {?} blob
* @param {?=} sanitize
* @return {?}
*/
blobToBase64(blob, sanitize) {
return this.toBase64(blob, sanitize);
}
/**
* @param {?} blob
* @param {?=} sanitize
* @return {?}
*/
blobToBase64Url(blob, sanitize) {
return this.toBase64Url(blob, sanitize);
}
/**
* @param {?} blob
* @return {?}
*/
blobToBase64Data(blob) {
return this.toBase64Data(blob);
}
/**
* @param {?} data
* @param {?=} sanitize
* @return {?}
*/
toBase64(data, sanitize) {
return Observable.create((observer) => {
/** @type {?} */
const reader = new FileReader();
reader.onloadend = () => {
/** @type {?} */
let content = reader.result;
if (!reader.result) {
content = /** @type {?} */ (reader['content']);
}
if (sanitize) {
content = this.sanitizer.bypassSecurityTrustResourceUrl(content);
}
observer.next(content);
observer.complete();
};
reader.readAsDataURL(data);
});
}
/**
* @param {?} data
* @param {?=} sanitize
* @return {?}
*/
toBase64Url(data, sanitize) {
return this.toBase64(data, sanitize);
}
/**
* @param {?} data
* @return {?}
*/
toBase64Data(data) {
return Observable.create((observer) => {
/** @type {?} */
const reader = new FileReader();
reader.onloadend = () => {
if (!reader.result) {
observer.next(window.btoa(/** @type {?} */ (reader['content'])));
}
else {
observer.next(window.btoa(/** @type {?} */ (reader.result)));
}
observer.complete();
};
reader.readAsBinaryString(data);
});
}
/**
* Download the blob file with the specified name
* @param {?} fileAsBlob the file to download as a Blob
* @param {?} fileName the name to give to the downloaded file
* @return {?}
*/
saveToFile(fileAsBlob, fileName) {
// If no name is provided, we use the original name if available, or a default name
if (!fileName) {
if (!fileAsBlob.name) {
fileName = 'tmpFile';
}
else {
fileName = fileAsBlob.name;
}
}
if (window.navigator.msSaveBlob) {
// IE
window.navigator.msSaveBlob(fileAsBlob, fileName);
}
else {
/** @type {?} */
let url = window.URL.createObjectURL(fileAsBlob);
/** @type {?} */
const anchor = document.createElement('a');
anchor.download = fileName;
anchor.target = '_blank';
anchor.href = url;
anchor.dispatchEvent(new MouseEvent('click'));
}
}
/**
* Transform a Blob into a File adding a file name and a last modified date
* @param {?} response The blob response
* @return {?}
*/
getFileFromBlobResponse(response) {
/** @type {?} */
const blob = response.body;
// May be null if the server doesn't explicitly add the content-disposition in the headers
if (blob.name == null) {
/** @type {?} */
let originalFileName = response.headers.get('content-disposition').replace(/ /g, '');
if (originalFileName) {
originalFileName = originalFileName.substring(originalFileName.lastIndexOf('filename=') + 9);
}
// The two attributes missing to a Blob to be a File
blob.name = originalFileName;
}
if (blob.lastModifiedDate == null) {
blob.lastModifiedDate = new Date();
}
return /** @type {?} */ (blob);
}
/**
* @param {?} file
* @return {?}
*/
getFileUrl(file) {
/** @type {?} */
let url = URL.createObjectURL(file);
return this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
/**
* @param {?} fileUrl
* @return {?}
*/
getFileAsText(fileUrl) {
return this.http.get(fileUrl, { responseType: 'text' });
}
/**
* @param {?} fileUrl
* @return {?}
*/
getFileAsBlob(fileUrl) {
return this.http.get(fileUrl, { responseType: 'blob', observe: 'response' }).pipe(map((response) => {
return this.getFileFromBlobResponse(response);
}));
}
/**
* @param {?} fileUrl
* @param {?} body
* @return {?}
*/
getFileAsBlobFromPostRequest(fileUrl, body) {
return this.http.post(fileUrl, body, { responseType: 'blob', observe: 'response' }).pipe(map((response) => {
return this.getFileFromBlobResponse(response);
}));
}
/**
* Download the file at the given url
* @param {?} fileUrl The url of the downloadable file
* @param {?=} fileName [Optional] The new name of the downloaded file
* @return {?}
*/
downloadFile(fileUrl, fileName) {
return this.getFileAsBlob(fileUrl).pipe(tap((fileAsBlob) => {
this.saveToFile(fileAsBlob, fileName);
}));
}
/**
* Download the file at the given url from a POST request
* @param {?} fileUrl The url of the downloadable file
* @param {?} body the POST request body
* @param {?=} fileName [Optional] The new name of the downloaded file
* @return {?}
*/
downloadFileFromPostRequest(fileUrl, body, fileName) {
return this.getFileAsBlobFromPostRequest(fileUrl, body).pipe(tap((fileAsBlob) => {
this.saveToFile(fileAsBlob, fileName);
}));
}
/**
* @param {?} fileUrl
* @return {?}
*/
getBlobImage(fileUrl) {
return this.http.get(fileUrl, { responseType: 'blob' });
}
/**
* @param {?} url
* @param {?} file
* @param {?=} reportProgress
* @return {?}
*/
uploadFile(url, file, reportProgress = false) {
/** @type {?} */
let formData = new FormData();
formData.append('file', file, file.name);
/** @type {?} */
const observe = reportProgress ? 'events' : 'body';
return this.http.post(url, formData, { reportProgress: reportProgress, observe: observe });
}
}
AsiFileService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
AsiFileService.ctorParameters = () => [
{ type: HttpClient },
{ type: DomSanitizer }
];
if (false) {
/** @type {?} */
AsiFileService.prototype.http;
/** @type {?} */
AsiFileService.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWZpbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvYXNpLWZpbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFtQixNQUFNLDJCQUEyQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFNMUMsTUFBTTs7Ozs7SUFFSixZQUFvQixJQUFnQixFQUFVLFNBQXVCO1FBQWpELFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFjO0tBQ3BFOzs7Ozs7SUFFRCxZQUFZLENBQUMsSUFBVSxFQUFFLFFBQWtCO1FBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUN0Qzs7Ozs7O0lBRUQsZUFBZSxDQUFDLElBQVUsRUFBRSxRQUFrQjtRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDekM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsSUFBVTtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoQzs7Ozs7O0lBRUQsWUFBWSxDQUFDLElBQVUsRUFBRSxRQUFrQjtRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDdEM7Ozs7OztJQUVELGVBQWUsQ0FBQyxJQUFVLEVBQUUs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O0tBQ0w7Ozs7Ozs7O0lBUUQsMkJBQTJCLENBQUMsT0FBZSxFQUFFLElBQVMsRUFBRSxRQUFpQjtRQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDOUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDdkMsQ0FBQyxDQUFDLENBQUM7S0FDTDs7Ozs7SUFFRCxZQUFZLENBQUMsT0FBZTtRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDekQ7Ozs7Ozs7SUFFRCxVQUFVLENBQUMsR0FBVyxFQUFFLElBQVUsRUFBRSxjQUFjLEdBQUcsS0FBSzs7UUFDeEQsSUFBSSxRQUFRLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN4QyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztRQUN6QyxNQUFNLE9BQU8sR0FBUSxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUM1Rjs7O1lBdktGLFVBQVU7Ozs7WUFSRixVQUFVO1lBRVYsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmliZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGRlIGdlc3Rpb24gZGUgZmljaGllclxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXNpRmlsZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcclxuICB9XHJcblxyXG4gIGZpbGVUb0Jhc2U2NChmaWxlOiBGaWxlLCBzYW5pdGl6ZT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNjQoZmlsZSwgc2FuaXRpemUpO1xyXG4gIH1cclxuXHJcbiAgZmlsZVRvQmFzZTY0VXJsKGZpbGU6IEZpbGUsIHNhbml0aXplPzogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U2NFVybChmaWxlLCBzYW5pdGl6ZSk7XHJcbiAgfVxyXG5cclxuICBmaWxlVG9CYXNlNjREYXRhKGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNjREYXRhKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgYmxvYlRvQmFzZTY0KGJsb2I6IEJsb2IsIHNhbml0aXplPzogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U2NChibG9iLCBzYW5pdGl6ZSk7XHJcbiAgfVxyXG5cclxuICBibG9iVG9CYXNlNjRVcmwoYmxvYjogQmxvYiwgc2FuaXRpemU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLnRvQmFzZTY0VXJsKGJsb2IsIHNhbml0aXplKTtcclxuICB9XHJcblxyXG4gIGJsb2JUb0Jhc2U2NERhdGEoYmxvYjogQmxvYik6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U2NERhdGEoYmxvYik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQmFzZTY0KGRhdGE6IGFueSwgc2FuaXRpemU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXI6IFN1YnNjcmliZXI8YW55PikgPT4ge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xyXG4gICAgICAgIGxldCBjb250ZW50OiBhbnkgPSByZWFkZXIucmVzdWx0O1xyXG4gICAgICAgIGlmICghcmVhZGVyLnJlc3VsdCkge1xyXG4gICAgICAgICAgY29udGVudCA9IDxzdHJpbmc+cmVhZGVyWydjb250ZW50J107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzYW5pdGl6ZSkge1xyXG4gICAgICAgICAgY29udGVudCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChjb250ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChjb250ZW50KTtcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQmFzZTY0VXJsKGRhdGE6IGFueSwgc2FuaXRpemU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnRvQmFzZTY0KGRhdGEsIHNhbml0aXplKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9CYXNlNjREYXRhKGRhdGE6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoKG9ic2VydmVyOiBTdWJzY3JpYmVyPGFueT4pID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICBpZiAoIXJlYWRlci5yZXN1bHQpIHtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQod2luZG93LmJ0b2EoPHN0cmluZz5yZWFkZXJbJ2NvbnRlbnQnXSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHdpbmRvdy5idG9hKDxzdHJpbmc+cmVhZGVyLnJlc3VsdCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIHRoZSBibG9iIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcclxuICAgKiBAcGFyYW0gZmlsZUFzQmxvYiB0aGUgZmlsZSB0byBkb3dubG9hZCBhcyBhIEJsb2JcclxuICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIG5hbWUgdG8gZ2l2ZSB0byB0aGUgZG93bmxvYWRlZCBmaWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzYXZlVG9GaWxlKGZpbGVBc0Jsb2I6IEZpbGUsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIElmIG5vIG5hbWUgaXMgcHJvdmlkZWQsIHdlIHVzZSB0aGUgb3JpZ2luYWwgbmFtZSBpZiBhdmFpbGFibGUsIG9yIGEgZGVmYXVsdCBuYW1lXHJcbiAgICBpZiAoIWZpbGVOYW1lKSB7XHJcbiAgICAgIGlmICghZmlsZUFzQmxvYi5uYW1lKSB7XHJcbiAgICAgICAgZmlsZU5hbWUgPSAndG1wRmlsZSc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlQXNCbG9iLm5hbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHsgIC8vIElFXHJcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYihmaWxlQXNCbG9iLCBmaWxlTmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZUFzQmxvYik7XHJcbiAgICAgIGNvbnN0IGFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgYW5jaG9yLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgIGFuY2hvci50YXJnZXQgPSAnX2JsYW5rJztcclxuICAgICAgYW5jaG9yLmhyZWYgPSB1cmw7XHJcbiAgICAgIGFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSBhIEJsb2IgaW50byBhIEZpbGUgYWRkaW5nIGEgZmlsZSBuYW1lIGFuZCBhIGxhc3QgbW9kaWZpZWQgZGF0ZVxyXG4gICAqIEBwYXJhbSByZXNwb25zZSBUaGUgYmxvYiByZXNwb25zZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsZUZyb21CbG9iUmVzcG9uc2UocmVzcG9uc2U6IGFueSk6IEZpbGUge1xyXG4gICAgY29uc3QgYmxvYjogYW55ID0gcmVzcG9uc2UuYm9keTtcclxuICAgIC8vIE1heSBiZSBudWxsIGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBleHBsaWNpdGx5IGFkZCB0aGUgY29udGVudC1kaXNwb3NpdGlvbiBpbiB0aGUgaGVhZGVyc1xyXG4gICAgaWYgKGJsb2IubmFtZSA9PSBudWxsKSB7XHJcbiAgICAgIGxldCBvcmlnaW5hbEZpbGVOYW1lID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKS5yZXBsYWNlKC8gL2csICcnKTtcclxuICAgICAgaWYgKG9yaWdpbmFsRmlsZU5hbWUpIHtcclxuICAgICAgICBvcmlnaW5hbEZpbGVOYW1lID0gb3JpZ2luYWxGaWxlTmFtZS5zdWJzdHJpbmcob3JpZ2luYWxGaWxlTmFtZS5sYXN0SW5kZXhPZignZmlsZW5hbWU9JykgKyA5KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBUaGUgdHdvIGF0dHJpYnV0ZXMgbWlzc2luZyB0byBhIEJsb2IgdG8gYmUgYSBGaWxlXHJcbiAgICAgIGJsb2IubmFtZSA9IG9yaWdpbmFsRmlsZU5hbWU7XHJcbiAgICB9XHJcbiAgICBpZiAoYmxvYi5sYXN0TW9kaWZpZWREYXRlID09IG51bGwpIHtcclxuICAgICAgYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiA8RmlsZT5ibG9iO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZVVybChmaWxlOiBGaWxlKTogU2FmZVJlc291cmNlVXJsIHtcclxuICAgIGxldCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsZUFzVGV4dChmaWxlVXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZmlsZVVybCwgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9KTtcclxuICB9XHJcblxyXG4gIGdldEZpbGVBc0Jsb2IoZmlsZVVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChmaWxlVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUobWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWxlRnJvbUJsb2JSZXNwb25zZShyZXNwb25zZSk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlQXNCbG9iRnJvbVBvc3RSZXF1ZXN0KGZpbGVVcmw6IHN0cmluZywgYm9keTogYW55KTogT2JzZXJ2YWJsZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZmlsZVVybCwgYm9keSwgeyByZXNwb25zZVR5cGU6ICdibG9iJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUZyb21CbG9iUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHVybFxyXG4gICAqIEBwYXJhbSBmaWxlVXJsIFRoZSB1cmwgb2YgdGhlIGRvd25sb2FkYWJsZSBmaWxlXHJcbiAgICogQHBhcmFtIGZpbGVOYW1lIFtPcHRpb25hbF0gVGhlIG5ldyBuYW1lIG9mIHRoZSBkb3dubG9hZGVkIGZpbGVcclxuICAgKi9cclxuICBkb3dubG9hZEZpbGUoZmlsZVVybDogc3RyaW5nLCBmaWxlTmFtZT86IHN0cmluZyk6IE9ic2VydmFibGU8RmlsZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUFzQmxvYihmaWxlVXJsKS5waXBlKHRhcCgoZmlsZUFzQmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnNhdmVUb0ZpbGUoZmlsZUFzQmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHVybCBmcm9tIGEgUE9TVCByZXF1ZXN0XHJcbiAgICogQHBhcmFtIGZpbGVVcmwgVGhlIHVybCBvZiB0aGUgZG93bmxvYWRhYmxlIGZpbGVcclxuICAgKiBAcGFyYW0gYm9keSB0aGUgUE9TVCByZXF1ZXN0IGJvZHlcclxuICAgKiBAcGFyYW0gZmlsZU5hbWUgW09wdGlvbmFsXSBUaGUgbmV3IG5hbWUgb2YgdGhlIGRvd25sb2FkZWQgZmlsZVxyXG4gICAqL1xyXG4gIGRvd25sb2FkRmlsZUZyb21Qb3N0UmVxdWVzdChmaWxlVXJsOiBzdHJpbmcsIGJvZHk6IGFueSwgZmlsZU5hbWU/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPEZpbGU+IHtcclxuICAgIHJldHVybiB0aGlzLmdldEZpbGVBc0Jsb2JGcm9tUG9zdFJlcXVlc3QoZmlsZVVybCwgYm9keSkucGlwZSh0YXAoKGZpbGVBc0Jsb2IpID0+IHtcclxuICAgICAgdGhpcy5zYXZlVG9GaWxlKGZpbGVBc0Jsb2IsIGZpbGVOYW1lKTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGdldEJsb2JJbWFnZShmaWxlVXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJsb2I+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGZpbGVVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSk7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRGaWxlKHVybDogc3RyaW5nLCBmaWxlOiBGaWxlLCByZXBvcnRQcm9ncmVzcyA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XHJcbiAgICBjb25zdCBvYnNlcnZlOiBhbnkgPSByZXBvcnRQcm9ncmVzcyA/ICdldmVudHMnIDogJ2JvZHknO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgZm9ybURhdGEsIHsgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzLCBvYnNlcnZlOiBvYnNlcnZlIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=