@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
195 lines (188 loc) • 22.2 kB
JavaScript
export class CsvConfigConsts {
}
CsvConfigConsts.EOL = '\r\n';
CsvConfigConsts.BOM = '\ufeff';
CsvConfigConsts.DEFAULT_FIELD_SEPARATOR = ',';
CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR = '.';
CsvConfigConsts.DEFAULT_QUOTE = '"';
CsvConfigConsts.DEFAULT_SHOW_TITLE = false;
CsvConfigConsts.DEFAULT_TITLE = 'My Report';
CsvConfigConsts.DEFAULT_FILENAME = 'mycsv.csv';
CsvConfigConsts.DEFAULT_SHOW_LABELS = false;
CsvConfigConsts.DEFAULT_USE_BOM = true;
CsvConfigConsts.DEFAULT_HEADER = [];
CsvConfigConsts.DEFAULT_NO_DOWNLOAD = false;
CsvConfigConsts.DEFAULT_NULL_TO_EMPTY_STRING = false;
export const ConfigDefaults = {
filename: CsvConfigConsts.DEFAULT_FILENAME,
fieldSeparator: CsvConfigConsts.DEFAULT_FIELD_SEPARATOR,
quoteStrings: CsvConfigConsts.DEFAULT_QUOTE,
decimalseparator: CsvConfigConsts.DEFAULT_DECIMAL_SEPARATOR,
showLabels: CsvConfigConsts.DEFAULT_SHOW_LABELS,
showTitle: CsvConfigConsts.DEFAULT_SHOW_TITLE,
title: CsvConfigConsts.DEFAULT_TITLE,
useBom: CsvConfigConsts.DEFAULT_USE_BOM,
headers: CsvConfigConsts.DEFAULT_HEADER,
noDownload: CsvConfigConsts.DEFAULT_NO_DOWNLOAD,
nullToEmptyString: CsvConfigConsts.DEFAULT_NULL_TO_EMPTY_STRING,
};
export class ExportToCsv {
constructor(DataJSON, filename, options) {
this.csv = '';
const config = options || {};
if (typeof DataJSON === 'string') {
this.data = JSON.parse(JSON.stringify(DataJSON));
}
else {
this.data =
typeof DataJSON !== 'object' ? JSON.parse(DataJSON) : DataJSON;
}
this._options = objectAssign({}, ConfigDefaults, config);
if (this._options.filename) {
this._options.filename = filename;
}
}
/**
* Check if is Float
* @param {any} input
*/
static isFloat(input) {
return +input === input && (!isFinite(input) || Boolean(input % 1));
}
/**
* Generate CSV To string
*/
csvToString() {
if (this._options.useBom) {
this.csv += CsvConfigConsts.BOM;
}
if (this._options.showTitle) {
this.csv += this._options.title + '\r\n\n';
}
this.getHeaders();
this.getBody();
if (this.csv === '') {
console.log('Invalid data');
return '';
}
return this.csv;
/*
if (this._options.noDownload) {
}
const blob = new Blob([this.csv], {'type': 'text/csv;charset=utf8;'});
if (navigator.msSaveBlob) {
const filename = this._options.filename.replace(/ /g, '_') + '.csv';
navigator.msSaveBlob(blob, filename);
} else {
const uri = 'data:attachment/csv;charset=utf-8,' + encodeURI(this.csv);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.setAttribute('visibility', 'hidden');
link.download = this._options.filename.replace(/ /g, '_') + '.csv';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
*/
}
/**
* Create Headers
*/
getHeaders() {
if (this._options.headers.length > 0) {
const { headers } = this._options;
let row = headers.reduce((headerRow, header) => {
return headerRow + header + this._options.fieldSeparator;
}, '');
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}
/**
* Create Body
*/
getBody() {
for (let i = 0; i < this.data.length; i++) {
let row = '';
for (const index in this.data[i]) {
row +=
this.formatData(this.data[i][index]) + this._options.fieldSeparator;
}
row = row.slice(0, -1);
this.csv += row + CsvConfigConsts.EOL;
}
}
/**
* Format Data
* @param {any} data
*/
formatData(data) {
if (this._options.decimalseparator === 'locale' &&
ExportToCsv.isFloat(data)) {
return data.toLocaleString();
}
if (this._options.decimalseparator !== '.' && ExportToCsv.isFloat(data)) {
return data.toString().replace('.', this._options.decimalseparator);
}
if (typeof data === 'string') {
data = data.replace(/"/g, '""');
if (this._options.quoteStrings ||
data.indexOf(',') > -1 ||
data.indexOf('\n') > -1 ||
data.indexOf('\r') > -1) {
data = this._options.quoteStrings + data + this._options.quoteStrings;
}
return data;
}
if (this._options.nullToEmptyString) {
if (data === null) {
return (data = '');
}
return data;
}
if (typeof data === 'boolean') {
return data ? 'TRUE' : 'FALSE';
}
return data;
}
}
const hasOwnProperty = Object.prototype.hasOwnProperty;
const propIsEnumerable = Object.prototype.propertyIsEnumerable;
/**
* Convet to Object
* @param {any} val
*/
function toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
/**
* Assign data to new Object
* @param {any} target
* @param {any[]} ...source
*/
function objectAssign(target, ...source) {
let from;
const to = toObject(target);
let symbols;
for (let s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (const key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if (Object.getOwnPropertySymbols) {
symbols = Object.getOwnPropertySymbols(from);
for (let i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL2Nzdi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxPQUFPLGVBQWU7O0FBQ1osbUJBQUcsR0FBRyxNQUFNLENBQUM7QUFDYixtQkFBRyxHQUFHLFFBQVEsQ0FBQztBQUVmLHVDQUF1QixHQUFHLEdBQUcsQ0FBQztBQUM5Qix5Q0FBeUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsNkJBQWEsR0FBRyxHQUFHLENBQUM7QUFDcEIsa0NBQWtCLEdBQUcsS0FBSyxDQUFDO0FBQzNCLDZCQUFhLEdBQUcsV0FBVyxDQUFDO0FBQzVCLGdDQUFnQixHQUFHLFdBQVcsQ0FBQztBQUMvQixtQ0FBbUIsR0FBRyxLQUFLLENBQUM7QUFDNUIsK0JBQWUsR0FBRyxJQUFJLENBQUM7QUFDdkIsOEJBQWMsR0FBVSxFQUFFLENBQUM7QUFDM0IsbUNBQW1CLEdBQUcsS0FBSyxDQUFDO0FBQzVCLDRDQUE0QixHQUFHLEtBQUssQ0FBQztBQUdyRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQVk7SUFDckMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxnQkFBZ0I7SUFDMUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyx1QkFBdUI7SUFDdkQsWUFBWSxFQUFFLGVBQWUsQ0FBQyxhQUFhO0lBQzNDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyx5QkFBeUI7SUFDM0QsVUFBVSxFQUFFLGVBQWUsQ0FBQyxtQkFBbUI7SUFDL0MsU0FBUyxFQUFFLGVBQWUsQ0FBQyxrQkFBa0I7SUFDN0MsS0FBSyxFQUFFLGVBQWUsQ0FBQyxhQUFhO0lBQ3BDLE1BQU0sRUFBRSxlQUFlLENBQUMsZUFBZTtJQUN2QyxPQUFPLEVBQUUsZUFBZSxDQUFDLGNBQWM7SUFDdkMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxtQkFBbUI7SUFDL0MsaUJBQWlCLEVBQUUsZUFB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SUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3pDLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDbEMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyQjtTQUNGO1FBRUQsSUFBVSxNQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDdkMsT0FBTyxHQUFTLE1BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMzQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuQzthQUNGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGZpZWxkU2VwYXJhdG9yOiBzdHJpbmc7XG4gIHF1b3RlU3RyaW5nczogc3RyaW5nO1xuICBkZWNpbWFsc2VwYXJhdG9yOiBzdHJpbmc7XG4gIHNob3dMYWJlbHM6IGJvb2xlYW47XG4gIHNob3dUaXRsZTogYm9vbGVhbjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdXNlQm9tOiBib29sZWFuO1xuICBoZWFkZXJzOiBzdHJpbmdbXTtcbiAgbm9Eb3dubG9hZDogYm9vbGVhbjtcbiAgbnVsbFRvRW1wdHlTdHJpbmc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBDc3ZDb25maWdDb25zdHMge1xuICBwdWJsaWMgc3RhdGljIEVPTCA9ICdcXHJcXG4nO1xuICBwdWJsaWMgc3RhdGljIEJPTSA9ICdcXHVmZWZmJztcblxuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfRklFTERfU0VQQVJBVE9SID0gJywnO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfREVDSU1BTF9TRVBBUkFUT1IgPSAnLic7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9RVU9URSA9ICdcIic7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9TSE9XX1RJVExFID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9USVRMRSA9ICdNeSBSZXBvcnQnO1xuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfRklMRU5BTUUgPSAnbXljc3YuY3N2JztcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NIT1dfTEFCRUxTID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9VU0VfQk9NID0gdHJ1ZTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0hFQURFUjogYW55W10gPSBbXTtcbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX05PX0RPV05MT0FEID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9OVUxMX1RPX0VNUFRZX1NUUklORyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3QgQ29uZmlnRGVmYXVsdHM6IE9wdGlvbnMgPSB7XG4gIGZpbGVuYW1lOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9GSUxFTkFNRSxcbiAgZmllbGRTZXBhcmF0b3I6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX0ZJRUxEX1NFUEFSQVRPUixcbiAgcXVvdGVTdHJpbmdzOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9RVU9URSxcbiAgZGVjaW1hbHNlcGFyYXRvcjogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfREVDSU1BTF9TRVBBUkFUT1IsXG4gIHNob3dMYWJlbHM6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1NIT1dfTEFCRUxTLFxuICBzaG93VGl0bGU6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX1NIT1dfVElUTEUsXG4gIHRpdGxlOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9USVRMRSxcbiAgdXNlQm9tOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9VU0VfQk9NLFxuICBoZWFkZXJzOiBDc3ZDb25maWdDb25zdHMuREVGQVVMVF9IRUFERVIsXG4gIG5vRG93bmxvYWQ6IENzdkNvbmZpZ0NvbnN0cy5ERUZBVUxUX05PX0RPV05MT0FELFxuICBudWxsVG9FbXB0eVN0cmluZzogQ3N2Q29uZmlnQ29uc3RzLkRFRkFVTFRfTlVMTF9UT19FTVBUWV9TVFJJTkcsXG59O1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0VG9Dc3Yge1xuICBjb25zdHJ1Y3RvcihcbiAgICBEYXRhSlNPTjogUmVjb3JkPHN0cmluZywgYW55PltdIHwgc3RyaW5nLFxuICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8T3B0aW9ucz5cbiAgKSB7XG4gICAgY29uc3QgY29uZmlnID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICh0eXBlb2YgRGF0YUpTT04gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KERhdGFKU09OKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9XG4gICAgICAgIHR5cGVvZiBEYXRhSlNPTiAhPT0gJ29iamVjdCcgPyBKU09OLnBhcnNlKERhdGFKU09OKSA6IERhdGFKU09OO1xuICAgIH1cblxuICAgIHRoaXMuX29wdGlvbnMgPSBvYmplY3RBc3NpZ24oe30sIENvbmZpZ0RlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuZmlsZW5hbWUpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICB9XG4gIH1cblxuICAvLyBwdWJsaWMgZmlsZU5hbWU6IHN0cmluZztcbiAgLy8gcHVibGljIGxhYmVsczogQXJyYXk8U3RyaW5nPjtcbiAgcHVibGljIGRhdGE6IGFueVtdO1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IE9wdGlvbnM7XG4gIHByaXZhdGUgY3N2ID0gJyc7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGlzIEZsb2F0XG4gICAqIEBwYXJhbSB7YW55fSBpbnB1dFxuICAgKi9cbiAgc3RhdGljIGlzRmxvYXQoaW5wdXQ6IGFueSkge1xuICAgIHJldHVybiAraW5wdXQgPT09IGlucHV0ICYmICghaXNGaW5pdGUoaW5wdXQpIHx8IEJvb2xlYW4oaW5wdXQgJSAxKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgQ1NWIFRvIHN0cmluZ1xuICAgKi9cbiAgcHVibGljIGNzdlRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMudXNlQm9tKSB7XG4gICAgICB0aGlzLmNzdiArPSBDc3ZDb25maWdDb25zdHMuQk9NO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vcHRpb25zLnNob3dUaXRsZSkge1xuICAgICAgdGhpcy5jc3YgKz0gdGhpcy5fb3B0aW9ucy50aXRsZSArICdcXHJcXG5cXG4nO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0SGVhZGVycygpO1xuICAgIHRoaXMuZ2V0Qm9keSgpO1xuXG4gICAgaWYgKHRoaXMuY3N2ID09PSAnJykge1xuICAgICAgY29uc29sZS5sb2coJ0ludmFsaWQgZGF0YScpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNzdjtcbiAgICAvKlxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5ub0Rvd25sb2FkKSB7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5jc3ZdLCB7J3R5cGUnOiAndGV4dC9jc3Y7Y2hhcnNldD11dGY4Oyd9KTtcblxuICAgICAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5fb3B0aW9ucy5maWxlbmFtZS5yZXBsYWNlKC8gL2csICdfJykgKyAnLmNzdic7XG4gICAgICAgICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBmaWxlbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSAnZGF0YTphdHRhY2htZW50L2NzdjtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUkkodGhpcy5jc3YpO1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcblxuICAgICAgICAgICAgbGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cbiAgICAgICAgICAgIGxpbmsuZG93bmxvYWQgPSB0aGlzLl9vcHRpb25zLmZpbGVuYW1lLnJlcGxhY2UoLyAvZywgJ18nKSArICcuY3N2JztcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgIH1cbiAgICAgICAgICovXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEhlYWRlcnNcbiAgICovXG4gIGdldEhlYWRlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaGVhZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHRoaXMuX29wdGlvbnM7XG4gICAgICBsZXQgcm93ID0gaGVhZGVycy5yZWR1Y2UoKGhlYWRlclJvdywgaGVhZGVyKSA9PiB7XG4gICAgICAgIHJldHVybiBoZWFkZXJSb3cgKyBoZWFkZXIgKyB0aGlzLl9vcHRpb25zLmZpZWxkU2VwYXJhdG9yO1xuICAgICAgfSwgJycpO1xuICAgICAgcm93ID0gcm93LnNsaWNlKDAsIC0xKTtcbiAgICAgIHRoaXMuY3N2ICs9IHJvdyArIENzdkNvbmZpZ0NvbnN0cy5FT0w7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBCb2R5XG4gICAqL1xuICBnZXRCb2R5KCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgcm93ID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IGluIHRoaXMuZGF0YVtpXSkge1xuICAgICAgICByb3cgKz1cbiAgICAgICAgICB0aGlzLmZvcm1hdERhdGEodGhpcy5kYXRhW2ldW2luZGV4XSkgKyB0aGlzLl9vcHRpb25zLmZpZWxkU2VwYXJhdG9yO1xuICAgICAgfVxuXG4gICAgICByb3cgPSByb3cuc2xpY2UoMCwgLTEpO1xuICAgICAgdGhpcy5jc3YgKz0gcm93ICsgQ3N2Q29uZmlnQ29uc3RzLkVPTDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IERhdGFcbiAgICogQHBhcmFtIHthbnl9IGRhdGFcbiAgICovXG4gIGZvcm1hdERhdGEoZGF0YTogYW55KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fb3B0aW9ucy5kZWNpbWFsc2VwYXJhdG9yID09PSAnbG9jYWxlJyAmJlxuICAgICAgRXhwb3J0VG9Dc3YuaXNGbG9hdChkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGEudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5kZWNpbWFsc2VwYXJhdG9yICE9PSAnLicgJiYgRXhwb3J0VG9Dc3YuaXNGbG9hdChkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgdGhpcy5fb3B0aW9ucy5kZWNpbWFsc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9vcHRpb25zLnF1b3RlU3RyaW5ncyB8fFxuICAgICAgICBkYXRhLmluZGV4T2YoJywnKSA+IC0xIHx8XG4gICAgICAgIGRhdGEuaW5kZXhPZignXFxuJykgPiAtMSB8fFxuICAgICAgICBkYXRhLmluZGV4T2YoJ1xccicpID4gLTFcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gdGhpcy5fb3B0aW9ucy5xdW90ZVN0cmluZ3MgKyBkYXRhICsgdGhpcy5fb3B0aW9ucy5xdW90ZVN0cmluZ3M7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5udWxsVG9FbXB0eVN0cmluZykge1xuICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIChkYXRhID0gJycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBkYXRhID8gJ1RSVUUnIDogJ0ZBTFNFJztcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn1cblxuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuY29uc3QgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ29udmV0IHRvIE9iamVjdFxuICogQHBhcmFtIHthbnl9IHZhbFxuICovXG5mdW5jdGlvbiB0b09iamVjdCh2YWw6IGFueSkge1xuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCdcbiAgICApO1xuICB9XG4gIHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuLyoqXG4gKiBBc3NpZ24gZGF0YSAgdG8gbmV3IE9iamVjdFxuICogQHBhcmFtIHthbnl9ICAgdGFyZ2V0XG4gKiBAcGFyYW0ge2FueVtdfSAuLi5zb3VyY2VcbiAqL1xuZnVuY3Rpb24gb2JqZWN0QXNzaWduKHRhcmdldDogYW55LCAuLi5zb3VyY2U6IGFueVtdKSB7XG4gIGxldCBmcm9tOiBhbnk7XG4gIGNvbnN0IHRvID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgbGV0IHN5bWJvbHM6IGFueTtcblxuICBmb3IgKGxldCBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuICAgIGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcbiAgICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKDxhbnk+T2JqZWN0KS5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIHN5bWJvbHMgPSAoPGFueT5PYmplY3QpLmdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG4gICAgICAgICAgdG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cbiJdfQ==