@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
231 lines • 19.5 kB
JavaScript
;
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 core_1 = require("@salesforce/core");
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
const QueryHelper_1 = __importDefault(require("../queryHelper/QueryHelper"));
const AliasList_1 = require("../utils/AliasList");
const ObjectCRUDHelper_1 = __importDefault(require("../utils/ObjectCRUDHelper"));
const InstalledPackagesQueryExecutor_1 = __importDefault(require("./packageQuery/InstalledPackagesQueryExecutor"));
const dedent_1 = __importDefault(require("dedent"));
class SFPOrg extends core_1.Org {
/**
* Get list of all artifacts in an org
*/
async getInstalledArtifacts(orderBy = `CreatedDate`, logger) {
let records = [];
try {
records = await QueryHelper_1.default.query(`SELECT Id, Name, CommitId__c, Version__c, Tag__c FROM SfpowerscriptsArtifact2__c ORDER BY ${orderBy} ASC`, this.getConnection(), false);
return records;
}
catch (error) {
sfp_logger_1.default.log('Unable to fetch any sfp artifacts in the org\n' +
'1. sfpowerscripts artifact package is not installed in the org\n' +
'2. The required prerequisite object is not deployed to this org\n', sfp_logger_1.LoggerLevel.WARN, logger);
}
return records;
}
/**
* Check whether an artifact is installed in a Org
* @param {Logger} logger
* @param {SfpPackage} sfpPackage
*/
async isArtifactInstalledInOrg(logger, sfpPackage) {
let result = {
isInstalled: false,
};
try {
sfp_logger_1.default.log(`Querying for version of ${sfpPackage.packageName} in the Org.`, sfp_logger_1.LoggerLevel.TRACE, logger);
result.isInstalled = false;
let installedArtifacts = await this.getInstalledArtifacts();
let packageName = sfpPackage.packageName;
for (const artifact of installedArtifacts) {
if (artifact.Name === packageName) {
result.versionNumber = artifact.Version__c;
if (artifact.Version__c === sfpPackage.package_version_number) {
result.isInstalled = true;
return result;
}
}
}
}
catch (error) {
sfp_logger_1.default.log('Unable to fetch any sfp artifacts in the org\n' +
'1. sfp package is not installed in the org\n' +
'2. The required prerequisite object is not deployed to this org\n', sfp_logger_1.LoggerLevel.WARN, logger);
}
return result;
}
/**
* Updates or Create information about an artifact in the org
* @param {Logger} logger
* @param {SfpPackage} sfpPackage
*/
async updateArtifactInOrg(logger, sfpPackage) {
try {
let artifactId = await this.getArtifactRecordId(sfpPackage);
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Existing artifact record id for ${sfpPackage.packageName} in Org for ${sfpPackage.package_version_number}: ${artifactId ? artifactId : 'N/A'}`), sfp_logger_1.LoggerLevel.INFO, logger);
let packageName = sfpPackage.package_name;
if (artifactId == null) {
artifactId = await ObjectCRUDHelper_1.default.createRecord(this.getConnection(), 'SfpowerscriptsArtifact2__c', {
Name: packageName,
Tag__c: sfpPackage.tag,
Version__c: sfpPackage.package_version_number,
CommitId__c: sfpPackage.sourceVersion,
});
}
else {
artifactId = await ObjectCRUDHelper_1.default.updateRecord(this.getConnection(), 'SfpowerscriptsArtifact2__c', {
Id: artifactId,
Name: packageName,
Tag__c: sfpPackage.tag,
Version__c: sfpPackage.package_version_number,
CommitId__c: sfpPackage.sourceVersion,
});
}
sfp_logger_1.default.log((0, sfp_logger_1.COLOR_KEY_MESSAGE)(`Updated Org with new Artifact ${packageName} ${sfpPackage.sourceVersion} ${sfpPackage.package_version_number} ${artifactId ? artifactId : ''}`), sfp_logger_1.LoggerLevel.INFO, logger);
return artifactId;
}
catch (error) {
sfp_logger_1.default.log((0, dedent_1.default)(`Unable to fetch any sfp artifacts in the org,skipping updates in the org
- 1. sfp artifact package is not installed in the org
- 2. The required prerequisite object is not deployed to this org`), sfp_logger_1.LoggerLevel.WARN, logger);
}
}
async getArtifactRecordId(sfpPackage) {
let installedArtifacts = await this.getInstalledArtifacts();
let packageName = sfpPackage.packageName;
for (const artifact of installedArtifacts) {
if (artifact.Name === packageName) {
return artifact.Id;
}
}
return null;
}
/**
* Retrieves all packages(recognized by Salesforce) installed in the org
*/
async getAllInstalled2GPPackages() {
const installedPackages = [];
let records = await InstalledPackagesQueryExecutor_1.default.exec(this.getConnection());
records.forEach((record) => {
let packageVersionNumber = `${record.SubscriberPackageVersion.MajorVersion}.${record.SubscriberPackageVersion.MinorVersion}.${record.SubscriberPackageVersion.PatchVersion}.${record.SubscriberPackageVersion.BuildNumber}`;
let packageDetails = {
name: record.SubscriberPackage.Name,
package2Id: record.SubscriberPackageId,
namespacePrefix: record.SubscriberPackage.NamespacePrefix,
subscriberPackageVersionId: record.SubscriberPackageVersion.Id,
versionNumber: packageVersionNumber,
type: record.SubscriberPackageVersion.Package2ContainerOptions,
isOrgDependent: record.SubscriberPackageVersion.IsOrgDependent,
};
installedPackages.push(packageDetails);
});
return installedPackages;
}
/**
* Retrives all managed packages in the org
*/
async getAllInstalledManagedPackages() {
const installedPackages = await this.getAllInstalled2GPPackages();
return installedPackages.filter((installedPackage) => installedPackage.type === 'Managed');
}
/**
* List all the packages created in DevHub, will throw an error, if its not a DevHub
*/
async listAllPackages() {
if (await this.determineIfDevHubOrg(true)) {
let records = await QueryHelper_1.default.query(packageQuery, this.getConnection(), true);
records.forEach((record) => {
record.IsOrgDependent =
record.ContainerOptions === 'Managed' ? 'N/A' : record.IsOrgDependent === true ? 'Yes' : 'No';
});
return records;
}
else
throw new Error('Package Type Information can only be fetched from a DevHub');
}
async getAlias() {
return await (0, AliasList_1.convertUsernameToAlias)(this.getUsername());
}
/**
* Return all artifacts including sfp as well as external unlocked/managed
*/
async getAllInstalledArtifacts() {
let artifacts = await this.getInstalledArtifacts(`Name`);
let installedArtifacts = [];
let installed2GPPackages = await this.getAllInstalled2GPPackages();
artifacts.forEach((artifact) => {
let installedArtifact = {
name: artifact.Name,
version: artifact.Version__c,
commitId: artifact.CommitId__c,
isInstalledBysfp: true,
};
let packageFound = installed2GPPackages.find((elem) => elem.name == artifact.Name);
if (packageFound) {
installedArtifact.subscriberVersion = packageFound.subscriberPackageVersionId;
if (packageFound.isOrgDependent)
installedArtifact.type = `OrgDependendent`;
else
installedArtifact.type = `Unlocked`;
}
else {
installedArtifact.subscriberVersion = `N/A`;
installedArtifact.type = `Source/Data`;
}
installedArtifacts.push(installedArtifact);
});
installed2GPPackages.forEach((installed2GPPackage) => {
let packageFound = installedArtifacts.find((elem) => elem.name == installed2GPPackage.name);
if (!packageFound) {
let installedArtifact = {
name: installed2GPPackage.name,
version: installed2GPPackage.versionNumber,
commitId: `N/A`,
};
if (installed2GPPackage.isOrgDependent)
installedArtifact.type = `OrgDependendent`;
else if (installed2GPPackage.type == `Managed`)
installedArtifact.type = `Managed`;
else
installedArtifact.type = `Unlocked`;
installedArtifact.subscriberVersion = installed2GPPackage.subscriberPackageVersionId;
installedArtifact.isInstalledBysfp = false;
installedArtifacts.push(installedArtifact);
}
});
return installedArtifacts;
}
}
exports.default = SFPOrg;
const packageQuery = 'SELECT Id,Name, Description, NamespacePrefix, ContainerOptions, IsOrgDependent ' +
'FROM Package2 ' +
'WHERE IsDeprecated != true ' +
'ORDER BY NamespacePrefix, Name';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU0ZQT3JnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvb3JnL1NGUE9yZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXVDO0FBQ3ZDLG1FQUF5RjtBQUd6Riw2RUFBcUQ7QUFDckQsa0RBQTREO0FBQzVELGlGQUF5RDtBQUN6RCxtSEFBMkY7QUFDM0Ysb0RBQTRCO0FBRTVCLE1BQXFCLE1BQU8sU0FBUSxVQUFHO0lBQ25DOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQWtCLGFBQWEsRUFBRSxNQUFlO1FBQy9FLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUM7WUFDRCxPQUFPLEdBQUcsTUFBTSxxQkFBVyxDQUFDLEtBQUssQ0FDN0IsNkZBQTZGLE9BQU8sTUFBTSxFQUMxRyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLEtBQUssQ0FDUixDQUFDO1lBQ0YsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixvQkFBUyxDQUFDLEdBQUcsQ0FDVCxnREFBZ0Q7Z0JBQzVDLGtFQUFrRTtnQkFDbEUsbUVBQW1FLEVBQ3ZFLHdCQUFXLENBQUMsSUFBSSxFQUNoQixNQUFNLENBQ1QsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyx3QkFBd0IsQ0FDakMsTUFBYyxFQUNkLFVBQXNCO1FBRXRCLElBQUksTUFBTSxHQUFxRDtZQUMzRCxXQUFXLEVBQUUsS0FBSztTQUNyQixDQUFDO1FBQ0YsSUFBSSxDQUFDO1lBQ0Qsb0JBQVMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLFVBQVUsQ0FBQyxXQUFXLGNBQWMsRUFBRSx3QkFBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDNUQsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUN6QyxLQUFLLE1BQU0sUUFBUSxJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3hDLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUMzQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLHNCQUFzQixFQUFFLENBQUM7d0JBQzVELE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3dCQUMxQixPQUFPLE1BQU0sQ0FBQztvQkFDbEIsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2Isb0JBQVMsQ0FBQyxHQUFHLENBQ1QsZ0RBQWdEO2dCQUM1Qyw4Q0FBOEM7Z0JBQzlDLG1FQUFtRSxFQUN2RSx3QkFBVyxDQUFDLElBQUksRUFDaEIsTUFBTSxDQUNULENBQUM7UUFDTixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBYyxFQUFFLFVBQXNCO1FBQ25FLElBQUksQ0FBQztZQUNELElBQUksVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTVELG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEsOEJBQWlCLEVBQ2IsbUNBQW1DLFVBQVUsQ0FBQyxXQUFXLGVBQ3JELFVBQVUsQ0FBQyxzQkFDZixLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FDekMsRUFDRCx3QkFBVyxDQUFDLElBQUksRUFDaEIsTUFBTSxDQUNULENBQUM7WUFFRixJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBRTFDLElBQUksVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNyQixVQUFVLEdBQUcsTUFBTSwwQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLDRCQUE0QixFQUFFO29CQUNqRyxJQUFJLEVBQUUsV0FBVztvQkFDakIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHO29CQUN0QixVQUFVLEVBQUUsVUFBVSxDQUFDLHNCQUFzQjtvQkFDN0MsV0FBVyxFQUFFLFVBQVUsQ0FBQyxhQUFhO2lCQUN4QyxDQUFDLENBQUM7WUFDUCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osVUFBVSxHQUFHLE1BQU0sMEJBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSw0QkFBNEIsRUFBRTtvQkFDakcsRUFBRSxFQUFFLFVBQVU7b0JBQ2QsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRztvQkFDdEIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxzQkFBc0I7b0JBQzdDLFdBQVcsRUFBRSxVQUFVLENBQUMsYUFBYTtpQkFDeEMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVELG9CQUFTLENBQUMsR0FBRyxDQUNULElBQUEsOEJBQWlCLEVBQ2IsaUNBQWlDLFdBQVcsSUFBSSxVQUFVLENBQUMsYUFBYSxJQUNwRSxVQUFVLENBQUMsc0JBQ2YsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3JDLEVBQ0Qsd0JBQVcsQ0FBQyxJQUFJLEVBQ2hCLE1BQU0sQ0FDVCxDQUFDO1lBQ0YsT0FBTyxVQUFVLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixvQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFBLGdCQUFNLEVBQ2hCOzttRkFFbUUsQ0FBQyxFQUNwRSx3QkFBVyxDQUFDLElBQUksRUFDaEIsTUFBTSxDQUNULENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxVQUFzQjtRQUNwRCxJQUFJLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFNUQsSUFBSSxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxLQUFLLE1BQU0sUUFBUSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDeEMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0Q7O09BRUc7SUFDSSxLQUFLLENBQUMsMEJBQTBCO1FBQ25DLE1BQU0saUJBQWlCLEdBQXFCLEVBQUUsQ0FBQztRQUUvQyxJQUFJLE9BQU8sR0FBRyxNQUFNLHdDQUE4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUU5RSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxvQkFBb0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUU1TixJQUFJLGNBQWMsR0FBbUI7Z0JBQ2pDLElBQUksRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSTtnQkFDbkMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7Z0JBQ3RDLGVBQWUsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsZUFBZTtnQkFDekQsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7Z0JBQzlELGFBQWEsRUFBRSxvQkFBb0I7Z0JBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsd0JBQXdCO2dCQUM5RCxjQUFjLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLGNBQWM7YUFDakUsQ0FBQztZQUVGLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8saUJBQWlCLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLDhCQUE4QjtRQUN2QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEUsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFDRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxlQUFlO1FBQ3hCLElBQUksTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLE9BQU8sR0FBRyxNQUFNLHFCQUFXLENBQUMsS0FBSyxDQUFrQixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxDQUFDLGNBQWM7b0JBQ2pCLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3RHLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQzs7WUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRO1FBQ2pCLE9BQU8sTUFBTSxJQUFBLGtDQUFzQixFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyx3QkFBd0I7UUFDakMsSUFBSSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsSUFBSSxrQkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBQ2pELElBQUksb0JBQW9CLEdBQUcsTUFBTSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUVuRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxpQkFBaUIsR0FBc0I7Z0JBQ3ZDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVO2dCQUM1QixRQUFRLEVBQUUsUUFBUSxDQUFDLFdBQVc7Z0JBQzlCLGdCQUFnQixFQUFFLElBQUk7YUFDekIsQ0FBQztZQUNGLElBQUksWUFBWSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkYsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZixpQkFBaUIsQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUM7Z0JBQzlFLElBQUksWUFBWSxDQUFDLGNBQWM7b0JBQUUsaUJBQWlCLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDOztvQkFDdkUsaUJBQWlCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztZQUM3QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osaUJBQWlCLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUM1QyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1lBQzNDLENBQUM7WUFDRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7WUFDakQsSUFBSSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxpQkFBaUIsR0FBc0I7b0JBQ3ZDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO29CQUM5QixPQUFPLEVBQUUsbUJBQW1CLENBQUMsYUFBYTtvQkFDMUMsUUFBUSxFQUFFLEtBQUs7aUJBQ2xCLENBQUM7Z0JBQ0YsSUFBSSxtQkFBbUIsQ0FBQyxjQUFjO29CQUFFLGlCQUFpQixDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztxQkFDOUUsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLElBQUksU0FBUztvQkFBRSxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDOztvQkFDOUUsaUJBQWlCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztnQkFFekMsaUJBQWlCLENBQUMsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsMEJBQTBCLENBQUM7Z0JBQ3JGLGlCQUFpQixDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDM0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxrQkFBa0IsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF0T0QseUJBc09DO0FBRUQsTUFBTSxZQUFZLEdBQ2QsaUZBQWlGO0lBQ2pGLGdCQUFnQjtJQUNoQiw2QkFBNkI7SUFDN0IsZ0NBQWdDLENBQUMifQ==