zater-docx-pdf2
Version:
ZAter doc2pdf
237 lines (204 loc) • 27.9 kB
JavaScript
;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _ErrorDocxPdf = require('../lib/ErrorDocxPdf');
var _ErrorDocxPdf2 = _interopRequireDefault(_ErrorDocxPdf);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _date = require('../lib/date');
var _date2 = _interopRequireDefault(_date);
var _base64IMGtoBuffer = require('../lib/base64IMGtoBuffer');
var _base64IMGtoBuffer2 = _interopRequireDefault(_base64IMGtoBuffer);
var _ContractDecorator = require('../decorators/ContractDecorator');
var _ContractDecorator2 = _interopRequireDefault(_ContractDecorator);
var _nodeFetch = require('node-fetch');
var _nodeFetch2 = _interopRequireDefault(_nodeFetch);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
const numeroPorExtenso = require('numero-por-extenso');
const CPF = require('cpf');
class Contract extends _ContractDecorator2.default {
constructor(Docx, DigitalData, S3Storage, PdfGenerator) {
super();
this.Storage = S3Storage;
this.Docx = Docx;
this.PdfGenerator = PdfGenerator;
this.setDigitalData(DigitalData);
}
setConfig(config) {
this.config = config;
this.Storage = this.Storage(config);
}
makeCPF(data) {
return _asyncToGenerator(function* () {
const cotacao = yield (0, _nodeFetch2.default)('https://www.btcbuyshop.com/api/crawlers/icoinomia').then(function (res) {
return res.json();
}).then(function (json) {
return json.response.clean.replace(/[\D]+/g, '');
}).then(function (value) {
return parseInt(value);
}).then(function (value) {
return (value / 100).toFixed(2);
});
const val = numeroPorExtenso.porExtenso(parseFloat(cotacao), numeroPorExtenso.estilo.monetario);
const amountMoney = `${cotacao} (${val})`;
// const {year, month, day} = dateFormat.datePTBR();
const contract = _extends({
investmentId: data.id,
type: data.type,
penaltyPorcent: data.penaltyPorcent || 0,
clientName: data.clientName || 'Daniel Silva Miranda',
managerName: data.managerName || 'Daniel Silva Miranda',
penaltyAdv: data.penaltyAdv || 0,
contractNumber: data.contractNumber || 'Exemplo',
contractEnd: data.contractEnd || '00/00/0000',
contractTaxe: data.contractTaxe || 0,
contractTrade: data.contractTrade || 0,
amountCrypt: data.amountCrypt || 0,
contractPorcent: data.contractPorcent || 0,
bankName: data.bank.name || 'BTC Banco',
bankTitular: data.bank.userName || 'BTC Banco',
bankAgency: data.bank.agency || '0000',
bankAccount: data.bank.account || '0000-00',
bankCode: data.bank.code || '0000-00',
// eslint-disable-next-line
image: (0, _base64IMGtoBuffer2.default)(data.image),
amountMoney
}, (0, _date2.default)(), {
date: (0, _moment2.default)(new Date()).format("DD/MM/YYYY"),
cnpjResume: ' ',
clientResume: `${data.clientName}, natural de ${data.clientNationality}, ${data.clientCivilState},
${data.clientOccupation},
portador do RG nº ${data.clientRG}, inscrito no CPF sob o nº ${CPF.format(data.clientCPF)}, residente e
domiciliado a
${data.clientStreet}
${data.clientComplement || ' '}, CEP ${data.clientCEP}, ${data.clientCity} ${data.clientState}` || ' '
});
return contract;
})();
}
makeCNPJ(data) {
var _this = this;
return _asyncToGenerator(function* () {
return Promise.resolve(_this.makeCPF(data)).then(function (res) {
return _extends({}, res, {
cnpjResume: `, pessoa jurídica de direito privado, inscrita no CNPJ nº ${data.clientCNPJ}, com sede na
${data.companyStreet}
${data.companyComplement}, CEP ${data.companyCEP}, ${data.companyCity} ${data.companyState}`
});
});
})();
}
make(userId, dataContract, config) {
var _this2 = this;
return _asyncToGenerator(function* () {
try {
yield _this2.setConfig(config.aws);
yield _this2.setType(config.contract);
dataContract.contractNumber = yield _this2.generatorLast();
if (_this2.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada');
let data;
//let file;
if (dataContract.clientCNPJ !== undefined) {
data = yield _this2.makeCNPJ(dataContract);
//file = path.resolve(__dirname, './../../assets/docEx.docx');
} else {
data = yield _this2.makeCPF(dataContract);
//file = path.resolve(__dirname, './../../assets/docEx.docx');
}
yield _this2.PdfGenerator.generate(data, userId);
return Promise.resolve(_this2.Storage.setBucket(config.bucket)).then(function () {
return _this2.Storage.setDestinationDir('contracts');
})
//.then(() => this.Docx.makeContract(file, data))
//.then(() => this.PdfGenerator.generate(data))
// .then(res => Buffer.from(res, 'base64'))
// .then(res => this.Storage.setFileBuffer({ data: res, type: 'pdf' }))
.then(function () {
return _this2.Storage.setFile('./' + userId + ".pdf");
}).then(function () {
return _this2.Storage.upload();
}).then(function (res) {
return JSON.stringify(res);
}).then(function (res) {
return JSON.parse(res);
}).then(function (res) {
return Promise.resolve(data).then(function (result) {
return _extends({}, result, {
contractUrl: res.Location,
status: 'Ativo'
});
});
}).then(function (res) {
return _this2.save(userId, res);
}).catch(function (e) {
throw e;
});
} catch (e) {
return Promise.reject(e);
}
})();
}
insertSignature(userId, dataContract, config) {
var _this3 = this;
return _asyncToGenerator(function* () {
try {
yield _this3.setConfig(config.aws);
yield _this3.setType(config.contract);
if (_this3.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada');
//let file;
// if (dataContract.clientCNPJ !== undefined) {
// file = path.resolve(__dirname, './../../assets/docEx.docx');
// } else {
// file = path.resolve(__dirname, './../../assets/docEx.docx');
// }
const data = _this3.makeDocument(dataContract.data);
yield _this3.PdfGenerator.generate(data, userId);
return Promise.resolve(_this3.Storage.setBucket(config.bucket)).then(function () {
return _this3.Storage.setDestinationDir('contracts');
})
//.then(() => this.Docx.makeContract(file, dataContract.data))
//.then(res => Buffer.from(res, 'base64'))
//.then(res => this.Storage.setFileBuffer({ data: res, type: 'docx' }))
.then(function () {
return _this3.Storage.setFile('./' + userId + ".pdf");
}).then(function () {
return _this3.Storage.upload();
}).then(function (res) {
return JSON.stringify(res);
}).then(function (res) {
return JSON.parse(res);
}).then(function (aws) {
return Promise.resolve(data.then(function (result) {
return { aws, result };
}));
}).then(function (res) {
res.result.contractUrl = res.aws.Location;
res.result.status = 'Assinado';
return res.result;
}).then(function (res) {
return _this3.update(res, dataContract.id);
}).catch(function (e) {
throw e;
});
} catch (e) {
return Promise.reject(e);
}
})();
}
makeDocument(dataContract) {
var _this4 = this;
return _asyncToGenerator(function* () {
if (dataContract.clientCNPJ !== undefined) {
return yield _this4.makeCNPJ(dataContract);
//file = path.resolve(__dirname, './../../assets/docEx.docx');
} else {
return yield _this4.makeCPF(dataContract);
//file = path.resolve(__dirname, './../../assets/docEx.docx');
}
})();
}
}
module.exports = (Docx, DigitalData, Storage, PdfGenerator) => new Contract(Docx, DigitalData, Storage, PdfGenerator);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb21haW4vQ29udHJhY3QuanMiXSwibmFtZXMiOlsibnVtZXJvUG9yRXh0ZW5zbyIsInJlcXVpcmUiLCJDUEYiLCJDb250cmFjdCIsIkNvbnRyYWN0RGVjb3JhdG9yIiwiY29uc3RydWN0b3IiLCJEb2N4IiwiRGlnaXRhbERhdGEiLCJTM1N0b3JhZ2UiLCJQZGZHZW5lcmF0b3IiLCJTdG9yYWdlIiwic2V0RGlnaXRhbERhdGEiLCJzZXRDb25maWciLCJjb25maWciLCJtYWtlQ1BGIiwiZGF0YSIsImNvdGFjYW8iLCJ0aGVuIiwicmVzIiwianNvbiIsInJlc3BvbnNlIiwiY2xlYW4iLCJyZXBsYWNlIiwicGFyc2VJbnQiLCJ2YWx1ZSIsInRvRml4ZWQiLCJ2YWwiLCJwb3JFeHRlbnNvIiwicGFyc2VGbG9hdCIsImVzdGlsbyIsIm1vbmV0YXJpbyIsImFtb3VudE1vbmV5IiwiY29udHJhY3QiLCJpbnZlc3RtZW50SWQiLCJpZCIsInR5cGUiLCJwZW5hbHR5UG9yY2VudCIsImNsaWVudE5hbWUiLCJtYW5hZ2VyTmFtZSIsInBlbmFsdHlBZHYiLCJjb250cmFjdE51bWJlciIsImNvbnRyYWN0RW5kIiwiY29udHJhY3RUYXhlIiwiY29udHJhY3RUcmFkZSIsImFtb3VudENyeXB0IiwiY29udHJhY3RQb3JjZW50IiwiYmFua05hbWUiLCJiYW5rIiwibmFtZSIsImJhbmtUaXR1bGFyIiwidXNlck5hbWUiLCJiYW5rQWdlbmN5IiwiYWdlbmN5IiwiYmFua0FjY291bnQiLCJhY2NvdW50IiwiYmFua0NvZGUiLCJjb2RlIiwiaW1hZ2UiLCJkYXRlIiwiRGF0ZSIsImZvcm1hdCIsImNucGpSZXN1bWUiLCJjbGllbnRSZXN1bWUiLCJjbGllbnROYXRpb25hbGl0eSIsImNsaWVudENpdmlsU3RhdGUiLCJjbGllbnRPY2N1cGF0aW9uIiwiY2xpZW50UkciLCJjbGllbnRDUEYiLCJjbGllbnRTdHJlZXQiLCJjbGllbnRDb21wbGVtZW50IiwiY2xpZW50Q0VQIiwiY2xpZW50Q2l0eSIsImNsaWVudFN0YXRlIiwibWFrZUNOUEoiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNsaWVudENOUEoiLCJjb21wYW55U3RyZWV0IiwiY29tcGFueUNvbXBsZW1lbnQiLCJjb21wYW55Q0VQIiwiY29tcGFueUNpdHkiLCJjb21wYW55U3RhdGUiLCJtYWtlIiwidXNlcklkIiwiZGF0YUNvbnRyYWN0IiwiYXdzIiwic2V0VHlwZSIsImdlbmVyYXRvckxhc3QiLCJ1bmRlZmluZWQiLCJFcnJvckRvY3hQZGYiLCJnZW5lcmF0ZSIsInNldEJ1Y2tldCIsImJ1Y2tldCIsInNldERlc3RpbmF0aW9uRGlyIiwic2V0RmlsZSIsInVwbG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsInJlc3VsdCIsImNvbnRyYWN0VXJsIiwiTG9jYXRpb24iLCJzdGF0dXMiLCJzYXZlIiwiY2F0Y2giLCJlIiwicmVqZWN0IiwiaW5zZXJ0U2lnbmF0dXJlIiwibWFrZURvY3VtZW50IiwidXBkYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLE1BQU1BLG1CQUFtQkMsUUFBUSxvQkFBUixDQUF6QjtBQUNBLE1BQU1DLE1BQU1ELFFBQVEsS0FBUixDQUFaOztBQUVBLE1BQU1FLFFBQU4sU0FBdUJDLDJCQUF2QixDQUF5QztBQUN2Q0MsY0FBWUMsSUFBWixFQUFrQkMsV0FBbEIsRUFBK0JDLFNBQS9CLEVBQTBDQyxZQUExQyxFQUF3RDtBQUN0RDtBQUNBLFNBQUtDLE9BQUwsR0FBZUYsU0FBZjtBQUNBLFNBQUtGLElBQUwsR0FBWUEsSUFBWjtBQUNBLFNBQUtHLFlBQUwsR0FBb0JBLFlBQXBCO0FBQ0EsU0FBS0UsY0FBTCxDQUFvQkosV0FBcEI7QUFDRDs7QUFFREssWUFBVUMsTUFBVixFQUFrQjtBQUNoQixTQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxT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QUNELFdBRkQsQ0FEUyxDQUFQO0FBQUEsU0FURCxFQWFKbEYsSUFiSSxDQWFDLFVBQUNDLEdBQUQsRUFBUztBQUNiQSxjQUFJaUYsTUFBSixDQUFXQyxXQUFYLEdBQXlCbEYsSUFBSW1FLEdBQUosQ0FBUWdCLFFBQWpDO0FBQ0FuRixjQUFJaUYsTUFBSixDQUFXRyxNQUFYLEdBQW9CLFVBQXBCO0FBQ0EsaUJBQU9wRixJQUFJaUYsTUFBWDtBQUNELFNBakJJLEVBa0JKbEYsSUFsQkksQ0FrQkM7QUFBQSxpQkFBTyxPQUFLNEYsTUFBTCxDQUFZM0YsR0FBWixFQUFpQmtFLGFBQWFsRCxFQUE5QixDQUFQO0FBQUEsU0FsQkQsRUFtQkpzRSxLQW5CSSxDQW1CRSxVQUFDQyxDQUFELEVBQU87QUFBRSxnQkFBTUEsQ0FBTjtBQUFVLFNBbkJyQixDQUFQO0FBb0JELE9BaENELENBZ0NFLE9BQU9BLENBQVAsRUFBVTtBQUNWLGVBQU8vQixRQUFRZ0MsTUFBUixDQUFlRCxDQUFmLENBQVA7QUFDRDtBQW5DaUQ7QUFvQ25EOztBQUVLRyxjQUFOLENBQW1CeEIsWUFBbkIsRUFBZ0M7QUFBQTs7QUFBQTtBQUM5QixVQUFJQSxhQUFhUixVQUFiLEtBQTRCWSxTQUFoQyxFQUEyQztBQUN6QyxlQUFPLE1BQU0sT0FBS2YsUUFBTCxDQUFjVyxZQUFkLENBQWI7QUFDQTtBQUNELE9BSEQsTUFHTztBQUNMLGVBQU8sTUFBTSxPQUFLdEUsT0FBTCxDQUFhc0UsWUFBYixDQUFiO0FBQ0E7QUFDRDtBQVA2QjtBQVEvQjtBQTdKc0M7O0FBZ0t6QzBCLE9BQU9DLE9BQVAsR0FBaUIsQ0FBQ3pHLElBQUQsRUFBT0MsV0FBUCxFQUFvQkcsT0FBcEIsRUFBNkJELFlBQTdCLEtBQThDLElBQUlOLFFBQUosQ0FBYUcsSUFBYixFQUFtQkMsV0FBbkIsRUFBZ0NHLE9BQWhDLEVBQXlDRCxZQUF6QyxDQUEvRCIsImZpbGUiOiJDb250cmFjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFcnJvckRvY3hQZGYgZnJvbSAnLi4vbGliL0Vycm9yRG9jeFBkZic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBkYXRlRm9ybWF0IGZyb20gJy4uL2xpYi9kYXRlJztcbmltcG9ydCBiYXNlNjRJTUdCdWZmZXIgZnJvbSAnLi4vbGliL2Jhc2U2NElNR3RvQnVmZmVyJztcbmltcG9ydCBDb250cmFjdERlY29yYXRvciBmcm9tICcuLi9kZWNvcmF0b3JzL0NvbnRyYWN0RGVjb3JhdG9yJztcbmltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuY29uc3QgbnVtZXJvUG9yRXh0ZW5zbyA9IHJlcXVpcmUoJ251bWVyby1wb3ItZXh0ZW5zbycpO1xuY29uc3QgQ1BGID0gcmVxdWlyZSgnY3BmJyk7XG5cbmNsYXNzIENvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3REZWNvcmF0b3Ige1xuICBjb25zdHJ1Y3RvcihEb2N4LCBEaWdpdGFsRGF0YSwgUzNTdG9yYWdlLCBQZGZHZW5lcmF0b3IpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuU3RvcmFnZSA9IFMzU3RvcmFnZTtcbiAgICB0aGlzLkRvY3ggPSBEb2N4O1xuICAgIHRoaXMuUGRmR2VuZXJhdG9yID0gUGRmR2VuZXJhdG9yO1xuICAgIHRoaXMuc2V0RGlnaXRhbERhdGEoRGlnaXRhbERhdGEpO1xuICB9XG5cbiAgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuU3RvcmFnZSA9IHRoaXMuU3RvcmFnZShjb25maWcpO1xuICB9XG5cblxuICBhc3luYyBtYWtlQ1BGKGRhdGEpIHtcbiAgICBjb25zdCBjb3RhY2FvID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LmJ0Y2J1eXNob3AuY29tL2FwaS9jcmF3bGVycy9pY29pbm9taWEnKVxuICAgICAgLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbihqc29uID0+IGpzb24ucmVzcG9uc2UuY2xlYW4ucmVwbGFjZSgvW1xcRF0rL2csICcnKSlcbiAgICAgIC50aGVuKHZhbHVlID0+IHBhcnNlSW50KHZhbHVlKSlcbiAgICAgIC50aGVuKHZhbHVlID0+ICh2YWx1ZSAvIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgICBjb25zdCB2YWwgPSBudW1lcm9Qb3JFeHRlbnNvLnBvckV4dGVuc28ocGFyc2VGbG9hdChjb3RhY2FvKSwgbnVtZXJvUG9yRXh0ZW5zby5lc3RpbG8ubW9uZXRhcmlvKTtcbiAgICBjb25zdCBhbW91bnRNb25leSA9IGAke2NvdGFjYW99ICgke3ZhbH0pYDtcbiAgICAvLyBjb25zdCB7eWVhciwgbW9udGgsIGRheX0gPSBkYXRlRm9ybWF0LmRhdGVQVEJSKCk7XG4gICAgY29uc3QgY29udHJhY3QgPSB7XG4gICAgICBpbnZlc3RtZW50SWQ6IGRhdGEuaWQsXG4gICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICBwZW5hbHR5UG9yY2VudDogZGF0YS5wZW5hbHR5UG9yY2VudCB8fCAwLFxuICAgICAgY2xpZW50TmFtZTogZGF0YS5jbGllbnROYW1lIHx8ICdEYW5pZWwgU2lsdmEgTWlyYW5kYScsXG4gICAgICBtYW5hZ2VyTmFtZTogZGF0YS5tYW5hZ2VyTmFtZSB8fCAnRGFuaWVsIFNpbHZhIE1pcmFuZGEnLFxuICAgICAgcGVuYWx0eUFkdjogZGF0YS5wZW5hbHR5QWR2IHx8IDAsXG4gICAgICBjb250cmFjdE51bWJlcjogZGF0YS5jb250cmFjdE51bWJlciB8fCAnRXhlbXBsbycsXG4gICAgICBjb250cmFjdEVuZDogZGF0YS5jb250cmFjdEVuZCB8fCAnMDAvMDAvMDAwMCcsXG4gICAgICBjb250cmFjdFRheGU6IGRhdGEuY29udHJhY3RUYXhlIHx8IDAsXG4gICAgICBjb250cmFjdFRyYWRlOiBkYXRhLmNvbnRyYWN0VHJhZGUgfHwgMCxcbiAgICAgIGFtb3VudENyeXB0OiBkYXRhLmFtb3VudENyeXB0IHx8IDAsXG4gICAgICBjb250cmFjdFBvcmNlbnQ6IGRhdGEuY29udHJhY3RQb3JjZW50IHx8IDAsXG4gICAgICBiYW5rTmFtZTogZGF0YS5iYW5rLm5hbWUgfHwgJ0JUQyBCYW5jbycsXG4gICAgICBiYW5rVGl0dWxhcjogZGF0YS5iYW5rLnVzZXJOYW1lIHx8ICdCVEMgQmFuY28nLFxuICAgICAgYmFua0FnZW5jeTogZGF0YS5iYW5rLmFnZW5jeSB8fCAnMDAwMCcsXG4gICAgICBiYW5rQWNjb3VudDogZGF0YS5iYW5rLmFjY291bnQgfHwgJzAwMDAtMDAnLFxuICAgICAgYmFua0NvZGU6IGRhdGEuYmFuay5jb2RlIHx8ICcwMDAwLTAwJyxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgaW1hZ2U6IGJhc2U2NElNR0J1ZmZlcihkYXRhLmltYWdlKSxcbiAgICAgIGFtb3VudE1vbmV5LFxuICAgICAgLi4uZGF0ZUZvcm1hdCgpLFxuICAgICAgZGF0ZTogbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdChcIkREL01NL1lZWVlcIiksXG4gICAgICBjbnBqUmVzdW1lOiAnICcsXG4gICAgICBjbGllbnRSZXN1bWU6IGAke2RhdGEuY2xpZW50TmFtZX0sIG5hdHVyYWwgZGUgJHtkYXRhLmNsaWVudE5hdGlvbmFsaXR5fSwgJHtkYXRhLmNsaWVudENpdmlsU3RhdGV9LCBcbiAgICAgICR7ZGF0YS5jbGllbnRPY2N1cGF0aW9ufSxcbiAgICAgIHBvcnRhZG9yIGRvIFJHIG7CuiAke2RhdGEuY2xpZW50Ukd9LCBpbnNjcml0byBubyBDUEYgc29iIG8gbsK6ICR7Q1BGLmZvcm1hdChkYXRhLmNsaWVudENQRil9LCByZXNpZGVudGUgZSBcbiAgICAgIGRvbWljaWxpYWRvIGFcbiAgICAgICR7ZGF0YS5jbGllbnRTdHJlZXR9XG4gICAgICAke2RhdGEuY2xpZW50Q29tcGxlbWVudCB8fCAnICd9LCBDRVAgJHtkYXRhLmNsaWVudENFUH0sICR7ZGF0YS5jbGllbnRDaXR5fSAke2RhdGEuY2xpZW50U3RhdGV9YCB8fCAnICcsXG4gICAgfTtcbiAgICByZXR1cm4gY29udHJhY3Q7XG4gIH1cblxuICBhc3luYyBtYWtlQ05QSihkYXRhKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLm1ha2VDUEYoZGF0YSkpLnRoZW4oKHJlcykgPT4gXG4gICAgICAoeyAgICAgIFxuICAgICAgICAuLi5yZXMsXG4gICAgICAgY25walJlc3VtZTogYCwgcGVzc29hIGp1csOtZGljYSBkZSBkaXJlaXRvIHByaXZhZG8sIGluc2NyaXRhIG5vIENOUEogbsK6ICR7ZGF0YS5jbGllbnRDTlBKfSwgY29tIHNlZGUgbmFcbiAgICAgICAke2RhdGEuY29tcGFueVN0cmVldH1cbiAgICAgICAke2RhdGEuY29tcGFueUNvbXBsZW1lbnR9LCBDRVAgJHtkYXRhLmNvbXBhbnlDRVB9LCAke2RhdGEuY29tcGFueUNpdHl9ICR7ZGF0YS5jb21wYW55U3RhdGV9YCxcbiAgICAgfSlcbiAgICApOyAgICBcbiAgfVxuXG4gIGFzeW5jIG1ha2UodXNlcklkLCBkYXRhQ29udHJhY3QsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNldENvbmZpZyhjb25maWcuYXdzKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0VHlwZShjb25maWcuY29udHJhY3QpO1xuICAgICAgZGF0YUNvbnRyYWN0LmNvbnRyYWN0TnVtYmVyID0gYXdhaXQgdGhpcy5nZW5lcmF0b3JMYXN0KCk7XG4gICAgICBpZiAodGhpcy5jb25maWcgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yRG9jeFBkZignQ29uZmlndXJhw6fDo28gbsOjbyBpbmljaWFsaXphZGEnKTtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgLy9sZXQgZmlsZTtcblxuICAgICAgaWYgKGRhdGFDb250cmFjdC5jbGllbnRDTlBKICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMubWFrZUNOUEooZGF0YUNvbnRyYWN0KTtcbiAgICAgICAgLy9maWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLm1ha2VDUEYoZGF0YUNvbnRyYWN0KTtcbiAgICAgICAgLy9maWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5QZGZHZW5lcmF0b3IuZ2VuZXJhdGUoZGF0YSwgdXNlcklkKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5TdG9yYWdlLnNldEJ1Y2tldChjb25maWcuYnVja2V0KSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnNldERlc3RpbmF0aW9uRGlyKCdjb250cmFjdHMnKSlcbiAgICAgICAgLy8udGhlbigoKSA9PiB0aGlzLkRvY3gubWFrZUNvbnRyYWN0KGZpbGUsIGRhdGEpKVxuICAgICAgICAvLy50aGVuKCgpID0+IHRoaXMuUGRmR2VuZXJhdG9yLmdlbmVyYXRlKGRhdGEpKVxuICAgICAgICAvLyAudGhlbihyZXMgPT4gQnVmZmVyLmZyb20ocmVzLCAnYmFzZTY0JykpXG4gICAgICAgIC8vIC50aGVuKHJlcyA9PiB0aGlzLlN0b3JhZ2Uuc2V0RmlsZUJ1ZmZlcih7IGRhdGE6IHJlcywgdHlwZTogJ3BkZicgfSkpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS5zZXRGaWxlKCcuLycgKyB1c2VySWQgKyBcIi5wZGZcIikpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS51cGxvYWQoKSlcbiAgICAgICAgLnRoZW4ocmVzID0+IEpTT04uc3RyaW5naWZ5KHJlcykpXG4gICAgICAgIC50aGVuKHJlcyA9PiBKU09OLnBhcnNlKHJlcykpXG4gICAgICAgIC50aGVuKHJlcyA9PiBQcm9taXNlLnJlc29sdmUoZGF0YSlcbiAgICAgICAgICAudGhlbihyZXN1bHQgPT4gKHtcbiAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgIGNvbnRyYWN0VXJsOiByZXMuTG9jYXRpb24sXG4gICAgICAgICAgICBzdGF0dXM6ICdBdGl2bydcbiAgICAgICAgICB9KSkpXG4gICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLnNhdmUodXNlcklkLCByZXMpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluc2VydFNpZ25hdHVyZSh1c2VySWQsIGRhdGFDb250cmFjdCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29uZmlnKGNvbmZpZy5hd3MpO1xuICAgICAgYXdhaXQgdGhpcy5zZXRUeXBlKGNvbmZpZy5jb250cmFjdCk7XG4gICAgICBpZiAodGhpcy5jb25maWcgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yRG9jeFBkZignQ29uZmlndXJhw6fDo28gbsOjbyBpbmljaWFsaXphZGEnKTtcbiAgICAgIC8vbGV0IGZpbGU7XG4gICAgICAvLyBpZiAoZGF0YUNvbnRyYWN0LmNsaWVudENOUEogIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gICBmaWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGZpbGUgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi8uLi8uLi9hc3NldHMvZG9jRXguZG9jeCcpO1xuICAgICAgLy8gfVxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMubWFrZURvY3VtZW50KGRhdGFDb250cmFjdC5kYXRhKTtcbiAgICAgIGF3YWl0IHRoaXMuUGRmR2VuZXJhdG9yLmdlbmVyYXRlKGRhdGEsIHVzZXJJZCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuU3RvcmFnZS5zZXRCdWNrZXQoY29uZmlnLmJ1Y2tldCkpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS5zZXREZXN0aW5hdGlvbkRpcignY29udHJhY3RzJykpXG4gICAgICAgIC8vLnRoZW4oKCkgPT4gdGhpcy5Eb2N4Lm1ha2VDb250cmFjdChmaWxlLCBkYXRhQ29udHJhY3QuZGF0YSkpXG4gICAgICAgIC8vLnRoZW4ocmVzID0+IEJ1ZmZlci5mcm9tKHJlcywgJ2Jhc2U2NCcpKVxuICAgICAgICAvLy50aGVuKHJlcyA9PiB0aGlzLlN0b3JhZ2Uuc2V0RmlsZUJ1ZmZlcih7IGRhdGE6IHJlcywgdHlwZTogJ2RvY3gnIH0pKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLlN0b3JhZ2Uuc2V0RmlsZSgnLi8nICsgdXNlcklkICsgXCIucGRmXCIpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLlN0b3JhZ2UudXBsb2FkKCkpXG4gICAgICAgIC50aGVuKHJlcyA9PiBKU09OLnN0cmluZ2lmeShyZXMpKVxuICAgICAgICAudGhlbihyZXMgPT4gSlNPTi5wYXJzZShyZXMpKVxuICAgICAgICAudGhlbihhd3MgPT4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgICAgZGF0YS50aGVuKChyZXN1bHQpID0+IHsgXG4gICAgICAgICAgICAgIHJldHVybiB7YXdzLCByZXN1bHR9O1xuICAgICAgICAgICAgfSkpKVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgcmVzLnJlc3VsdC5jb250cmFjdFVybCA9IHJlcy5hd3MuTG9jYXRpb247XG4gICAgICAgICAgcmVzLnJlc3VsdC5zdGF0dXMgPSAnQXNzaW5hZG8nO1xuICAgICAgICAgIHJldHVybiByZXMucmVzdWx0O1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXMgPT4gdGhpcy51cGRhdGUocmVzLCBkYXRhQ29udHJhY3QuaWQpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1ha2VEb2N1bWVudChkYXRhQ29udHJhY3Qpe1xuICAgIGlmIChkYXRhQ29udHJhY3QuY2xpZW50Q05QSiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWtlQ05QSihkYXRhQ29udHJhY3QpO1xuICAgICAgLy9maWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZUNQRihkYXRhQ29udHJhY3QpO1xuICAgICAgLy9maWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoRG9jeCwgRGlnaXRhbERhdGEsIFN0b3JhZ2UsIFBkZkdlbmVyYXRvcikgPT4gbmV3IENvbnRyYWN0KERvY3gsIERpZ2l0YWxEYXRhLCBTdG9yYWdlLCBQZGZHZW5lcmF0b3IpO1xuIl19