UNPKG

ng-rest-http

Version:

http client module for Angular [ tested for angular6 ]

259 lines 32.2 kB
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=