zater-docx-pdf2
Version:
ZAter doc2pdf
426 lines (394 loc) • 56.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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 fs = require('fs');
const pdf = require('dynamic-html-pdf');
const bufferConverter = require('arraybuffer-to-string');
const path = require('path');
const ContractType = require('../../domain/ContractTypeEnum');
const Signatures = require('../../domain/Signature');
class PdfGenerator {
constructor(type) {
this.type = type;
}
generate(contract, file_name, insertSignature) {
var _this = this;
return _asyncToGenerator(function* () {
_this.type = contract.type;
let resol = contract;
resol.image = 'data:image/png;base64,' + bufferConverter(resol.image, 'base64');
if (insertSignature) {
resol = yield _this.makeSignatures(resol);
}
//adding this property to get "base directory to the header images"
resol.basePath = path.join('file:///', __dirname, '../../../assets/');
return new Promise(function (resolve, reject) {
try {
let html = '';
if (_this.type == ContractType.MUTUO_TRADING) html = fs.readFileSync(path.join(__dirname, '../../../assets/MutuoComTrading.html'), 'utf8');
if (_this.type == ContractType.MUTUO_SEM_TRADING) html = fs.readFileSync(path.join(__dirname, '../../../assets/MutuoSemTrading.html'), 'utf8');
if (_this.type == ContractType.MUTUO_LE_REVE) html = fs.readFileSync(path.join(__dirname, '../../../assets/MutuoComProduto.html'), 'utf8');
if (_this.type == ContractType.MUTUO_TRADING_LXC) html = fs.readFileSync(path.join(__dirname, '../../../assets/MutuoComTradingLXC.html'), 'utf8');
if (_this.type == ContractType.MUTUO_SEM_TRADING_LXC) html = fs.readFileSync(path.join(__dirname, '../../../assets/MutuoSemTradingLXC.html'), 'utf8');
if (_this.type == ContractType.MUTUO_COMBO_LXC) html = fs.readFileSync(path.join(__dirname, '../../../assets/MutuoComboLXC.html'), 'utf8');
const footer = _this.buildFooter();
const options = {
format: 'Letter',
base: path.join('file:///', __dirname, '../../../assets/'),
header: {
contents: "", //header
height: "35mm"
},
footer: {
"contents": footer
}
};
const document = {
type: 'file', // 'file' or 'buffer'
template: html,
context: {
contract: resol
},
path: './' + file_name + '.pdf' // it is not required if type is buffer
};
//Promise.resolve(pdf.create(document, options)).then(res => console.log(res));
resolve(pdf.create(document, options));
} catch (err) {
reject(err);
}
});
})();
}
makeSignatures(contract) {
var _this2 = this;
return _asyncToGenerator(function* () {
contract.vpSignature = Signatures.HELOISA;
contract.comercialSignature = Signatures.JAIME;
const firstSignature = yield _this2.randomizeSignature();
let secondSignature = yield _this2.randomizeSignature();
while (firstSignature === secondSignature) {
secondSignature = yield _this2.randomizeSignature();
}
contract.firstRandomSignature = firstSignature;
contract.secondRandomSignature = secondSignature;
return contract;
})();
}
randomizeSignature() {
return _asyncToGenerator(function* () {
const testimonials = Object.keys(Signatures).filter(function (key) {
if (Signatures[key] !== Signatures.HELOISA && Signatures[key] !== Signatures.JAIME) return Signatures[key];
});
return Signatures[testimonials[Object.keys(testimonials)[Math.floor(Math.random() * Object.keys(testimonials).length)]]];
})();
}
buildFooter() {
if (this.type == 1) {
return `
<p class="c3">
<span class="c4 c8">Alameda Doutor Carlos de Carvalho n. 417 – 30º andar. Conjunto 3001 | Bairro Centro |
CEP 80410-180 | Curitiba . Paraná</span>
</p>
<p class="c3">
<span class="c4 c8">Telefone +55 41 3123-9192</span>
</p>
<p class="c3">
<span class="c8 c14"></span>
<table class="c21">
<tbody>
<tr class="c45">
<td class="c35" colspan="1" rowspan="1">
<p class="c6">
<span class="c4 c0">Mutuo Com Trading versão 5.0</span>
</p>
</td>
<td class="c62" colspan="1" rowspan="1">
<p class="c3">
<span class="c0 c40">Página {{page}} </span>
<span class="c0 c40"> de {{pages}} </span>
</p>
</td>
<td class="c51" colspan="1" rowspan="1">
<p class="c3 c16">
<span class="c4 c0"></span>
</p>
</td>
<td class="c64" colspan="1" rowspan="1">
<p class="c3">
<span class="c4 c0">Dr. Ismair Junior Couto</span>
</p>
<p class="c3">
<span class="c4 c0">Diretor Jurídico</span>
</p>
<p class="c3">
<span class="c4 c0">OAB/PR 49001</span>
</p>
</td>
</tr>
</tbody>
</table>
</p>
<a id="t.082bc7f9bd17458e7662efd45871e7b72a4a82ff"></a>
<a id="t.6"></a>
<p class="c3 c16">
<span class="c14 c8"></span>
</p>`;
} else if (this.type == 2) {
return `
<p class="c3">
<span class="c4 c8">Alameda Doutor Carlos de Carvalho n. 417 – 30º andar. Conjunto 3001 | Bairro Centro |
CEP 80410-180 | Curitiba . Paraná</span>
</p>
<p class="c3">
<span class="c4 c8">Telefone +55 41 3123-9192</span>
</p>
<p class="c3">
<span class="c8 c14"></span>
<table class="c21">
<tbody>
<tr class="c45">
<td class="c35" colspan="1" rowspan="1">
<p class="c6">
<span class="c4 c0">Mutuo Sem Trading versão 5.0</span>
</p>
</td>
<td class="c62" colspan="1" rowspan="1">
<p class="c3">
<span class="c0 c40">Página {{page}} </span>
<span class="c0 c40"> de {{pages}} </span>
</p>
</td>
<td class="c51" colspan="1" rowspan="1">
<p class="c3 c16">
<span class="c4 c0"></span>
</p>
</td>
<td class="c64" colspan="1" rowspan="1">
<p class="c3">
<span class="c4 c0">Dr. Ismair Junior Couto</span>
</p>
<p class="c3">
<span class="c4 c0">Diretor Jurídico</span>
</p>
<p class="c3">
<span class="c4 c0">OAB/PR 49001</span>
</p>
</td>
</tr>
</tbody>
</table>
</p>
<a id="t.082bc7f9bd17458e7662efd45871e7b72a4a82ff"></a>
<a id="t.6"></a>
<p class="c3 c16">
<span class="c14 c8"></span>
</p>`;
} else if (this.type == 3) {
return `
<p class="c3">
<span class="c4 c8">Alameda Doutor Carlos de Carvalho n. 417 – 30º andar. Conjunto 3001 | Bairro Centro |
CEP 80410-180 | Curitiba . Paraná</span>
</p>
<p class="c3">
<span class="c4 c8">Telefone +55 41 3123-9192</span>
</p>
<p class="c3">
<span class="c8 c14"></span>
<table class="c21">
<tbody>
<tr class="c45">
<td class="c35" colspan="1" rowspan="1">
<p class="c3">
<span class="c0 c40">Produto</span>
<span class="c0 c40">Mútuo LeRêve</span>
</p>
</td>
<td class="c62" colspan="1" rowspan="1">
<p class="c3">
<span class="c0 c40">Página {{page}} </span>
<span class="c0 c40"> de {{pages}} </span>
</p>
</td>
<td class="c51" colspan="1" rowspan="1">
<p class="c3">
<span class="c4 c0">Versão</span>
</p>
<p class="c3">
<span class="c4 c0">1.4</span>
</p>
</td>
<td class="c64" colspan="1" rowspan="1">
<p class="c3">
<span class="c4 c0">Dr. Ismair Junior Couto</span>
</p>
<p class="c3">
<span class="c4 c0">Diretor Jurídico</span>
</p>
<p class="c3">
<span class="c4 c0">OAB/PR 49001</span>
</p>
</td>
</tr>
</tbody>
</table>
</p>
<a id="t.082bc7f9bd17458e7662efd45871e7b72a4a82ff"></a>
<a id="t.6"></a>
<p class="c3 c16">
<span class="c14 c8"></span>
</p>`;
} else if (this.type == 4) {
return `
<p class="c3">
<span class="c4 c8">Alameda Doutor Carlos de Carvalho n. 417 – 30º andar. Conjunto 3001 | Bairro Centro |
CEP 80410-180 | Curitiba . Paraná</span>
</p>
<p class="c3">
<span class="c4 c8">Telefone +55 41 3123-9192</span>
</p>
<p class="c3">
<span class="c8 c14"></span>
<table class="c21">
<tbody>
<tr class="c45">
<td class="c35" colspan="1" rowspan="1">
<p class="c6">
<span class="c4 c0">Mútuo LXC Com Trading versão 5.0</span>
</p>
</td>
<td class="c62" colspan="1" rowspan="1">
<p class="c3">
<span class="c0 c40">Página {{page}} </span>
<span class="c0 c40"> de {{pages}} </span>
</p>
</td>
<td class="c51" colspan="1" rowspan="1">
<p class="c3 c16">
<span class="c4 c0"></span>
</p>
</td>
<td class="c64" colspan="1" rowspan="1">
<p class="c3">
<span class="c4 c0">Dr. Ismair Junior Couto</span>
</p>
<p class="c3">
<span class="c4 c0">Diretor Jurídico</span>
</p>
<p class="c3">
<span class="c4 c0">OAB/PR 49001</span>
</p>
</td>
</tr>
</tbody>
</table>
</p>
<a id="t.082bc7f9bd17458e7662efd45871e7b72a4a82ff"></a>
<a id="t.6"></a>
<p class="c3 c16">
<span class="c14 c8"></span>
</p>`;
} else if (this.type == 5) {
return `
<p class="c3">
<span class="c4 c8">Alameda Doutor Carlos de Carvalho n. 417 – 30º andar. Conjunto 3001 | Bairro Centro |
CEP 80410-180 | Curitiba . Paraná</span>
</p>
<p class="c2">
<span class="c18 c5 c8">Telefone +55 41 3123-9192</span>
</p>
<p class="c2 c3">
<span class="c18 c5 c53"></span>
</p>
<a id="t.d52fbb6362b5826fe79fb1784747727bdf6992f8"></a>
<a id="t.6"></a>
<table class="c22">
<tbody>
<tr class="c21">
<td class="c39" colspan="1" rowspan="1">
<p class="c7">
<span class="c18 c0 c8">Mútuo LXC Sem Trading versão 5.0</span>
</p>
</td>
<td class="c54" colspan="1" rowspan="1">
<p class="c2">
<span class="c0 c26">Página {{page}} </span>
<span class="c0 c26"> de {{pages}} </span>
</p>
</td>
<td class="c10" colspan="1" rowspan="1">
<p class="c2 c3">
<span class="c18 c0 c8"></span>
</p>
</td>
<td class="c47" colspan="1" rowspan="1">
<p class="c2">
<span class="c18 c0 c8">Dr. Ismair Junior Couto</span>
</p>
<p class="c2">
<span class="c18 c0 c8">Diretor Jurídico</span>
</p>
<p class="c2">
<span class="c18 c0 c8">OAB/PR 49001</span>
</p>
</td>
</tr>
</tbody>
</table>
<p class="c2 c3">
<span class="c18 c5 c53"></span>
</p>
`;
} else if (this.type == 6) {
return `
<p class="c9 c6"><span class="c14"></span></p>
<a id="t.f3938e79502005adf94a4e51215e89fb827a9929"></a><a id="t.5"></a>
<table class="doStyle53">
<tbody>
<tr class="doStyle5">
<td class="doStyle45" colspan="3" rowspan="1">
<p class="c0 c6"><span class="doStyle25 doStyle8 doStyle18"></span></p>
</td>
<td class="doStyle68" colspan="2" rowspan="1">
<p class="c0 c6"><span class="doStyle25 doStyle8 doStyle18"></span></p>
</td>
<td class="doStyle61" colspan="1" rowspan="1">
<p class="c0 c6"><span class="doStyle25 doStyle8 doStyle18"></span></p>
</td>
<td class="doStyle62" colspan="2" rowspan="1">
<p class="c0 c6"><span class="doStyle25 doStyle8 doStyle18"></span></p>
</td>
</tr>
<tr class="doStyle5">
<td class="doStyle13" colspan="1" rowspan="1">
<p class="c0"><span class="doStyle7">Produto</span></p>
<p class="c0"><span class="doStyle25 doStyle8 doStyle18">LXCombo</span></p>
</td>
<td class="doStyle69" colspan="1" rowspan="1">
<p class="c0"><span class="doStyle7">Versão</span></p>
<p class="c0"><span class="doStyle25 doStyle8 doStyle18">1.0</span></p>
</td>
<td class="doStyle64" colspan="2" rowspan="1">
<p class="c0"><span class="doStyle7">Atualização</span></p>
<p class="c0"><span class="doStyle25 doStyle8 doStyle18">01/02/2019</span></p>
</td>
<td class="doStyle75" colspan="3" rowspan="1">
<p class="c0"><span class="doStyle25 doStyle8 doStyle18">Alameda Doutor Carlos de Carvalho n. 431 - 10º andar | Bairro Centro </span></p>
<p class="c0"><span class="doStyle25 doStyle8 doStyle18">CEP 80410-180 . Curitiba . Paraná | +55 41 3123-9192 – www.btc-banco.com</span></p>
</td>
<td class="doStyle78" colspan="1" rowspan="1">
<p class="c0">
<span class="doStyle25 doStyle8 doStyle18">Página {{page}} </span>
<span class="doStyle25 doStyle8 doStyle18"> de {{pages}} </span>
</p>
</td>
</tr>
</tbody>
</table>
`;
}
}
}
exports.default = type => new PdfGenerator(type);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9pbmZyYXN0cnVjdHVyZS9wcm92aWRlcnMvUGRmR2VuZXJhdG9yLmpzIl0sIm5hbWVzIjpbImZzIiwicmVxdWlyZSIsInBkZiIsImJ1ZmZlckNvbnZlcnRlciIsInBhdGgiLCJDb250cmFjdFR5cGUiLCJTaWduYXR1cmVzIiwiUGRmR2VuZXJhdG9yIiwiY29uc3RydWN0b3IiLCJ0eXBlIiwiZ2VuZXJhdGUiLCJjb250cmFjdCIsImZpbGVfbmFtZSIsImluc2VydFNpZ25hdHVyZSIsInJlc29sIiwiaW1hZ2UiLCJtYWtlU2lnbmF0dXJlcyIsImJhc2VQYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiaHRtbCIsIk1VVFVPX1RSQURJTkciLCJyZWFkRmlsZVN5bmMiLCJNVVRVT19TRU1fVFJBRElORyIsIk1VVFVPX0xFX1JFVkUiLCJNVVRVT19UUkFESU5HX0xYQyIsIk1VVFVPX1NFTV9UUkFESU5HX0xYQyIsIk1VVFVPX0NPTUJPX0xYQyIsImZvb3RlciIsImJ1aWxkRm9vdGVyIiwib3B0aW9ucyIsImZvcm1hdCIsImJhc2UiLCJoZWFkZXIiLCJjb250ZW50cyIsImhlaWdodCIsImRvY3VtZW50IiwidGVtcGxhdGUiLCJjb250ZXh0IiwiY3JlYXRlIiwiZXJyIiwidnBTaWduYXR1cmUiLCJIRUxPSVNBIiwiY29tZXJjaWFsU2lnbmF0dXJlIiwiSkFJTUUiLCJmaXJzdFNpZ25hdHVyZSIsInJhbmRvbWl6ZVNpZ25hdHVyZSIsInNlY29uZFNpZ25hdHVyZSIsImZpcnN0UmFuZG9tU2lnbmF0dXJlIiwic2Vjb25kUmFuZG9tU2lnbmF0dXJlIiwidGVzdGltb25pYWxzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImtleSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImxlbmd0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxNQUFNQSxLQUFLQyxRQUFRLElBQVIsQ0FBWDtBQUNB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OlsiY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGRmID0gcmVxdWlyZSgnZHluYW1pYy1odG1sLXBkZicpO1xuY29uc3QgYnVmZmVyQ29udmVydGVyID0gcmVxdWlyZSgnYXJyYXlidWZmZXItdG8tc3RyaW5nJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgQ29udHJhY3RUeXBlID0gcmVxdWlyZSgnLi4vLi4vZG9tYWluL0NvbnRyYWN0VHlwZUVudW0nKTtcbmNvbnN0IFNpZ25hdHVyZXMgPSByZXF1aXJlKCcuLi8uLi9kb21haW4vU2lnbmF0dXJlJyk7XG5cbmNsYXNzIFBkZkdlbmVyYXRvciB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cblxuICAgIGFzeW5jIGdlbmVyYXRlKGNvbnRyYWN0LCBmaWxlX25hbWUsIGluc2VydFNpZ25hdHVyZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBjb250cmFjdC50eXBlXG4gICAgICAgIGxldCByZXNvbCA9IGNvbnRyYWN0XG4gICAgICAgIFxuICAgICAgICByZXNvbC5pbWFnZSA9ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsJyArIGJ1ZmZlckNvbnZlcnRlcihyZXNvbC5pbWFnZSwgJ2Jhc2U2NCcpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGluc2VydFNpZ25hdHVyZSl7XG4gICAgICAgICAgICByZXNvbCA9IGF3YWl0IHRoaXMubWFrZVNpZ25hdHVyZXMocmVzb2wpO1xuICAgICAgICB9XG4gICAgICAgIC8vYWRkaW5nIHRoaXMgcHJvcGVydHkgdG8gZ2V0IFwiYmFzZSBkaXJlY3RvcnkgdG8gdGhlIGhlYWRlciBpbWFnZXNcIiBcbiAgICAgICAgcmVzb2wuYmFzZVBhdGggPSBwYXRoLmpvaW4oJ2ZpbGU6Ly8vJywgX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzLycpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBodG1sID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBDb250cmFjdFR5cGUuTVVUVU9fVFJBRElORylcbiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL011dHVvQ29tVHJhZGluZy5odG1sJyksICd1dGY4Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09IENvbnRyYWN0VHlwZS5NVVRVT19TRU1fVFJBRElORylcbiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL011dHVvU2VtVHJhZGluZy5odG1sJyksICd1dGY4Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09IENvbnRyYWN0VHlwZS5NVVRVT19MRV9SRVZFKVxuICAgICAgICAgICAgICAgICAgICBodG1sID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9hc3NldHMvTXV0dW9Db21Qcm9kdXRvLmh0bWwnKSwgJ3V0ZjgnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ29udHJhY3RUeXBlLk1VVFVPX1RSQURJTkdfTFhDKVxuICAgICAgICAgICAgICAgICAgICBodG1sID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9hc3NldHMvTXV0dW9Db21UcmFkaW5nTFhDLmh0bWwnKSwgJ3V0ZjgnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ29udHJhY3RUeXBlLk1VVFVPX1NFTV9UUkFESU5HX0xYQylcbiAgICAgICAgICAgICAgICAgICAgaHRtbCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL011dHVvU2VtVHJhZGluZ0xYQy5odG1sJyksICd1dGY4Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09IENvbnRyYWN0VHlwZS5NVVRVT19DT01CT19MWEMpXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uLy4uL2Fzc2V0cy9NdXR1b0NvbWJvTFhDLmh0bWwnKSwgJ3V0ZjgnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuYnVpbGRGb290ZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdMZXR0ZXInLFxuICAgICAgICAgICAgICAgICAgICBiYXNlOiBwYXRoLmpvaW4oJ2ZpbGU6Ly8vJywgX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzLycpLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBcIlwiLC8vaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiMzVtbVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZvb3Rlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50c1wiOiBmb290ZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ZpbGUnLCAvLyAnZmlsZScgb3IgJ2J1ZmZlcidcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGh0bWwsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0OiByZXNvbFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnLi8nICsgZmlsZV9uYW1lICsgJy5wZGYnICAvLyBpdCBpcyBub3QgcmVxdWlyZWQgaWYgdHlwZSBpcyBidWZmZXJcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy9Qcm9taXNlLnJlc29sdmUocGRmLmNyZWF0ZShkb2N1bWVudCwgb3B0aW9ucykpLnRoZW4ocmVzID0+IGNvbnNvbGUubG9nKHJlcykpO1xuICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShwZGYuY3JlYXRlKGRvY3VtZW50LCBvcHRpb25zKSk7XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBtYWtlU2lnbmF0dXJlcyhjb250cmFjdCkge1xuICAgICAgICBjb250cmFjdC52cFNpZ25hdHVyZSA9IFNpZ25hdHVyZXMuSEVMT0lTQTtcbiAgICAgICAgY29udHJhY3QuY29tZXJjaWFsU2lnbmF0dXJlID0gU2lnbmF0dXJlcy5KQUlNRTtcbiAgICAgICAgY29uc3QgZmlyc3RTaWduYXR1cmUgPSBhd2FpdCB0aGlzLnJhbmRvbWl6ZVNpZ25hdHVyZSgpO1xuICAgICAgICBsZXQgc2Vjb25kU2lnbmF0dXJlID0gYXdhaXQgdGhpcy5yYW5kb21pemVTaWduYXR1cmUoKTtcbiAgICAgICAgd2hpbGUgKGZpcnN0U2lnbmF0dXJlID09PSBzZWNvbmRTaWduYXR1cmUpIHtcbiAgICAgICAgICAgIHNlY29uZFNpZ25hdHVyZSA9IGF3YWl0IHRoaXMucmFuZG9taXplU2lnbmF0dXJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJhY3QuZmlyc3RSYW5kb21TaWduYXR1cmUgPSBmaXJzdFNpZ25hdHVyZTtcbiAgICAgICAgY29udHJhY3Quc2Vjb25kUmFuZG9tU2lnbmF0dXJlID0gc2Vjb25kU2lnbmF0dXJlO1xuICAgICAgICByZXR1cm4gY29udHJhY3Q7XG4gICAgfVxuXG4gICAgYXN5bmMgcmFuZG9taXplU2lnbmF0dXJlKCkge1xuICAgICAgICBjb25zdCB0ZXN0aW1vbmlhbHMgPSBPYmplY3Qua2V5cyhTaWduYXR1cmVzKS5maWx0ZXIoZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBpZiAoU2lnbmF0dXJlc1trZXldICE9PSBTaWduYXR1cmVzLkhFTE9JU0EgJiYgU2lnbmF0dXJlc1trZXldICE9PSBTaWduYXR1cmVzLkpBSU1FKVxuICAgICAgICAgICAgICByZXR1cm4gU2lnbmF0dXJlc1trZXldO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBTaWduYXR1cmVzW3Rlc3RpbW9uaWFsc1tPYmplY3Qua2V5cyh0ZXN0aW1vbmlhbHMpW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE9iamVjdC5rZXlzKHRlc3RpbW9uaWFscykubGVuZ3RoKV1dXTtcbiAgICB9XG5cbiAgICBidWlsZEZvb3RlcigpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjOFwiPkFsYW1lZGEgRG91dG9yIENhcmxvcyBkZSBDYXJ2YWxobyBuLiA0MTcgJm5kYXNoOyAzMCZvcmRtOyBhbmRhci4gQ29uanVudG8gMzAwMSAmbmJzcDt8ICZuYnNwO0JhaXJybyBDZW50cm8gJm5ic3A7fFxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Q0VQIDgwNDEwLTE4MCAmbmJzcDt8ICZuYnNwO0N1cml0aWJhIC4gUGFyYW4mYWFjdXRlOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGM4XCI+VGVsZWZvbmUgKzU1IDQxIDMxMjMtOTE5Mjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM4IGMxNFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiYzIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJjNDVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImMzNVwiIGNvbHNwYW49XCIxXCIgcm93c3Bhbj1cIjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImM2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj5NdXR1byBDb20gVHJhZGluZyB2ZXJzw6NvIDUuMDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYzYyXCIgY29sc3Bhbj1cIjFcIiByb3dzcGFuPVwiMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj5QJmFhY3V0ZTtnaW5hIHt7cGFnZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj4mbmJzcDtkZSB7e3BhZ2VzfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjNTFcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjMyBjMTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjMFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYzY0XCIgY29sc3Bhbj1cIjFcIiByb3dzcGFuPVwiMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjMFwiPkRyLiBJc21haXIgSnVuaW9yIENvdXRvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj5EaXJldG9yIEp1ciZpYWN1dGU7ZGljbzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+T0FCL1BSIDQ5MDAxPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwidC4wODJiYzdmOWJkMTc0NThlNzY2MmVmZDQ1ODcxZTdiNzJhNGE4MmZmXCI+PC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwidC42XCI+PC9hPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzIGMxNlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMxNCBjOFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gMilcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGM4XCI+QWxhbWVkYSBEb3V0b3IgQ2FybG9zIGRlIENhcnZhbGhvIG4uIDQxNyAmbmRhc2g7IDMwJm9yZG07IGFuZGFyLiBDb25qdW50byAzMDAxICZuYnNwO3wgJm5ic3A7QmFpcnJvIENlbnRybyAmbmJzcDt8XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO0NFUCA4MDQxMC0xODAgJm5ic3A7fCAmbmJzcDtDdXJpdGliYSAuIFBhcmFuJmFhY3V0ZTs8L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjOFwiPlRlbGVmb25lICs1NSA0MSAzMTIzLTkxOTI8L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM4IGMxNFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJjMjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJjNDVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYzM1XCIgY29sc3Bhbj1cIjFcIiByb3dzcGFuPVwiMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj5NdXR1byBTZW0gVHJhZGluZyB2ZXJzw6NvIDUuMDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYzYyXCIgY29sc3Bhbj1cIjFcIiByb3dzcGFuPVwiMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzAgYzQwXCI+UCZhYWN1dGU7Z2luYSB7e3BhZ2V9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj4mbmJzcDtkZSB7e3BhZ2VzfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjNTFcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzIGMxNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImM2NFwiIGNvbHNwYW49XCIxXCIgcm93c3Bhbj1cIjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+RHIuIElzbWFpciBKdW5pb3IgQ291dG88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjMFwiPkRpcmV0b3IgSnVyJmlhY3V0ZTtkaWNvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj5PQUIvUFIgNDkwMDE8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8YSBpZD1cInQuMDgyYmM3ZjliZDE3NDU4ZTc2NjJlZmQ0NTg3MWU3YjcyYTRhODJmZlwiPjwvYT5cbiAgICAgICAgICAgIDxhIGlkPVwidC42XCI+PC9hPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjMyBjMTZcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMxNCBjOFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAzKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzhcIj5BbGFtZWRhIERvdXRvciBDYXJsb3MgZGUgQ2FydmFsaG8gbi4gNDE3ICZuZGFzaDsgMzAmb3JkbTsgYW5kYXIuIENvbmp1bnRvIDMwMDEgJm5ic3A7fCAmbmJzcDtCYWlycm8gQ2VudHJvICZuYnNwO3xcbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7Q0VQIDgwNDEwLTE4MCAmbmJzcDt8ICZuYnNwO0N1cml0aWJhIC4gUGFyYW4mYWFjdXRlOzwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGM4XCI+VGVsZWZvbmUgKzU1IDQxIDMxMjMtOTE5Mjwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzggYzE0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImMyMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImM0NVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjMzVcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj5Qcm9kdXRvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzAgYzQwXCI+TcO6dHVvICBMZVLDqnZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjNjJcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj5QJmFhY3V0ZTtnaW5hIHt7cGFnZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMwIGM0MFwiPiZuYnNwO2RlIHt7cGFnZXN9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImM1MVwiIGNvbHNwYW49XCIxXCIgcm93c3Bhbj1cIjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+VmVycyZhdGlsZGU7bzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+MS40PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjNjRcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjMFwiPkRyLiBJc21haXIgSnVuaW9yIENvdXRvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj5EaXJldG9yIEp1ciZpYWN1dGU7ZGljbzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+T0FCL1BSIDQ5MDAxPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGEgaWQ9XCJ0LjA4MmJjN2Y5YmQxNzQ1OGU3NjYyZWZkNDU4NzFlN2I3MmE0YTgyZmZcIj48L2E+XG4gICAgICAgICAgICA8YSBpZD1cInQuNlwiPjwvYT5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiYzMgYzE2XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMTQgYzhcIj48L3NwYW4+XG4gICAgICAgICAgICA8L3A+YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gNClcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzhcIj5BbGFtZWRhIERvdXRvciBDYXJsb3MgZGUgQ2FydmFsaG8gbi4gNDE3ICZuZGFzaDsgMzAmb3JkbTsgYW5kYXIuIENvbmp1bnRvIDMwMDEgJm5ic3A7fCAmbmJzcDtCYWlycm8gQ2VudHJvICZuYnNwO3xcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO0NFUCA4MDQxMC0xODAgJm5ic3A7fCAmbmJzcDtDdXJpdGliYSAuIFBhcmFuJmFhY3V0ZTs8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjOFwiPlRlbGVmb25lICs1NSA0MSAzMTIzLTkxOTI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjOCBjMTRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImMyMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiYzQ1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjMzVcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+TcO6dHVvIExYQyBDb20gVHJhZGluZyB2ZXJzw6NvIDUuMDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYzYyXCIgY29sc3Bhbj1cIjFcIiByb3dzcGFuPVwiMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj5QJmFhY3V0ZTtnaW5hIHt7cGFnZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMCBjNDBcIj4mbmJzcDtkZSB7e3BhZ2VzfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjNTFcIiBjb2xzcGFuPVwiMVwiIHJvd3NwYW49XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjMyBjMTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjMFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYzY0XCIgY29sc3Bhbj1cIjFcIiByb3dzcGFuPVwiMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjNCBjMFwiPkRyLiBJc21haXIgSnVuaW9yIENvdXRvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzBcIj5EaXJldG9yIEp1ciZpYWN1dGU7ZGljbzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImM0IGMwXCI+T0FCL1BSIDQ5MDAxPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwidC4wODJiYzdmOWJkMTc0NThlNzY2MmVmZDQ1ODcxZTdiNzJhNGE4MmZmXCI+PC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwidC42XCI+PC9hPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzIGMxNlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMxNCBjOFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gNSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIGAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzQgYzhcIj5BbGFtZWRhIERvdXRvciBDYXJsb3MgZGUgQ2FydmFsaG8gbi4gNDE3ICZuZGFzaDsgMzAmb3JkbTsgYW5kYXIuIENvbmp1bnRvIDMwMDEgJm5ic3A7fCAmbmJzcDtCYWlycm8gQ2VudHJvICZuYnNwO3xcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO0NFUCA4MDQxMC0xODAgJm5ic3A7fCAmbmJzcDtDdXJpdGliYSAuIFBhcmFuJmFhY3V0ZTs8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYzJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjMTggYzUgYzhcIj5UZWxlZm9uZSArNTUgNDEgMzEyMy05MTkyPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImMyIGMzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYzE4IGM1IGM1M1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJ0LmQ1MmZiYjYzNjJiNTgyNmZlNzlmYjE3ODQ3NDc3MjdiZGY2OTkyZjhcIj48L2E+XG4gICAgICAgICAgICAgICAgPGEgaWQ9XCJ0LjZcIj48L2E+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiYzIyXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImMyMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImMzOVwiIGNvbHNwYW49XCIxXCIgcm93c3Bhbj1cIjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjN1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY