testcafe
Version:
Automated browser testing for the modern web development stack.
126 lines • 19.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CdpCookieProvider = void 0;
const url_1 = require("url");
const base_1 = require("../test-run/cookies/base");
const match_collection_1 = __importDefault(require("../utils/match-collection"));
const get_active_client_1 = require("./utils/get-active-client");
const set_cookie_parser_1 = require("set-cookie-parser");
const lodash_1 = require("lodash");
const MAX_TIMESTAMP = 8640000000000000;
class CdpCookieProvider extends base_1.CookieProviderBase {
async _getCdpClient() {
const browserConnection = this.testRun.browserConnection;
return (0, get_active_client_1.getActiveClient)(browserConnection);
}
async initialize() {
return this.deleteCookies();
}
async getCookies(externalCookies, urls = []) {
const client = await this._getCdpClient();
const { cookies } = await client.Storage.getCookies({});
const parsedUrls = this._parseUrls(urls);
return (0, match_collection_1.default)(cookies, externalCookies, (cookie, cookieFilter) => {
const { domain, path } = cookieFilter;
if (domain && path || !parsedUrls.length)
return (0, lodash_1.isMatch)(cookie, cookieFilter);
for (const url of parsedUrls) {
if ((0, lodash_1.isMatch)(cookie, Object.assign({}, cookieFilter, { domain: url.domain, path: url.path })))
return true;
}
return false;
})
.map(this._cdpCookieToExternalCookie);
}
async setCookies(cookies, url) {
const client = await this._getCdpClient();
const { hostname = '', pathname = '/' } = url ? new url_1.URL(url) : {};
const cookiesArray = (0, lodash_1.castArray)(cookies);
const parsedCookies = this._isCookieOptionsArray(cookiesArray)
? cookiesArray
: this._parseSetCookieStrings(cookiesArray);
await client.Network.setCookies({
cookies: parsedCookies.map(cookie => this._cookieOptionToCdpCookieParam(cookie, hostname, pathname)),
});
}
async deleteCookies(cookies = [], urls = []) {
const client = await this._getCdpClient();
if (!cookies || !cookies.length)
return client.Network.clearBrowserCookies();
const parsedUrls = this._parseUrls(urls);
let existingCookies = await this.getCookies([]);
if (parsedUrls.length) {
existingCookies = existingCookies.filter(cookie => parsedUrls
.find(url => url.domain === cookie.domain && url.path === cookie.path));
}
existingCookies = (0, match_collection_1.default)(existingCookies, cookies);
for (const cookie of existingCookies) {
await client.Network.deleteCookies({
name: cookie.name || '',
domain: cookie.domain,
path: cookie.path,
});
}
return void 0;
}
async getCookieHeader(url) {
const [{ domain, path }] = this._parseUrls([url]);
const cookies = await this.getCookies([{ domain }]);
const filteredCookies = cookies.filter(c => this._includesPath(c.path || '/', path));
return filteredCookies.map(c => `${c.name}=${c.value}`).join(';');
}
_cdpCookieToExternalCookie(cookie) {
var _a;
return {
name: cookie.name,
value: cookie.value,
domain: cookie.domain,
maxAge: void 0,
path: cookie.path,
expires: void 0,
secure: cookie.secure,
httpOnly: cookie.httpOnly,
sameSite: (_a = cookie.sameSite) !== null && _a !== void 0 ? _a : 'none',
};
}
_cookieOptionToCdpCookieParam(cookie, hostname, pathname) {
var _a, _b, _c;
return {
name: cookie.name,
value: cookie.value,
domain: (_a = cookie.domain) !== null && _a !== void 0 ? _a : hostname,
path: (_b = cookie.path) !== null && _b !== void 0 ? _b : pathname,
secure: cookie.secure,
httpOnly: cookie.httpOnly,
sameSite: cookie.sameSite,
expires: ((_c = cookie.expires) === null || _c === void 0 ? void 0 : _c.getTime()) || MAX_TIMESTAMP,
};
}
_parseUrls(urls) {
return urls.map(url => {
const { hostname, pathname } = new url_1.URL(url);
return { domain: hostname, path: pathname };
});
}
_includesPath(cookiePath, urlPath) {
if (cookiePath === '/')
return true;
const cookieParts = cookiePath.split('/');
const urlParts = urlPath.split('/');
if (cookieParts.length > urlParts.length)
return false;
while (cookieParts.length) {
if (cookieParts.shift() !== urlParts.shift())
return false;
}
return true;
}
_parseSetCookieStrings(cookies) {
return (0, set_cookie_parser_1.parse)(cookies);
}
}
exports.CdpCookieProvider = CdpCookieProvider;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS1hdXRvbWF0aW9uL2Nvb2tpZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSw2QkFBMEI7QUFFMUIsbURBQThFO0FBRTlFLGlGQUF3RDtBQUN4RCxpRUFBNEQ7QUFDNUQseURBQTBDO0FBQzFDLG1DQUE0QztBQUk1QyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUV2QyxNQUFhLGlCQUFrQixTQUFRLHlCQUFrQjtJQUM3QyxLQUFLLENBQUMsYUFBYTtRQUN2QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFFekQsT0FBTyxJQUFBLG1DQUFlLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBRSxlQUFrQyxFQUFFLE9BQWlCLEVBQUU7UUFDckUsTUFBTSxNQUFNLEdBQVEsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQyxPQUFRLElBQUEsMEJBQWUsRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUMsTUFBK0IsRUFBRSxZQUE2QixFQUFFLEVBQUU7WUFDakgsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUM7WUFFdEMsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07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QUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sc0JBQXNCLENBQUUsT0FBaUI7UUFDN0MsT0FBTyxJQUFBLHlCQUFLLEVBQUMsT0FBTyxDQUFvQixDQUFDO0lBQzdDLENBQUM7Q0FDSjtBQXpJRCw4Q0F5SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVtb3RlQ2hyb21lIGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29va2llcyB9IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuaW1wb3J0IFByb3RvY29sIGZyb20gJ2RldnRvb2xzLXByb3RvY29sJztcbmltcG9ydCBDb29raWUgPSBQcm90b2NvbC5OZXR3b3JrLkNvb2tpZTtcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBDb29raWVPcHRpb25zIH0gZnJvbSAnLi4vdGVzdC1ydW4vY29tbWFuZHMvb3B0aW9ucyc7XG5pbXBvcnQgeyBDb29raWVQcm92aWRlciwgQ29va2llUHJvdmlkZXJCYXNlIH0gZnJvbSAnLi4vdGVzdC1ydW4vY29va2llcy9iYXNlJztcbmltcG9ydCBDb29raWVQYXJhbSA9IFByb3RvY29sLk5ldHdvcmsuQ29va2llUGFyYW07XG5pbXBvcnQgbWF0Y2hDb2xsZWN0aW9uIGZyb20gJy4uL3V0aWxzL21hdGNoLWNvbGxlY3Rpb24nO1xuaW1wb3J0IHsgZ2V0QWN0aXZlQ2xpZW50IH0gZnJvbSAnLi91dGlscy9nZXQtYWN0aXZlLWNsaWVudCc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3NldC1jb29raWUtcGFyc2VyJztcbmltcG9ydCB7IGNhc3RBcnJheSwgaXNNYXRjaCB9IGZyb20gJ2xvZGFzaCc7XG5cbmRlY2xhcmUgdHlwZSBDb29raWVTYW1lU2l0ZSA9ICdMYXgnIHwgJ1N0cmljdCcgfCAnTm9uZSc7XG5cbmNvbnN0IE1BWF9USU1FU1RBTVAgPSA4NjQwMDAwMDAwMDAwMDAwO1xuXG5leHBvcnQgY2xhc3MgQ2RwQ29va2llUHJvdmlkZXIgZXh0ZW5kcyBDb29raWVQcm92aWRlckJhc2UgaW1wbGVtZW50cyBDb29raWVQcm92aWRlciB7XG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Q2RwQ2xpZW50ICgpOiBQcm9taXNlPHJlbW90ZUNocm9tZS5Qcm90b2NvbEFwaT4ge1xuICAgICAgICBjb25zdCBicm93c2VyQ29ubmVjdGlvbiA9IHRoaXMudGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbjtcblxuICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQ2xpZW50KGJyb3dzZXJDb25uZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0aWFsaXplICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlQ29va2llcygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENvb2tpZXMgKGV4dGVybmFsQ29va2llczogRXh0ZXJuYWxDb29raWVzW10sIHVybHM6IHN0cmluZ1tdID0gW10pOiBQcm9taXNlPEV4dGVybmFsQ29va2llc1tdPiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCAgICAgID0gYXdhaXQgdGhpcy5fZ2V0Q2RwQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IHsgY29va2llcyB9ID0gYXdhaXQgY2xpZW50LlN0b3JhZ2UuZ2V0Q29va2llcyh7fSk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybHMgID0gdGhpcy5fcGFyc2VVcmxzKHVybHMpO1xuXG4gICAgICAgIHJldHVybiAobWF0Y2hDb2xsZWN0aW9uKGNvb2tpZXMsIGV4dGVybmFsQ29va2llcywgKGNvb2tpZTogUHJvdG9jb2wuTmV0d29yay5Db29raWUsIGNvb2tpZUZpbHRlcjogRXh0ZXJuYWxDb29raWVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGRvbWFpbiwgcGF0aCB9ID0gY29va2llRmlsdGVyO1xuXG4gICAgICAgICAgICBpZiAoZG9tYWluICYmIHBhdGggfHwgIXBhcnNlZFVybHMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBpc01hdGNoKGNvb2tpZSwgY29va2llRmlsdGVyKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgcGFyc2VkVXJscykge1xuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoKGNvb2tpZSwgT2JqZWN0LmFzc2lnbih7fSwgY29va2llRmlsdGVyLCB7IGRvbWFpbjogdXJsLmRvbWFpbiwgcGF0aDogdXJsLnBhdGggfSkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KSBhcyBDb29raWVbXSlcbiAgICAgICAgICAgIC5tYXAodGhpcy5fY2RwQ29va2llVG9FeHRlcm5hbENvb2tpZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0Q29va2llcyAoY29va2llczogc3RyaW5nIHwgc3RyaW5nW10gfCBDb29raWVPcHRpb25zW10sIHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGF3YWl0IHRoaXMuX2dldENkcENsaWVudCgpO1xuICAgICAgICBjb25zdCB7IGhvc3RuYW1lID0gJycsIHBhdGhuYW1lID0gJy8nIH0gPSB1cmwgPyBuZXcgVVJMKHVybCkgOiB7fTtcbiAgICAgICAgY29uc3QgY29va2llc0FycmF5ICAgICAgICAgICAgICAgICAgICAgID0gY2FzdEFycmF5PHN0cmluZyB8IENvb2tpZU9wdGlvbnM+KGNvb2tpZXMpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZENvb2tpZXMgPSB0aGlzLl9pc0Nvb2tpZU9wdGlvbnNBcnJheShjb29raWVzQXJyYXkpXG4gICAgICAgICAgICA/IGNvb2tpZXNBcnJheVxuICAgICAgICAgICAgOiB0aGlzLl9wYXJzZVNldENvb2tpZVN0cmluZ3MoY29va2llc0FycmF5IGFzIHN0cmluZ1tdKTtcblxuICAgICAgICBhd2FpdCBjbGllbnQuTmV0d29yay5zZXRDb29raWVzKHtcbiAgICAgICAgICAgIGNvb2tpZXM6IHBhcnNlZENvb2tpZXMubWFwKGNvb2tpZSA9PiB0aGlzLl9jb29raWVPcHRpb25Ub0NkcENvb2tpZVBhcmFtKGNvb2tpZSwgaG9zdG5hbWUsIHBhdGhuYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZUNvb2tpZXMgKGNvb2tpZXM6IENvb2tpZU9wdGlvbnNbXSA9IFtdLCB1cmxzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuX2dldENkcENsaWVudCgpO1xuXG4gICAgICAgIGlmICghY29va2llcyB8fCAhY29va2llcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gY2xpZW50Lk5ldHdvcmsuY2xlYXJCcm93c2VyQ29va2llcygpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFVybHMgICAgPSB0aGlzLl9wYXJzZVVybHModXJscyk7XG4gICAgICAgIGxldCBleGlzdGluZ0Nvb2tpZXMgPSBhd2FpdCB0aGlzLmdldENvb2tpZXMoW10pO1xuXG4gICAgICAgIGlmIChwYXJzZWRVcmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgZXhpc3RpbmdDb29raWVzID0gZXhpc3RpbmdDb29raWVzLmZpbHRlcihjb29raWUgPT4gcGFyc2VkVXJsc1xuICAgICAgICAgICAgICAgIC5maW5kKHVybCA9PiB1cmwuZG9tYWluID09PSBjb29raWUuZG9tYWluICYmIHVybC5wYXRoID09PSBjb29raWUucGF0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhpc3RpbmdDb29raWVzID0gbWF0Y2hDb2xsZWN0aW9uKGV4aXN0aW5nQ29va2llcywgY29va2llcykgYXMgRXh0ZXJuYWxDb29raWVzW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgZXhpc3RpbmdDb29raWVzKSB7XG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuTmV0d29yay5kZWxldGVDb29raWVzKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAgIGNvb2tpZS5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgICAgIGRvbWFpbjogY29va2llLmRvbWFpbixcbiAgICAgICAgICAgICAgICBwYXRoOiAgIGNvb2tpZS5wYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENvb2tpZUhlYWRlciAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgW3sgZG9tYWluLCBwYXRoIH1dID0gdGhpcy5fcGFyc2VVcmxzKFt1cmxdKTtcbiAgICAgICAgY29uc3QgY29va2llcyAgICAgICAgICAgID0gYXdhaXQgdGhpcy5nZXRDb29raWVzKFt7IGRvbWFpbiB9XSk7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkQ29va2llcyAgICA9IGNvb2tpZXMuZmlsdGVyKGMgPT4gdGhpcy5faW5jbHVkZXNQYXRoKGMucGF0aCB8fCAnLycsIHBhdGgpKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyZWRDb29raWVzLm1hcChjID0+IGAkeyBjLm5hbWUgfT0keyBjLnZhbHVlIH1gKS5qb2luKCc7Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2RwQ29va2llVG9FeHRlcm5hbENvb2tpZSAoY29va2llOiBDb29raWUpOiBFeHRlcm5hbENvb2tpZXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogICAgIGNvb2tpZS5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6ICAgIGNvb2tpZS52YWx1ZSxcbiAgICAgICAgICAgIGRvbWFpbjogICBjb29raWUuZG9tYWluLFxuICAgICAgICAgICAgbWF4QWdlOiAgIHZvaWQgMCxcbiAgICAgICAgICAgIHBhdGg6ICAgICBjb29raWUucGF0aCxcbiAgICAgICAgICAgIGV4cGlyZXM6ICB2b2lkIDAsXG4gICAgICAgICAgICBzZWN1cmU6ICAgY29va2llLnNlY3VyZSxcbiAgICAgICAgICAgIGh0dHBPbmx5OiBjb29raWUuaHR0cE9ubHksXG4gICAgICAgICAgICBzYW1lU2l0ZTogY29va2llLnNhbWVTaXRlID8/ICdub25lJyxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIEV4dGVybmFsQ29va2llcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb29raWVPcHRpb25Ub0NkcENvb2tpZVBhcmFtIChjb29raWU6IENvb2tpZU9wdGlvbnMsIGhvc3RuYW1lOiBzdHJpbmcsIHBhdGhuYW1lOiBzdHJpbmcpOiBDb29raWVQYXJhbSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAgICAgY29va2llLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogICAgY29va2llLnZhbHVlLFxuICAgICAgICAgICAgZG9tYWluOiAgIGNvb2tpZS5kb21haW4gPz8gaG9zdG5hbWUsXG4gICAgICAgICAgICBwYXRoOiAgICAgY29va2llLnBhdGggPz8gcGF0aG5hbWUsXG4gICAgICAgICAgICBzZWN1cmU6ICAgY29va2llLnNlY3VyZSxcbiAgICAgICAgICAgIGh0dHBPbmx5OiBjb29raWUuaHR0cE9ubHksXG4gICAgICAgICAgICBzYW1lU2l0ZTogY29va2llLnNhbWVTaXRlIGFzIENvb2tpZVNhbWVTaXRlLFxuICAgICAgICAgICAgZXhwaXJlczogIGNvb2tpZS5leHBpcmVzPy5nZXRUaW1lKCkgfHwgTUFYX1RJTUVTVEFNUCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVVybHMgKHVybHM6IHN0cmluZ1tdKTogeyBkb21haW46IHN0cmluZywgcGF0aDogc3RyaW5nIH1bXSB7XG4gICAgICAgIHJldHVybiB1cmxzLm1hcCh1cmwgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgZG9tYWluOiBob3N0bmFtZSwgcGF0aDogcGF0aG5hbWUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5jbHVkZXNQYXRoIChjb29raWVQYXRoOiBzdHJpbmcsIHVybFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29va2llUGF0aCA9PT0gJy8nKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3QgY29va2llUGFydHMgPSBjb29raWVQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHVybFBhcnRzICAgID0gdXJsUGF0aC5zcGxpdCgnLycpO1xuXG4gICAgICAgIGlmIChjb29raWVQYXJ0cy5sZW5ndGggPiB1cmxQYXJ0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgd2hpbGUgKGNvb2tpZVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvb2tpZVBhcnRzLnNoaWZ0KCkgIT09IHVybFBhcnRzLnNoaWZ0KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VTZXRDb29raWVTdHJpbmdzIChjb29raWVzOiBzdHJpbmdbXSk6IENvb2tpZU9wdGlvbnNbXSB7XG4gICAgICAgIHJldHVybiBwYXJzZShjb29raWVzKSBhcyBDb29raWVPcHRpb25zW107XG4gICAgfVxufVxuIl19