UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

153 lines 24.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const testcafe_browser_tools_1 = require("testcafe-browser-tools"); const crop_1 = require("./crop"); const async_queue_1 = require("../utils/async-queue"); const warning_message_1 = __importDefault(require("../notifications/warning-message")); const escape_user_agent_1 = __importDefault(require("../utils/escape-user-agent")); const correct_file_path_1 = __importDefault(require("../utils/correct-file-path")); const promisified_functions_1 = require("../utils/promisified-functions"); const default_extension_1 = __importDefault(require("./default-extension")); class Capturer { // TODO: refactor to use dictionary constructor(baseScreenshotsPath, testEntry, connection, pathPattern, fullPage, thumbnails, warningLog) { this.enabled = !!baseScreenshotsPath; this.baseScreenshotsPath = baseScreenshotsPath; this.testEntry = testEntry; this.provider = connection.provider; this.browserId = connection.id; this.warningLog = warningLog; this.pathPattern = pathPattern; this.fullPage = fullPage; this.thumbnails = thumbnails; } static _getDimensionWithoutScrollbar(fullDimension, documentDimension, bodyDimension) { if (bodyDimension > fullDimension) return documentDimension; if (documentDimension > fullDimension) return bodyDimension; return Math.max(documentDimension, bodyDimension); } static _getCropDimensions(cropDimensions, pageDimensions) { if (!cropDimensions || !pageDimensions) return null; const { dpr } = pageDimensions; const { top, left, bottom, right } = cropDimensions; return { top: Math.round(top * dpr), left: Math.round(left * dpr), bottom: Math.round(bottom * dpr), right: Math.round(right * dpr), }; } static _getClientAreaDimensions(pageDimensions) { if (!pageDimensions) return null; const { innerWidth, documentWidth, bodyWidth, innerHeight, documentHeight, bodyHeight, dpr } = pageDimensions; return { width: Math.floor(Capturer._getDimensionWithoutScrollbar(innerWidth, documentWidth, bodyWidth) * dpr), height: Math.floor(Capturer._getDimensionWithoutScrollbar(innerHeight, documentHeight, bodyHeight) * dpr), }; } static async _isScreenshotCaptured(screenshotPath) { try { const stats = await (0, promisified_functions_1.stat)(screenshotPath); return stats.isFile(); } catch (e) { return false; } } _joinWithBaseScreenshotPath(path) { return (0, path_1.join)(this.baseScreenshotsPath, path); } _incrementFileIndexes(forError) { if (forError) this.pathPattern.data.errorFileIndex++; else this.pathPattern.data.fileIndex++; } _getCustomScreenshotPath(customPath) { const correctedCustomPath = (0, correct_file_path_1.default)(customPath, default_extension_1.default); return this._joinWithBaseScreenshotPath(correctedCustomPath); } _getScreenshotPath(forError, customPathPattern) { const path = this.pathPattern.getPath(forError, customPathPattern); this._incrementFileIndexes(forError); return this._joinWithBaseScreenshotPath(path); } _getThumbnailPath(screenshotPath) { const imageName = (0, path_1.basename)(screenshotPath); const imageDir = (0, path_1.dirname)(screenshotPath); return (0, path_1.join)(imageDir, 'thumbnails', imageName); } async _takeScreenshot({ filePath, pageWidth, pageHeight, fullPage = this.fullPage }) { await this.provider.takeScreenshot(this.browserId, filePath, pageWidth, pageHeight, fullPage); } async _capture(forError, { actionId, failedActionId, pageDimensions, cropDimensions, markSeed, customPath, customPathPattern, fullPage, thumbnails } = {}) { if (!this.enabled) return null; thumbnails = thumbnails === void 0 ? this.thumbnails : thumbnails; const screenshotPath = customPath ? this._getCustomScreenshotPath(customPath) : this._getScreenshotPath(forError, customPathPattern); const thumbnailPath = this._getThumbnailPath(screenshotPath); if (customPath && customPathPattern) this.warningLog.addWarning(warning_message_1.default.screenshotPathOverridesPathPattern, customPath, customPathPattern); if ((0, async_queue_1.isInQueue)(screenshotPath)) this.warningLog.addWarning(warning_message_1.default.screenshotRewritingError, screenshotPath); await (0, async_queue_1.addToQueue)(screenshotPath, async () => { const clientAreaDimensions = Capturer._getClientAreaDimensions(pageDimensions); const { width: pageWidth, height: pageHeight } = clientAreaDimensions || {}; const takeScreenshotOptions = { filePath: screenshotPath, pageWidth, pageHeight, fullPage, }; await this._takeScreenshot(takeScreenshotOptions); if (!await Capturer._isScreenshotCaptured(screenshotPath)) return; const image = await (0, promisified_functions_1.readPngFile)(screenshotPath); const markSeedPosition = markSeed ? (0, crop_1.calculateMarkPosition)(image, markSeed) : null; if (markSeed && !markSeedPosition) this.warningLog.addWarning(warning_message_1.default.screenshotMarkNotFound, screenshotPath, (0, crop_1.markSeedToId)(markSeed)); const croppedImage = await (0, crop_1.cropScreenshot)(image, { markSeedPosition, clientAreaDimensions, path: screenshotPath, cropDimensions: Capturer._getCropDimensions(cropDimensions, pageDimensions), }); if (croppedImage) await (0, promisified_functions_1.writePng)(screenshotPath, croppedImage); if (thumbnails) await (0, testcafe_browser_tools_1.generateThumbnail)(screenshotPath, thumbnailPath); }); const testRunId = this.testEntry.testRuns[this.browserId].id; const userAgent = (0, escape_user_agent_1.default)(this.pathPattern.data.parsedUserAgent.prettyUserAgent); const quarantineAttempt = this.pathPattern.data.quarantineAttempt; const takenOnFail = forError; const screenshot = { testRunId, screenshotPath, thumbnailPath, userAgent, quarantineAttempt, takenOnFail, actionId: failedActionId || actionId, }; this.testEntry.screenshots.push(screenshot); return screenshotPath; } async captureAction(options) { return await this._capture(false, options); } async captureError(options) { return await this._capture(true, options); } } exports.default = Capturer; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyZWVuc2hvdHMvY2FwdHVyZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFJYztBQUVkLG1FQUEyRDtBQUMzRCxpQ0FJZ0I7QUFDaEIsc0RBQTZEO0FBQzdELHVGQUErRDtBQUMvRCxtRkFBeUQ7QUFDekQsbUZBQXlEO0FBQ3pELDBFQUl3QztBQUV4Qyw0RUFBK0Q7QUFHL0QsTUFBcUIsUUFBUTtJQUN6QixtQ0FBbUM7SUFDbkMsWUFBYSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVU7UUFDbEcsSUFBSSxDQUFDLE9BQU8sR0FBZSxDQUFDLENBQUMsbUJBQW1CLENBQUM7UUFDakQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEdBQWEsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQWMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFhLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBWSxVQUFVLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBVyxXQUFXLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBYyxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBWSxVQUFVLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sQ0FBQyw2QkFBNkIsQ0FBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsYUFBYTtRQUNqRixJQUFJLGFBQWEsR0FBRyxhQUFhO1lBQzdCLE9BQU8saUJBQWlCLENBQUM7UUFFN0IsSUFBSSxpQkFBaUIsR0FBRyxhQUFhO1lBQ2pDLE9BQU8sYUFBYSxDQUFDO1FBRXpCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FB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T0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDSjtBQXBMRCwyQkFvTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGpvaW4gYXMgam9pblBhdGgsXG4gICAgZGlybmFtZSxcbiAgICBiYXNlbmFtZSxcbn0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGdlbmVyYXRlVGh1bWJuYWlsIH0gZnJvbSAndGVzdGNhZmUtYnJvd3Nlci10b29scyc7XG5pbXBvcnQge1xuICAgIGNyb3BTY3JlZW5zaG90LFxuICAgIGNhbGN1bGF0ZU1hcmtQb3NpdGlvbixcbiAgICBtYXJrU2VlZFRvSWQsXG59IGZyb20gJy4vY3JvcCc7XG5pbXBvcnQgeyBpc0luUXVldWUsIGFkZFRvUXVldWUgfSBmcm9tICcuLi91dGlscy9hc3luYy1xdWV1ZSc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCBlc2NhcGVVc2VyQWdlbnQgZnJvbSAnLi4vdXRpbHMvZXNjYXBlLXVzZXItYWdlbnQnO1xuaW1wb3J0IGNvcnJlY3RGaWxlUGF0aCBmcm9tICcuLi91dGlscy9jb3JyZWN0LWZpbGUtcGF0aCc7XG5pbXBvcnQge1xuICAgIHJlYWRQbmdGaWxlLFxuICAgIHN0YXQsXG4gICAgd3JpdGVQbmcsXG59IGZyb20gJy4uL3V0aWxzL3Byb21pc2lmaWVkLWZ1bmN0aW9ucyc7XG5cbmltcG9ydCBERUZBVUxUX1NDUkVFTlNIT1RfRVhURU5TSU9OIGZyb20gJy4vZGVmYXVsdC1leHRlbnNpb24nO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcHR1cmVyIHtcbiAgICAvLyBUT0RPOiByZWZhY3RvciB0byB1c2UgZGljdGlvbmFyeVxuICAgIGNvbnN0cnVjdG9yIChiYXNlU2NyZWVuc2hvdHNQYXRoLCB0ZXN0RW50cnksIGNvbm5lY3Rpb24sIHBhdGhQYXR0ZXJuLCBmdWxsUGFnZSwgdGh1bWJuYWlscywgd2FybmluZ0xvZykge1xuICAgICAgICB0aGlzLmVuYWJsZWQgICAgICAgICAgICAgPSAhIWJhc2VTY3JlZW5zaG90c1BhdGg7XG4gICAgICAgIHRoaXMuYmFzZVNjcmVlbnNob3RzUGF0aCA9IGJhc2VTY3JlZW5zaG90c1BhdGg7XG4gICAgICAgIHRoaXMudGVzdEVudHJ5ICAgICAgICAgICA9IHRlc3RFbnRyeTtcbiAgICAgICAgdGhpcy5wcm92aWRlciAgICAgICAgICAgID0gY29ubmVjdGlvbi5wcm92aWRlcjtcbiAgICAgICAgdGhpcy5icm93c2VySWQgICAgICAgICAgID0gY29ubmVjdGlvbi5pZDtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nICAgICAgICAgID0gd2FybmluZ0xvZztcbiAgICAgICAgdGhpcy5wYXRoUGF0dGVybiAgICAgICAgID0gcGF0aFBhdHRlcm47XG4gICAgICAgIHRoaXMuZnVsbFBhZ2UgICAgICAgICAgICA9IGZ1bGxQYWdlO1xuICAgICAgICB0aGlzLnRodW1ibmFpbHMgICAgICAgICAgPSB0aHVtYm5haWxzO1xuICAgIH1cblxuICAgIHN0YXRpYyBfZ2V0RGltZW5zaW9uV2l0aG91dFNjcm9sbGJhciAoZnVsbERpbWVuc2lvbiwgZG9jdW1lbnREaW1lbnNpb24sIGJvZHlEaW1lbnNpb24pIHtcbiAgICAgICAgaWYgKGJvZHlEaW1lbnNpb24gPiBmdWxsRGltZW5zaW9uKVxuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50RGltZW5zaW9uO1xuXG4gICAgICAgIGlmIChkb2N1bWVudERpbWVuc2lvbiA+IGZ1bGxEaW1lbnNpb24pXG4gICAgICAgICAgICByZXR1cm4gYm9keURpbWVuc2lvbjtcblxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnREaW1lbnNpb24sIGJvZHlEaW1lbnNpb24pO1xuICAgIH1cblxuICAgIHN0YXRpYyBfZ2V0Q3JvcERpbWVuc2lvbnMgKGNyb3BEaW1lbnNpb25zLCBwYWdlRGltZW5zaW9ucykge1xuICAgICAgICBpZiAoIWNyb3BEaW1lbnNpb25zIHx8ICFwYWdlRGltZW5zaW9ucylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHsgZHByIH0gICAgICAgICAgICAgICAgICAgICAgPSBwYWdlRGltZW5zaW9ucztcbiAgICAgICAgY29uc3QgeyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQgfSA9IGNyb3BEaW1lbnNpb25zO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6ICAgIE1hdGgucm91bmQodG9wICogZHByKSxcbiAgICAgICAgICAgIGxlZnQ6ICAgTWF0aC5yb3VuZChsZWZ0ICogZHByKSxcbiAgICAgICAgICAgIGJvdHRvbTogTWF0aC5yb3VuZChib3R0b20gKiBkcHIpLFxuICAgICAgICAgICAgcmlnaHQ6ICBNYXRoLnJvdW5kKHJpZ2h0ICogZHByKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgX2dldENsaWVudEFyZWFEaW1lbnNpb25zIChwYWdlRGltZW5zaW9ucykge1xuICAgICAgICBpZiAoIXBhZ2VEaW1lbnNpb25zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgeyBpbm5lcldpZHRoLCBkb2N1bWVudFdpZHRoLCBib2R5V2lkdGgsIGlubmVySGVpZ2h0LCBkb2N1bWVudEhlaWdodCwgYm9keUhlaWdodCwgZHByIH0gPSBwYWdlRGltZW5zaW9ucztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6ICBNYXRoLmZsb29yKENhcHR1cmVyLl9nZXREaW1lbnNpb25XaXRob3V0U2Nyb2xsYmFyKGlubmVyV2lkdGgsIGRvY3VtZW50V2lkdGgsIGJvZHlXaWR0aCkgKiBkcHIpLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmZsb29yKENhcHR1cmVyLl9nZXREaW1lbnNpb25XaXRob3V0U2Nyb2xsYmFyKGlubmVySGVpZ2h0LCBkb2N1bWVudEhlaWdodCwgYm9keUhlaWdodCkgKiBkcHIpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBfaXNTY3JlZW5zaG90Q2FwdHVyZWQgKHNjcmVlbnNob3RQYXRoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQoc2NyZWVuc2hvdFBhdGgpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RhdHMuaXNGaWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9qb2luV2l0aEJhc2VTY3JlZW5zaG90UGF0aCAocGF0aCkge1xuICAgICAgICByZXR1cm4gam9pblBhdGgodGhpcy5iYXNlU2NyZWVuc2hvdHNQYXRoLCBwYXRoKTtcbiAgICB9XG5cbiAgICBfaW5jcmVtZW50RmlsZUluZGV4ZXMgKGZvckVycm9yKSB7XG4gICAgICAgIGlmIChmb3JFcnJvcilcbiAgICAgICAgICAgIHRoaXMucGF0aFBhdHRlcm4uZGF0YS5lcnJvckZpbGVJbmRleCsrO1xuXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGF0aFBhdHRlcm4uZGF0YS5maWxlSW5kZXgrKztcbiAgICB9XG5cbiAgICBfZ2V0Q3VzdG9tU2NyZWVuc2hvdFBhdGggKGN1c3RvbVBhdGgpIHtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkQ3VzdG9tUGF0aCA9IGNvcnJlY3RGaWxlUGF0aChjdXN0b21QYXRoLCBERUZBVUxUX1NDUkVFTlNIT1RfRVhURU5TSU9OKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fam9pbldpdGhCYXNlU2NyZWVuc2hvdFBhdGgoY29ycmVjdGVkQ3VzdG9tUGF0aCk7XG4gICAgfVxuXG4gICAgX2dldFNjcmVlbnNob3RQYXRoIChmb3JFcnJvciwgY3VzdG9tUGF0aFBhdHRlcm4pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMucGF0aFBhdHRlcm4uZ2V0UGF0aChmb3JFcnJvciwgY3VzdG9tUGF0aFBhdHRlcm4pO1xuXG4gICAgICAgIHRoaXMuX2luY3JlbWVudEZpbGVJbmRleGVzKGZvckVycm9yKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fam9pbldpdGhCYXNlU2NyZWVuc2hvdFBhdGgocGF0aCk7XG4gICAgfVxuXG4gICAgX2dldFRodW1ibmFpbFBhdGggKHNjcmVlbnNob3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IGJhc2VuYW1lKHNjcmVlbnNob3RQYXRoKTtcbiAgICAgICAgY29uc3QgaW1hZ2VEaXIgID0gZGlybmFtZShzY3JlZW5zaG90UGF0aCk7XG5cbiAgICAgICAgcmV0dXJuIGpvaW5QYXRoKGltYWdlRGlyLCAndGh1bWJuYWlscycsIGltYWdlTmFtZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX3Rha2VTY3JlZW5zaG90ICh7IGZpbGVQYXRoLCBwYWdlV2lkdGgsIHBhZ2VIZWlnaHQsIGZ1bGxQYWdlID0gdGhpcy5mdWxsUGFnZSB9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIudGFrZVNjcmVlbnNob3QodGhpcy5icm93c2VySWQsIGZpbGVQYXRoLCBwYWdlV2lkdGgsIHBhZ2VIZWlnaHQsIGZ1bGxQYWdlKTtcbiAgICB9XG5cbiAgICBhc3luYyBfY2FwdHVyZSAoZm9yRXJyb3IsIHsgYWN0aW9uSWQsIGZhaWxlZEFjdGlvbklkLCBwYWdlRGltZW5zaW9ucywgY3JvcERpbWVuc2lvbnMsIG1hcmtTZWVkLCBjdXN0b21QYXRoLCBjdXN0b21QYXRoUGF0dGVybiwgZnVsbFBhZ2UsIHRodW1ibmFpbHMgfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgdGh1bWJuYWlscyA9IHRodW1ibmFpbHMgPT09IHZvaWQgMCA/IHRoaXMudGh1bWJuYWlscyA6IHRodW1ibmFpbHM7XG5cbiAgICAgICAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBjdXN0b21QYXRoID8gdGhpcy5fZ2V0Q3VzdG9tU2NyZWVuc2hvdFBhdGgoY3VzdG9tUGF0aCkgOiB0aGlzLl9nZXRTY3JlZW5zaG90UGF0aChmb3JFcnJvciwgY3VzdG9tUGF0aFBhdHRlcm4pO1xuXG4gICAgICAgIGNvbnN0IHRodW1ibmFpbFBhdGggID0gdGhpcy5fZ2V0VGh1bWJuYWlsUGF0aChzY3JlZW5zaG90UGF0aCk7XG5cbiAgICAgICAgaWYgKGN1c3RvbVBhdGggJiYgY3VzdG9tUGF0aFBhdHRlcm4pXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0Uuc2NyZWVuc2hvdFBhdGhPdmVycmlkZXNQYXRoUGF0dGVybiwgY3VzdG9tUGF0aCwgY3VzdG9tUGF0aFBhdHRlcm4pO1xuXG4gICAgICAgIGlmIChpc0luUXVldWUoc2NyZWVuc2hvdFBhdGgpKVxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoV0FSTklOR19NRVNTQUdFLnNjcmVlbnNob3RSZXdyaXRpbmdFcnJvciwgc2NyZWVuc2hvdFBhdGgpO1xuXG4gICAgICAgIGF3YWl0IGFkZFRvUXVldWUoc2NyZWVuc2hvdFBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudEFyZWFEaW1lbnNpb25zID0gQ2FwdHVyZXIuX2dldENsaWVudEFyZWFEaW1lbnNpb25zKHBhZ2VEaW1lbnNpb25zKTtcblxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aDogcGFnZVdpZHRoLCBoZWlnaHQ6IHBhZ2VIZWlnaHQgfSA9IGNsaWVudEFyZWFEaW1lbnNpb25zIHx8IHt9O1xuXG4gICAgICAgICAgICBjb25zdCB0YWtlU2NyZWVuc2hvdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IHNjcmVlbnNob3RQYXRoLFxuICAgICAgICAgICAgICAgIHBhZ2VXaWR0aCxcbiAgICAgICAgICAgICAgICBwYWdlSGVpZ2h0LFxuICAgICAgICAgICAgICAgIGZ1bGxQYWdlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fdGFrZVNjcmVlbnNob3QodGFrZVNjcmVlbnNob3RPcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKCFhd2FpdCBDYXB0dXJlci5faXNTY3JlZW5zaG90Q2FwdHVyZWQoc2NyZWVuc2hvdFBhdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZWFkUG5nRmlsZShzY3JlZW5zaG90UGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtTZWVkUG9zaXRpb24gPSBtYXJrU2VlZCA/IGNhbGN1bGF0ZU1hcmtQb3NpdGlvbihpbWFnZSwgbWFya1NlZWQpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG1hcmtTZWVkICYmICFtYXJrU2VlZFBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRS5zY3JlZW5zaG90TWFya05vdEZvdW5kLCBzY3JlZW5zaG90UGF0aCwgbWFya1NlZWRUb0lkKG1hcmtTZWVkKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNyb3BwZWRJbWFnZSA9IGF3YWl0IGNyb3BTY3JlZW5zaG90KGltYWdlLCB7XG4gICAgICAgICAgICAgICAgbWFya1NlZWRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICBjbGllbnRBcmVhRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICBwYXRoOiAgICAgICAgICAgc2NyZWVuc2hvdFBhdGgsXG4gICAgICAgICAgICAgICAgY3JvcERpbWVuc2lvbnM6IENhcHR1cmVyLl9nZXRDcm9wRGltZW5zaW9ucyhjcm9wRGltZW5zaW9ucywgcGFnZURpbWVuc2lvbnMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChjcm9wcGVkSW1hZ2UpXG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGVQbmcoc2NyZWVuc2hvdFBhdGgsIGNyb3BwZWRJbWFnZSk7XG5cbiAgICAgICAgICAgIGlmICh0aHVtYm5haWxzKVxuICAgICAgICAgICAgICAgIGF3YWl0IGdlbmVyYXRlVGh1bWJuYWlsKHNjcmVlbnNob3RQYXRoLCB0aHVtYm5haWxQYXRoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdGVzdFJ1bklkICAgICAgICAgPSB0aGlzLnRlc3RFbnRyeS50ZXN0UnVuc1t0aGlzLmJyb3dzZXJJZF0uaWQ7XG4gICAgICAgIGNvbnN0IHVzZXJBZ2VudCAgICAgICAgID0gZXNjYXBlVXNlckFnZW50KHRoaXMucGF0aFBhdHRlcm4uZGF0YS5wYXJzZWRVc2VyQWdlbnQucHJldHR5VXNlckFnZW50KTtcbiAgICAgICAgY29uc3QgcXVhcmFudGluZUF0dGVtcHQgPSB0aGlzLnBhdGhQYXR0ZXJuLmRhdGEucXVhcmFudGluZUF0dGVtcHQ7XG4gICAgICAgIGNvbnN0IHRha2VuT25GYWlsICAgICAgID0gZm9yRXJyb3I7XG5cbiAgICAgICAgY29uc3Qgc2NyZWVuc2hvdCA9IHtcbiAgICAgICAgICAgIHRlc3RSdW5JZCxcbiAgICAgICAgICAgIHNjcmVlbnNob3RQYXRoLFxuICAgICAgICAgICAgdGh1bWJuYWlsUGF0aCxcbiAgICAgICAgICAgIHVzZXJBZ2VudCxcbiAgICAgICAgICAgIHF1YXJhbnRpbmVBdHRlbXB0LFxuICAgICAgICAgICAgdGFrZW5PbkZhaWwsXG4gICAgICAgICAgICBhY3Rpb25JZDogZmFpbGVkQWN0aW9uSWQgfHwgYWN0aW9uSWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy50ZXN0RW50cnkuc2NyZWVuc2hvdHMucHVzaChzY3JlZW5zaG90KTtcblxuICAgICAgICByZXR1cm4gc2NyZWVuc2hvdFBhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgY2FwdHVyZUFjdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2FwdHVyZShmYWxzZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY2FwdHVyZUVycm9yIChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYXB0dXJlKHRydWUsIG9wdGlvbnMpO1xuICAgIH1cbn1cblxuIl19