UNPKG

@oaklean/profiler-core

Version:

Part of the @oaklean suite. It provides all basic functions to work with the `.oak` file format. It allows parsing the `.oak` file format as well as tools for analyzing the measurement values. It also provides all necessary capabilities required for prec

347 lines 28.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SystemInformation = void 0; const systeminformation_1 = __importDefault(require("systeminformation")); const BaseModel_1 = require("./BaseModel"); const LoggerHelper_1 = require("../helper/LoggerHelper"); class SystemInformation extends BaseModel_1.BaseModel { constructor(system, baseBoard, chassis, cpu, memory, memoryLayout, battery, os) { super(); this.system = system; this.baseBoard = baseBoard; this.chassis = chassis; this.cpu = cpu; this.memory = memory; this.memoryLayout = memoryLayout; this.battery = battery; this.os = os; } static sameSystem(...args) { if (args.length === 0) { throw new Error('SystemInformation.merge: no SystemInformation were given'); } const firstSystemInformation = args[0]; const firstSystem = firstSystemInformation.system; const firstBaseBoard = firstSystemInformation.baseBoard; const firstChassi = firstSystemInformation.chassis; const firstCpu = firstSystemInformation.cpu; const firstMemory = firstSystemInformation.memory; const firstMemoryLayout = firstSystemInformation.memoryLayout; const firstBattery = firstSystemInformation.battery; const firstOs = firstSystemInformation.os; for (const currentSystemInformation of args) { const currentSystem = currentSystemInformation.system; const systemIsTheSame = firstSystem.manufacturer === currentSystem.manufacturer && firstSystem.model === currentSystem.model && firstSystem.version === currentSystem.version && firstSystem.virtual === currentSystem.virtual; if (!systemIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different systems'); return false; } const currentBaseBoard = currentSystemInformation.baseBoard; const baseBoardIsTheSame = firstBaseBoard.manufacturer === currentBaseBoard.manufacturer && firstBaseBoard.model === currentBaseBoard.model && firstBaseBoard.version === currentBaseBoard.version && firstBaseBoard.memMax === currentBaseBoard.memMax && firstBaseBoard.memSlots === currentBaseBoard.memSlots; if (!baseBoardIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different baseboards'); return false; } const currentChassis = currentSystemInformation.chassis; const chassisIsTheSame = firstChassi.manufacturer === currentChassis.manufacturer && firstChassi.model === currentChassis.model && firstChassi.type === currentChassis.type && firstChassi.version === currentChassis.version && firstChassi.assetTag === currentChassis.assetTag && firstChassi.sku === currentChassis.sku; if (!chassisIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different chassis'); return false; } const currentCpu = currentSystemInformation.cpu; const cpuIsTheSame = firstCpu.manufacturer === currentCpu.manufacturer && firstCpu.brand === currentCpu.brand && firstCpu.vendor === currentCpu.vendor && firstCpu.family === currentCpu.family && firstCpu.model === currentCpu.model && firstCpu.stepping === currentCpu.stepping && firstCpu.revision === currentCpu.revision && firstCpu.speedMin === currentCpu.speedMin && firstCpu.speedMax === currentCpu.speedMax && firstCpu.cores === currentCpu.cores && firstCpu.physicalCores === currentCpu.physicalCores && firstCpu.efficiencyCores === currentCpu.efficiencyCores && firstCpu.performanceCores === currentCpu.performanceCores && firstCpu.processors === currentCpu.processors && firstCpu.virtualization === currentCpu.virtualization && firstCpu.cache.l1d === currentCpu.cache.l1d && firstCpu.cache.l1i === currentCpu.cache.l1i && firstCpu.cache.l2 === currentCpu.cache.l2 && firstCpu.cache.l3 === currentCpu.cache.l3; if (!cpuIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different cpus'); return false; } const currentMemory = currentSystemInformation.memory; const memoryIsTheSame = firstMemory.total === currentMemory.total; if (!memoryIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different memory'); return false; } const currentMemoryLayout = currentSystemInformation.memoryLayout; if (firstMemoryLayout.length !== currentMemoryLayout.length) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different memoryLayout'); return false; } for (let i = 0; i < firstMemoryLayout.length; i++) { const memoryLayoutIsTheSame = firstMemoryLayout[i].size === currentMemoryLayout[i].size && firstMemoryLayout[i].type === currentMemoryLayout[i].type && firstMemoryLayout[i].manufacturer === currentMemoryLayout[i].manufacturer && firstMemoryLayout[i].voltageMin === currentMemoryLayout[i].voltageMin && firstMemoryLayout[i].voltageMax === currentMemoryLayout[i].voltageMax; if (!memoryLayoutIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different memoryLayout'); return false; } } const currentBattery = currentSystemInformation.battery; const batteryIsTheSame = firstBattery.type === currentBattery.type && firstBattery.model === currentBattery.model && firstBattery.manufacturer === currentBattery.manufacturer; if (!batteryIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different battery'); return false; } const currentOs = currentSystemInformation.os; const osIsTheSame = firstOs.platform === currentOs.platform && firstOs.distro === currentOs.distro && firstOs.release === currentOs.release && firstOs.codename === currentOs.codename && firstOs.kernel === currentOs.kernel && firstOs.arch === currentOs.arch && firstOs.codepage === currentOs.codepage && firstOs.logofile === currentOs.logofile && firstOs.build === currentOs.build && firstOs.servicepack === currentOs.servicepack && firstOs.uefi === currentOs.uefi; if (!osIsTheSame) { LoggerHelper_1.LoggerHelper.error('SystemInformation.isSame: detected different os'); return false; } } return true; } static collect() { return __awaiter(this, void 0, void 0, function* () { return new SystemInformation(yield this.systemInfo(), yield this.baseBoardInfo(), yield this.chassisInfo(), yield this.cpuInfo(), yield this.memoryInfo(), yield this.memoryLayoutInfo(), yield this.batteryInfo(), yield this.osInfo()); }); } static systemInfo() { return __awaiter(this, void 0, void 0, function* () { const { manufacturer, model, version, sku, virtual, virtualHost, raspberry } = yield systeminformation_1.default.system(); let raspberryInfo = undefined; if (raspberry) { raspberryInfo = { manufacturer: raspberry.manufacturer, processor: raspberry.processor, type: raspberry.type, revision: raspberry.revision }; } return { manufacturer, model, version, sku, virtual, virtualHost, raspberry: raspberryInfo }; }); } static baseBoardInfo() { return __awaiter(this, void 0, void 0, function* () { const { manufacturer, model, version, assetTag, memMax, memSlots } = yield systeminformation_1.default.baseboard(); return { manufacturer, model, version, assetTag, memMax, memSlots }; }); } static chassisInfo() { return __awaiter(this, void 0, void 0, function* () { const { manufacturer, model, type, version, assetTag, sku } = yield systeminformation_1.default.chassis(); return { manufacturer, model, type, version, assetTag, sku }; }); } static cpuInfo() { return __awaiter(this, void 0, void 0, function* () { const { manufacturer, brand, vendor, family, model, stepping, revision, voltage, speed, speedMin, speedMax, governor, cores, physicalCores, efficiencyCores, performanceCores, processors, socket, flags, virtualization, cache: { l1d, l1i, l2, l3 } } = yield systeminformation_1.default.cpu(); return { manufacturer, brand, vendor, family, model, stepping, revision, voltage, speed, speedMin, speedMax, governor, cores, physicalCores, efficiencyCores, performanceCores, processors, socket, flags, virtualization, cache: { l1d, l1i, l2, l3 } }; }); } static memoryInfo() { return __awaiter(this, void 0, void 0, function* () { const { total, free, used, active, available, buffcache, buffers, cached, slab, reclaimable, swaptotal, swapused, swapfree, writeback, dirty } = yield systeminformation_1.default.mem(); return { total, free, used, active, available, buffcache, buffers, cached, slab, reclaimable, swaptotal, swapused, swapfree, writeback, dirty }; }); } static memoryLayoutInfo() { return __awaiter(this, void 0, void 0, function* () { return (yield systeminformation_1.default.memLayout()).map(({ size, bank, type, ecc, clockSpeed, formFactor, manufacturer, partNum, voltageConfigured, voltageMin, voltageMax }) => { return { size, bank, type, ecc, clockSpeed, formFactor, manufacturer, partNum, voltageConfigured, voltageMin, voltageMax }; }); }); } static batteryInfo() { return __awaiter(this, void 0, void 0, function* () { function convert(data) { const { hasBattery, cycleCount, isCharging, voltage, designedCapacity, maxCapacity, currentCapacity, capacityUnit, percent, timeRemaining, acConnected, type, model, manufacturer, additionalBatteries } = data; return { hasBattery, cycleCount, isCharging, voltage, designedCapacity, maxCapacity, currentCapacity, capacityUnit, percent, timeRemaining, acConnected, type, model, manufacturer, additionalBatteries: additionalBatteries === null || additionalBatteries === void 0 ? void 0 : additionalBatteries.map((x) => convert(x)) }; } return convert(yield systeminformation_1.default.battery()); }); } static osInfo() { return __awaiter(this, void 0, void 0, function* () { const { platform, distro, release, codename, kernel, arch, codepage, logofile, build, servicepack, uefi, hypervizor, remoteSession } = yield systeminformation_1.default.osInfo(); return { platform, distro, release, codename, kernel, arch, codepage, logofile, build, servicepack, uefi, hypervizor, remoteSession }; }); } toJSON() { return { system: this.system, baseBoard: this.baseBoard, chassis: this.chassis, cpu: this.cpu, memory: this.memory, memoryLayout: this.memoryLayout, battery: this.battery, os: this.os }; } static fromJSON(json) { let data; if (typeof json === 'string') { data = JSON.parse(json); } else { data = json; } return new SystemInformation(data.system, data.baseBoard, data.chassis, data.cpu, data.memory, data.memoryLayout, data.battery, data.os); } } exports.SystemInformation = SystemInformation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3lzdGVtSW5mb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvU3lzdGVtSW5mb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMEVBQXlEO0FBRXpELDJDQUF1QztBQWN2Qyx5REFBcUQ7QUFFckQsTUFBYSxpQkFBa0IsU0FBUSxxQkFBUztJQVUvQyxZQUNDLE1BQWlDLEVBQ2pDLFNBQXVDLEVBQ3ZDLE9BQW1DLEVBQ25DLEdBQTJCLEVBQzNCLE1BQWlDLEVBQ2pDLFlBQStDLEVBQy9DLE9BQW1DLEVBQ25DLEVBQXlCO1FBRXpCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBMEI7UUFDOUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2QsMERBQTBELENBQzFELENBQUE7UUFDRixDQUFDO1FBQ0QsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEMsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFBO1FBQ2pELE1BQU0sY0FBYyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQTtRQUN2RCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUE7UUFDbEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFBO1FBQzNDLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQTtRQUNqRCxNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQTtRQUM3RCxNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUE7UUFDbkQsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsRUFBRSxDQUFBO1FBRXpDLEtBQUssTUFBTSx3QkFBd0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLENBQUE7WUFFckQsTUFBTSxlQUFlLEdBQ3BCLFdBQVcsQ0FBQyxZQUFZLEtBQUssYUFBYSxDQUFDLFlBQVk7Z0JBQ3ZELFdBQVcsQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLEtBQUs7Z0JBQ3pDLFdBQVcsQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDLE9BQU87Z0JBQzdDLFdBQVcsQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQTtZQUU5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3RCLDJCQUFZLENBQUMsS0FBSyxDQUNqQixzREFBc0QsQ0FDdEQsQ0FBQTtnQkFDRCxPQUFPLEtBQUssQ0FBQTtZQUNiLENBQUM7WUFFRCxNQUFNLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQTtZQUUzRCxNQUFNLGtCQUFrQixHQUN2QixjQUFjLENBQUMsWUFBWSxLQUFLLGdCQUFnQixDQUFDLFlBQVk7Z0JBQzdELGNBQWMsQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsS0FBSztnQkFDL0MsY0FBYyxDQUFDLE9BQU8sS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUNuRCxjQUFjLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLE1BQU07Z0JBQ2pELGNBQWMsQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUMsUUFBUSxDQUFBO1lBQ3RELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN6QiwyQkFBWSxDQUFDLEtBQUssQ0FDakIseURBQXlELENBQ3pELENBQUE7Z0JBQ0QsT0FBTyxLQUFLLENBQUE7WUFDYixDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFBO1lBRXZELE1BQU0sZ0JBQWdCLEdBQ3JCLFdBQVcsQ0FBQyxZQUFZLEtBQUssY0FBYyxDQUFDLFlBQVk7Z0JBQ3hELFdBQVcsQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLEtBQUs7Z0JBQzFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLElBQUk7Z0JBQ3hDLFdBQVcsQ0FBQyxPQUFPLEtBQUssY0FBYyxDQUFDLE9BQU87Z0JBQzlDLFdBQVcsQ0FBQyxRQUFRLEtBQUssY0FBYyxDQUFDLFFBQVE7Z0JBQ2hELFdBQVcsQ0FBQyxHQUFHLEtBQUssY0FBYyxDQUFDLEdBQUcsQ0FBQTtZQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdkIsMkJBQVksQ0FBQyxLQUFLLENBQ2pCLHNEQUFzRCxDQUN0RCxDQUFBO2dCQUNELE9BQU8sS0FBSyxDQUFBO1lBQ2IsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQTtZQUUvQyxNQUFNLFlBQVksR0FDakIsUUFBUSxDQUFDLFlBQVksS0FBSyxVQUFVLENBQUMsWUFBWTtnQkFDakQsUUFBUSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsS0FBSztnQkFDbkMsUUFBUSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTTtnQkFDckMsUUFBUSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTTtnQkFDckMsUUFBUSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsS0FBSztnQkFDbkMsUUFBUSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUTtnQkFDekMsUUFBUSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUTtnQkFDekMsUUFBUSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUTtnQkFDekMsUUFBUSxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsUUFBUTtnQkFDekMsUUFBUSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsS0FBSztnQkFDbkMsUUFBUSxDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUMsYUFBYTtnQkFDbkQsUUFBUSxDQUFDLGVBQWUsS0FBSyxVQUFVLENBQUMsZUFBZTtnQkFDdkQsUUFBUSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsQ0FBQyxnQkFBZ0I7Z0JBQ3pELFFBQVEsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFVBQVU7Z0JBQzdDLFFBQVEsQ0FBQyxjQUFjLEtBQUssVUFBVSxDQUFDLGNBQWM7Z0JBQ3JELFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDM0MsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHO2dCQUMzQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFBO1lBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbkIsMkJBQVksQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQTtnQkFDdkUsT0FBTyxLQUFLLENBQUE7WUFDYixDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFBO1lBRXJELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQTtZQUNqRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3RCLDJCQUFZLENBQUMsS0FBSyxDQUNqQixxREFBcUQsQ0FDckQsQ0FBQTtnQkFDRCxPQUFPLEtBQUssQ0FBQTtZQUNiLENBQUM7WUFFRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLFlBQVksQ0FBQTtZQUVqRSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0QsMkJBQVksQ0FBQyxLQUFLLENBQ2pCLDJEQUEyRCxDQUMzRCxDQUFBO2dCQUNELE9BQU8sS0FBSyxDQUFBO1lBQ2IsQ0FBQztZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxxQkFBcUIsR0FDMUIsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ3pELGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO29CQUN6RCxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZO3dCQUNoQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZO29CQUNwQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO3dCQUM5QixtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO29CQUNsQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO2dCQUV0RSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDNUIsMkJBQVksQ0FBQyxLQUFLLENBQ2pCLDJEQUEyRCxDQUMzRCxDQUFBO29CQUNELE9BQU8sS0FBSyxDQUFBO2dCQUNiLENBQUM7WUFDRixDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFBO1lBRXZELE1BQU0sZ0JBQWdCLEdBQ3JCLFlBQVksQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLElBQUk7Z0JBQ3pDLFlBQVksQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLEtBQUs7Z0JBQzNDLFlBQVksQ0FBQyxZQUFZLEtBQUssY0FBYyxDQUFDLFlBQVksQ0FBQTtZQUMxRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdkIsMkJBQVksQ0FBQyxLQUFLLENBQ2pCLHNEQUFzRCxDQUN0RCxDQUFBO2dCQUNELE9BQU8sS0FBSyxDQUFBO1lBQ2IsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLEVBQUUsQ0FBQTtZQUU3QyxNQUFNLFdBQVcsR0FDaEIsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDdkMsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTTtnQkFDbkMsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsT0FBTztnQkFDckMsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDdkMsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTTtnQkFDbkMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSTtnQkFDL0IsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDdkMsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDdkMsT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsS0FBSztnQkFDakMsT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsV0FBVztnQkFDN0MsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFBO1lBRWhDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbEIsMkJBQVksQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQTtnQkFDckUsT0FBTyxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ1osQ0FBQztJQUVELE1BQU0sQ0FBTyxPQUFPOztZQUNuQixPQUFPLElBQUksaUJBQWlCLENBQzNCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFDMUIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ3hCLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNwQixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDdkIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFDN0IsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQ3hCLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNuQixDQUFBO1FBQ0YsQ0FBQztLQUFBO0lBRUQsTUFBTSxDQUFPLFVBQVU7O1lBQ3RCLE1BQU0sRUFDTCxZQUFZLEVBQ1osS0FBSyxFQUNMLE9BQU8sRUFDUCxHQUFHLEVBQ0gsT0FBTyxFQUNQLFdBQVcsRUFDWCxTQUFTLEVBQ1QsR0FBRyxNQUFNLDJCQUFFLENBQUMsTUFBTSxFQUFFLENBQUE7WUFFckIsSUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFBO1lBQzdCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2YsYUFBYSxHQUFHO29CQUNmLFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWTtvQkFDcEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO29CQUM5QixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7b0JBQ3BCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtpQkFDNUIsQ0FBQTtZQUNGLENBQUM7WUFFRCxPQUFPO2dCQUNOLFlBQVk7Z0JBQ1osS0FBSztnQkFDTCxPQUFPO2dCQUNQLEdBQUc7Z0JBQ0gsT0FBTztnQkFDUCxXQUFXO2dCQUNYLFNBQVMsRUFBRSxhQUFhO2FBQ3hCLENBQUE7UUFDRixDQUFDO0tBQUE7SUFFRCxNQUFNLENBQU8sYUFBYTs7WUFDekIsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQ2pFLE1BQU0sMkJBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUVyQixPQUFPO2dCQUNOLFlBQVk7Z0JBQ1osS0FBSztnQkFDTCxPQUFPO2dCQUNQLFFBQVE7Z0JBQ1IsTUFBTTtnQkFDTixRQUFRO2FBQ1IsQ0FBQTtRQUNGLENBQUM7S0FBQTtJQUVELE1BQU0sQ0FBTyxXQUFXOztZQUN2QixNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FDMUQsTUFBTSwyQkFBRSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBRW5CLE9BQU87Z0JBQ04sWUFBWTtnQkFDWixLQUFLO2dCQUNMLElBQUk7Z0JBQ0osT0FBTztnQkFDUCxRQUFRO2dCQUNSLEdBQUc7YUFDSCxDQUFBO1FBQ0YsQ0FBQztLQUFBO0lBRUQsTUFBTSxDQUFPLE9BQU87O1lBQ25CLE1BQU0sRUFDTCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixRQUFRLEVBQ1IsT0FBTyxFQUNQLEtBQUssRUFDTCxRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixLQUFLLEVBQ0wsYUFBYSxFQUNiLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUMzQixHQUFHLE1BQU0sMkJBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUVsQixPQUFPO2dCQUNOLFlBQVk7Z0JBQ1osS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sS0FBSztnQkFDTCxRQUFRO2dCQUNSLFFBQVE7Z0JBQ1IsT0FBTztnQkFDUCxLQUFLO2dCQUNMLFFBQVE7Z0JBQ1IsUUFBUTtnQkFDUixRQUFRO2dCQUNSLEtBQUs7Z0JBQ0wsYUFBYTtnQkFDYixlQUFlO2dCQUNmLGdCQUFnQjtnQkFDaEIsVUFBVTtnQkFDVixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsY0FBYztnQkFDZCxLQUFLLEVBQUU7b0JBQ04sR0FBRztvQkFDSCxHQUFHO29CQUNILEVBQUU7b0JBQ0YsRUFBRTtpQkFDRjthQUNELENBQUE7UUFDRixDQUFDO0tBQUE7SUFFRCxNQUFNLENBQU8sVUFBVTs7WUFDdEIsTUFBTSxFQUNMLEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLEVBQ1QsS0FBSyxFQUNMLEdBQUcsTUFBTSwyQkFBRSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBRWxCLE9BQU87Z0JBQ04sS0FBSztnQkFDTCxJQUFJO2dCQUNKLElBQUk7Z0JBQ0osTUFBTTtnQkFDTixTQUFTO2dCQUNULFNBQVM7Z0JBQ1QsT0FBTztnQkFDUCxNQUFNO2dCQUNOLElBQUk7Z0JBQ0osV0FBVztnQkFDWCxTQUFTO2dCQUNULFFBQVE7Z0JBQ1IsUUFBUTtnQkFDUixTQUFTO2dCQUNULEtBQUs7YUFDTCxDQUFBO1FBQ0YsQ0FBQztLQUFBO0lBRUQsTUFBTSxDQUFPLGdCQUFnQjs7WUFDNUIsT0FBTyxDQUFDLE1BQU0sMkJBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FDaEMsQ0FBQyxFQUNBLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLEdBQUcsRUFDSCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixVQUFVLEVBQ1YsRUFBRSxFQUFFO2dCQUNKLE9BQU87b0JBQ04sSUFBSTtvQkFDSixJQUFJO29CQUNKLElBQUk7b0JBQ0osR0FBRztvQkFDSCxVQUFVO29CQUNWLFVBQVU7b0JBQ1YsWUFBWTtvQkFDWixPQUFPO29CQUNQLGlCQUFpQjtvQkFDakIsVUFBVTtvQkFDVixVQUFVO2lCQUNWLENBQUE7WUFDRixDQUFDLENBQ0QsQ0FBQTtRQUNGLENBQUM7S0FBQTtJQUVELE1BQU0sQ0FBTyxXQUFXOztZQUN2QixTQUFTLE9BQU8sQ0FDZixJQUFtQztnQkFFbkMsTUFBTSxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osT0FBTyxFQUNQLGFBQWEsRUFDYixXQUFXLEVBQ1gsSUFBSSxFQUNKLEtBQUssRUFDTCxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLEdBQUcsSUFBSSxDQUFBO2dCQUVSLE9BQU87b0JBQ04sVUFBVTtvQkFDVixVQUFVO29CQUNWLFVBQVU7b0JBQ1YsT0FBTztvQkFDUCxnQkFBZ0I7b0JBQ2hCLFdBQVc7b0JBQ1gsZUFBZTtvQkFDZixZQUFZO29CQUNaLE9BQU87b0JBQ1AsYUFBYTtvQkFDYixXQUFXO29CQUNYLElBQUk7b0JBQ0osS0FBSztvQkFDTCxZQUFZO29CQUNaLG1CQUFtQixFQUFFLG1CQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRSxDQUFBO1lBQ0YsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sMkJBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ25DLENBQUM7S0FBQTtJQUVELE1BQU0sQ0FBTyxNQUFNOztZQUNsQixNQUFNLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixPQUFPLEVBQ1AsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osUUFBUSxFQUNSLFFBQVEsRUFDUixLQUFLLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixVQUFVLEVBQ1YsYUFBYSxFQUNiLEdBQUcsTUFBTSwyQkFBRSxDQUFDLE1BQU0sRUFBRSxDQUFBO1lBRXJCLE9BQU87Z0JBQ04sUUFBUTtnQkFDUixNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsUUFBUTtnQkFDUixNQUFNO2dCQUNOLElBQUk7Z0JBQ0osUUFBUTtnQkFDUixRQUFRO2dCQUNSLEtBQUs7Z0JBQ0wsV0FBVztnQkFDWCxJQUFJO2dCQUNKLFVBQVU7Z0JBQ1YsYUFBYTthQUNiLENBQUE7UUFDRixDQUFDO0tBQUE7SUFFRCxNQUFNO1FBQ0wsT0FBTztZQUNOLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNYLENBQUE7SUFDRixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFpQztRQUNoRCxJQUFJLElBQXdCLENBQUE7UUFDNUIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNQLElBQUksR0FBRyxJQUFJLENBQUE7UUFDWixDQUFDO1FBRUQsT0FBTyxJQUFJLGlCQUFpQixDQUMzQixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsR0FBRyxFQUNSLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsRUFBRSxDQUNQLENBQUE7SUFDRixDQUFDO0NBQ0Q7QUF2ZkQsOENBdWZDIn0=