"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const correct_file_path_1 = __importDefault(require("../utils/correct-file-path")); const escape_user_agent_1 = __importDefault(require("../utils/escape-user-agent")); const events_1 = __importDefault(require("events")); const DATE_FORMAT = 'YYYY-MM-DD'; const TIME_FORMAT = 'HH-mm-ss'; const ERRORS_FOLDER = 'errors'; const PROBLEMATIC_PLACEHOLDER_VALUE = ''; const PLACEHOLDERS = { DATE: '${DATE}', TIME: '${TIME}', TEST_INDEX: '${TEST_INDEX}', FILE_INDEX: '${FILE_INDEX}', QUARANTINE_ATTEMPT: '${QUARANTINE_ATTEMPT}', FIXTURE: '${FIXTURE}', TEST: '${TEST}', USERAGENT: '${USERAGENT}', BROWSER: '${BROWSER}', BROWSER_VERSION: '${BROWSER_VERSION}', OS: '${OS}', OS_VERSION: '${OS_VERSION}', TEST_ID: '${TEST_ID}', RUN_ID: '${RUN_ID}', }; const DEFAULT_PATH_PATTERN_FOR_REPORT = `${PLACEHOLDERS.DATE}_${PLACEHOLDERS.TIME}\\${PLACEHOLDERS.TEST_ID}\\` + `${PLACEHOLDERS.RUN_ID}\\${PLACEHOLDERS.USERAGENT}\\${PLACEHOLDERS.FILE_INDEX}`; const TEST_ID_TEMPLATE = data => data.testIndex ? `test-${data.testIndex}` : ''; const RUN_ID_TEMPLATE = data => data.quarantineAttempt ? `run-${data.quarantineAttempt}` : ''; class PathPattern extends events_1.default { constructor(pattern, fileExtension, data) { super(); this.pattern = this._ensurePattern(pattern); this.data = this._addDefaultFields(data); this.placeholderToDataMap = this._createPlaceholderToDataMap(); this.fileExtension = fileExtension; } _ensurePattern(pattern) { if (pattern) return pattern; return DEFAULT_PATH_PATTERN_FOR_REPORT; } _addDefaultFields(data) { const defaultFields = { testId: TEST_ID_TEMPLATE(data), runId: RUN_ID_TEMPLATE(data), formattedDate: data.now.format(DATE_FORMAT), formattedTime: data.now.format(TIME_FORMAT), fileIndex: 1, errorFileIndex: 1, }; return Object.assign({}, defaultFields, data); } _createPlaceholderToDataMap() { return { [PLACEHOLDERS.TEST_ID]: this.data.testId, [PLACEHOLDERS.RUN_ID]: this.data.runId, [PLACEHOLDERS.DATE]: this.data.formattedDate, [PLACEHOLDERS.TIME]: this.data.formattedTime, [PLACEHOLDERS.TEST_INDEX]: this.data.testIndex, [PLACEHOLDERS.QUARANTINE_ATTEMPT]: this.data.quarantineAttempt || 1, [PLACEHOLDERS.FIXTURE]: this.data.fixture, [PLACEHOLDERS.TEST]: this.data.test, [PLACEHOLDERS.FILE_INDEX]: forError => forError ? this.data.errorFileIndex : this.data.fileIndex, [PLACEHOLDERS.USERAGENT]: this.data.parsedUserAgent.prettyUserAgent, [PLACEHOLDERS.BROWSER]: this.data.parsedUserAgent.name, [PLACEHOLDERS.BROWSER_VERSION]: this.data.parsedUserAgent.version, [PLACEHOLDERS.OS]: this.data.parsedUserAgent.os.name, [PLACEHOLDERS.OS_VERSION]: this.data.parsedUserAgent.os.version, }; } _buildPath(pattern, placeholderToDataMap, forError) { let resultFilePath = pattern; const problematicPlaceholders = []; for (const placeholder in placeholderToDataMap) { const findPlaceholderRegExp = new RegExp((0, lodash_1.escapeRegExp)(placeholder), 'g'); resultFilePath = resultFilePath.replace(findPlaceholderRegExp, () => { if (placeholder === PLACEHOLDERS.FILE_INDEX) { const getFileIndexFn = placeholderToDataMap[placeholder]; let result = getFileIndexFn(forError); if (forError) result = `${ERRORS_FOLDER}\\${result}`; return result; } else if (placeholder === PLACEHOLDERS.USERAGENT) { const userAgent = placeholderToDataMap[placeholder]; return (0, escape_user_agent_1.default)(userAgent); } let calculatedValue = placeholderToDataMap[placeholder]; if (calculatedValue === null || calculatedValue === void 0) { problematicPlaceholders.push(placeholder); calculatedValue = PROBLEMATIC_PLACEHOLDER_VALUE; } return calculatedValue; }); } if (problematicPlaceholders.length) this.emit('problematic-placeholders-found', { placeholders: problematicPlaceholders }); return resultFilePath; } getPath(forError) { const path = this._buildPath(this.pattern, this.placeholderToDataMap, forError); return (0, correct_file_path_1.default)(path, this.fileExtension); } // For testing purposes static get PLACEHOLDERS() { return PLACEHOLDERS; } } exports.default = PathPattern; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC1wYXR0ZXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGgtcGF0dGVybi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrRDtBQUNsRCxtRkFBeUQ7QUFDekQsbUZBQXlEO0FBQ3pELG9EQUFrQztBQUVsQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDakMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUUvQixNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRztJQUNqQixJQUFJLEVBQWdCLFNBQVM7SUFDN0IsSUFBSSxFQUFnQixTQUFTO0lBQzdCLFVBQVUsRUFBVSxlQUFlO0lBQ25DLFVBQVUsRUFBVSxlQUFlO0lBQ25DLGtCQUFrQixFQUFFLHVCQUF1QjtJQUMzQyxPQUFPLEVBQWEsWUFBWTtJQUNoQyxJQUFJLEVBQWdCLFNBQVM7SUFDN0IsU0FBUyxFQUFXLGNBQWM7SUFDbEMsT0FBTyxFQUFhLFlBQVk7SUFDaEMsZUFBZSxFQUFLLG9CQUFvQjtJQUN4QyxFQUFFLEVBQWtCLE9BQU87SUFDM0IsVUFBVSxFQUFVLGVBQWU7SUFDbkMsT0FBTyxFQUFhLFlBQVk7SUFDaEMsTUFBTSxFQUFjLFdBQVc7Q0FDbEMsQ0FBQztBQUVGLE1BQU0sK0JBQStCLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sSUFBSTtJQUN0RSxHQUFHLFlBQVksQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFFeEgsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFB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QUssSUFBSSxJQUFJLGVBQWUsS0FBSyxLQUFLLENBQUMsRUFBRTtvQkFDeEQsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUUxQyxlQUFlLEdBQUcsNkJBQTZCLENBQUM7aUJBQ25EO2dCQUVELE9BQU8sZUFBZSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLHVCQUF1QixDQUFDLE1BQU07WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7UUFFM0YsT0FBTyxjQUFjLENBQUM7SUFDMUIsQ0FBQztJQUVELE9BQU8sQ0FBRSxRQUFRO1FBQ2IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVoRixPQUFPLElBQUEsMkJBQWUsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLFlBQVk7UUFDbkIsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztDQUNKO0FBckdELDhCQXFHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVzY2FwZVJlZ0V4cCBhcyBlc2NhcGVSZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgY29ycmVjdEZpbGVQYXRoIGZyb20gJy4uL3V0aWxzL2NvcnJlY3QtZmlsZS1wYXRoJztcbmltcG9ydCBlc2NhcGVVc2VyQWdlbnQgZnJvbSAnLi4vdXRpbHMvZXNjYXBlLXVzZXItYWdlbnQnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuXG5jb25zdCBEQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREJztcbmNvbnN0IFRJTUVfRk9STUFUID0gJ0hILW1tLXNzJztcblxuY29uc3QgRVJST1JTX0ZPTERFUiA9ICdlcnJvcnMnO1xuXG5jb25zdCBQUk9CTEVNQVRJQ19QTEFDRUhPTERFUl9WQUxVRSA9ICcnO1xuXG5jb25zdCBQTEFDRUhPTERFUlMgPSB7XG4gICAgREFURTogICAgICAgICAgICAgICAnJHtEQVRFfScsXG4gICAgVElNRTogICAgICAgICAgICAgICAnJHtUSU1FfScsXG4gICAgVEVTVF9JTkRFWDogICAgICAgICAnJHtURVNUX0lOREVYfScsXG4gICAgRklMRV9JTkRFWDogICAgICAgICAnJHtGSUxFX0lOREVYfScsXG4gICAgUVVBUkFOVElORV9BVFRFTVBUOiAnJHtRVUFSQU5USU5FX0FUVEVNUFR9JyxcbiAgICBGSVhUVVJFOiAgICAgICAgICAgICcke0ZJWFRVUkV9JyxcbiAgICBURVNUOiAgICAgICAgICAgICAgICcke1RFU1R9JyxcbiAgICBVU0VSQUdFTlQ6ICAgICAgICAgICcke1VTRVJBR0VOVH0nLFxuICAgIEJST1dTRVI6ICAgICAgICAgICAgJyR7QlJPV1NFUn0nLFxuICAgIEJST1dTRVJfVkVSU0lPTjogICAgJyR7QlJPV1NFUl9WRVJTSU9OfScsXG4gICAgT1M6ICAgICAgICAgICAgICAgICAnJHtPU30nLFxuICAgIE9TX1ZFUlNJT046ICAgICAgICAgJyR7T1NfVkVSU0lPTn0nLFxuICAgIFRFU1RfSUQ6ICAgICAgICAgICAgJyR7VEVTVF9JRH0nLFxuICAgIFJVTl9JRDogICAgICAgICAgICAgJyR7UlVOX0lEfScsXG59O1xuXG5jb25zdCBERUZBVUxUX1BBVEhfUEFUVEVSTl9GT1JfUkVQT1JUID0gYCR7UExBQ0VIT0xERVJTLkRBVEV9XyR7UExBQ0VIT0xERVJTLlRJTUV9XFxcXCR7UExBQ0VIT0xERVJTLlRFU1RfSUR9XFxcXGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke1BMQUNFSE9MREVSUy5SVU5fSUR9XFxcXCR7UExBQ0VIT0xERVJTLlVTRVJBR0VOVH1cXFxcJHtQTEFDRUhPTERFUlMuRklMRV9JTkRFWH1gO1xuXG5jb25zdCBURVNUX0lEX1RFTVBMQVRFID0gZGF0YSA9PiBkYXRhLnRlc3RJbmRleCA/IGB0ZXN0LSR7ZGF0YS50ZXN0SW5kZXh9YCA6ICcnO1xuY29uc3QgUlVOX0lEX1RFTVBMQVRFICA9IGRhdGEgPT4gZGF0YS5xdWFyYW50aW5lQXR0ZW1wdCA/IGBydW4tJHtkYXRhLnF1YXJhbnRpbmVBdHRlbXB0fWAgOiAnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGF0aFBhdHRlcm4gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yIChwYXR0ZXJuLCBmaWxlRXh0ZW5zaW9uLCBkYXRhKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5wYXR0ZXJuICAgICAgICAgICAgICA9IHRoaXMuX2Vuc3VyZVBhdHRlcm4ocGF0dGVybik7XG4gICAgICAgIHRoaXMuZGF0YSAgICAgICAgICAgICAgICAgPSB0aGlzLl9hZGREZWZhdWx0RmllbGRzKGRhdGEpO1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyVG9EYXRhTWFwID0gdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXJUb0RhdGFNYXAoKTtcbiAgICAgICAgdGhpcy5maWxlRXh0ZW5zaW9uICAgICAgICA9IGZpbGVFeHRlbnNpb247XG4gICAgfVxuXG4gICAgX2Vuc3VyZVBhdHRlcm4gKHBhdHRlcm4pIHtcbiAgICAgICAgaWYgKHBhdHRlcm4pXG4gICAgICAgICAgICByZXR1cm4gcGF0dGVybjtcblxuICAgICAgICByZXR1cm4gREVGQVVMVF9QQVRIX1BBVFRFUk5fRk9SX1JFUE9SVDtcbiAgICB9XG5cbiAgICBfYWRkRGVmYXVsdEZpZWxkcyAoZGF0YSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0RmllbGRzID0ge1xuICAgICAgICAgICAgdGVzdElkOiAgICAgICAgIFRFU1RfSURfVEVNUExBVEUoZGF0YSksXG4gICAgICAgICAgICBydW5JZDogICAgICAgICAgUlVOX0lEX1RFTVBMQVRFKGRhdGEpLFxuICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZTogIGRhdGEubm93LmZvcm1hdChEQVRFX0ZPUk1BVCksXG4gICAgICAgICAgICBmb3JtYXR0ZWRUaW1lOiAgZGF0YS5ub3cuZm9ybWF0KFRJTUVfRk9STUFUKSxcbiAgICAgICAgICAgIGZpbGVJbmRleDogICAgICAxLFxuICAgICAgICAgICAgZXJyb3JGaWxlSW5kZXg6IDEsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRGaWVsZHMsIGRhdGEpO1xuICAgIH1cblxuICAgIF9jcmVhdGVQbGFjZWhvbGRlclRvRGF0YU1hcCAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLlRFU1RfSURdOiAgICAgICAgICAgIHRoaXMuZGF0YS50ZXN0SWQsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLlJVTl9JRF06ICAgICAgICAgICAgIHRoaXMuZGF0YS5ydW5JZCxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuREFURV06ICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLlRJTUVdOiAgICAgICAgICAgICAgIHRoaXMuZGF0YS5mb3JtYXR0ZWRUaW1lLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5URVNUX0lOREVYXTogICAgICAgICB0aGlzLmRhdGEudGVzdEluZGV4LFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5RVUFSQU5USU5FX0FUVEVNUFRdOiB0aGlzLmRhdGEucXVhcmFudGluZUF0dGVtcHQgfHwgMSxcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuRklYVFVSRV06ICAgICAgICAgICAgdGhpcy5kYXRhLmZpeHR1cmUsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLlRFU1RdOiAgICAgICAgICAgICAgIHRoaXMuZGF0YS50ZXN0LFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5GSUxFX0lOREVYXTogICAgICAgICBmb3JFcnJvciA9PiBmb3JFcnJvciA/IHRoaXMuZGF0YS5lcnJvckZpbGVJbmRleCA6IHRoaXMuZGF0YS5maWxlSW5kZXgsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLlVTRVJBR0VOVF06ICAgICAgICAgIHRoaXMuZGF0YS5wYXJzZWRVc2VyQWdlbnQucHJldHR5VXNlckFnZW50LFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5CUk9XU0VSXTogICAgICAgICAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50Lm5hbWUsXG4gICAgICAgICAgICBbUExBQ0VIT0xERVJTLkJST1dTRVJfVkVSU0lPTl06ICAgIHRoaXMuZGF0YS5wYXJzZWRVc2VyQWdlbnQudmVyc2lvbixcbiAgICAgICAgICAgIFtQTEFDRUhPTERFUlMuT1NdOiAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnBhcnNlZFVzZXJBZ2VudC5vcy5uYW1lLFxuICAgICAgICAgICAgW1BMQUNFSE9MREVSUy5PU19WRVJTSU9OXTogICAgICAgICB0aGlzLmRhdGEucGFyc2VkVXNlckFnZW50Lm9zLnZlcnNpb24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX2J1aWxkUGF0aCAocGF0dGVybiwgcGxhY2Vob2xkZXJUb0RhdGFNYXAsIGZvckVycm9yKSB7XG4gICAgICAgIGxldCByZXN1bHRGaWxlUGF0aCAgICAgICAgICAgID0gcGF0dGVybjtcbiAgICAgICAgY29uc3QgcHJvYmxlbWF0aWNQbGFjZWhvbGRlcnMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyIGluIHBsYWNlaG9sZGVyVG9EYXRhTWFwKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5kUGxhY2Vob2xkZXJSZWdFeHAgPSBuZXcgUmVnRXhwKGVzY2FwZVJlKHBsYWNlaG9sZGVyKSwgJ2cnKTtcblxuICAgICAgICAgICAgcmVzdWx0RmlsZVBhdGggPSByZXN1bHRGaWxlUGF0aC5yZXBsYWNlKGZpbmRQbGFjZWhvbGRlclJlZ0V4cCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciA9PT0gUExBQ0VIT0xERVJTLkZJTEVfSU5ERVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RmlsZUluZGV4Rm4gPSBwbGFjZWhvbGRlclRvRGF0YU1hcFtwbGFjZWhvbGRlcl07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgICAgICAgICAgID0gZ2V0RmlsZUluZGV4Rm4oZm9yRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGAke0VSUk9SU19GT0xERVJ9XFxcXCR7cmVzdWx0fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwbGFjZWhvbGRlciA9PT0gUExBQ0VIT0xERVJTLlVTRVJBR0VOVCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSBwbGFjZWhvbGRlclRvRGF0YU1hcFtwbGFjZWhvbGRlcl07XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZVVzZXJBZ2VudCh1c2VyQWdlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjYWxjdWxhdGVkVmFsdWUgPSBwbGFjZWhvbGRlclRvRGF0YU1hcFtwbGFjZWhvbGRlcl07XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZFZhbHVlID09PSBudWxsIHx8IGNhbGN1bGF0ZWRWYWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2JsZW1hdGljUGxhY2Vob2xkZXJzLnB1c2gocGxhY2Vob2xkZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRWYWx1ZSA9IFBST0JMRU1BVElDX1BMQUNFSE9MREVSX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVkVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ibGVtYXRpY1BsYWNlaG9sZGVycy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Byb2JsZW1hdGljLXBsYWNlaG9sZGVycy1mb3VuZCcsIHsgcGxhY2Vob2xkZXJzOiBwcm9ibGVtYXRpY1BsYWNlaG9sZGVycyB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0RmlsZVBhdGg7XG4gICAgfVxuXG4gICAgZ2V0UGF0aCAoZm9yRXJyb3IpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMuX2J1aWxkUGF0aCh0aGlzLnBhdHRlcm4sIHRoaXMucGxhY2Vob2xkZXJUb0RhdGFNYXAsIGZvckVycm9yKTtcblxuICAgICAgICByZXR1cm4gY29ycmVjdEZpbGVQYXRoKHBhdGgsIHRoaXMuZmlsZUV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICBzdGF0aWMgZ2V0IFBMQUNFSE9MREVSUyAoKSB7XG4gICAgICAgIHJldHVybiBQTEFDRUhPTERFUlM7XG4gICAgfVxufVxuIl19