UNPKG

@flxbl-io/sfp

Version:

sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model

261 lines 25.4 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ArtifactGenerator_1 = __importDefault(require("./core/artifacts/generators/ArtifactGenerator")); const os_1 = require("os"); const SfpCommand_1 = __importDefault(require("./SfpCommand")); const core_1 = require("@salesforce/core"); const fs = require("fs"); const SFPStatsSender_1 = __importDefault(require("./core/stats/SFPStatsSender")); const ProjectConfig_1 = __importDefault(require("./core/project/ProjectConfig")); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const GetFormattedTime_1 = __importDefault(require("./core/utils/GetFormattedTime")); const core_2 = require("@oclif/core"); const sfdxflags_1 = require("./flags/sfdxflags"); const ReleaseConfigAggregator_1 = require("./impl/release/ReleaseConfigAggregator"); // Initialize Messages with the current plugin directory core_1.Messages.importMessagesDirectory(__dirname); // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core, // or any library that is using the messages framework can also be loaded this way. const messages = core_1.Messages.loadMessages('@flxbl-io/sfp', 'build'); class BuildBase extends SfpCommand_1.default { constructor() { super(...arguments); this.releaseConfigMap = {}; } async execute() { const { flags } = await this.parse(); let buildExecResult; let totalElapsedTime; let artifactCreationErrors = []; let tags = { is_diffcheck_enabled: String(flags.diffcheck), stage: this.getStage(), branch: flags.branch, }; try { const artifactDirectory = flags.artifactdir; const diffcheck = flags.diffcheck; const branch = flags.branch; const buildOnlyPackages = flags.buildOnly; // Read Manifest let projectConfig = ProjectConfig_1.default.getSFDXProjectConfig(process.cwd()); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`command: ${(0, sfp_logger_1.COLOR_KEY_MESSAGE)(this.getStage())}`)); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Build Packages Only Changed: ${flags.diffcheck}`)); if (projectConfig?.plugins?.sfp?.scratchOrgDefFilePaths?.enableMultiDefinitionFiles) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Multiple Config Files Mode: enabled`)); } else { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Config File Path: ${flags.configfilepath}`)); } if (flags.releaseconfig?.length > 0) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Release Config Files: ${flags.releaseconfig}`)); } sfp_logger_1.default.log((0, sfp_logger_1.COLOR_HEADER)(`Artifact Directory: ${flags.artifactdir}`)); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO); let executionStartTime = Date.now(); if (!(flags.tag == null || flags.tag == undefined)) { tags['tag'] = flags.tag; } SFPStatsSender_1.default.logCount('build.scheduled', tags); let buildProps = this.getBuildProps(); //Filter Build Props by ReleaseConfig if (buildOnlyPackages?.length > 0) { buildProps = this.includeOnlyPackagesAsProvided(buildOnlyPackages, buildProps, new sfp_logger_1.ConsoleLogger()); } else { buildProps = this.includeOnlyPackagesAsPerReleaseConfig(flags.releaseconfig, buildProps, new sfp_logger_1.ConsoleLogger()); } buildExecResult = await this.getBuildImplementer(buildProps).exec(); if (diffcheck && buildExecResult.generatedPackages.length === 0 && buildExecResult.failedPackages.length === 0) { sfp_logger_1.default.log(`${os_1.EOL}${os_1.EOL}`); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_INFO)('No packages found to be built.. Exiting.. ')); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO); return; } sfp_logger_1.default.log(`${os_1.EOL}${os_1.EOL}`); sfp_logger_1.default.log('Generating Artifacts and Tags....'); for (let generatedPackage of buildExecResult.generatedPackages) { try { await ArtifactGenerator_1.default.generateArtifact(generatedPackage, process.cwd(), artifactDirectory); } catch (error) { sfp_logger_1.default.log(error.message); artifactCreationErrors.push(generatedPackage.packageName); } } totalElapsedTime = Date.now() - executionStartTime; if (artifactCreationErrors.length > 0 || buildExecResult.failedPackages.length > 0) throw new Error('Build Failed'); SFPStatsSender_1.default.logGauge('build.duration', Date.now() - executionStartTime, tags); SFPStatsSender_1.default.logCount('build.succeeded', tags); } catch (error) { SFPStatsSender_1.default.logCount('build.failed', tags); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(error)); process.exitCode = 1; } finally { if (buildExecResult?.generatedPackages?.length > 0 || buildExecResult?.failedPackages?.length > 0) { sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_SUCCESS)(`${buildExecResult.generatedPackages.length} artifacts created in ${(0, sfp_logger_1.COLOR_TIME)((0, GetFormattedTime_1.default)(totalElapsedTime))} minutes with ${(0, sfp_logger_1.COLOR_ERROR)(buildExecResult.failedPackages.length)} errors`)); if (buildExecResult.failedPackages.length > 0) sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`Packages Failed To Build`, buildExecResult.failedPackages)); if (artifactCreationErrors.length > 0) sfp_logger_1.default.log((0, sfp_logger_1.COLOR_ERROR)(`Failed To Create Artifacts`, artifactCreationErrors)); sfp_logger_1.default.printHeaderLine('', sfp_logger_1.COLOR_HEADER, sfp_logger_1.LoggerLevel.INFO); const buildResult = { packages: [], summary: { scheduled_packages: null, elapsed_time: null, succeeded: null, failed: null, sucessfullReleaseConfigs: [], failedReleaseConfigs: [] }, }; for (let generatedPackage of buildExecResult.generatedPackages) { buildResult.packages.push({ name: generatedPackage.packageName, version: generatedPackage.package_version_number, elapsed_time: generatedPackage.creation_details?.creation_time, versionId: generatedPackage.package_version_id, status: 'succeeded', }); } for (let failedPackage of buildExecResult.failedPackages) { buildResult.packages.push({ name: failedPackage, version: null, elapsed_time: null, status: 'failed', }); } //try to understad which release configs was successfull buildResult.summary.sucessfullReleaseConfigs = []; for (const releaseConfig in this.releaseConfigMap) { let packages = this.releaseConfigMap[releaseConfig]; let failedPackages = packages.filter((x) => buildExecResult.failedPackages.includes(x)); if (failedPackages.length === 0) { buildResult.summary.sucessfullReleaseConfigs.push(releaseConfig); } else { buildResult.summary.failedReleaseConfigs.push(releaseConfig); } } buildResult.summary.scheduled_packages = buildExecResult.generatedPackages.length + buildExecResult.failedPackages.length; buildResult.summary.elapsed_time = totalElapsedTime; buildResult.summary.succeeded = buildExecResult.generatedPackages.length; buildResult.summary.failed = buildExecResult.failedPackages.length; fs.writeFileSync(`buildResult.json`, JSON.stringify(buildResult, null, 4)); } } } includeOnlyPackagesAsProvided(buildOnlyPackages, buildProps, logger) { buildProps.includeOnlyPackages = buildOnlyPackages; printIncludeOnlyPackages(buildProps.includeOnlyPackages); return buildProps; function printIncludeOnlyPackages(includeOnlyPackages) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Build will include the below packages as per the given release configs domain(s)`), sfp_logger_1.LoggerLevel.INFO); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_VALUE)(`${includeOnlyPackages.toString()}`), sfp_logger_1.LoggerLevel.INFO); } } includeOnlyPackagesAsPerReleaseConfig(releaseConfigFilePaths, buildProps, logger) { if (releaseConfigFilePaths?.length > 0) { buildProps.includeOnlyPackages = []; let releaseConfigAggregatedLoader = new ReleaseConfigAggregator_1.ReleaseConfigAggregator(logger); releaseConfigAggregatedLoader.addReleaseConfigs(releaseConfigFilePaths); buildProps.includeOnlyPackages = releaseConfigAggregatedLoader.getAllPackages(); printIncludeOnlyPackages(buildProps.includeOnlyPackages); } return buildProps; function printIncludeOnlyPackages(includeOnlyPackages) { sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Build will include the below packages as per the given release configs(domain(s))`), sfp_logger_1.LoggerLevel.INFO); sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_VALUE)(`${includeOnlyPackages.toString()}`), sfp_logger_1.LoggerLevel.INFO); } } } BuildBase.requiresUsername = false; BuildBase.requiresDevhubUsername = false; BuildBase.requiresProject = true; BuildBase.flags = { loglevel: sfdxflags_1.loglevel, apiversion: sfdxflags_1.orgApiVersionFlagSfdxStyle, devhubalias: sfdxflags_1.targetdevhubusername, diffcheck: core_2.Flags.boolean({ description: messages.getMessage('diffCheckFlagDescription'), default: false, }), buildOnly: (0, sfdxflags_1.arrayFlagSfdxStyle)({ char: 'p', description: messages.getMessage('buildOnlyFlagDescription'), }), repourl: core_2.Flags.string({ char: 'r', description: messages.getMessage('repoUrlFlagDescription'), }), configfilepath: core_2.Flags.file({ char: 'f', description: messages.getMessage('configFilePathFlagDescription'), default: 'config/project-scratch-def.json', }), artifactdir: core_2.Flags.directory({ description: messages.getMessage('artifactDirectoryFlagDescription'), default: 'artifacts', }), waittime: core_2.Flags.integer({ description: messages.getMessage('waitTimeFlagDescription'), default: 120, }), buildnumber: core_2.Flags.integer({ description: messages.getMessage('buildNumberFlagDescription'), default: 1, }), executorcount: core_2.Flags.integer({ description: messages.getMessage('executorCountFlagDescription'), default: 5, }), branch: core_2.Flags.string({ description: messages.getMessage('branchFlagDescription'), default: 'main', required: true, }), tag: core_2.Flags.string({ description: messages.getMessage('tagFlagDescription'), }), releaseconfig: (0, sfdxflags_1.arrayFlagSfdxStyle)({ aliases: ['domain'], description: messages.getMessage('releaseConfigFileFlagDescription'), }), }; exports.default = BuildBase; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVpbGRCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0J1aWxkQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0dBQThFO0FBRTlFLDJCQUF5QjtBQUN6Qiw4REFBc0M7QUFDdEMsMkNBQTRDO0FBQzVDLHlCQUEwQjtBQUMxQixpRkFBeUQ7QUFFekQsaUZBQXlEO0FBRXpELG1FQVc4QjtBQUM5QixxRkFBNkQ7QUFHN0Qsc0NBQW9DO0FBQ3BDLGlEQUFtSDtBQUNuSCxvRkFBaUY7QUFFakYsd0RBQXdEO0FBQ3hELGVBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUU1QyxpR0FBaUc7QUFDakcsbUZBQW1GO0FBQ25GLE1BQU0sUUFBUSxHQUFHLGVBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWpFLE1BQThCLFNBQVUsU0FBUSxvQkFBVTtJQUExRDs7UUFJYyxxQkFBZ0IsR0FBZ0MsRUFBRSxDQUFDO0lBOFFqRSxDQUFDO0lBek5VLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxJQUFJLGVBR0gsQ0FBQztRQUNGLElBQUksZ0JBQXdCLENBQUM7UUFDN0IsSUFBSSxzQkFBc0IsR0FBYSxFQUFFLENBQUM7UUFFMUMsSUFBSSxJQUFJLEdBQUc7WUFDUCxvQkFBb0IsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUM3QyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN0QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07U0FDdkIsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNELE1BQU0saUJBQWlCLEdBQVcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUNwRCxNQUFNLFNBQVMsR0FBWSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzNDLE1BQU0sTUFBTSxHQUFXLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDcEMsTUFBTSxpQkFBaUIsR0FBYSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBRXBELGdCQUFnQjtZQUNoQixJQUFJLGFBQWEsR0FBRyx1QkFBYSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRXRFLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyxZQUFZLElBQUEsOEJBQWlCLEVBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUUsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLGdDQUFnQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9FLElBQUksYUFBYSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQztnQkFDbEYsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBWSxFQUFDLHFCQUFxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxJQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxHQUFDLENBQUMsRUFDaEMsQ0FBQztnQkFDRyxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLHlCQUFZLEVBQUMseUJBQXlCLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEseUJBQVksRUFBQyx1QkFBdUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RSxvQkFBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUseUJBQVksRUFBRSx3QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlELElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBRXBDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDNUIsQ0FBQztZQUVELHdCQUFjLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWpELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUV0QyxxQ0FBcUM7WUFDckMsSUFBSSxpQkFBaUIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLFVBQVUsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLElBQUksMEJBQWEsRUFBRSxDQUFDLENBQUM7WUFDeEcsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFVBQVUsR0FBRyxJQUFJLENBQUMscUNBQXFDLENBQ25ELEtBQUssQ0FBQyxhQUFhLEVBQ25CLFVBQVUsRUFDVixJQUFJLDBCQUFhLEVBQUUsQ0FDdEIsQ0FBQztZQUNOLENBQUM7WUFDRCxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFcEUsSUFDSSxTQUFTO2dCQUNULGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDOUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUM3QyxDQUFDO2dCQUNDLG9CQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBRyxHQUFHLFFBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzlCLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEsdUJBQVUsRUFBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLG9CQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSx5QkFBWSxFQUFFLHdCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlELE9BQU87WUFDWCxDQUFDO1lBRUQsb0JBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFHLEdBQUcsUUFBRyxFQUFFLENBQUMsQ0FBQztZQUM5QixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBRW5ELEtBQUssSUFBSSxnQkFBZ0IsSUFBSSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDO29CQUNELE1BQU0sMkJBQWlCLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2pHLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDYixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzdCLHNCQUFzQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztZQUNMLENBQUM7WUFFRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7WUFFbkQsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzlFLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFcEMsd0JBQWMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWpGLHdCQUFjLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Isd0JBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlDLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEsd0JBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hHLG9CQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSx5QkFBWSxFQUFFLHdCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlELG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEsMEJBQWEsRUFDVCxHQUFHLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLHlCQUF5QixJQUFBLHVCQUFVLEVBQzFFLElBQUEsMEJBQWdCLEVBQUMsZ0JBQWdCLENBQUMsQ0FDckMsaUJBQWlCLElBQUEsd0JBQVcsRUFBQyxlQUFlLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ2hGLENBQ0osQ0FBQztnQkFFRixJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3pDLG9CQUFTLENBQUMsR0FBRyxDQUFDLElBQUEsd0JBQVcsRUFBQywwQkFBMEIsRUFBRSxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFFM0YsSUFBSSxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDakMsb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBVyxFQUFDLDRCQUE0QixFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztnQkFFckYsb0JBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLHlCQUFZLEVBQUUsd0JBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFOUQsTUFBTSxXQUFXLEdBQWdCO29CQUM3QixRQUFRLEVBQUUsRUFBRTtvQkFDWixPQUFPLEVBQUU7d0JBQ0wsa0JBQWtCLEVBQUUsSUFBSTt3QkFDeEIsWUFBWSxFQUFFLElBQUk7d0JBQ2xCLFNBQVMsRUFBRSxJQUFJO3dCQUNmLE1BQU0sRUFBRSxJQUFJO3dCQUNaLHdCQUF3QixFQUFFLEVBQUU7d0JBQzVCLG9CQUFvQixFQUFDLEVBQUU7cUJBQzFCO2lCQUNKLENBQUM7Z0JBRUYsS0FBSyxJQUFJLGdCQUFnQixJQUFJLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUM3RCxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDdEIsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFdBQVc7d0JBQ2xDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxzQkFBc0I7d0JBQ2hELFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhO3dCQUM5RCxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsa0JBQWtCO3dCQUM5QyxNQUFNLEVBQUUsV0FBVztxQkFDdEIsQ0FBQyxDQUFDO2dCQUVQLENBQUM7Z0JBRUQsS0FBSyxJQUFJLGFBQWEsSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZELFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUN0QixJQUFJLEVBQUUsYUFBYTt3QkFDbkIsT0FBTyxFQUFFLElBQUk7d0JBQ2IsWUFBWSxFQUFFLElBQUk7d0JBQ2xCLE1BQU0sRUFBRSxRQUFRO3FCQUNuQixDQUFDLENBQUM7Z0JBQ1AsQ0FBQztnQkFFRCx3REFBd0Q7Z0JBQ3hELFdBQVcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEdBQUMsRUFBRSxDQUFDO2dCQUNoRCxLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUNoRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3BELElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3hGLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDOUIsV0FBVyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ3JFLENBQUM7eUJBQ0ksQ0FBQzt3QkFDRixXQUFXLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDakUsQ0FBQztnQkFDTCxDQUFDO2dCQUdELFdBQVcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCO29CQUNsQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO2dCQUNyRixXQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztnQkFDcEQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztnQkFDekUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7Z0JBRW5FLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sNkJBQTZCLENBQ2pDLGlCQUEyQixFQUMzQixVQUFzQixFQUN0QixNQUFlO1FBRWYsVUFBVSxDQUFDLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDO1FBQ25ELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sVUFBVSxDQUFDO1FBQ2xCLFNBQVMsd0JBQXdCLENBQUMsbUJBQTZCO1lBQzNELG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEsOEJBQWlCLEVBQUMsa0ZBQWtGLENBQUMsRUFDckcsd0JBQVcsQ0FBQyxJQUFJLENBQ25CLENBQUM7WUFDRixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLDRCQUFlLEVBQUMsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsd0JBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRixDQUFDO0lBQ0wsQ0FBQztJQUVPLHFDQUFxQyxDQUN6QyxzQkFBZ0MsRUFDaEMsVUFBc0IsRUFDdEIsTUFBZTtRQUlmLElBQUksc0JBQXNCLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFVBQVUsQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7WUFDcEMsSUFBSSw2QkFBNkIsR0FBRyxJQUFJLGlEQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pGLDZCQUE2QixDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDeEUsVUFBVSxDQUFDLG1CQUFtQixHQUFHLDZCQUE2QixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZFLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztRQUVsQixTQUFTLHdCQUF3QixDQUFDLG1CQUE2QjtZQUMzRCxvQkFBUyxDQUFDLEdBQUcsQ0FDVCxJQUFBLDhCQUFpQixFQUFDLG1GQUFtRixDQUFDLEVBQ3RHLHdCQUFXLENBQUMsSUFBSSxDQUNuQixDQUFDO1lBQ0Ysb0JBQVMsQ0FBQyxHQUFHLENBQUMsSUFBQSw0QkFBZSxFQUFDLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxFQUFFLHdCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUYsQ0FBQztJQUNMLENBQUM7O0FBMVFnQiwwQkFBZ0IsR0FBRyxLQUFLLEFBQVIsQ0FBUztBQUN6QixnQ0FBc0IsR0FBRyxLQUFLLEFBQVIsQ0FBUztBQUMvQix5QkFBZSxHQUFHLElBQUksQUFBUCxDQUFRO0FBRzFCLGVBQUssR0FBRztJQUNsQixRQUFRLEVBQVIsb0JBQVE7SUFDUixVQUFVLEVBQUUsc0NBQTBCO0lBQ3RDLFdBQVcsRUFBRSxnQ0FBb0I7SUFDakMsU0FBUyxFQUFFLFlBQUssQ0FBQyxPQUFPLENBQUM7UUFDckIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUM7UUFDNUQsT0FBTyxFQUFFLEtBQUs7S0FDakIsQ0FBQztJQUNGLFNBQVMsRUFBRSxJQUFBLDhCQUFrQixFQUFDO1FBQzFCLElBQUksRUFBRSxHQUFHO1FBQ1QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUM7S0FDL0QsQ0FBQztJQUNGLE9BQU8sRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLElBQUksRUFBRSxHQUFHO1FBQ1QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUM7S0FDN0QsQ0FBQztJQUNGLGNBQWMsRUFBRSxZQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksRUFBRSxHQUFHO1FBQ1QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsK0JBQStCLENBQUM7UUFDakUsT0FBTyxFQUFFLGlDQUFpQztLQUM3QyxDQUFDO0lBQ0YsV0FBVyxFQUFFLFlBQUssQ0FBQyxTQUFTLENBQUM7UUFDekIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUM7UUFDcEUsT0FBTyxFQUFFLFdBQVc7S0FDdkIsQ0FBQztJQUNGLFFBQVEsRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3BCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDO1FBQzNELE9BQU8sRUFBRSxHQUFHO0tBQ2YsQ0FBQztJQUNGLFdBQVcsRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDO1FBQzlELE9BQU8sRUFBRSxDQUFDO0tBQ2IsQ0FBQztJQUNGLGFBQWEsRUFBRSxZQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3pCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDO1FBQ2hFLE9BQU8sRUFBRSxDQUFDO0tBQ2IsQ0FBQztJQUNGLE1BQU0sRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2pCLFdBQVcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDO1FBQ3pELE9BQU8sRUFBRSxNQUFNO1FBQ2YsUUFBUSxFQUFFLElBQUk7S0FDakIsQ0FBQztJQUNGLEdBQUcsRUFBRSxZQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUM7S0FDekQsQ0FBQztJQUNGLGFBQWEsRUFBRSxJQUFBLDhCQUFrQixFQUFDO1FBQzlCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNuQixXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQztLQUN2RSxDQUFDO0NBQ0wsQUFqRGtCLENBaURqQjtrQkF2RHdCLFNBQVMifQ==