ng-rest-http
Version:
http client module for Angular [ tested for angular6 ]
259 lines • 32.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { HttpParams, HttpHeaders } from '@angular/common/http';
import { of } from 'rxjs';
import { catchError } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export class RestHttpClient {
constructor(http) {
this.http = http;
}
/**
* @param Object obj {url, params, headers}
* url : String,
* params {k1:v1, k2:v2....}
* headers {k1:v1, k2:v2....}
* @return Callback Function
*/
get(obj) {
const apiUrl = obj.url;
const body = {};
body.observe = 'response';
if (!Object.entries) {
Object.entries = (entryObj) => {
const ownProps = Object.keys(entryObj);
let i = ownProps.length;
const resArray = new Array(i); // preallocate the Array
while (i--) {
resArray[i] = [ownProps[i], entryObj[ownProps[i]]];
}
return resArray;
};
}
if (typeof obj.params !== 'undefined') {
let Params = new HttpParams();
Object.entries(obj.params).forEach(([key, value]) => Params = Params.append(key, String(value)));
body.params = Params;
}
if (typeof obj.headers !== 'undefined') {
body.headers = this.createHeders(obj.headers);
}
return new Promise((resolve, reject) => {
this.http.get(apiUrl, body)
.pipe(
// 에러가 발생하면 err를 녀ㅠㄴㅊ갸ㅠㄷdml next 로 보낸다.
catchError(err => { return of(err); })
// catchError(this.handleError)
// catchError(err => {return of(this.handleError(err));})
)
.subscribe({
next: (v) => resolve(v),
error: (e) => reject(e),
complete: () => console.info('complete')
});
});
}
/**
* @param Object obj {url, params}
* @return Callback Function
*/
post(obj) {
const apiUrl = obj.url;
const params = obj.params;
const body = {};
body.observe = 'response';
if (typeof obj.headers !== 'undefined') {
body.headers = this.createHeders(obj.headers);
}
return new Promise((resolve) => {
this.http.post(apiUrl, params, body)
.subscribe({
next: (v) => resolve(v),
error: (e) => this.logError(e),
complete: () => console.info('complete')
});
});
}
/**
* @param Object obj {url, params}
* @return Callback Function
*/
delete(obj) {
const apiUrl = obj.url;
const body = {};
body.observe = 'response';
if (typeof obj.headers !== 'undefined') {
body.headers = this.createHeders(obj.headers);
}
return new Promise((resolve) => {
this.http.delete(apiUrl, body)
.subscribe({
next: (v) => resolve(v),
error: (e) => this.logError(e),
complete: () => console.info('complete')
});
});
}
/**
* @param Object obj {url, params}
* @return Callback Function
*/
update(obj) {
const apiUrl = obj.url;
const params = obj.params;
const body = {};
body.observe = 'response';
if (typeof obj.headers !== 'undefined') {
body.headers = this.createHeders(obj.headers);
}
return new Promise((resolve) => {
this.http.post(apiUrl, params, body)
.subscribe({
next: (v) => resolve(v),
error: (e) => this.logError(e),
complete: () => console.info('complete')
});
});
}
/**
* @param Object obj {url, params}
* @return Callback Function
*/
put(obj) {
const apiUrl = obj.url;
const params = obj.params;
const body = {};
body.observe = 'response';
if (typeof obj.headers !== 'undefined') {
body.headers = this.createHeders(obj.headers);
}
return new Promise((resolve) => {
this.http.put(apiUrl, params, body)
.subscribe({
next: (v) => resolve(v),
error: (e) => this.logError(e),
complete: () => console.info('complete')
});
});
}
/**
* @param Object headers : headers {k1:v1, k2:v2....}
*/
createHeders(headers) {
let header = new HttpHeaders(); // { 'Content-Type': 'application/json' }
if (!Object.entries) {
Object.entries = (entryObj) => {
const ownProps = Object.keys(entryObj);
let i = ownProps.length;
const resArray = new Array(i); // preallocate the Array
while (i--) {
resArray[i] = [ownProps[i], entryObj[ownProps[i]]];
}
return resArray;
};
}
Object.entries(headers).forEach(([key, value]) => header = header.append(key, String(value)));
return header;
}
extractData(res) {
try {
if (typeof res.constructor !== 'undefined' && res.constructor.name === 'HttpResponse') {
return res.body;
}
else {
const body = res.json();
return body || {};
}
}
catch (e) {
return res._body;
}
}
handleError(error) {
if (error.status === 0) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occurred:', error.error);
}
else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong.
console.error(`Backend returned code ${error.status}, body was: `, error.error);
}
return error;
// return throwError(() => new Error('Something bad happened; please try again later.'));
}
logError(err) {
console.error('There was an error: ');
console.error(err);
}
/**
* Not yet tested
* @param Object obj {url, params, headers}
* url : String,
* params {k1:v1, k2:v2....}
* headers {k1:v1, k2:v2....}
* @return Callback Function
* @param String filetype application/ms-excel image/jpeg, image/png, and image/svg+xml.
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types
*/
filedownload(obj, filetype) {
const apiUrl = obj.url;
const body = {};
body.observe = 'response';
body.responseType = 'arraybuffer'; // add responseType
if (!Object.entries) {
Object.entries = (entryObj) => {
const ownProps = Object.keys(entryObj);
let i = ownProps.length;
const resArray = new Array(i); // preallocate the Array
while (i--) {
resArray[i] = [ownProps[i], entryObj[ownProps[i]]];
}
return resArray;
};
}
if (typeof obj.params !== 'undefined') {
let Params = new HttpParams();
Object.entries(obj.params).forEach(([key, value]) => Params = Params.append(key, String(value)));
body.params = Params;
}
if (typeof obj.headers !== 'undefined') {
body.headers = this.createHeders(obj.headers);
}
if (typeof obj.headers !== 'undefined') {
this.createHeders(obj.headers);
}
return new Promise((resolve) => {
this.http.get(apiUrl, body)
.pipe(
// catchError(this.handleError)
catchError(err => { return of(err); })
// catchError(err => {return of(this.handleError(err));})
)
.subscribe({
next: (v) => resolve(v.body),
error: (e) => this.logError(e),
complete: () => console.info('complete')
});
});
}
/**
* Method is use to download file.
* @param data - Array Buffer data
* @param type - type of the document.
*/
downLoadFile(data, type) {
const blob = new Blob([data], { type });
const url = window.URL.createObjectURL(blob);
const pwa = window.open(url);
if (!pwa || pwa.closed || typeof pwa.closed === 'undefined') {
console.log('Please disable your Pop-up blocker and try again.');
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: RestHttpClient, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: RestHttpClient }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: RestHttpClient, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcmVzdC1odHRwL3NyYy9saWIvaHR0cC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxXQUFXLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUYsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUc1QyxNQUFNLE9BQU8sY0FBYztJQUN6QixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUcsQ0FBQztJQUV4Qzs7Ozs7O09BTUc7SUFDSSxHQUFHLENBQUMsR0FBUTtRQUNqQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFRLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNuQixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUUsUUFBYSxFQUFHLEVBQUU7Z0JBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUUsUUFBUSxDQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO2dCQUN2RCxPQUFPLENBQUMsRUFBRSxFQUFFO29CQUNWLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFD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dCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMsIEh0dHBIZWFkZXJzLCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgdGhyb3dFcnJvciwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJlc3RIdHRwQ2xpZW50IHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBPYmplY3Qgb2JqIHt1cmwsIHBhcmFtcywgaGVhZGVyc31cclxuICAgKiB1cmwgOiBTdHJpbmcsXHJcbiAgICogcGFyYW1zIHtrMTp2MSwgazI6djIuLi4ufVxyXG4gICAqIGhlYWRlcnMge2sxOnYxLCBrMjp2Mi4uLi59XHJcbiAgICogQHJldHVybiBDYWxsYmFjayBGdW5jdGlvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQob2JqOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgYXBpVXJsID0gb2JqLnVybDtcclxuICAgIGNvbnN0IGJvZHk6IGFueSA9IHt9O1xyXG4gICAgYm9keS5vYnNlcnZlID0gJ3Jlc3BvbnNlJztcclxuXHJcbiAgICBpZiAoIU9iamVjdC5lbnRyaWVzKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzID0gKCBlbnRyeU9iajogYW55ICkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG93blByb3BzID0gT2JqZWN0LmtleXMoIGVudHJ5T2JqICk7XHJcbiAgICAgICAgbGV0IGkgPSBvd25Qcm9wcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzQXJyYXkgPSBuZXcgQXJyYXkoaSk7IC8vIHByZWFsbG9jYXRlIHRoZSBBcnJheVxyXG4gICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgIHJlc0FycmF5W2ldID0gW293blByb3BzW2ldLCBlbnRyeU9ialtvd25Qcm9wc1tpXV1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzQXJyYXk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvYmoucGFyYW1zICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBsZXQgUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgICAgT2JqZWN0LmVudHJpZXMob2JqLnBhcmFtcykuZm9yRWFjaChcclxuICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiBQYXJhbXMgPSBQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGJvZHkucGFyYW1zID0gUGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGJvZHkuaGVhZGVycyA9IHRoaXMuY3JlYXRlSGVkZXJzKG9iai5oZWFkZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmh0dHAuZ2V0KGFwaVVybCwgYm9keSlcclxuICAgICAgLnBpcGUgKFxyXG4gICAgICAgIC8vIOyXkOufrOqwgCDrsJzsg53tlZjrqbQgZXJy66W8IOuFgOOFoOOEtOOFiuqwuOOFoOOEt2RtbCBuZXh0IOuhnCDrs7Trgrjri6QuXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge3JldHVybiBvZihlcnIpO30pXHJcbiAgICAgICAgLy8gY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IoZXJyID0+IHtyZXR1cm4gb2YodGhpcy5oYW5kbGVFcnJvcihlcnIpKTt9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICh2KSA9PiByZXNvbHZlKHYpLFxyXG4gICAgICAgIGVycm9yOiAoZSkgPT4gcmVqZWN0KGUpLCAvLyAgdGhpcy5sb2dFcnJvcihlKSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4gY29uc29sZS5pbmZvKCdjb21wbGV0ZScpIFxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBPYmplY3Qgb2JqIHt1cmwsIHBhcmFtc31cclxuICAgKiBAcmV0dXJuIENhbGxiYWNrIEZ1bmN0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3Qob2JqOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgYXBpVXJsID0gb2JqLnVybDtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG9iai5wYXJhbXM7XHJcblxyXG4gICAgY29uc3QgYm9keTogYW55ID0ge307XHJcbiAgICBib2R5Lm9ic2VydmUgPSAncmVzcG9uc2UnO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGJvZHkuaGVhZGVycyA9IHRoaXMuY3JlYXRlSGVkZXJzKG9iai5oZWFkZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgdGhpcy5odHRwLnBvc3QoYXBpVXJsLCBwYXJhbXMsICBib2R5KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodikgPT4gcmVzb2x2ZSh2KSxcclxuICAgICAgICBlcnJvcjogKGUpID0+IHRoaXMubG9nRXJyb3IoZSksXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUuaW5mbygnY29tcGxldGUnKSBcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gT2JqZWN0IG9iaiB7dXJsLCBwYXJhbXN9XHJcbiAgICogQHJldHVybiBDYWxsYmFjayBGdW5jdGlvblxyXG4gICAqL1xyXG5cclxuICBwdWJsaWMgZGVsZXRlKG9iajogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGFwaVVybCA9IG9iai51cmw7XHJcbiAgICBjb25zdCBib2R5OiBhbnkgPSB7fTtcclxuICAgIGJvZHkub2JzZXJ2ZSA9ICdyZXNwb25zZSc7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvYmouaGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgYm9keS5oZWFkZXJzID0gdGhpcy5jcmVhdGVIZWRlcnMob2JqLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLmh0dHAuZGVsZXRlKGFwaVVybCwgYm9keSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHYpID0+IHJlc29sdmUodiksXHJcbiAgICAgICAgZXJyb3I6IChlKSA9PiB0aGlzLmxvZ0Vycm9yKGUpLFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiBjb25zb2xlLmluZm8oJ2NvbXBsZXRlJykgXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIE9iamVjdCBvYmoge3VybCwgcGFyYW1zfVxyXG4gICAqIEByZXR1cm4gQ2FsbGJhY2sgRnVuY3Rpb25cclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlKG9iajogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGFwaVVybCA9IG9iai51cmw7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBvYmoucGFyYW1zO1xyXG4gICAgY29uc3QgYm9keTogYW55ID0ge307XHJcbiAgICBib2R5Lm9ic2VydmUgPSAncmVzcG9uc2UnO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGJvZHkuaGVhZGVycyA9IHRoaXMuY3JlYXRlSGVkZXJzKG9iai5oZWFkZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgdGhpcy5odHRwLnBvc3QoYXBpVXJsLCBwYXJhbXMsICBib2R5KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodikgPT4gcmVzb2x2ZSh2KSxcclxuICAgICAgICBlcnJvcjogKGUpID0+IHRoaXMubG9nRXJyb3IoZSksXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUuaW5mbygnY29tcGxldGUnKSBcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gT2JqZWN0IG9iaiB7dXJsLCBwYXJhbXN9XHJcbiAgICogQHJldHVybiBDYWxsYmFjayBGdW5jdGlvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBwdXQob2JqOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgYXBpVXJsID0gb2JqLnVybDtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG9iai5wYXJhbXM7XHJcbiAgICBjb25zdCBib2R5OiBhbnkgPSB7fTtcclxuICAgIGJvZHkub2JzZXJ2ZSA9ICdyZXNwb25zZSc7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvYmouaGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgYm9keS5oZWFkZXJzID0gdGhpcy5jcmVhdGVIZWRlcnMob2JqLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLmh0dHAucHV0KGFwaVVybCwgcGFyYW1zLCAgYm9keSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHYpID0+IHJlc29sdmUodiksXHJcbiAgICAgICAgZXJyb3I6IChlKSA9PiB0aGlzLmxvZ0Vycm9yKGUpLFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiBjb25zb2xlLmluZm8oJ2NvbXBsZXRlJykgXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBPYmplY3QgaGVhZGVycyA6IGhlYWRlcnMge2sxOnYxLCBrMjp2Mi4uLi59XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVIZWRlcnMoaGVhZGVyczogSHR0cEhlYWRlcnMpOiBIdHRwSGVhZGVycyB7XHJcbiAgICBsZXQgaGVhZGVyID0gbmV3IEh0dHBIZWFkZXJzICgpOyAvLyB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxyXG5cclxuICAgIGlmICghT2JqZWN0LmVudHJpZXMpIHtcclxuICAgICAgT2JqZWN0LmVudHJpZXMgPSAoIGVudHJ5T2JqOiBhbnkgKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3duUHJvcHMgPSBPYmplY3Qua2V5cyggZW50cnlPYmogKTtcclxuICAgICAgICBsZXQgaSA9IG93blByb3BzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXNBcnJheSA9IG5ldyBBcnJheShpKTsgLy8gcHJlYWxsb2NhdGUgdGhlIEFycmF5XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgcmVzQXJyYXlbaV0gPSBbb3duUHJvcHNbaV0sIGVudHJ5T2JqW293blByb3BzW2ldXV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNBcnJheTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5mb3JFYWNoIChcclxuICAgICAgKFtrZXksIHZhbHVlXSkgPT4gaGVhZGVyID0gaGVhZGVyLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBoZWFkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4dHJhY3REYXRhKHJlczogYW55KTogYW55IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICggdHlwZW9mIHJlcy5jb25zdHJ1Y3RvciAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVzLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdIdHRwUmVzcG9uc2UnKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcy5ib2R5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXMuanNvbigpO1xyXG4gICAgICAgIHJldHVybiBib2R5IHx8IHt9O1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiByZXMuX2JvZHk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gMCkge1xyXG4gICAgICAvLyBBIGNsaWVudC1zaWRlIG9yIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIEhhbmRsZSBpdCBhY2NvcmRpbmdseS5cclxuICAgICAgY29uc29sZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQ6JywgZXJyb3IuZXJyb3IpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVGhlIGJhY2tlbmQgcmV0dXJuZWQgYW4gdW5zdWNjZXNzZnVsIHJlc3BvbnNlIGNvZGUuXHJcbiAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IG1heSBjb250YWluIGNsdWVzIGFzIHRvIHdoYXQgd2VudCB3cm9uZy5cclxuICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICBgQmFja2VuZCByZXR1cm5lZCBjb2RlICR7ZXJyb3Iuc3RhdHVzfSwgYm9keSB3YXM6IGAsIGVycm9yLmVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlcnJvcjtcclxuICAgIC8vIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignU29tZXRoaW5nIGJhZCBoYXBwZW5lZDsgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvZ0Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3I6ICcpO1xyXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm90IHlldCB0ZXN0ZWRcclxuICAgKiBAcGFyYW0gT2JqZWN0IG9iaiB7dXJsLCBwYXJhbXMsIGhlYWRlcnN9XHJcbiAgICogdXJsIDogU3RyaW5nLFxyXG4gICAqIHBhcmFtcyB7azE6djEsIGsyOnYyLi4uLn1cclxuICAgKiBoZWFkZXJzIHtrMTp2MSwgazI6djIuLi4ufVxyXG4gICAqIEByZXR1cm4gQ2FsbGJhY2sgRnVuY3Rpb25cclxuICAgKiBAcGFyYW0gU3RyaW5nIGZpbGV0eXBlIGFwcGxpY2F0aW9uL21zLWV4Y2VsICBpbWFnZS9qcGVnLCBpbWFnZS9wbmcsIGFuZCBpbWFnZS9zdmcreG1sLlxyXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWxlZG93bmxvYWQob2JqOiBhbnksIGZpbGV0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGFwaVVybCA9IG9iai51cmw7XHJcbiAgICBjb25zdCBib2R5OiBhbnkgPSB7fTtcclxuICAgIGJvZHkub2JzZXJ2ZSA9ICdyZXNwb25zZSc7XHJcbiAgICBib2R5LnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7IC8vIGFkZCByZXNwb25zZVR5cGVcclxuXHJcbiAgICBpZiAoIU9iamVjdC5lbnRyaWVzKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzID0gKCBlbnRyeU9iajogYW55ICkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG93blByb3BzID0gT2JqZWN0LmtleXMoIGVudHJ5T2JqICk7XHJcbiAgICAgICAgbGV0IGkgPSBvd25Qcm9wcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzQXJyYXkgPSBuZXcgQXJyYXkoaSk7IC8vIHByZWFsbG9jYXRlIHRoZSBBcnJheVxyXG4gICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgIHJlc0FycmF5W2ldID0gW293blByb3BzW2ldLCBlbnRyeU9ialtvd25Qcm9wc1tpXV1dO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc0FycmF5O1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb2JqLnBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgbGV0IFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKG9iai5wYXJhbXMpLmZvckVhY2goXHJcbiAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gUGFyYW1zID0gUGFyYW1zLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBib2R5LnBhcmFtcyA9IFBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9iai5oZWFkZXJzICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBib2R5LmhlYWRlcnMgPSB0aGlzLmNyZWF0ZUhlZGVycyhvYmouaGVhZGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvYmouaGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5jcmVhdGVIZWRlcnMob2JqLmhlYWRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLmh0dHAuZ2V0KGFwaVVybCwgYm9keSlcclxuICAgICAgLnBpcGUgKFxyXG4gICAgICAgIC8vIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7cmV0dXJuIG9mKGVycik7fSlcclxuICAgICAgICAvLyBjYXRjaEVycm9yKGVyciA9PiB7cmV0dXJuIG9mKHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7fSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAodjogYW55KSA9PiByZXNvbHZlKHYuYm9keSksXHJcbiAgICAgICAgZXJyb3I6IChlKSA9PiB0aGlzLmxvZ0Vycm9yKGUpLFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiBjb25zb2xlLmluZm8oJ2NvbXBsZXRlJykgXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuICAvKipcclxuICAgKiBNZXRob2QgaXMgdXNlIHRvIGRvd25sb2FkIGZpbGUuXHJcbiAgICogQHBhcmFtIGRhdGEgLSBBcnJheSBCdWZmZXIgZGF0YVxyXG4gICAqIEBwYXJhbSB0eXBlIC0gdHlwZSBvZiB0aGUgZG9jdW1lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkb3duTG9hZEZpbGUoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZX0pO1xyXG5cclxuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgY29uc3QgcHdhID0gd2luZG93Lm9wZW4odXJsKTtcclxuICAgIGlmICghcHdhIHx8IHB3YS5jbG9zZWQgfHwgdHlwZW9mIHB3YS5jbG9zZWQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCAnUGxlYXNlIGRpc2FibGUgeW91ciBQb3AtdXAgYmxvY2tlciBhbmQgdHJ5IGFnYWluLicpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=