cnpmcore
Version:
Private NPM Registry for Enterprise
548 lines • 49.8 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import path from 'node:path';
import util from 'node:util';
import { SingletonProto } from 'egg';
import { BinaryType } from "../../enum/Binary.js";
import { AbstractBinary, BinaryAdapter } from "./AbstractBinary.js";
const PACKAGE_URL = 'https://registry.npmjs.com/playwright-core';
const DOWNLOAD_HOST = 'https://playwright.azureedge.net/';
// https://github.com/playwright-community/playwright-go/blob/56e30d60f8b42785982469eaca6ad969bc2e1946/run.go#L341-L374
const PLAYWRIGHT_DRIVER_ARCHS = ['win32_x64', 'mac-arm64', 'mac', 'linux-arm64', 'linux'];
// https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/registry/index.ts
// CFT entries use Chrome for Testing URLs: builds/cft/{browserVersion}/{suffix}
// (introduced in playwright 1.58.1, see https://github.com/cnpm/cnpmcore/issues/1033)
const cft = (suffix) => ({ cft: suffix });
/* eslint-disable quote-props */
const DOWNLOAD_PATHS = {
chromium: {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': cft('linux64/chrome-linux64.zip'),
'ubuntu22.04-x64': cft('linux64/chrome-linux64.zip'),
'ubuntu24.04-x64': cft('linux64/chrome-linux64.zip'),
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'ubuntu22.04-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'ubuntu24.04-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'debian11-x64': cft('linux64/chrome-linux64.zip'),
'debian11-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'debian12-x64': cft('linux64/chrome-linux64.zip'),
'debian12-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'debian13-x64': cft('linux64/chrome-linux64.zip'),
'debian13-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'mac10.13': cft('mac-x64/chrome-mac-x64.zip'),
'mac10.14': cft('mac-x64/chrome-mac-x64.zip'),
'mac10.15': cft('mac-x64/chrome-mac-x64.zip'),
mac11: cft('mac-x64/chrome-mac-x64.zip'),
'mac11-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac12: cft('mac-x64/chrome-mac-x64.zip'),
'mac12-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac13: cft('mac-x64/chrome-mac-x64.zip'),
'mac13-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac14: cft('mac-x64/chrome-mac-x64.zip'),
'mac14-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac15: cft('mac-x64/chrome-mac-x64.zip'),
'mac15-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
win64: cft('win64/chrome-win64.zip'),
},
'chromium-headless-shell': {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'ubuntu22.04-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'ubuntu24.04-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/chromium/%s/chromium-headless-shell-linux-arm64.zip',
'ubuntu22.04-arm64': 'builds/chromium/%s/chromium-headless-shell-linux-arm64.zip',
'ubuntu24.04-arm64': 'builds/chromium/%s/chromium-headless-shell-linux-arm64.zip',
'debian11-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'debian11-arm64': 'builds/chromium/%s/chromium-headless-shell-linux-arm64.zip',
'debian12-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'debian12-arm64': 'builds/chromium/%s/chromium-headless-shell-linux-arm64.zip',
'debian13-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'debian13-arm64': 'builds/chromium/%s/chromium-headless-shell-linux-arm64.zip',
'mac10.13': undefined,
'mac10.14': undefined,
'mac10.15': undefined,
mac11: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac11-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac12: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac12-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac13: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac13-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac14: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac14-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac15: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac15-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
win64: cft('win64/chrome-headless-shell-win64.zip'),
},
'chromium-tip-of-tree': {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': cft('linux64/chrome-linux64.zip'),
'ubuntu22.04-x64': cft('linux64/chrome-linux64.zip'),
'ubuntu24.04-x64': cft('linux64/chrome-linux64.zip'),
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'ubuntu22.04-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'ubuntu24.04-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'debian11-x64': cft('linux64/chrome-linux64.zip'),
'debian11-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'debian12-x64': cft('linux64/chrome-linux64.zip'),
'debian12-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'debian13-x64': cft('linux64/chrome-linux64.zip'),
'debian13-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'mac10.13': cft('mac-x64/chrome-mac-x64.zip'),
'mac10.14': cft('mac-x64/chrome-mac-x64.zip'),
'mac10.15': cft('mac-x64/chrome-mac-x64.zip'),
mac11: cft('mac-x64/chrome-mac-x64.zip'),
'mac11-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac12: cft('mac-x64/chrome-mac-x64.zip'),
'mac12-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac13: cft('mac-x64/chrome-mac-x64.zip'),
'mac13-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac14: cft('mac-x64/chrome-mac-x64.zip'),
'mac14-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
mac15: cft('mac-x64/chrome-mac-x64.zip'),
'mac15-arm64': cft('mac-arm64/chrome-mac-arm64.zip'),
win64: cft('win64/chrome-win64.zip'),
},
'chromium-tip-of-tree-headless-shell': {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'ubuntu22.04-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'ubuntu24.04-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip',
'ubuntu22.04-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip',
'ubuntu24.04-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip',
'debian11-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'debian11-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip',
'debian12-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'debian12-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip',
'debian13-x64': cft('linux64/chrome-headless-shell-linux64.zip'),
'debian13-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip',
'mac10.13': undefined,
'mac10.14': undefined,
'mac10.15': undefined,
mac11: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac11-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac12: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac12-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac13: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac13-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac14: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac14-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
mac15: cft('mac-x64/chrome-headless-shell-mac-x64.zip'),
'mac15-arm64': cft('mac-arm64/chrome-headless-shell-mac-arm64.zip'),
win64: cft('win64/chrome-headless-shell-win64.zip'),
},
firefox: {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': 'builds/firefox/%s/firefox-ubuntu-20.04.zip',
'ubuntu22.04-x64': 'builds/firefox/%s/firefox-ubuntu-22.04.zip',
'ubuntu24.04-x64': 'builds/firefox/%s/firefox-ubuntu-24.04.zip',
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/firefox/%s/firefox-ubuntu-20.04-arm64.zip',
'ubuntu22.04-arm64': 'builds/firefox/%s/firefox-ubuntu-22.04-arm64.zip',
'ubuntu24.04-arm64': 'builds/firefox/%s/firefox-ubuntu-24.04-arm64.zip',
'debian11-x64': 'builds/firefox/%s/firefox-debian-11.zip',
'debian11-arm64': 'builds/firefox/%s/firefox-debian-11-arm64.zip',
'debian12-x64': 'builds/firefox/%s/firefox-debian-12.zip',
'debian12-arm64': 'builds/firefox/%s/firefox-debian-12-arm64.zip',
'mac10.13': 'builds/firefox/%s/firefox-mac.zip',
'mac10.14': 'builds/firefox/%s/firefox-mac.zip',
'mac10.15': 'builds/firefox/%s/firefox-mac.zip',
mac11: 'builds/firefox/%s/firefox-mac.zip',
'mac11-arm64': 'builds/firefox/%s/firefox-mac-arm64.zip',
mac12: 'builds/firefox/%s/firefox-mac.zip',
'mac12-arm64': 'builds/firefox/%s/firefox-mac-arm64.zip',
mac13: 'builds/firefox/%s/firefox-mac.zip',
'mac13-arm64': 'builds/firefox/%s/firefox-mac-arm64.zip',
mac14: 'builds/firefox/%s/firefox-mac.zip',
'mac14-arm64': 'builds/firefox/%s/firefox-mac-arm64.zip',
mac15: 'builds/firefox/%s/firefox-mac.zip',
'mac15-arm64': 'builds/firefox/%s/firefox-mac-arm64.zip',
win64: 'builds/firefox/%s/firefox-win64.zip',
},
'firefox-beta': {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': 'builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip',
'ubuntu22.04-x64': 'builds/firefox-beta/%s/firefox-beta-ubuntu-22.04.zip',
'ubuntu24.04-x64': 'builds/firefox-beta/%s/firefox-beta-ubuntu-24.04.zip',
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': undefined,
'ubuntu22.04-arm64': 'builds/firefox-beta/%s/firefox-beta-ubuntu-22.04-arm64.zip',
'ubuntu24.04-arm64': 'builds/firefox-beta/%s/firefox-beta-ubuntu-24.04-arm64.zip',
'debian11-x64': 'builds/firefox-beta/%s/firefox-beta-debian-11.zip',
'debian11-arm64': 'builds/firefox-beta/%s/firefox-beta-debian-11-arm64.zip',
'debian12-x64': 'builds/firefox-beta/%s/firefox-beta-debian-12.zip',
'debian12-arm64': 'builds/firefox-beta/%s/firefox-beta-debian-12-arm64.zip',
'mac10.13': 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac10.14': 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac10.15': 'builds/firefox-beta/%s/firefox-beta-mac.zip',
mac11: 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac11-arm64': 'builds/firefox-beta/%s/firefox-beta-mac-arm64.zip',
mac12: 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac12-arm64': 'builds/firefox-beta/%s/firefox-beta-mac-arm64.zip',
mac13: 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac13-arm64': 'builds/firefox-beta/%s/firefox-beta-mac-arm64.zip',
mac14: 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac14-arm64': 'builds/firefox-beta/%s/firefox-beta-mac-arm64.zip',
mac15: 'builds/firefox-beta/%s/firefox-beta-mac.zip',
'mac15-arm64': 'builds/firefox-beta/%s/firefox-beta-mac-arm64.zip',
win64: 'builds/firefox-beta/%s/firefox-beta-win64.zip',
},
webkit: {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': 'builds/webkit/%s/webkit-ubuntu-20.04.zip',
'ubuntu22.04-x64': 'builds/webkit/%s/webkit-ubuntu-22.04.zip',
'ubuntu24.04-x64': 'builds/webkit/%s/webkit-ubuntu-24.04.zip',
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/webkit/%s/webkit-ubuntu-20.04-arm64.zip',
'ubuntu22.04-arm64': 'builds/webkit/%s/webkit-ubuntu-22.04-arm64.zip',
'ubuntu24.04-arm64': 'builds/webkit/%s/webkit-ubuntu-24.04-arm64.zip',
'debian11-x64': 'builds/webkit/%s/webkit-debian-11.zip',
'debian11-arm64': 'builds/webkit/%s/webkit-debian-11-arm64.zip',
'debian12-x64': 'builds/webkit/%s/webkit-debian-12.zip',
'debian12-arm64': 'builds/webkit/%s/webkit-debian-12-arm64.zip',
'mac10.13': undefined,
'mac10.14': 'builds/deprecated-webkit-mac-10.14/%s/deprecated-webkit-mac-10.14.zip',
'mac10.15': 'builds/deprecated-webkit-mac-10.15/%s/deprecated-webkit-mac-10.15.zip',
mac11: 'builds/webkit/%s/webkit-mac-11.zip',
'mac11-arm64': 'builds/webkit/%s/webkit-mac-11-arm64.zip',
mac12: 'builds/webkit/%s/webkit-mac-12.zip',
'mac12-arm64': 'builds/webkit/%s/webkit-mac-12-arm64.zip',
mac13: 'builds/webkit/%s/webkit-mac-13.zip',
'mac13-arm64': 'builds/webkit/%s/webkit-mac-13-arm64.zip',
mac14: 'builds/webkit/%s/webkit-mac-14.zip',
'mac14-arm64': 'builds/webkit/%s/webkit-mac-14-arm64.zip',
mac15: 'builds/webkit/%s/webkit-mac-15.zip',
'mac15-arm64': 'builds/webkit/%s/webkit-mac-15-arm64.zip',
win64: 'builds/webkit/%s/webkit-win64.zip',
},
ffmpeg: {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'ubuntu22.04-x64': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'ubuntu24.04-x64': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/ffmpeg/%s/ffmpeg-linux-arm64.zip',
'ubuntu22.04-arm64': 'builds/ffmpeg/%s/ffmpeg-linux-arm64.zip',
'ubuntu24.04-arm64': 'builds/ffmpeg/%s/ffmpeg-linux-arm64.zip',
'debian11-x64': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'debian11-arm64': 'builds/ffmpeg/%s/ffmpeg-linux-arm64.zip',
'debian12-x64': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'debian12-arm64': 'builds/ffmpeg/%s/ffmpeg-linux-arm64.zip',
'mac10.13': 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac10.14': 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac10.15': 'builds/ffmpeg/%s/ffmpeg-mac.zip',
mac11: 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac11-arm64': 'builds/ffmpeg/%s/ffmpeg-mac-arm64.zip',
mac12: 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac12-arm64': 'builds/ffmpeg/%s/ffmpeg-mac-arm64.zip',
mac13: 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac13-arm64': 'builds/ffmpeg/%s/ffmpeg-mac-arm64.zip',
mac14: 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac14-arm64': 'builds/ffmpeg/%s/ffmpeg-mac-arm64.zip',
mac15: 'builds/ffmpeg/%s/ffmpeg-mac.zip',
'mac15-arm64': 'builds/ffmpeg/%s/ffmpeg-mac-arm64.zip',
win64: 'builds/ffmpeg/%s/ffmpeg-win64.zip',
},
winldd: {
'<unknown>': undefined,
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': undefined,
'ubuntu22.04-x64': undefined,
'ubuntu24.04-x64': undefined,
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': undefined,
'ubuntu22.04-arm64': undefined,
'ubuntu24.04-arm64': undefined,
'debian11-x64': undefined,
'debian11-arm64': undefined,
'debian12-x64': undefined,
'debian12-arm64': undefined,
'mac10.13': undefined,
'mac10.14': undefined,
'mac10.15': undefined,
mac11: undefined,
'mac11-arm64': undefined,
mac12: undefined,
'mac12-arm64': undefined,
mac13: undefined,
'mac13-arm64': undefined,
mac14: undefined,
'mac14-arm64': undefined,
mac15: undefined,
'mac15-arm64': undefined,
win64: 'builds/winldd/%s/winldd-win64.zip',
},
android: {
'<unknown>': 'builds/android/%s/android.zip',
'ubuntu18.04-x64': undefined,
'ubuntu20.04-x64': 'builds/android/%s/android.zip',
'ubuntu22.04-x64': 'builds/android/%s/android.zip',
'ubuntu24.04-x64': 'builds/android/%s/android.zip',
'ubuntu18.04-arm64': undefined,
'ubuntu20.04-arm64': 'builds/android/%s/android.zip',
'ubuntu22.04-arm64': 'builds/android/%s/android.zip',
'ubuntu24.04-arm64': 'builds/android/%s/android.zip',
'debian11-x64': 'builds/android/%s/android.zip',
'debian11-arm64': 'builds/android/%s/android.zip',
'debian12-x64': 'builds/android/%s/android.zip',
'debian12-arm64': 'builds/android/%s/android.zip',
'mac10.13': 'builds/android/%s/android.zip',
'mac10.14': 'builds/android/%s/android.zip',
'mac10.15': 'builds/android/%s/android.zip',
mac11: 'builds/android/%s/android.zip',
'mac11-arm64': 'builds/android/%s/android.zip',
mac12: 'builds/android/%s/android.zip',
'mac12-arm64': 'builds/android/%s/android.zip',
mac13: 'builds/android/%s/android.zip',
'mac13-arm64': 'builds/android/%s/android.zip',
mac14: 'builds/android/%s/android.zip',
'mac14-arm64': 'builds/android/%s/android.zip',
mac15: 'builds/android/%s/android.zip',
'mac15-arm64': 'builds/android/%s/android.zip',
win64: 'builds/android/%s/android.zip',
},
};
let PlaywrightBinary = class PlaywrightBinary extends AbstractBinary {
async initFetch() {
this.dirItems = undefined;
}
async fetch(dir) {
if (!this.dirItems) {
const packageData = await this.requestJSON(PACKAGE_URL);
const nowDateISO = new Date().toISOString();
const buildDirs = [];
for (const browserName of Object.keys(DOWNLOAD_PATHS)) {
if (browserName === 'chromium-headless-shell' || browserName === 'chromium-tip-of-tree-headless-shell') {
continue;
}
buildDirs.push({
name: `${browserName}/`,
isDir: true,
url: '',
size: '-',
date: nowDateISO,
});
}
buildDirs.push({
name: 'driver/',
isDir: true,
url: '',
size: '-',
date: nowDateISO,
});
// builds/cft/ holds Chrome for Testing downloads
// (Playwright 1.58.1+ moved chromium downloads to builds/cft/{browserVersion}/{platform}/)
buildDirs.push({
name: 'cft/',
isDir: true,
url: '',
size: '-',
date: nowDateISO,
});
this.dirItems = {
'/': [
{
name: 'builds/',
isDir: true,
url: '',
size: '-',
date: nowDateISO,
},
],
'/builds/': buildDirs,
'/builds/cft/': [],
};
for (const browserName of Object.keys(DOWNLOAD_PATHS)) {
if (browserName === 'chromium-headless-shell' || browserName === 'chromium-tip-of-tree-headless-shell') {
continue;
}
this.dirItems[`/builds/${browserName}/`] = [];
}
// Only download beta and release versions of packages to reduce amount of request
const packageVersions = Object.keys(packageData.versions)
.filter((version) => version.match(/^(?:\d+\.\d+\.\d+)(?:-beta-\d+)?$/))
// select recently update 20 items
.slice(-20);
// Add driver to dirItems
this.dirItems['/builds/driver/'] = [];
const hasBetaVersions = packageVersions.some((version) => version.includes('-beta-'));
if (hasBetaVersions) {
this.dirItems['/builds/driver/'].push({
name: 'next/',
isDir: true,
url: '',
size: '-',
date: 'next',
});
this.dirItems['/builds/driver/next/'] = [];
}
for (const version of packageVersions) {
for (const arch of PLAYWRIGHT_DRIVER_ARCHS) {
const isBetaVersion = version.includes('-beta-');
const driverFileName = `playwright-${version}-${arch}.zip`;
const driverURL = isBetaVersion
? DOWNLOAD_HOST + `builds/driver/next/${driverFileName}`
: DOWNLOAD_HOST + `builds/driver/${driverFileName}`;
const driverItem = {
name: driverFileName,
isDir: false,
url: driverURL,
size: '-',
date: version,
};
const targetDir = isBetaVersion ? '/builds/driver/next/' : '/builds/driver/';
this.dirItems[targetDir].push(driverItem);
}
}
const browsers = [];
await Promise.all(packageVersions.map((version) => this.requestJSON(`https://unpkg.com/playwright-core@${version}/browsers.json`)
.then((data) => {
// browsers: [
// {
// "name": "chromium",
// "revision": "1005",
// "installByDefault": true,
// "browserVersion": "102.0.5005.40",
// "revisionOverrides": {}
// },
// ]
browsers.push(...data.browsers);
return data;
})
.catch((err) => {
/* c8 ignore next 2 */
this.logger.warn('[PlaywrightBinary.fetch:error] Playwright version %s browser data request failed: %s', version, err);
})));
// if chromium-headless-shell not exists on browsers, copy chromium to chromium-headless-shell
if (!browsers.some((browser) => browser.name === 'chromium-headless-shell')) {
const chromium = browsers.find((browser) => browser.name === 'chromium');
// {
// "name": "chromium",
// "revision": "1155",
// "installByDefault": true,
// "browserVersion": "133.0.6943.16"
// }
if (chromium) {
browsers.push({
...chromium,
name: 'chromium-headless-shell',
});
}
}
// if chromium-tip-of-tree-headless-shell not exists on browsers, copy chromium-tip-of-tree to chromium-tip-of-tree-headless-shell
if (!browsers.some((browser) => browser.name === 'chromium-tip-of-tree-headless-shell')) {
const chromiumTipOfTree = browsers.find((browser) => browser.name === 'chromium-tip-of-tree');
if (chromiumTipOfTree) {
browsers.push({
...chromiumTipOfTree,
name: 'chromium-tip-of-tree-headless-shell',
});
}
}
for (const browser of browsers) {
const downloadPaths = DOWNLOAD_PATHS[browser.name];
if (!downloadPaths)
continue;
let browserDirname = browser.name;
if (browser.name === 'chromium-headless-shell') {
// chromium-headless-shell should be under chromium
// https://playwright.azureedge.net/builds/chromium/1155/chromium-headless-shell-mac-arm64.zip
browserDirname = 'chromium';
}
else if (browser.name === 'chromium-tip-of-tree-headless-shell') {
// chromium-tip-of-tree-headless-shell should be under chromium-tip-of-tree
// https://playwright.azureedge.net/builds/chromium-tip-of-tree/1293/chromium-tip-of-tree-headless-shell-mac-arm64.zip
browserDirname = 'chromium-tip-of-tree';
}
for (const [platform, remotePath] of Object.entries(downloadPaths)) {
if (!remotePath)
continue;
const revision = browser.revisionOverrides?.[platform] ?? browser.revision;
const itemDate = browser.browserVersion || revision;
let url;
let name;
let dir;
if (typeof remotePath === 'string') {
url = DOWNLOAD_HOST + util.format(remotePath, revision);
name = path.basename(remotePath);
dir = `/builds/${browserDirname}/${revision}/`;
if (!this.dirItems[dir]) {
this.dirItems[`/builds/${browserDirname}/`].push({
name: `${revision}/`,
isDir: true,
url: '',
size: '-',
date: revision,
});
this.dirItems[dir] = [];
}
}
else {
if (!browser.browserVersion)
continue;
const cftSuffix = remotePath.cft;
url = `${DOWNLOAD_HOST}builds/cft/${browser.browserVersion}/${cftSuffix}`;
name = path.basename(cftSuffix);
const platformDir = path.dirname(cftSuffix);
const versionDir = `/builds/cft/${browser.browserVersion}/`;
dir = `${versionDir}${platformDir}/`;
if (!this.dirItems[versionDir]) {
this.dirItems['/builds/cft/'].push({
name: `${browser.browserVersion}/`,
isDir: true,
url: '',
size: '-',
date: browser.browserVersion,
});
this.dirItems[versionDir] = [];
}
if (!this.dirItems[versionDir].some((item) => item.name === `${platformDir}/`)) {
this.dirItems[versionDir].push({
name: `${platformDir}/`,
isDir: true,
url: '',
size: '-',
date: browser.browserVersion,
});
}
if (!this.dirItems[dir]) {
this.dirItems[dir] = [];
}
}
if (!this.dirItems[dir].some((item) => item.name === name)) {
this.dirItems[dir].push({
name,
isDir: false,
url,
size: '-',
date: itemDate,
});
}
}
}
}
return { items: this.dirItems[dir] ?? [], nextParams: null };
}
};
PlaywrightBinary = __decorate([
SingletonProto(),
BinaryAdapter(BinaryType.Playwright)
], PlaywrightBinary);
export { PlaywrightBinary };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxheXdyaWdodEJpbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9jb21tb24vYWRhcHRlci9iaW5hcnkvUGxheXdyaWdodEJpbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBRTdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFxQyxNQUFNLHFCQUFxQixDQUFDO0FBRXZHLE1BQU0sV0FBVyxHQUFHLDRDQUE0QyxDQUFDO0FBQ2pFLE1BQU0sYUFBYSxHQUFHLG1DQUFtQyxDQUFDO0FBQzFELHVIQUF1SDtBQUN2SCxNQUFNLHVCQUF1QixHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTFGLDBHQUEwRztBQUMxRyxnRkFBZ0Y7QUFDaEYsc0ZBQXNGO0FBQ3RGLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFVLENBQUM7QUFDM0QsZ0NBQWdDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGlCQUFpQixFQUFFLFNBQVM7UUFDNUIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ3BELGlCQUFpQixFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUNwRCxpQkFBaUIsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDcEQsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixtQkFBbUIsRUFBRSw2Q0FBNkM7UUFDbEUsbUJBQW1CLEVBQUUsNkNBQTZDO1FBQ2xFLG1CQUFtQixFQUFFLDZDQUE2QztRQUNsRSxjQUFjLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ2pELGdCQUFnQixFQUFFLDZDQUE2QztRQUMvRCxjQUFjLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ2pELGdCQUFnQixFQUFFLDZDQUE2QztRQUMvRCxjQUFjLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ2pELGdCQUFnQixFQUFFLDZDQUE2QztRQUMvRCxVQUFVLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQzdDLFVBQVUsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDN0MsVUFBVSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUM3QyxLQUFLLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ3hDLGFBQWEsRUFBRSxHQUFHLENBQUMsZ0NBQWdDLENBQUM7UUFDcEQsS0FBSyxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUN4QyxhQUFhLEVBQUUsR0FBRyxDQUFDLGdDQUFnQyxDQUFDO1FBQ3BELEtBQUssRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDeEMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQztRQUNwRCxLQUFLLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ3hDLGFBQWEsRUFBRSxHQUFHLENBQUMsZ0NBQWdDLENBQUM7UUFDcEQsS0FBSyxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUN4QyxhQUFhLEVBQUUsR0FBRyxDQUFDLGdDQUFnQyxDQUFDO1FBQ3BELEtBQUssRUFBRSxHQUFHLENBQUMsd0JBQXdCLENBQUM7S0FDckM7SUFDRCx5QkFBeUIsRUFBRTtRQUN6QixXQUFXLEVBQUUsU0FBUztRQUN0QixpQkFBaUIsRUFBRSxTQUFTO1FBQzVCLGlCQUFpQixFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUNuRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsMkNBQTJDLENBQUM7UUFDbkUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ25FLG1CQUFtQixFQUFFLFNBQVM7UUFDOUIsbUJBQW1CLEVBQUUsNERBQTREO1FBQ2pGLG1CQUFtQixFQUFFLDREQUE0RDtRQUNqRixtQkFBbUIsRUFBRSw0REFBNEQ7UUFDakYsY0FBYyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUNoRSxnQkFBZ0IsRUFBRSw0REFBNEQ7UUFDOUUsY0FBYyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUNoRSxnQkFBZ0IsRUFBRSw0REFBNEQ7UUFDOUUsY0FBYyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUNoRSxnQkFBZ0IsRUFBRSw0REFBNEQ7UUFDOUUsVUFBVSxFQUFFLFNBQVM7UUFDckIsVUFBVSxFQUFFLFNBQVM7UUFDckIsVUFBVSxFQUFFLFNBQVM7UUFDckIsS0FBSyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUN2RCxhQUFhLEVBQUUsR0FBRyxDQUFDLCtDQUErQyxDQUFDO1FBQ25FLEtBQUssRUFBRSxHQUFHLENBQUMsMkNBQTJDLENBQUM7UUFDdkQsYUFBYSxFQUFFLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQztRQUNuRSxLQUFLLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ3ZELGFBQWEsRUFBRSxHQUFHLENBQUMsK0NBQStDLENBQUM7UUFDbkUsS0FBSyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUN2RCxhQUFhLEVBQUUsR0FBRyxDQUFDLCtDQUErQyxDQUFDO1FBQ25FLEtBQUssRUFBRSxHQUFHLENBQUMsMkNBQTJDLENBQUM7UUFDdkQsYUFBYSxFQUFFLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQztRQUNuRSxLQUFLLEVBQUUsR0FBRyxDQUFDLHVDQUF1QyxDQUFDO0tBQ3BEO0lBQ0Qsc0JBQXNCLEVBQUU7UUFDdEIsV0FBVyxFQUFFLFNBQVM7UUFDdEIsaUJBQWlCLEVBQUUsU0FBUztRQUM1QixpQkFBaUIsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDcEQsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ3BELGlCQUFpQixFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUNwRCxtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLG1CQUFtQixFQUFFLHFFQUFxRTtRQUMxRixtQkFBbUIsRUFBRSxxRUFBcUU7UUFDMUYsbUJBQW1CLEVBQUUscUVBQXFFO1FBQzFGLGNBQWMsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDakQsZ0JBQWdCLEVBQUUscUVBQXFFO1FBQ3ZGLGNBQWMsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDakQsZ0JBQWdCLEVBQUUscUVBQXFFO1FBQ3ZGLGNBQWMsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDakQsZ0JBQWdCLEVBQUUscUVBQXFFO1FBQ3ZGLFVBQVUsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDN0MsVUFBVSxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUM3QyxVQUFVLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQzdDLEtBQUssRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDeEMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQztRQUNwRCxLQUFLLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ3hDLGFBQWEsRUFBRSxHQUFHLENBQUMsZ0NBQWdDLENBQUM7UUFDcEQsS0FBSyxFQUFFLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQztRQUN4QyxhQUFhLEVBQUUsR0FBRyxDQUFDLGdDQUFnQyxDQUFDO1FBQ3BELEtBQUssRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDeEMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQztRQUNwRCxLQUFLLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1FBQ3hDLGFBQWEsRUFBRSxHQUFHLENBQUMsZ0NBQWdDLENBQUM7UUFDcEQsS0FBSyxFQUFFLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztLQUNyQztJQUNELHFDQUFxQyxFQUFFO1FBQ3JDLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGlCQUFpQixFQUFFLFNBQVM7UUFDNUIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ25FLGlCQUFpQixFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUNuRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsMkNBQTJDLENBQUM7UUFDbkUsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixtQkFBbUIsRUFBRSxvRkFBb0Y7UUFDekcsbUJBQW1CLEVBQUUsb0ZBQW9GO1FBQ3pHLG1CQUFtQixFQUFFLG9GQUFvRjtRQUN6RyxjQUFjLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ2hFLGdCQUFnQixFQUFFLG9GQUFvRjtRQUN0RyxjQUFjLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ2hFLGdCQUFnQixFQUFFLG9GQUFvRjtRQUN0RyxjQUFjLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ2hFLGdCQUFnQixFQUFFLG9GQUFvRjtRQUN0RyxVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsU0FBUztRQUNyQixLQUFLLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ3ZELGFBQWEsRUFBRSxHQUFHLENBQUMsK0NBQStDLENBQUM7UUFDbkUsS0FBSyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUN2RCxhQUFhLEVBQUUsR0FBRyxDQUFDLCtDQUErQyxDQUFDO1FBQ25FLEtBQUssRUFBRSxHQUFHLENBQUMsMkNBQTJDLENBQUM7UUFDdkQsYUFBYSxFQUFFLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQztRQUNuRSxLQUFLLEVBQUUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO1FBQ3ZELGFBQWEsRUFBRSxHQUFHLENBQUMsK0NBQStDLENBQUM7UUFDbkUsS0FBSyxFQUFFLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztRQUN2RCxhQUFhLEVBQUUsR0FBRyxDQUFDLCtDQUErQyxDQUFDO1FBQ25FLEtBQUssRUFBRSxHQUFHLENBQUMsdUNBQXVDLENBQUM7S0FDcEQ7SUFDRCxPQUFPLEVBQUU7UUFDUCxXQUFXLEVBQUUsU0FBUztRQUN0QixpQkFBaUIsRUFBRSxTQUFTO1FBQzVCLGlCQUFpQixFQUFFLDRDQUE0QztRQUMvRCxpQkFBaUIsRUFBRSw0Q0FBNEM7UUFDL0QsaUJBQWlCLEVBQUUsNENBQTRDO1FBQy9ELG1CQUFtQixFQUFFLFNBQVM7UUFDOUIsbUJBQW1CLEVBQUUsa0RBQWtEO1FBQ3ZFLG1CQUFtQixFQUFFLGtEQUFrRDtRQUN2RSxtQkFBbUIsRUFBRSxrREFBa0Q7UUFDdkUsY0FBYyxFQUFFLHlDQUF5QztRQUN6RCxnQkFBZ0IsRUFBRSwrQ0FBK0M7UUFDakUsY0FBYyxFQUFFLHlDQUF5QztRQUN6RCxnQkFBZ0IsRUFBRSwrQ0FBK0M7UUFDakUsVUFBVSxFQUFFLG1DQUFtQztRQUMvQyxVQUFVLEVBQUUsbUNBQW1DO1FBQy9DLFVBQVUsRUFBRSxtQ0FBbUM7UUFDL0MsS0FBSyxFQUFFLG1DQUFtQztRQUMxQyxhQUFhLEVBQUUseUNBQXlDO1FBQ3hELEtBQUssRUFBRSxtQ0FBbUM7UUFDMUMsYUFBYSxFQUFFLHlDQUF5QztRQUN4RCxLQUFLLEVBQUUsbUNBQW1DO1FBQzFDLGFBQWEsRUFBRSx5Q0FBeUM7UUFDeEQsS0FBSyxFQUFFLG1DQUFtQztRQUMxQyxhQUFhLEVBQUUseUNBQXlDO1FBQ3hELEtBQUssRUFBRSxtQ0FBbUM7UUFDMUMsYUFBYSxFQUFFLHlDQUF5QztRQUN4RCxLQUFLLEVBQUUscUNBQXFDO0tBQzdDO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsV0FBVyxFQUFFLFNBQVM7UUFDdEIsaUJBQWlCLEVBQUUsU0FBUztRQUM1QixpQkFBaUIsRUFBRSxzREFBc0Q7UUFDekUsaUJBQWlCLEVBQUUsc0RBQXNEO1FBQ3pFLGlCQUFpQixFQUFFLHNEQUFzRDtRQUN6RSxtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLG1CQUFtQixFQUFFLFNBQVM7UUFDOUIsbUJBQW1CLEVBQUUsNERBQTREO1FBQ2pGLG1CQUFtQixFQUFFLDREQUE0RDtRQUNqRixjQUFjLEVBQUUsbURBQW1EO1FBQ25FLGdCQUFnQixFQUFFLHlEQUF5RDtRQUMzRSxjQUFjLEVBQUUsbURBQW1EO1FBQ25FLGdCQUFnQixFQUFFLHlEQUF5RDtRQUMzRSxVQUFVLEVBQUUsNkNBQTZDO1FBQ3pELFVBQVUsRUFBRSw2Q0FBNkM7UUFDekQsVUFBVSxFQUFFLDZDQUE2QztRQUN6RCxLQUFLLEVBQUUsNkNBQTZDO1FBQ3BELGFBQWEsRUFBRSxtREFBbUQ7UUFDbEUsS0FBSyxFQUFFLDZDQUE2QztRQUNwRCxhQUFhLEVBQUUsbURBQW1EO1FBQ2xFLEtBQUssRUFBRSw2Q0FBNkM7UUFDcEQsYUFBYSxFQUFFLG1EQUFtRDtRQUNsRSxLQUFLLEVBQUUsNkNBQTZDO1FBQ3BELGFBQWEsRUFBRSxtREFBbUQ7UUFDbEUsS0FBSyxFQUFFLDZDQUE2QztRQUNwRCxhQUFhLEVBQUUsbURBQW1EO1FBQ2xFLEtBQUssRUFBRSwrQ0FBK0M7S0FDdkQ7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsU0FBUztRQUN0QixpQkFBaUIsRUFBRSxTQUFTO1FBQzVCLGlCQUFpQixFQUFFLDBDQUEwQztRQUM3RCxpQkFBaUIsRUFBRSwwQ0FBMEM7UUFDN0QsaUJBQWlCLEVBQUUsMENBQTBDO1FBQzdELG1CQUFtQixFQUFFLFNBQVM7UUFDOUIsbUJBQW1CLEVBQUUsZ0RBQWdEO1FBQ3JFLG1CQUFtQixFQUFFLGdEQUFnRDtRQUNyRSxtQkFBbUIsRUFBRSxnREFBZ0Q7UUFDckUsY0FBYyxFQUFFLHVDQUF1QztRQUN2RCxnQkFBZ0IsRUFBRSw2Q0FBNkM7UUFDL0QsY0FBYyxFQUFFLHVDQUF1QztRQUN2RCxnQkFBZ0IsRUFBRSw2Q0FBNkM7UUFDL0QsVUFBVSxFQUFFLFNBQVM7UUFDckIsVUFBVSxFQUFFLHVFQUF1RTtRQUNuRixVQUFVLEVBQUUsdUVBQXVFO1FBQ25GLEtBQUssRUFBRSxvQ0FBb0M7UUFDM0MsYUFBYSxFQUFFLDBDQUEwQztRQUN6RCxLQUFLLEVBQUUsb0NBQW9DO1FBQzNDLGFBQWEsRUFBRSwwQ0FBMEM7UUFDekQsS0FBSyxFQUFFLG9DQUFvQztRQUMzQyxhQUFhLEVBQUUsMENBQTBDO1FBQ3pELEtBQUssRUFBRSxvQ0FBb0M7UUFDM0MsYUFBYSxFQUFFLDBDQUEwQztRQUN6RCxLQUFLLEVBQUUsb0NBQW9DO1FBQzNDLGFBQWEsRUFBRSwwQ0FBMEM7UUFDekQsS0FBSyxFQUFFLG1DQUFtQztLQUMzQztJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGlCQUFpQixFQUFFLFNBQVM7UUFDNUIsaUJBQWlCLEVBQUUsbUNBQW1DO1FBQ3RELGlCQUFpQixFQUFFLG1DQUFtQztRQUN0RCxpQkFBaUIsRUFBRSxtQ0FBbUM7UUFDdEQsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixtQkFBbUIsRUFBRSx5Q0FBeUM7UUFDOUQsbUJBQW1CLEVBQUUseUNBQXlDO1FBQzlELG1CQUFtQixFQUFFLHlDQUF5QztRQUM5RCxjQUFjLEVBQUUsbUNBQW1DO1FBQ25ELGdCQUFnQixFQUFFLHlDQUF5QztRQUMzRCxjQUFjLEVBQUUsbUNBQW1DO1FBQ25ELGdCQUFnQixFQUFFLHlDQUF5QztRQUMzRCxVQUFVLEVBQUUsaUNBQWlDO1FBQzdDLFVBQVUsRUFBRSxpQ0FBaUM7UUFDN0MsVUFBVSxFQUFFLGlDQUFpQztRQUM3QyxLQUFLLEVBQUUsaUNBQWlDO1FBQ3hDLGFBQWEsRUFBRSx1Q0FBdUM7UUFDdEQsS0FBSyxFQUFFLGlDQUFpQztRQUN4QyxhQUFhLEVBQUUsdUNBQXVDO1FBQ3RELEtBQUssRUFBRSxpQ0FBaUM7UUFDeEMsYUFBYSxFQUFFLHVDQUF1QztRQUN0RCxLQUFLLEVBQUUsaUNBQWlDO1FBQ3hDLGFBQWEsRUFBRSx1Q0FBdUM7UUFDdEQsS0FBSyxFQUFFLGlDQUFpQztRQUN4QyxhQUFhLEVBQUUsdUNBQXVDO1FBQ3RELEtBQUssRUFBRSxtQ0FBbUM7S0FDM0M7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsU0FBUztRQUN0QixpQkFBaUIsRUFBRSxTQUFTO1FBQzVCLGlCQUFpQixFQUFFLFNBQVM7UUFDNUIsaUJBQWlCLEVBQUUsU0FBUztRQUM1QixpQkFBaUIsRUFBRSxTQUFTO1FBQzVCLG1CQUFtQixFQUFFLFNBQVM7UUFDOUIsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixtQkFBbUIsRUFBRSxTQUFTO1FBQzlCLG1CQUFtQixFQUFFLFNBQVM7UUFDOUIsY0FBYyxFQUFFLFNBQVM7UUFDekIsZ0JBQWdCLEVBQUUsU0FBUztRQUMzQixjQUFjLEVBQUUsU0FBUztRQUN6QixnQkFBZ0IsRUFBRSxTQUFTO1FBQzNCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLEtBQUssRUFBRSxtQ0FBbUM7S0FDM0M7SUFDRCxPQUFPLEVBQUU7UUFDUCxXQUFXLEVBQUUsK0JBQStCO1FBQzVDLGlCQUFpQixFQUFFLFNBQVM7UUFDNUIsaUJBQWlCLEVBQUUsK0JBQStCO1FBQ2xELGlCQUFpQixFQUFFLCtCQUErQjtRQUNsRCxpQkFBaUIsRUFBRSwrQkFBK0I7UUFDbEQsbUJBQW1CLEVBQUUsU0FBUztRQUM5QixtQkFBbUIsRUFBRSwrQkFBK0I7UUFDcEQsbUJBQW1CLEVBQUUsK0JBQStCO1FBQ3BELG1CQUFtQixFQUFFLCtCQUErQjtRQUNwRCxjQUFjLEVBQUUsK0JBQStCO1FBQy9DLGdCQUFnQixFQUFFLCtCQUErQjtRQUNqRCxjQUFjLEVBQUUsK0JBQStCO1FBQy9DLGdCQUFnQixFQUFFLCtCQUErQjtRQUNqRCxVQUFVLEVBQUUsK0JBQStCO1FBQzNDLFVBQVUsRUFBRSwrQkFBK0I7UUFDM0MsVUFBVSxFQUFFLCtCQUErQjtRQUMzQyxLQUFLLEVBQUUsK0JBQStCO1FBQ3RDLGFBQWEsRUFBRSwrQkFBK0I7UUFDOUMsS0FBSyxFQUFFLCtCQUErQjtRQUN0QyxhQUFhLEVBQUUsK0JBQStCO1FBQzlDLEtBQUssRUFBRSwrQkFBK0I7UUFDdEMsYUFBYSxFQUFFLCtCQUErQjtRQUM5QyxLQUFLLEVBQUUsK0JBQStCO1FBQ3RDLGFBQWEsRUFBRSwrQkFBK0I7UUFDOUMsS0FBSyxFQUFFLCtCQUErQjtRQUN0QyxhQUFhLEVBQUUsK0JBQStCO1FBQzlDLEtBQUssRUFBRSwrQkFBK0I7S0FDdkM7Q0FDTyxDQUFDO0FBSUosSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSxjQUFjO0lBRWxELEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBVztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVDLE1BQU0sU0FBUyxHQUFpQixFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELElBQUksV0FBVyxLQUFLLHlCQUF5QixJQUFJLFdBQVcsS0FBSyxxQ0FBcUMsRUFBRSxDQUFDO29CQUN2RyxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDYixJQUFJLEVBQUUsR0FBRyxXQUFXLEdBQUc7b0JBQ3ZCLEtBQUssRUFBRSxJQUFJO29CQUNYLEdBQUcsRUFBRSxFQUFFO29CQUNQLElBQUksRUFBRSxHQUFHO29CQUNULElBQUksRUFBRSxVQUFVO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDYixJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsSUFBSTtnQkFDWCxHQUFHLEVBQUUsRUFBRTtnQkFDUCxJQUFJLEVBQUUsR0FBRztnQkFDVCxJQUFJLEVBQUUsVUFBVTthQUNqQixDQUFDLENBQUM7WUFDSCxpREFBaUQ7WUFDakQsMkZBQTJGO1lBQzNGLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osS0FBSyxFQUFFLElBQUk7Z0JBQ1gsR0FBRyxFQUFFLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLFVBQVU7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRztnQkFDZCxHQUFHLEVBQUU7b0JBQ0g7d0JBQ0UsSUFBSSxFQUFFLFNBQVM7d0JBQ2YsS0FBSyxFQUFFLElBQUk7d0JBQ1gsR0FBRyxFQUFFLEVBQUU7d0JBQ1AsSUFBSSxFQUFFLEdBQUc7d0JBQ1QsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO2lCQUNGO2dCQUNELFVBQVUsRUFBRSxTQUFTO2dCQUNyQixjQUFjLEVBQUUsRUFBRTthQUNuQixDQUFDO1lBQ0YsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELElBQUksV0FBVyxLQUFLLHlCQUF5QixJQUFJLFdBQVcsS0FBSyxxQ0FBcUMsRUFBRSxDQUFDO29CQUN2RyxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hELENBQUM7WUFFRCxrRkFBa0Y7WUFDbEYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO2lCQUN0RCxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztnQkFDeEUsa0NBQWtDO2lCQUNqQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNkLHlCQUF5QjtZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNwQyxJQUFJLEVBQUUsT0FBTztvQkFDYixLQUFLLEVBQUUsSUFBSTtvQkFDWCxHQUFHLEVBQUUsRUFBRTtvQkFDUCxJQUFJLEVBQUUsR0FBRztvQkFDVCxJQUFJLEVBQUUsTUFBTTtpQkFDYixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsS0FBSyxNQUFNLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDdEMsS0FBSyxNQUFNLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO29CQUMzQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNqRCxNQUFNLGNBQWMsR0FBRyxjQUFjLE9BQU8sSUFBSSxJQUFJLE1BQU0sQ0FBQztvQkFDM0QsTUFBTSxTQUFTLEdBQUcsYUFBYTt3QkFDN0IsQ0FBQyxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsY0FBYyxFQUFFO3dCQUN4RCxDQUFDLENBQUMsYUFBYSxHQUFHLGlCQUFpQixjQUFjLEVBQUUsQ0FBQztvQkFDdEQsTUFBTSxVQUFVLEdBQUc7d0JBQ2pCLElBQUksRUFBRSxjQUFjO3dCQUNwQixLQUFLLEVBQUUsS0FBSzt3QkFDWixHQUFHLEVBQUUsU0FBUzt3QkFDZCxJQUFJLEVBQUUsR0FBRzt3QkFDVCxJQUFJLEVBQUUsT0FBTztxQkFDZCxDQUFDO29CQUNGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO29CQUM3RSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFFBQVEsR0FLUixFQUFFLENBQUM7WUFDVCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMscUNBQXFDLE9BQU8sZ0JBQWdCLENBQUM7aUJBQzNFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLGNBQWM7Z0JBQ2QsTUFBTTtnQkFDTiwwQkFBMEI7Z0JBQzFCLDBCQUEwQjtnQkFDMUIsZ0NBQWdDO2dCQUNoQyx5Q0FBeUM7Z0JBQ3pDLDhCQUE4QjtnQkFDOUIsT0FBTztnQkFDUCxJQUFJO2dCQUNKLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2Qsc0ZBQXNGLEVBQ3RGLE9BQU8sRUFDUCxHQUFHLENBQ0osQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUNMLENBQ0YsQ0FBQztZQUNGLDhGQUE4RjtZQUM5RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzVFLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ3pFLElBQUk7Z0JBQ0osd0JBQXdCO2dCQUN4Qix3QkFBd0I7Z0JBQ3hCLDhCQUE4QjtnQkFDOUIsc0NBQXNDO2dCQUN0QyxJQUFJO2dCQUNKLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDWixHQUFHLFFBQVE7d0JBQ1gsSUFBSSxFQUFFLHlCQUF5QjtxQkFDaEMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQ0Qsa0lBQWtJO1lBQ2xJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLHFDQUFxQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEYsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLHNCQUFzQixDQUFDLENBQUM7Z0JBQzlGLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQkFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDWixHQUFHLGlCQUFpQjt3QkFDcEIsSUFBSSxFQUFFLHFDQUFxQztxQkFDNUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLGFBQWE7b0JBQUUsU0FBUztnQkFDN0IsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLHlCQUF5QixFQUFFLENBQUM7b0JBQy9DLG1EQUFtRDtvQkFDbkQsOEZBQThGO29CQUM5RixjQUFjLEdBQUcsVUFBVSxDQUFDO2dCQUM5QixDQUFDO3FCQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxxQ0FBcUMsRUFBRSxDQUFDO29CQUNsRSwyRUFBMkU7b0JBQzNFLHNIQUFzSDtvQkFDdEgsY0FBYyxHQUFHLHNCQUFzQixDQUFDO2dCQUMxQyxDQUFDO2dCQUNELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7b0JBQ25FLElBQUksQ0FBQyxVQUFVO3dCQUFFLFNBQVM7b0JBQzFCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQzNFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDO29CQUNwRCxJQUFJLEdBQVcsQ0FBQztvQkFDaEIsSUFBSSxJQUFZLENBQUM7b0JBQ2pCLElBQUksR0FBVyxDQUFDO29CQUNoQixJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUNuQyxHQUFHLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUN4RCxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDakMsR0FBRyxHQUFHLFdBQVcsY0FBYyxJQUFJLFFBQVEsR0FBRyxDQUFDO3dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0NBQy9DLElBQUksRUFBRSxHQUFHLFFBQVEsR0FBRztnQ0FDcEIsS0FBSyxFQUFFLElBQUk7Z0NBQ1gsR0FBRyxFQUFFLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLEdBQUc7Z0NBQ1QsSUFBSSxFQUFFLFFBQVE7NkJBQ2YsQ0FBQyxDQUFDOzRCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUMxQixDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWM7NEJBQUUsU0FBUzt3QkFDdEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQzt3QkFDakMsR0FBRyxHQUFHLEdBQUcsYUFBYSxjQUFjLE9BQU8sQ0FBQyxjQUFjLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQzFFLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUM1QyxNQUFNLFVBQVUsR0FBRyxlQUFlLE9BQU8sQ0FBQyxjQUFjLEdBQUcsQ0FBQzt3QkFDNUQsR0FBRyxHQUFHLEdBQUcsVUFBVSxHQUFHLFdBQVcsR0FBRyxDQUFDO3dCQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDOzRCQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQ0FDakMsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLGNBQWMsR0FBRztnQ0FDbEMsS0FBSyxFQUFFLElBQUk7Z0NBQ1gsR0FBRyxFQUFFLEVBQUU7Z0NBQ1AsSUFBSSxFQUFFLEdBQUc7Z0NBQ1QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxjQUFjOzZCQUM3QixDQUFDLENBQUM7NEJBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2pDLENBQUM7d0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQztnQ0FDN0IsSUFBSSxFQUFFLEdBQUcsV0FBVyxHQUFHO2dDQUN2QixLQUFLLEVBQUUsSUFBSTtnQ0FDWCxHQUFHLEVBQUUsRUFBRTtnQ0FDUCxJQUFJLEVBQUUsR0FBRztnQ0FDVCxJQUFJLEVBQUUsT0FBTyxDQUFDLGNBQWM7NkJBQzdCLENBQUMsQ0FBQzt3QkFDTCxDQUFDO3dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUMxQixDQUFDO29CQUNILENBQUM7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUN0QixJQUFJOzRCQUNKLEtBQUssRUFBRSxLQUFLOzRCQUNaLEdBQUc7NEJBQ0gsSUFBSSxFQUFFLEdBQUc7NEJBQ1QsSUFBSSxFQUFFLFFBQVE7eUJBQ2YsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztDQUNGLENBQUE7QUEzT1ksZ0JBQWdCO0lBRjVCLGNBQWMsRUFBRTtJQUNoQixhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztHQUN4QixnQkFBZ0IsQ0EyTzVCIn0=