@aws/pdk
Version:
All documentation is located at: https://aws.github.io/aws-pdk
65 lines • 14.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.sonarqubeScanner = exports.createSonarqubeProject = exports.generateSonarqubeReports = void 0;
const cube = (path, action = "GET", args) => `curl -X ${action} -u $SONARQUBE_TOKEN: "$SONARQUBE_ENDPOINT${path}" ${args || ""}`;
const setupSonarqubeQualityGates = (defaultProfileOrGateName, specificProfileOrGateName) => [
`export DEFAULT_GATE=\`${cube(`/api/qualitygates/search?gateName=${defaultProfileOrGateName}`)}\``,
`export SPECIFIC_GATE=\`${cube(`/api/qualitygates/search?gateName=${specificProfileOrGateName}`)}\``,
`if [[ "$(echo $SPECIFIC_GATE | jq .errors)" == "null" && "$(echo $SPECIFIC_GATE | jq '.results | length')" -gt 0 ]]; then export GATE_NAME=${specificProfileOrGateName}; else export GATE_NAME=${defaultProfileOrGateName}; fi`,
`${cube("/api/qualitygates/select?projectKey=$PROJECT_NAME&gateName=$GATE_NAME", "POST")}`,
];
const setupSonarqubeQualityProfiles = (defaultProfileOrGateName, specificProfileOrGateName) => [
`export DEFAULT_PROFILE=\`${cube(`/api/qualityprofiles/search?qualityProfile=${defaultProfileOrGateName}`)} | jq .profiles\``,
`export SPECIFIC_PROFILE=\`${cube(`/api/qualityprofiles/search?qualityProfile=${specificProfileOrGateName}`)} | jq .profiles\``,
`export MERGED_PROFILES=\`jq --argjson arr1 "$DEFAULT_PROFILE" --argjson arr2 "$SPECIFIC_PROFILE" -n '$arr1 + $arr2 | group_by(.language) | map(.[-1])'\``,
`echo $MERGED_PROFILES | jq -c '.[]' | while read i; do ${cube("/api/qualityprofiles/add_project?project=$PROJECT_NAME&language=`echo $i | jq -r .language`&qualityProfile=`echo $i | jq -r .name`", "POST")}; done`,
];
const setupSonarqubePermissions = (authorizedGroup) => !authorizedGroup
? []
: [
"admin",
"codeviewer",
"issueadmin",
"securityhotspotadmin",
"scan",
"user",
].map((p) => `${cube(`/api/permissions/add_group?projectKey=$PROJECT_NAME&groupName=${authorizedGroup}&permission=${p}`, "POST")}`);
const setupSonarqubeProject = ({ sonarqubeTags, sonarqubeAuthorizedGroup, sonarqubeDefaultProfileOrGateName, sonarqubeSpecificProfileOrGateName, }) => {
return [
...setupSonarqubePermissions(sonarqubeAuthorizedGroup),
`${cube("/api/project_branches/rename?project=$PROJECT_NAME&name=mainline", "POST")}`,
`${cube(`/api/project_tags/set?project=$PROJECT_NAME&tags=${[
sonarqubeAuthorizedGroup,
...(sonarqubeTags || []),
].join(",")}`, "POST")}`,
...setupSonarqubeQualityProfiles(sonarqubeDefaultProfileOrGateName, sonarqubeSpecificProfileOrGateName),
...setupSonarqubeQualityGates(sonarqubeDefaultProfileOrGateName, sonarqubeSpecificProfileOrGateName),
].join(";");
};
const generateSonarqubeReports = () => [
cube("/api/bitegarden/report/pdf_issues_breakdown?resource=$PROJECT_NAME&branch=mainline", "GET", "--output reports/prototype-issues-report.pdf"),
cube("/api/bitegarden/report/pdf?resource=$PROJECT_NAME&branch=mainline", "GET", "--output reports/prototype-executive-report.pdf"),
cube("/api/security_reports/download?project=$PROJECT_NAME", "GET", "--output reports/prototype-security-report.pdf"),
];
exports.generateSonarqubeReports = generateSonarqubeReports;
const createSonarqubeProject = (props) => [
`CREATE_PROJECT_OUTPUT=\`${cube("/api/projects/create?name=$PROJECT_NAME&project=$PROJECT_NAME&visibility=private", "POST")}\``,
`if [[ "$(echo $CREATE_PROJECT_OUTPUT | jq .errors)" == "null" ]]; then ${setupSonarqubeProject(props)}; fi;`,
];
exports.createSonarqubeProject = createSonarqubeProject;
const sonarqubeScanner = (excludeGlobsForScan) => [
"npx sonarqube-scanner -Dsonar.login=$SONARQUBE_TOKEN",
"-Dsonar.projectKey=$PROJECT_NAME",
"-Dsonar.projectName=$PROJECT_NAME",
"-Dsonar.projectVersion=`echo $RESOLVED_SOURCE_VERSION | cut -c1-7`",
"-Dsonar.branch.name=mainline",
"-Dsonar.host.url=$SONARQUBE_ENDPOINT",
"-Dsonar.cfn.nag.reportFiles=reports/cfn-nag-report.json",
"-Dsonar.dependencyCheck.htmlReportPath=reports/dependency-check-report.html",
"-Dsonar.javascript.lcov.reportPaths=**/coverage/lcov.info",
"-Dsonar.clover.reportPath=**/coverage/clover.xml",
`-Dsonar.exclusions="**/reports/**,**/coverage/**${excludeGlobsForScan ? `,${excludeGlobsForScan.join(",")}` : ""}"`,
"-Dsonar.sources=.",
].join(" ");
exports.sonarqubeScanner = sonarqubeScanner;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYXJxdWJlLWNvbW1hbmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic29uYXJxdWJlLWNvbW1hbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQWlCLEtBQUssRUFBRSxJQUFhLEVBQUUsRUFBRSxDQUNuRSxXQUFXLE1BQU0sNkNBQTZDLElBQUksS0FDaEUsSUFBSSxJQUFJLEVBQ1YsRUFBRSxDQUFDO0FBRUwsTUFBTSwwQkFBMEIsR0FBRyxDQUNqQyx3QkFBZ0MsRUFDaEMseUJBQWtDLEVBQ2xDLEVBQUUsQ0FBQztJQUNILHlCQUF5QixJQUFJLENBQzNCLHFDQUFxQyx3QkFBd0IsRUFBRSxDQUNoRSxJQUFJO0lBQ0wsMEJBQTBCLElBQUksQ0FDNUIscUNBQXFDLHlCQUF5QixFQUFFLENBQ2pFLElBQUk7SUFDTCw4SUFBOEkseUJBQXlCLDJCQUEyQix3QkFBd0IsTUFBTTtJQUNoTyxHQUFHLElBQUksQ0FDTCx1RUFBdUUsRUFDdkUsTUFBTSxDQUNQLEVBQUU7Q0FDSixDQUFDO0FBRUYsTUFBTSw2QkFBNkIsR0FBRyxDQUNwQyx3QkFBZ0MsRUFDaEMseUJBQWtDLEVBQ2xDLEVBQUUsQ0FBQztJQUNILDRCQUE0QixJQUFJLENBQzlCLDhDQUE4Qyx3QkFBd0IsRUFBRSxDQUN6RSxtQkFBbUI7SUFDcEIsNkJBQTZCLElBQUksQ0FDL0IsOENBQThDLHlCQUF5QixFQUFFLENBQzFFLG1CQUFtQjtJQUNwQiwwSkFBMEo7SUFDMUosMERBQTBELElBQUksQ0FDNUQsb0lBQW9JLEVBQ3BJLE1BQU0sQ0FDUCxRQUFRO0NBQ1YsQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxlQUF3QixFQUFFLEVBQUUsQ0FDN0QsQ0FBQyxlQUFlO0lBQ2QsQ0FBQyxDQUFDLEVBQUU7SUFDSixDQUFDLENBQUM7UUFDRSxPQUFPO1FBQ1AsWUFBWTtRQUNaLFlBQVk7UUFDWixzQkFBc0I7UUFDdEIsTUFBTTtRQUNOLE1BQU07S0FDUCxDQUFDLEdBQUcsQ0FDSCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osR0FBRyxJQUFJLENBQ0wsaUVBQWlFLGVBQWUsZUFBZSxDQUFDLEVBQUUsRUFDbEcsTUFBTSxDQUNQLEVBQUUsQ0FDTixDQUFDO0FBRVIsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQzdCLGFBQWEsRUFDYix3QkFBd0IsRUFDeEIsaUNBQWlDLEVBQ2pDLGtDQUFrQyxHQUNaLEVBQUUsRUFBRTtJQUMxQixPQUFPO1FBQ0wsR0FBRyx5QkFBeUIsQ0FBQyx3QkFBd0IsQ0FBQztRQUN0RCxHQUFHLElBQUksQ0FDTCxrRUFBa0UsRUFDbEUsTUFBTSxDQUNQLEVBQUU7UUFDSCxHQUFHLElBQUksQ0FDTCxvREFBb0Q7WUFDbEQsd0JBQXdCO1lBQ3hCLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1NBQ3pCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQ2IsTUFBTSxDQUNQLEVBQUU7UUFDSCxHQUFHLDZCQUE2QixDQUM5QixpQ0FBaUMsRUFDakMsa0NBQWtDLENBQ25DO1FBQ0QsR0FBRywwQkFBMEIsQ0FDM0IsaUNBQWlDLEVBQ2pDLGtDQUFrQyxDQUNuQztLQUNGLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUssTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUM1QyxJQUFJLENBQ0Ysb0ZBQW9GLEVBQ3BGLEtBQUssRUFDTCw4Q0FBOEMsQ0FDL0M7SUFDRCxJQUFJLENBQ0YsbUVBQW1FLEVBQ25FLEtBQUssRUFDTCxpREFBaUQsQ0FDbEQ7SUFDRCxJQUFJLENBQ0Ysc0RBQXNELEVBQ3RELEtBQUssRUFDTCxnREFBZ0QsQ0FDakQ7Q0FDRixDQUFDO0FBaEJXLFFBQUEsd0JBQXdCLDRCQWdCbkM7QUFFSyxNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBNEIsRUFBRSxFQUFFLENBQUM7SUFDdEUsMkJBQTJCLElBQUksQ0FDN0Isa0ZBQWtGLEVBQ2xGLE1BQU0sQ0FDUCxJQUFJO0lBQ0wsMEVBQTBFLHFCQUFxQixDQUM3RixLQUFLLENBQ04sT0FBTztDQUNULENBQUM7QUFSVyxRQUFBLHNCQUFzQiwwQkFRakM7QUFFSyxNQUFNLGdCQUFnQixHQUFHLENBQUMsbUJBQThCLEVBQUUsRUFBRSxDQUNqRTtJQUNFLHNEQUFzRDtJQUN0RCxrQ0FBa0M7SUFDbEMsbUNBQW1DO0lBQ25DLG9FQUFvRTtJQUNwRSw4QkFBOEI7SUFDOUIsc0NBQXNDO0lBQ3RDLHlEQUF5RDtJQUN6RCw2RUFBNkU7SUFDN0UsMkRBQTJEO0lBQzNELGtEQUFrRDtJQUNsRCxtREFDRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDOUQsR0FBRztJQUNILG1CQUFtQjtDQUNwQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQWhCRCxRQUFBLGdCQUFnQixvQkFnQmYiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQ29weXJpZ2h0IFtBbWF6b24uY29tXShodHRwOi8vYW1hem9uLmNvbS8pLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cbmltcG9ydCB7IFNvbmFyQ29kZVNjYW5uZXJQcm9wcyB9IGZyb20gXCIuL3NvbmFyLWNvZGUtc2Nhbm5lclwiO1xuXG5jb25zdCBjdWJlID0gKHBhdGg6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcgPSBcIkdFVFwiLCBhcmdzPzogc3RyaW5nKSA9PlxuICBgY3VybCAtWCAke2FjdGlvbn0gLXUgJFNPTkFSUVVCRV9UT0tFTjogXCIkU09OQVJRVUJFX0VORFBPSU5UJHtwYXRofVwiICR7XG4gICAgYXJncyB8fCBcIlwiXG4gIH1gO1xuXG5jb25zdCBzZXR1cFNvbmFycXViZVF1YWxpdHlHYXRlcyA9IChcbiAgZGVmYXVsdFByb2ZpbGVPckdhdGVOYW1lOiBzdHJpbmcsXG4gIHNwZWNpZmljUHJvZmlsZU9yR2F0ZU5hbWU/OiBzdHJpbmdcbikgPT4gW1xuICBgZXhwb3J0IERFRkFVTFRfR0FURT1cXGAke2N1YmUoXG4gICAgYC9hcGkvcXVhbGl0eWdhdGVzL3NlYXJjaD9nYXRlTmFtZT0ke2RlZmF1bHRQcm9maWxlT3JHYXRlTmFtZX1gXG4gICl9XFxgYCxcbiAgYGV4cG9ydCBTUEVDSUZJQ19HQVRFPVxcYCR7Y3ViZShcbiAgICBgL2FwaS9xdWFsaXR5Z2F0ZXMvc2VhcmNoP2dhdGVOYW1lPSR7c3BlY2lmaWNQcm9maWxlT3JHYXRlTmFtZX1gXG4gICl9XFxgYCxcbiAgYGlmIFtbIFwiJChlY2hvICRTUEVDSUZJQ19HQVRFIHwganEgLmVycm9ycylcIiA9PSBcIm51bGxcIiAmJiBcIiQoZWNobyAkU1BFQ0lGSUNfR0FURSB8IGpxICcucmVzdWx0cyB8IGxlbmd0aCcpXCIgLWd0IDAgXV07IHRoZW4gZXhwb3J0IEdBVEVfTkFNRT0ke3NwZWNpZmljUHJvZmlsZU9yR2F0ZU5hbWV9OyBlbHNlIGV4cG9ydCBHQVRFX05BTUU9JHtkZWZhdWx0UHJvZmlsZU9yR2F0ZU5hbWV9OyBmaWAsXG4gIGAke2N1YmUoXG4gICAgXCIvYXBpL3F1YWxpdHlnYXRlcy9zZWxlY3Q/cHJvamVjdEtleT0kUFJPSkVDVF9OQU1FJmdhdGVOYW1lPSRHQVRFX05BTUVcIixcbiAgICBcIlBPU1RcIlxuICApfWAsXG5dO1xuXG5jb25zdCBzZXR1cFNvbmFycXViZVF1YWxpdHlQcm9maWxlcyA9IChcbiAgZGVmYXVsdFByb2ZpbGVPckdhdGVOYW1lOiBzdHJpbmcsXG4gIHNwZWNpZmljUHJvZmlsZU9yR2F0ZU5hbWU/OiBzdHJpbmdcbikgPT4gW1xuICBgZXhwb3J0IERFRkFVTFRfUFJPRklMRT1cXGAke2N1YmUoXG4gICAgYC9hcGkvcXVhbGl0eXByb2ZpbGVzL3NlYXJjaD9xdWFsaXR5UHJvZmlsZT0ke2RlZmF1bHRQcm9maWxlT3JHYXRlTmFtZX1gXG4gICl9IHwganEgLnByb2ZpbGVzXFxgYCxcbiAgYGV4cG9ydCBTUEVDSUZJQ19QUk9GSUxFPVxcYCR7Y3ViZShcbiAgICBgL2FwaS9xdWFsaXR5cHJvZmlsZXMvc2VhcmNoP3F1YWxpdHlQcm9maWxlPSR7c3BlY2lmaWNQcm9maWxlT3JHYXRlTmFtZX1gXG4gICl9IHwganEgLnByb2ZpbGVzXFxgYCxcbiAgYGV4cG9ydCBNRVJHRURfUFJPRklMRVM9XFxganEgLS1hcmdqc29uIGFycjEgXCIkREVGQVVMVF9QUk9GSUxFXCIgLS1hcmdqc29uIGFycjIgXCIkU1BFQ0lGSUNfUFJPRklMRVwiIC1uICckYXJyMSArICRhcnIyIHwgZ3JvdXBfYnkoLmxhbmd1YWdlKSB8IG1hcCguWy0xXSknXFxgYCxcbiAgYGVjaG8gJE1FUkdFRF9QUk9GSUxFUyB8IGpxIC1jICcuW10nIHwgd2hpbGUgcmVhZCBpOyBkbyAke2N1YmUoXG4gICAgXCIvYXBpL3F1YWxpdHlwcm9maWxlcy9hZGRfcHJvamVjdD9wcm9qZWN0PSRQUk9KRUNUX05BTUUmbGFuZ3VhZ2U9YGVjaG8gJGkgfCBqcSAtciAubGFuZ3VhZ2VgJnF1YWxpdHlQcm9maWxlPWBlY2hvICRpIHwganEgLXIgLm5hbWVgXCIsXG4gICAgXCJQT1NUXCJcbiAgKX07IGRvbmVgLFxuXTtcblxuY29uc3Qgc2V0dXBTb25hcnF1YmVQZXJtaXNzaW9ucyA9IChhdXRob3JpemVkR3JvdXA/OiBzdHJpbmcpID0+XG4gICFhdXRob3JpemVkR3JvdXBcbiAgICA/IFtdXG4gICAgOiBbXG4gICAgICAgIFwiYWRtaW5cIixcbiAgICAgICAgXCJjb2Rldmlld2VyXCIsXG4gICAgICAgIFwiaXNzdWVhZG1pblwiLFxuICAgICAgICBcInNlY3VyaXR5aG90c3BvdGFkbWluXCIsXG4gICAgICAgIFwic2NhblwiLFxuICAgICAgICBcInVzZXJcIixcbiAgICAgIF0ubWFwKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICBgJHtjdWJlKFxuICAgICAgICAgICAgYC9hcGkvcGVybWlzc2lvbnMvYWRkX2dyb3VwP3Byb2plY3RLZXk9JFBST0pFQ1RfTkFNRSZncm91cE5hbWU9JHthdXRob3JpemVkR3JvdXB9JnBlcm1pc3Npb249JHtwfWAsXG4gICAgICAgICAgICBcIlBPU1RcIlxuICAgICAgICAgICl9YFxuICAgICAgKTtcblxuY29uc3Qgc2V0dXBTb25hcnF1YmVQcm9qZWN0ID0gKHtcbiAgc29uYXJxdWJlVGFncyxcbiAgc29uYXJxdWJlQXV0aG9yaXplZEdyb3VwLFxuICBzb25hcnF1YmVEZWZhdWx0UHJvZmlsZU9yR2F0ZU5hbWUsXG4gIHNvbmFycXViZVNwZWNpZmljUHJvZmlsZU9yR2F0ZU5hbWUsXG59OiBTb25hckNvZGVTY2FubmVyUHJvcHMpID0+IHtcbiAgcmV0dXJuIFtcbiAgICAuLi5zZXR1cFNvbmFycXViZVBlcm1pc3Npb25zKHNvbmFycXViZUF1dGhvcml6ZWRHcm91cCksXG4gICAgYCR7Y3ViZShcbiAgICAgIFwiL2FwaS9wcm9qZWN0X2JyYW5jaGVzL3JlbmFtZT9wcm9qZWN0PSRQUk9KRUNUX05BTUUmbmFtZT1tYWlubGluZVwiLFxuICAgICAgXCJQT1NUXCJcbiAgICApfWAsXG4gICAgYCR7Y3ViZShcbiAgICAgIGAvYXBpL3Byb2plY3RfdGFncy9zZXQ/cHJvamVjdD0kUFJPSkVDVF9OQU1FJnRhZ3M9JHtbXG4gICAgICAgIHNvbmFycXViZUF1dGhvcml6ZWRHcm91cCxcbiAgICAgICAgLi4uKHNvbmFycXViZVRhZ3MgfHwgW10pLFxuICAgICAgXS5qb2luKFwiLFwiKX1gLFxuICAgICAgXCJQT1NUXCJcbiAgICApfWAsXG4gICAgLi4uc2V0dXBTb25hcnF1YmVRdWFsaXR5UHJvZmlsZXMoXG4gICAgICBzb25hcnF1YmVEZWZhdWx0UHJvZmlsZU9yR2F0ZU5hbWUsXG4gICAgICBzb25hcnF1YmVTcGVjaWZpY1Byb2ZpbGVPckdhdGVOYW1lXG4gICAgKSxcbiAgICAuLi5zZXR1cFNvbmFycXViZVF1YWxpdHlHYXRlcyhcbiAgICAgIHNvbmFycXViZURlZmF1bHRQcm9maWxlT3JHYXRlTmFtZSxcbiAgICAgIHNvbmFycXViZVNwZWNpZmljUHJvZmlsZU9yR2F0ZU5hbWVcbiAgICApLFxuICBdLmpvaW4oXCI7XCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlU29uYXJxdWJlUmVwb3J0cyA9ICgpID0+IFtcbiAgY3ViZShcbiAgICBcIi9hcGkvYml0ZWdhcmRlbi9yZXBvcnQvcGRmX2lzc3Vlc19icmVha2Rvd24/cmVzb3VyY2U9JFBST0pFQ1RfTkFNRSZicmFuY2g9bWFpbmxpbmVcIixcbiAgICBcIkdFVFwiLFxuICAgIFwiLS1vdXRwdXQgcmVwb3J0cy9wcm90b3R5cGUtaXNzdWVzLXJlcG9ydC5wZGZcIlxuICApLFxuICBjdWJlKFxuICAgIFwiL2FwaS9iaXRlZ2FyZGVuL3JlcG9ydC9wZGY/cmVzb3VyY2U9JFBST0pFQ1RfTkFNRSZicmFuY2g9bWFpbmxpbmVcIixcbiAgICBcIkdFVFwiLFxuICAgIFwiLS1vdXRwdXQgcmVwb3J0cy9wcm90b3R5cGUtZXhlY3V0aXZlLXJlcG9ydC5wZGZcIlxuICApLFxuICBjdWJlKFxuICAgIFwiL2FwaS9zZWN1cml0eV9yZXBvcnRzL2Rvd25sb2FkP3Byb2plY3Q9JFBST0pFQ1RfTkFNRVwiLFxuICAgIFwiR0VUXCIsXG4gICAgXCItLW91dHB1dCByZXBvcnRzL3Byb3RvdHlwZS1zZWN1cml0eS1yZXBvcnQucGRmXCJcbiAgKSxcbl07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTb25hcnF1YmVQcm9qZWN0ID0gKHByb3BzOiBTb25hckNvZGVTY2FubmVyUHJvcHMpID0+IFtcbiAgYENSRUFURV9QUk9KRUNUX09VVFBVVD1cXGAke2N1YmUoXG4gICAgXCIvYXBpL3Byb2plY3RzL2NyZWF0ZT9uYW1lPSRQUk9KRUNUX05BTUUmcHJvamVjdD0kUFJPSkVDVF9OQU1FJnZpc2liaWxpdHk9cHJpdmF0ZVwiLFxuICAgIFwiUE9TVFwiXG4gICl9XFxgYCxcbiAgYGlmIFtbIFwiJChlY2hvICRDUkVBVEVfUFJPSkVDVF9PVVRQVVQgfCBqcSAuZXJyb3JzKVwiID09IFwibnVsbFwiIF1dOyB0aGVuICR7c2V0dXBTb25hcnF1YmVQcm9qZWN0KFxuICAgIHByb3BzXG4gICl9OyBmaTtgLFxuXTtcblxuZXhwb3J0IGNvbnN0IHNvbmFycXViZVNjYW5uZXIgPSAoZXhjbHVkZUdsb2JzRm9yU2Nhbj86IHN0cmluZ1tdKSA9PlxuICBbXG4gICAgXCJucHggc29uYXJxdWJlLXNjYW5uZXIgLURzb25hci5sb2dpbj0kU09OQVJRVUJFX1RPS0VOXCIsXG4gICAgXCItRHNvbmFyLnByb2plY3RLZXk9JFBST0pFQ1RfTkFNRVwiLFxuICAgIFwiLURzb25hci5wcm9qZWN0TmFtZT0kUFJPSkVDVF9OQU1FXCIsXG4gICAgXCItRHNvbmFyLnByb2plY3RWZXJzaW9uPWBlY2hvICRSRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTiB8IGN1dCAtYzEtN2BcIixcbiAgICBcIi1Ec29uYXIuYnJhbmNoLm5hbWU9bWFpbmxpbmVcIixcbiAgICBcIi1Ec29uYXIuaG9zdC51cmw9JFNPTkFSUVVCRV9FTkRQT0lOVFwiLFxuICAgIFwiLURzb25hci5jZm4ubmFnLnJlcG9ydEZpbGVzPXJlcG9ydHMvY2ZuLW5hZy1yZXBvcnQuanNvblwiLFxuICAgIFwiLURzb25hci5kZXBlbmRlbmN5Q2hlY2suaHRtbFJlcG9ydFBhdGg9cmVwb3J0cy9kZXBlbmRlbmN5LWNoZWNrLXJlcG9ydC5odG1sXCIsXG4gICAgXCItRHNvbmFyLmphdmFzY3JpcHQubGNvdi5yZXBvcnRQYXRocz0qKi9jb3ZlcmFnZS9sY292LmluZm9cIixcbiAgICBcIi1Ec29uYXIuY2xvdmVyLnJlcG9ydFBhdGg9KiovY292ZXJhZ2UvY2xvdmVyLnhtbFwiLFxuICAgIGAtRHNvbmFyLmV4Y2x1c2lvbnM9XCIqKi9yZXBvcnRzLyoqLCoqL2NvdmVyYWdlLyoqJHtcbiAgICAgIGV4Y2x1ZGVHbG9ic0ZvclNjYW4gPyBgLCR7ZXhjbHVkZUdsb2JzRm9yU2Nhbi5qb2luKFwiLFwiKX1gIDogXCJcIlxuICAgIH1cImAsXG4gICAgXCItRHNvbmFyLnNvdXJjZXM9LlwiLFxuICBdLmpvaW4oXCIgXCIpO1xuIl19