ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
81 lines • 13.8 kB
JavaScript
export class PdfDocumentPropertiesExtractor {
pdfDateStringRegex = new RegExp('^D:' + // Prefix (required)
'(\\d{4})' + // Year (required)
'(\\d{2})?' + // Month (optional)
'(\\d{2})?' + // Day (optional)
'(\\d{2})?' + // Hour (optional)
'(\\d{2})?' + // Minute (optional)
'(\\d{2})?' + // Second (optional)
'([Z|+|-])?' + // Universal time relation (optional)
'(\\d{2})?' + // Offset hour (optional)
// tslint:disable-next-line: quotemark
"'?" + // Splitting apostrophe (optional)
'(\\d{2})?' + // Offset minute (optional)
// tslint:disable-next-line: quotemark
"'?" // Trailing apostrophe (optional)
);
async getDocumentProperties() {
const PDFViewerApplication = window.PDFViewerApplication;
const pdfDocument = PDFViewerApplication.pdfDocument;
const result = {};
const md = await pdfDocument.getMetadata();
const info = md.info;
result.author = info.Author;
result.creationDate = this.toDateObject(info.CreationDate);
result.creator = info.Creator;
result.keywords = info.Keywords;
result.linearized = info.IsLinearized;
result.modificationDate = this.toDateObject(info.ModDate);
result.pdfFormatVersion = info.PDFFormatVersion;
result.producer = info.Producer;
result.subject = info.Subject;
result.title = info.Title;
if (md['contentDispositionFilename']) {
result.fileName = md['contentDispositionFilename'];
}
result.maybeFileSize = (await pdfDocument.getDownloadInfo()).length;
return result;
}
/** shamelessly copied from pdf.js */
toDateObject(input) {
// Optional fields that don't satisfy the requirements from the regular
// expression (such as incorrect digit counts or numbers that are out of
// range) will fall back the defaults from the specification.
const matches = this.pdfDateStringRegex.exec(input);
if (!matches) {
return null;
}
// JavaScript's `Date` object expects the month to be between 0 and 11
// instead of 1 and 12, so we have to correct for that.
const year = parseInt(matches[1], 10);
let month = parseInt(matches[2], 10);
month = month >= 1 && month <= 12 ? month - 1 : 0;
let day = parseInt(matches[3], 10);
day = day >= 1 && day <= 31 ? day : 1;
let hour = parseInt(matches[4], 10);
hour = hour >= 0 && hour <= 23 ? hour : 0;
let minute = parseInt(matches[5], 10);
minute = minute >= 0 && minute <= 59 ? minute : 0;
let second = parseInt(matches[6], 10);
second = second >= 0 && second <= 59 ? second : 0;
const universalTimeRelation = matches[7] || 'Z';
let offsetHour = parseInt(matches[8], 10);
offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;
let offsetMinute = parseInt(matches[9], 10) || 0;
offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;
// Universal time relation 'Z' means that the local time is equal to the
// universal time, whereas the relations '+'/'-' indicate that the local
// time is later respectively earlier than the universal time. Every date
// is normalized to universal time.
if (universalTimeRelation === '-') {
hour += offsetHour;
minute += offsetMinute;
}
else if (universalTimeRelation === '+') {
hour -= offsetHour;
minute -= offsetMinute;
}
return new Date(Date.UTC(year, month, day, hour, minute, second));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRvY3VtZW50LXByb3BlcnRpZXMtZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9wZGYtZG9jdW1lbnQtcHJvcGVydGllcy1leHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sT0FBTyw4QkFBOEI7SUFDakMsa0JBQWtCLEdBQUcsSUFBSSxNQUFNLENBQ3JDLEtBQUssR0FBRyxvQkFBb0I7UUFDMUIsVUFBVSxHQUFHLGtCQUFrQjtRQUMvQixXQUFXLEdBQUcsbUJBQW1CO1FBQ2pDLFdBQVcsR0FBRyxpQkFBaUI7UUFDL0IsV0FBVyxHQUFHLGtCQUFrQjtRQUNoQyxXQUFXLEdBQUcsb0JBQW9CO1FBQ2xDLFdBQVcsR0FBRyxvQkFBb0I7UUFDbEMsWUFBWSxHQUFHLHFDQUFxQztRQUNwRCxXQUFXLEdBQUcseUJBQXlCO1FBQ3ZDLHNDQUFzQztRQUN0QyxJQUFJLEdBQUcsa0NBQWtDO1FBQ3pDLFdBQVcsR0FBRywyQkFBMkI7UUFDekMsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxpQ0FBaUM7S0FDekMsQ0FBQztJQUVLLEtBQUssQ0FBQyxxQkFBcUI7UUFDaEMsTUFBTSxvQkFBb0IsR0FBMkIsTUFBYyxDQUFDLG9CQUFvQixDQUFDO1FBQ3pGLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQztRQUVyRCxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsTUFBTSxFQUFFLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQXNCLENBQUM7UUFFdkMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM5QixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxFQUFFLENBQUMsNEJBQTRCLENBQUMsRUFBRTtZQUNwQyxNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsTUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3BFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxxQ0FBcUM7SUFDN0IsWUFBWSxDQUFDLEtBQW1CO1FBQ3RDLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsNkRBQTZEO1FBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxzRUFBc0U7UUFDdEUsdURBQXVEO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyQyxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDaEQsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxVQUFVLEdBQUcsVUFBVSxJQUFJLENBQUMsSUFBSSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxZQUFZLEdBQUcsWUFBWSxJQUFJLENBQUMsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxtQ0FBbUM7UUFDbkMsSUFBSSxxQkFBcUIsS0FBSyxHQUFHLEVBQUU7WUFDakMsSUFBSSxJQUFJLFVBQVUsQ0FBQztZQUNuQixNQUFNLElBQUksWUFBWSxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxxQkFBcUIsS0FBSyxHQUFHLEVBQUU7WUFDeEMsSUFBSSxJQUFJLFVBQVUsQ0FBQztZQUNuQixNQUFNLElBQUksWUFBWSxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUERGVmlld2VyQXBwbGljYXRpb24gfSBmcm9tICcuL29wdGlvbnMvcGRmLXZpZXdlci1hcHBsaWNhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGRmRG9jdW1lbnRJbmZvIHtcbiAgYXV0aG9yPzogc3RyaW5nO1xuICBjcmVhdGlvbkRhdGU/OiBEYXRlO1xuICBjcmVhdG9yPzogc3RyaW5nO1xuXG4gIGtleXdvcmRzPzogc3RyaW5nO1xuICBsaW5lYXJpemVkPzogYm9vbGVhbjtcbiAgbWF5YmVGaWxlU2l6ZT86IHN0cmluZztcbiAgbW9kaWZpY2F0aW9uRGF0ZT86IERhdGU7XG4gIHBkZkZvcm1hdFZlcnNpb24/OiBzdHJpbmc7XG4gIHByb2R1Y2VyPzogc3RyaW5nO1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFBkZkRvY3VtZW50UHJvcGVydGllc0V4dHJhY3RvciB7XG4gIHByaXZhdGUgcGRmRGF0ZVN0cmluZ1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAnXkQ6JyArIC8vIFByZWZpeCAocmVxdWlyZWQpXG4gICAgICAnKFxcXFxkezR9KScgKyAvLyBZZWFyIChyZXF1aXJlZClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBNb250aCAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gRGF5IChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBIb3VyIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBNaW51dGUgKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIFNlY29uZCAob3B0aW9uYWwpXG4gICAgICAnKFtafCt8LV0pPycgKyAvLyBVbml2ZXJzYWwgdGltZSByZWxhdGlvbiAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gT2Zmc2V0IGhvdXIgKG9wdGlvbmFsKVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBxdW90ZW1hcmtcbiAgICAgIFwiJz9cIiArIC8vIFNwbGl0dGluZyBhcG9zdHJvcGhlIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBPZmZzZXQgbWludXRlIChvcHRpb25hbClcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcXVvdGVtYXJrXG4gICAgICBcIic/XCIgLy8gVHJhaWxpbmcgYXBvc3Ryb3BoZSAob3B0aW9uYWwpXG4gICk7XG5cbiAgcHVibGljIGFzeW5jIGdldERvY3VtZW50UHJvcGVydGllcygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gPSAod2luZG93IGFzIGFueSkuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgY29uc3QgcGRmRG9jdW1lbnQgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZEb2N1bWVudDtcblxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgY29uc3QgbWQgPSBhd2FpdCBwZGZEb2N1bWVudC5nZXRNZXRhZGF0YSgpO1xuICAgIGNvbnN0IGluZm8gPSBtZC5pbmZvIGFzIHVua25vd24gYXMgYW55O1xuXG4gICAgcmVzdWx0LmF1dGhvciA9IGluZm8uQXV0aG9yO1xuICAgIHJlc3VsdC5jcmVhdGlvbkRhdGUgPSB0aGlzLnRvRGF0ZU9iamVjdChpbmZvLkNyZWF0aW9uRGF0ZSk7XG4gICAgcmVzdWx0LmNyZWF0b3IgPSBpbmZvLkNyZWF0b3I7XG4gICAgcmVzdWx0LmtleXdvcmRzID0gaW5mby5LZXl3b3JkcztcbiAgICByZXN1bHQubGluZWFyaXplZCA9IGluZm8uSXNMaW5lYXJpemVkO1xuICAgIHJlc3VsdC5tb2RpZmljYXRpb25EYXRlID0gdGhpcy50b0RhdGVPYmplY3QoaW5mby5Nb2REYXRlKTtcbiAgICByZXN1bHQucGRmRm9ybWF0VmVyc2lvbiA9IGluZm8uUERGRm9ybWF0VmVyc2lvbjtcbiAgICByZXN1bHQucHJvZHVjZXIgPSBpbmZvLlByb2R1Y2VyO1xuICAgIHJlc3VsdC5zdWJqZWN0ID0gaW5mby5TdWJqZWN0O1xuICAgIHJlc3VsdC50aXRsZSA9IGluZm8uVGl0bGU7XG4gICAgaWYgKG1kWydjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSddKSB7XG4gICAgICByZXN1bHQuZmlsZU5hbWUgPSBtZFsnY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUnXTtcbiAgICB9XG4gICAgcmVzdWx0Lm1heWJlRmlsZVNpemUgPSAoYXdhaXQgcGRmRG9jdW1lbnQuZ2V0RG93bmxvYWRJbmZvKCkpLmxlbmd0aDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIHNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIHBkZi5qcyAqL1xuICBwcml2YXRlIHRvRGF0ZU9iamVjdChpbnB1dDogc3RyaW5nIHwgYW55KTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBmcm9tIHRoZSByZWd1bGFyXG4gICAgLy8gZXhwcmVzc2lvbiAoc3VjaCBhcyBpbmNvcnJlY3QgZGlnaXQgY291bnRzIG9yIG51bWJlcnMgdGhhdCBhcmUgb3V0IG9mXG4gICAgLy8gcmFuZ2UpIHdpbGwgZmFsbCBiYWNrIHRoZSBkZWZhdWx0cyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLlxuICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLnBkZkRhdGVTdHJpbmdSZWdleC5leGVjKGlucHV0KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEphdmFTY3JpcHQncyBgRGF0ZWAgb2JqZWN0IGV4cGVjdHMgdGhlIG1vbnRoIHRvIGJlIGJldHdlZW4gMCBhbmQgMTFcbiAgICAvLyBpbnN0ZWFkIG9mIDEgYW5kIDEyLCBzbyB3ZSBoYXZlIHRvIGNvcnJlY3QgZm9yIHRoYXQuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcbiAgICBsZXQgbW9udGggPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCk7XG4gICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDtcbiAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hlc1szXSwgMTApO1xuICAgIGRheSA9IGRheSA+PSAxICYmIGRheSA8PSAzMSA/IGRheSA6IDE7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7XG4gICAgaG91ciA9IGhvdXIgPj0gMCAmJiBob3VyIDw9IDIzID8gaG91ciA6IDA7XG4gICAgbGV0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwO1xuICAgIGxldCBzZWNvbmQgPSBwYXJzZUludChtYXRjaGVzWzZdLCAxMCk7XG4gICAgc2Vjb25kID0gc2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5ID8gc2Vjb25kIDogMDtcbiAgICBjb25zdCB1bml2ZXJzYWxUaW1lUmVsYXRpb24gPSBtYXRjaGVzWzddIHx8ICdaJztcbiAgICBsZXQgb2Zmc2V0SG91ciA9IHBhcnNlSW50KG1hdGNoZXNbOF0sIDEwKTtcbiAgICBvZmZzZXRIb3VyID0gb2Zmc2V0SG91ciA+PSAwICYmIG9mZnNldEhvdXIgPD0gMjMgPyBvZmZzZXRIb3VyIDogMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s5XSwgMTApIHx8IDA7XG4gICAgb2Zmc2V0TWludXRlID0gb2Zmc2V0TWludXRlID49IDAgJiYgb2Zmc2V0TWludXRlIDw9IDU5ID8gb2Zmc2V0TWludXRlIDogMDtcblxuICAgIC8vIFVuaXZlcnNhbCB0aW1lIHJlbGF0aW9uICdaJyBtZWFucyB0aGF0IHRoZSBsb2NhbCB0aW1lIGlzIGVxdWFsIHRvIHRoZVxuICAgIC8vIHVuaXZlcnNhbCB0aW1lLCB3aGVyZWFzIHRoZSByZWxhdGlvbnMgJysnLyctJyBpbmRpY2F0ZSB0aGF0IHRoZSBsb2NhbFxuICAgIC8vIHRpbWUgaXMgbGF0ZXIgcmVzcGVjdGl2ZWx5IGVhcmxpZXIgdGhhbiB0aGUgdW5pdmVyc2FsIHRpbWUuIEV2ZXJ5IGRhdGVcbiAgICAvLyBpcyBub3JtYWxpemVkIHRvIHVuaXZlcnNhbCB0aW1lLlxuICAgIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICctJykge1xuICAgICAgaG91ciArPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlICs9IG9mZnNldE1pbnV0ZTtcbiAgICB9IGVsc2UgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gJysnKSB7XG4gICAgICBob3VyIC09IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuICB9XG59XG4iXX0=