cdk-cost-analyzer 0.1.41 → 0.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cdk-cost-analyzer-cache/metadata.json +8 -8
- package/dist/action/api/index.d.ts +1 -0
- package/dist/action/api/single-template-types.d.ts +4 -0
- package/dist/action/api/types.d.ts +3 -0
- package/dist/action/config/types.d.ts +2 -0
- package/dist/action/optimization/OptimizationEngine.d.ts +11 -0
- package/dist/action/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
- package/dist/action/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
- package/dist/action/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
- package/dist/action/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
- package/dist/action/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
- package/dist/action/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
- package/dist/action/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
- package/dist/action/optimization/defaults.d.ts +2 -0
- package/dist/action/optimization/index.d.ts +10 -0
- package/dist/action/optimization/types.d.ts +35 -0
- package/dist/action/reporter/RecommendationReporter.d.ts +3 -0
- package/dist/analysis/SingleTemplateAnalyzer.js +12 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +2 -1
- package/dist/api/single-template-types.d.ts +4 -0
- package/dist/api/single-template-types.js +1 -1
- package/dist/api/types.d.ts +3 -0
- package/dist/api/types.js +1 -1
- package/dist/cli/index.js +13 -2
- package/dist/config/types.d.ts +2 -0
- package/dist/config/types.js +1 -1
- package/dist/optimization/OptimizationEngine.d.ts +11 -0
- package/dist/optimization/OptimizationEngine.js +51 -0
- package/dist/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
- package/dist/optimization/analyzers/GravitonMigrationAnalyzer.js +209 -0
- package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
- package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.js +142 -0
- package/dist/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
- package/dist/optimization/analyzers/ReservedInstanceAnalyzer.js +102 -0
- package/dist/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
- package/dist/optimization/analyzers/RightSizingAnalyzer.js +109 -0
- package/dist/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
- package/dist/optimization/analyzers/SavingsPlansAnalyzer.js +102 -0
- package/dist/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
- package/dist/optimization/analyzers/SpotInstanceAnalyzer.js +113 -0
- package/dist/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
- package/dist/optimization/analyzers/StorageOptimizationAnalyzer.js +142 -0
- package/dist/optimization/defaults.d.ts +2 -0
- package/dist/optimization/defaults.js +22 -0
- package/dist/optimization/index.d.ts +10 -0
- package/dist/optimization/index.js +22 -0
- package/dist/optimization/types.d.ts +35 -0
- package/dist/optimization/types.js +3 -0
- package/dist/releasetag.txt +1 -1
- package/dist/reporter/RecommendationReporter.d.ts +3 -0
- package/dist/reporter/RecommendationReporter.js +133 -0
- package/dist/reporter/SingleTemplateReporter.js +11 -1
- package/docs/CALCULATORS.md +374 -8
- package/docs/README.md +3 -2
- package/docs/RECOMMENDATIONS.md +466 -0
- package/docs/SINGLE-TEMPLATE-ANALYSIS.md +59 -16
- package/docs/index.md +38 -8
- package/examples/recommendations-demo.json +74 -0
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SingleTemplateReporter = void 0;
|
|
4
4
|
const markdownUtils_1 = require("./markdownUtils");
|
|
5
|
+
const RecommendationReporter_1 = require("./RecommendationReporter");
|
|
5
6
|
/**
|
|
6
7
|
* Reporter for generating formatted output for single template cost analysis
|
|
7
8
|
*/
|
|
@@ -101,6 +102,10 @@ class SingleTemplateReporter {
|
|
|
101
102
|
report += '-'.repeat(80) + '\n';
|
|
102
103
|
report += 'Legend: ✓ High confidence ~ Medium confidence ? Low confidence ✗ Unknown/Unsupported\n';
|
|
103
104
|
report += '='.repeat(80) + '\n';
|
|
105
|
+
// Recommendations
|
|
106
|
+
if (result.recommendations) {
|
|
107
|
+
report += (0, RecommendationReporter_1.formatRecommendationsText)(result.recommendations);
|
|
108
|
+
}
|
|
104
109
|
return report;
|
|
105
110
|
}
|
|
106
111
|
/**
|
|
@@ -186,6 +191,11 @@ class SingleTemplateReporter {
|
|
|
186
191
|
}
|
|
187
192
|
report += '\n</details>\n\n';
|
|
188
193
|
}
|
|
194
|
+
// Recommendations
|
|
195
|
+
if (result.recommendations) {
|
|
196
|
+
report += (0, RecommendationReporter_1.formatRecommendationsMarkdown)(result.recommendations);
|
|
197
|
+
report += '\n';
|
|
198
|
+
}
|
|
189
199
|
// Footer
|
|
190
200
|
report += '---\n\n';
|
|
191
201
|
report += '*Powered by [cdk-cost-analyzer](https://github.com/buildinginthecloud/cdk-cost-analyzer) | Confidence levels: ✅ high, ⚠️ medium, ❓ low, ❌ unknown*\n';
|
|
@@ -211,4 +221,4 @@ class SingleTemplateReporter {
|
|
|
211
221
|
}
|
|
212
222
|
}
|
|
213
223
|
exports.SingleTemplateReporter = SingleTemplateReporter;
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVSZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLG1EQUF3RTtBQUV4RTs7R0FFRztBQUNILE1BQWEsc0JBQXNCO0lBQ2pDOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQ1osTUFBZ0MsRUFDaEMsTUFBb0MsRUFDcEMsT0FBcUM7UUFFckMsTUFBTSxJQUFJLEdBQUc7WUFDWCxhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUUsSUFBSTtZQUNyQixXQUFXLEVBQUUsSUFBSTtZQUNqQixNQUFNLEVBQUUsTUFBa0M7WUFDMUMsR0FBRyxPQUFPO1NBQ1gsQ0FBQztRQUVGLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNuRCxLQUFLLE1BQU0sQ0FBQztZQUNaO2dCQUNFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsTUFBZ0M7UUFDekQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQ3hCLE1BQWdDLEVBQ2hDLE9BQThDO1FBRTlDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixTQUFTO1FBQ1QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcs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Q2YsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBOVBELHdEQThQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxufSBmcm9tICcuLi9hcGkvc2luZ2xlLXRlbXBsYXRlLXR5cGVzJztcbmltcG9ydCB7IGdldFRyZW5kSW5kaWNhdG9yLCBleHRyYWN0U2VydmljZU5hbWUgfSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuXG4vKipcbiAqIFJlcG9ydGVyIGZvciBnZW5lcmF0aW5nIGZvcm1hdHRlZCBvdXRwdXQgZm9yIHNpbmdsZSB0ZW1wbGF0ZSBjb3N0IGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgZm9ybWF0dGVkIHJlcG9ydCBmcm9tIHNpbmdsZSB0ZW1wbGF0ZSBhbmFseXNpcyByZXN1bHRcbiAgICogXG4gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgYW5hbHlzaXMgcmVzdWx0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0ICh0ZXh0LCBqc29uLCBvciBtYXJrZG93bilcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBmb3JtYXR0aW5nIHByZWZlcmVuY2VzXG4gICAqIEByZXR1cm5zIEZvcm1hdHRlZCByZXBvcnQgc3RyaW5nXG4gICAqL1xuICBnZW5lcmF0ZVJlcG9ydChcbiAgICByZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgICBmb3JtYXQ6ICd0ZXh0JyB8ICdqc29uJyB8ICdtYXJrZG93bicsXG4gICAgb3B0aW9ucz86IFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgc2hvd0JyZWFrZG93bjogdHJ1ZSxcbiAgICAgIHNob3dBc3N1bXB0aW9uczogdHJ1ZSxcbiAgICAgIGdyb3VwQnlUeXBlOiB0cnVlLFxuICAgICAgc29ydEJ5OiAnY29zdCcgYXMgJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUpzb25SZXBvcnQocmVzdWx0KTtcbiAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNYXJrZG93blJlcG9ydChyZXN1bHQsIG9wdHMpO1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVRleHRSZXBvcnQocmVzdWx0LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgSlNPTiBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlSnNvblJlcG9ydChyZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGV4dCBmb3JtYXQgcmVwb3J0XG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlVGV4dFJlcG9ydChcbiAgICByZXN1bHQ6IFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxTaW5nbGVUZW1wbGF0ZVJlcG9ydE9wdGlvbnM+LFxuICApOiBzdHJpbmcge1xuICAgIGxldCByZXBvcnQgPSAnJztcblxuICAgIC8vIEhlYWRlclxuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgIHJlcG9ydCArPSAnU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG4nO1xuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSBgVG90YWwgTW9udGhseSBDb3N0OiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5gO1xuICAgIHJlcG9ydCArPSBgQW5hbHlzaXMgRGF0ZTogJHtyZXN1bHQubWV0YWRhdGEuYW5hbHl6ZWRBdC50b0lTT1N0cmluZygpfVxcbmA7XG4gICAgcmVwb3J0ICs9IGBSZWdpb246ICR7cmVzdWx0Lm1ldGFkYXRhLnJlZ2lvbn1cXG5gO1xuICAgIHJlcG9ydCArPSBgVGVtcGxhdGUgSGFzaDogJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcblxcbmA7XG5cbiAgICAvLyBSZXNvdXJjZSBjb3VudHNcbiAgICByZXBvcnQgKz0gYFRvdGFsIFJlc291cmNlczogJHtyZXN1bHQubWV0YWRhdGEucmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgU3VwcG9ydGVkIFJlc291cmNlczogJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5gO1xuICAgIHJlcG9ydCArPSBgVW5zdXBwb3J0ZWQgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS51bnN1cHBvcnRlZFJlc291cmNlQ291bnR9XFxuXFxuYDtcblxuICAgIC8vIENvc3QgYnJlYWtkb3duIGJ5IGNvbmZpZGVuY2VcbiAgICBpZiAocmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwubGVuZ3RoID4gMCkge1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgICByZXBvcnQgKz0gJ0Nvc3QgQ29uZmlkZW5jZSBCcmVha2Rvd25cXG4nO1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAgIGZvciAoY29uc3QgY29uZiBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieUNvbmZpZGVuY2VMZXZlbCkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKChjb25mLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgcmVwb3J0ICs9IGAke2NvbmYuY29uZmlkZW5jZS50b1VwcGVyQ2FzZSgpLnBhZEVuZCgxMCl9ICR7Y29uZi5jb3VudH0gcmVzb3VyY2VzICAkJHtjb25mLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZSBicmVha2Rvd25cbiAgICBpZiAob3B0aW9ucy5zaG93QnJlYWtkb3duICYmIG9wdGlvbnMuZ3JvdXBCeVR5cGUpIHtcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgICAgcmVwb3J0ICs9ICdDb3N0IEJyZWFrZG93biBieSBSZXNvdXJjZSBUeXBlXFxuJztcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCR7dHlwZUdyb3VwLnJlc291cmNlVHlwZX1cXG5gO1xuICAgICAgICByZXBvcnQgKz0gYCAgQ291bnQ6ICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgICBUb3RhbCBDb3N0OiAkJHt0eXBlR3JvdXAudG90YWxDb3N0LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlcXG5gO1xuXG4gICAgICAgIC8vIFNob3cgaW5kaXZpZHVhbCByZXNvdXJjZXNcbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBjb25mSW5kaWNhdG9yID0gY29uZiA9PT0gJ2hpZ2gnID8gJ+KckycgOiBjb25mID09PSAnbWVkaXVtJyA/ICd+JyA6IGNvbmYgPT09ICdsb3cnID8gJz8nIDogJ+Kclyc7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAgJHtjb25mSW5kaWNhdG9yfSAke3Jlc291cmNlLmxvZ2ljYWxJZC5wYWRFbmQoNDApfSAkJHtyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQudG9GaXhlZCgyKX1cXG5gO1xuICAgICAgICB9XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3N1bXB0aW9uc1xuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICAgIHJlcG9ydCArPSAnQ29zdCBDYWxjdWxhdGlvbiBBc3N1bXB0aW9uc1xcbic7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCBhc3N1bXB0aW9uIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zKSB7XG4gICAgICAgIHJlcG9ydCArPSBgICDigKIgJHthc3N1bXB0aW9ufVxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gTGVnZW5kXG4gICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgcmVwb3J0ICs9ICdMZWdlbmQ6IOKckyBIaWdoIGNvbmZpZGVuY2UgIH4gTWVkaXVtIGNvbmZpZGVuY2UgID8gTG93IGNvbmZpZGVuY2UgIOKclyBVbmtub3duL1Vuc3VwcG9ydGVkXFxuJztcbiAgICByZXBvcnQgKz0gJz0nLnJlcGVhdCg4MCkgKyAnXFxuJztcblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWFya2Rvd24gZm9ybWF0IHJlcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1hcmtkb3duUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICcjIPCfkrAgU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSAnIyMgU3VtbWFyeVxcblxcbic7XG4gICAgcmVwb3J0ICs9IGAqKlRvdGFsIE1vbnRobHkgQ29zdDoqKiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5cXG5gO1xuICAgIHJlcG9ydCArPSAnfCBNZXRyaWMgfCBWYWx1ZSB8XFxuJztcbiAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IEFuYWx5c2lzIERhdGUgfCAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBSZWdpb24gfCAke3Jlc3VsdC5tZXRhZGF0YS5yZWdpb259IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBUZW1wbGF0ZSBIYXNoIHwgXFxgJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcYCB8XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSAnIyMg8J+TiiBSZXNvdXJjZSBPdmVydmlld1xcblxcbic7XG4gICAgcmVwb3J0ICs9ICd8IENhdGVnb3J5IHwgQ291bnQgfFxcbic7XG4gICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IFRvdGFsIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnJlc291cmNlQ291bnR9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBTdXBwb3J0ZWQgUmVzb3VyY2VzIHwgJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcbmA7XG4gICAgcmVwb3J0ICs9IGB8IFVuc3VwcG9ydGVkIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcblxcbmA7XG5cbiAgICAvLyBDb3N0IGJyZWFrZG93biBieSBjb25maWRlbmNlXG4gICAgaWYgKHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnIyMg8J+OryBDb3N0IENvbmZpZGVuY2UgQnJlYWtkb3duXFxuXFxuJztcbiAgICAgIHJlcG9ydCArPSAnfCBDb25maWRlbmNlIHwgUmVzb3VyY2VzIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfFxcbic7XG4gICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLXxcXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoY29uZi50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIGNvbnN0IGVtb2ppID0gY29uZi5jb25maWRlbmNlID09PSAnaGlnaCcgPyAn4pyFJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ2xvdycgPyAn4p2TJyA6ICfinYwnO1xuICAgICAgICByZXBvcnQgKz0gYHwgJHtlbW9qaX0gJHtjb25mLmNvbmZpZGVuY2V9IHwgJHtjb25mLmNvdW50fSB8ICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9IHwgJHtwZXJjZW50YWdlfSUgfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgc2VydmljZVxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICcjIyDwn5OIIENvc3QgQnJlYWtkb3duIGJ5IFNlcnZpY2VcXG5cXG4nO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgdG90YWxDb3N0OiBudW1iZXI7IHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IH0+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBleHRyYWN0U2VydmljZU5hbWUodHlwZUdyb3VwLnJlc291cmNlVHlwZSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlczogW10gfTtcbiAgICAgICAgZXhpc3RpbmcudG90YWxDb3N0ICs9IHR5cGVHcm91cC50b3RhbENvc3Q7XG4gICAgICAgIGV4aXN0aW5nLnJlc291cmNlcy5wdXNoKC4uLnR5cGVHcm91cC5yZXNvdXJjZXMpO1xuICAgICAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbShzZXJ2aWNlTWFwLmVudHJpZXMoKSlcbiAgICAgICAgLm1hcCgoW3NlcnZpY2UsIGRhdGFdKSA9PiAoeyBzZXJ2aWNlLCAuLi5kYXRhIH0pKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7XG5cbiAgICAgIHJlcG9ydCArPSAnfCBTZXJ2aWNlIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfCBUcmVuZCB8XFxuJztcbiAgICAgIHJlcG9ydCArPSAnfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS18XFxuJztcblxuICAgICAgZm9yIChjb25zdCBzdmMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoc3ZjLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgY29uc3QgdHJlbmQgPSBnZXRUcmVuZEluZGljYXRvcihzdmMudG90YWxDb3N0KTtcbiAgICAgICAgcmVwb3J0ICs9IGB8ICR7c3ZjLnNlcnZpY2V9IHwgJCR7c3ZjLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSB8ICR7cGVyY2VudGFnZX0lIHwgJHt0cmVuZH0gfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG5cbiAgICAgIC8vIERldGFpbGVkIGJyZWFrZG93biBieSByZXNvdXJjZSB0eXBlXG4gICAgICByZXBvcnQgKz0gJyMjIyBEZXRhaWxlZCBSZXNvdXJjZSBCcmVha2Rvd25cXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCMjIyMgXFxgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcYFxcblxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKkNvdW50OioqICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKlRvdGFsIENvc3Q6KiogJCR7dHlwZUdyb3VwLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuXFxuYDtcblxuICAgICAgICByZXBvcnQgKz0gJ3wgUmVzb3VyY2UgfCBDb3N0IHwgQ29uZmlkZW5jZSB8XFxuJztcbiAgICAgICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfFxcbic7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBlbW9qaSA9IGNvbmYgPT09ICdoaWdoJyA/ICfinIUnIDogY29uZiA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYgPT09ICdsb3cnID8gJ+KdkycgOiAn4p2MJztcbiAgICAgICAgICByZXBvcnQgKz0gYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJCR7cmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LnRvRml4ZWQoMil9IHwgJHtlbW9qaX0gJHtjb25mfSB8XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNzdW1wdGlvbnMgKGNvbGxhcHNpYmxlKVxuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJzxkZXRhaWxzPlxcbic7XG4gICAgICByZXBvcnQgKz0gJzxzdW1tYXJ5PjxzdHJvbmc+8J+TiyBDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zPC9zdHJvbmc+PC9zdW1tYXJ5Plxcblxcbic7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAtICR7YXNzdW1wdGlvbn1cXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG48L2RldGFpbHM+XFxuXFxuJztcbiAgICB9XG5cbiAgICAvLyBGb290ZXJcbiAgICByZXBvcnQgKz0gJy0tLVxcblxcbic7XG4gICAgcmVwb3J0ICs9ICcqUG93ZXJlZCBieSBbY2RrLWNvc3QtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWlsZGluZ2ludGhlY2xvdWQvY2RrLWNvc3QtYW5hbHl6ZXIpIHwgQ29uZmlkZW5jZSBsZXZlbHM6IOKchSBoaWdoLCDimqDvuI8gbWVkaXVtLCDinZMgbG93LCDinYwgdW5rbm93bipcXG4nO1xuXG4gICAgcmV0dXJuIHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IHJlc291cmNlcyBiYXNlZCBvbiBzcGVjaWZpZWQgY3JpdGVyaWFcbiAgICovXG4gIHByaXZhdGUgc29ydFJlc291cmNlcyhcbiAgICByZXNvdXJjZXM6IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbW9udGhseUNvc3Q6IGFueSB9PixcbiAgICBzb3J0Qnk6ICdjb3N0JyB8ICduYW1lJyB8ICd0eXBlJyxcbiAgKTogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucmVzb3VyY2VzXTtcblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlICdjb3N0JzpcbiAgICAgICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS5sb2dpY2FsSWQubG9jYWxlQ29tcGFyZShiLmxvZ2ljYWxJZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYS50eXBlLmxvY2FsZUNvbXBhcmUoYi50eXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luZ2xlVGVtcGxhdGVSZXBvcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9TaW5nbGVUZW1wbGF0ZVJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLG1EQUF3RTtBQUN4RSxxRUFHa0M7QUFFbEM7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjtJQUNqQzs7Ozs7OztPQU9HO0lBQ0gsY0FBYyxDQUNaLE1BQWdDLEVBQ2hDLE1BQW9DLEVBQ3BDLE9BQXFDO1FBRXJDLE1BQU0sSUFBSSxHQUFHO1lBQ1gsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLElBQUk7WUFDckIsV0FBVyxFQUFFLElBQUk7WUFDakIsTUFBTSxFQUFFLE1BQWtDO1lBQzFDLEdBQUcsT0FBTztTQUNYLENBQUM7UUFFRixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkQsS0FBSyxNQUFNLENBQUM7WUFDWjtnQkFDRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLE1BQWdDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUN4QixNQUFnQyxFQUNoQyxPQUE4QztRQUU5QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFaEIsU0FBUztRQUNULE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEVB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TSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDakIsQ0FBQztRQUVELFNBQVM7UUFDVCxNQUFNLElBQUksU0FBUyxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxzSkFBc0osQ0FBQztRQUVqSyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQ25CLFNBQXVFLEVBQ3ZFLE1BQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUU5QixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRSxNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtZQUNSLEtBQUssTUFBTTtnQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE1BQU07UUFDVixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBelFELHdEQXlRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCxcbiAgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxufSBmcm9tICcuLi9hcGkvc2luZ2xlLXRlbXBsYXRlLXR5cGVzJztcbmltcG9ydCB7IGdldFRyZW5kSW5kaWNhdG9yLCBleHRyYWN0U2VydmljZU5hbWUgfSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVjb21tZW5kYXRpb25zVGV4dCxcbiAgZm9ybWF0UmVjb21tZW5kYXRpb25zTWFya2Rvd24sXG59IGZyb20gJy4vUmVjb21tZW5kYXRpb25SZXBvcnRlcic7XG5cbi8qKlxuICogUmVwb3J0ZXIgZm9yIGdlbmVyYXRpbmcgZm9ybWF0dGVkIG91dHB1dCBmb3Igc2luZ2xlIHRlbXBsYXRlIGNvc3QgYW5hbHlzaXNcbiAqL1xuZXhwb3J0IGNsYXNzIFNpbmdsZVRlbXBsYXRlUmVwb3J0ZXIge1xuICAvKipcbiAgICogR2VuZXJhdGUgYSBmb3JtYXR0ZWQgcmVwb3J0IGZyb20gc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzIHJlc3VsdFxuICAgKiBcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSBhbmFseXNpcyByZXN1bHRcbiAgICogQHBhcmFtIGZvcm1hdCAtIE91dHB1dCBmb3JtYXQgKHRleHQsIGpzb24sIG9yIG1hcmtkb3duKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXNcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIHJlcG9ydCBzdHJpbmdcbiAgICovXG4gIGdlbmVyYXRlUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIGZvcm1hdDogJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICBvcHRpb25zPzogU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBzaG93QnJlYWtkb3duOiB0cnVlLFxuICAgICAgc2hvd0Fzc3VtcHRpb25zOiB0cnVlLFxuICAgICAgZ3JvdXBCeVR5cGU6IHRydWUsXG4gICAgICBzb3J0Qnk6ICdjb3N0JyBhcyAnY29zdCcgfCAnbmFtZScgfCAndHlwZScsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSnNvblJlcG9ydChyZXN1bHQpO1xuICAgICAgY2FzZSAnbWFya2Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1hcmtkb3duUmVwb3J0KHJlc3VsdCwgb3B0cyk7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dFJlcG9ydChyZXN1bHQsIG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBKU09OIGZvcm1hdCByZXBvcnRcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVKc29uUmVwb3J0KHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZXh0IGZvcm1hdCByZXBvcnRcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVUZXh0UmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICc9Jy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgcmVwb3J0ICs9ICdTaW5nbGUgVGVtcGxhdGUgQ29zdCBBbmFseXNpc1xcbic7XG4gICAgcmVwb3J0ICs9ICc9Jy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAvLyBTdW1tYXJ5XG4gICAgcmVwb3J0ICs9IGBUb3RhbCBNb250aGx5IENvc3Q6ICQke3Jlc3VsdC50b3RhbE1vbnRobHlDb3N0LnRvRml4ZWQoMil9ICR7cmVzdWx0LmN1cnJlbmN5fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBBbmFseXNpcyBEYXRlOiAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9XFxuYDtcbiAgICByZXBvcnQgKz0gYFJlZ2lvbjogJHtyZXN1bHQubWV0YWRhdGEucmVnaW9ufVxcbmA7XG4gICAgcmVwb3J0ICs9IGBUZW1wbGF0ZSBIYXNoOiAke3Jlc3VsdC5tZXRhZGF0YS50ZW1wbGF0ZUhhc2h9XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSBgVG90YWwgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS5yZXNvdXJjZUNvdW50fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBTdXBwb3J0ZWQgUmVzb3VyY2VzOiAke3Jlc3VsdC5tZXRhZGF0YS5zdXBwb3J0ZWRSZXNvdXJjZUNvdW50fVxcbmA7XG4gICAgcmVwb3J0ICs9IGBVbnN1cHBvcnRlZCBSZXNvdXJjZXM6ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH1cXG5cXG5gO1xuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgY29uZmlkZW5jZVxuICAgIGlmIChyZXN1bHQuY29zdEJyZWFrZG93bi5ieUNvbmZpZGVuY2VMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICAgIHJlcG9ydCArPSAnQ29zdCBDb25maWRlbmNlIEJyZWFrZG93blxcbic7XG4gICAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuXFxuJztcblxuICAgICAgZm9yIChjb25zdCBjb25mIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKGNvbmYudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCR7Y29uZi5jb25maWRlbmNlLnRvVXBwZXJDYXNlKCkucGFkRW5kKDEwKX0gJHtjb25mLmNvdW50fSByZXNvdXJjZXMgICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9ICgke3BlcmNlbnRhZ2V9JSlcXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlIGJyZWFrZG93blxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcbic7XG4gICAgICByZXBvcnQgKz0gJ0Nvc3QgQnJlYWtkb3duIGJ5IFJlc291cmNlIFR5cGVcXG4nO1xuICAgICAgcmVwb3J0ICs9ICctJy5yZXBlYXQoODApICsgJ1xcblxcbic7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoKHR5cGVHcm91cC50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIHJlcG9ydCArPSBgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgICBDb3VudDogJHt0eXBlR3JvdXAuY291bnR9XFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGAgIFRvdGFsIENvc3Q6ICQke3R5cGVHcm91cC50b3RhbENvc3QudG9GaXhlZCgyKX0gKCR7cGVyY2VudGFnZX0lKVxcbmA7XG5cbiAgICAgICAgLy8gU2hvdyBpbmRpdmlkdWFsIHJlc291cmNlc1xuICAgICAgICBjb25zdCBzb3J0ZWRSZXNvdXJjZXMgPSB0aGlzLnNvcnRSZXNvdXJjZXModHlwZUdyb3VwLnJlc291cmNlcywgb3B0aW9ucy5zb3J0QnkpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZFJlc291cmNlcykge1xuICAgICAgICAgIGNvbnN0IGNvbmYgPSByZXNvdXJjZS5tb250aGx5Q29zdC5jb25maWRlbmNlO1xuICAgICAgICAgIGNvbnN0IGNvbmZJbmRpY2F0b3IgPSBjb25mID09PSAnaGlnaCcgPyAn4pyTJyA6IGNvbmYgPT09ICdtZWRpdW0nID8gJ34nIDogY29uZiA9PT0gJ2xvdycgPyAnPycgOiAn4pyXJztcbiAgICAgICAgICByZXBvcnQgKz0gYCAgICAke2NvbmZJbmRpY2F0b3J9ICR7cmVzb3VyY2UubG9naWNhbElkLnBhZEVuZCg0MCl9ICQke3Jlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudC50b0ZpeGVkKDIpfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzc3VtcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuc2hvd0Fzc3VtcHRpb25zICYmIHJlc3VsdC5jb3N0QnJlYWtkb3duLmFzc3VtcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG4nO1xuICAgICAgcmVwb3J0ICs9ICdDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zXFxuJztcbiAgICAgIHJlcG9ydCArPSAnLScucmVwZWF0KDgwKSArICdcXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAgIOKAoiAke2Fzc3VtcHRpb259XFxuYDtcbiAgICAgIH1cbiAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICB9XG5cbiAgICAvLyBMZWdlbmRcbiAgICByZXBvcnQgKz0gJy0nLnJlcGVhdCg4MCkgKyAnXFxuJztcbiAgICByZXBvcnQgKz0gJ0xlZ2VuZDog4pyTIEhpZ2ggY29uZmlkZW5jZSAgfiBNZWRpdW0gY29uZmlkZW5jZSAgPyBMb3cgY29uZmlkZW5jZSAg4pyXIFVua25vd24vVW5zdXBwb3J0ZWRcXG4nO1xuICAgIHJlcG9ydCArPSAnPScucmVwZWF0KDgwKSArICdcXG4nO1xuXG4gICAgLy8gUmVjb21tZW5kYXRpb25zXG4gICAgaWYgKHJlc3VsdC5yZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgIHJlcG9ydCArPSBmb3JtYXRSZWNvbW1lbmRhdGlvbnNUZXh0KHJlc3VsdC5yZWNvbW1lbmRhdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWFya2Rvd24gZm9ybWF0IHJlcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1hcmtkb3duUmVwb3J0KFxuICAgIHJlc3VsdDogU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0LFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPFNpbmdsZVRlbXBsYXRlUmVwb3J0T3B0aW9ucz4sXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcG9ydCA9ICcnO1xuXG4gICAgLy8gSGVhZGVyXG4gICAgcmVwb3J0ICs9ICcjIPCfkrAgU2luZ2xlIFRlbXBsYXRlIENvc3QgQW5hbHlzaXNcXG5cXG4nO1xuXG4gICAgLy8gU3VtbWFyeVxuICAgIHJlcG9ydCArPSAnIyMgU3VtbWFyeVxcblxcbic7XG4gICAgcmVwb3J0ICs9IGAqKlRvdGFsIE1vbnRobHkgQ29zdDoqKiAkJHtyZXN1bHQudG90YWxNb250aGx5Q29zdC50b0ZpeGVkKDIpfSAke3Jlc3VsdC5jdXJyZW5jeX1cXG5cXG5gO1xuICAgIHJlcG9ydCArPSAnfCBNZXRyaWMgfCBWYWx1ZSB8XFxuJztcbiAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IEFuYWx5c2lzIERhdGUgfCAke3Jlc3VsdC5tZXRhZGF0YS5hbmFseXplZEF0LnRvSVNPU3RyaW5nKCl9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBSZWdpb24gfCAke3Jlc3VsdC5tZXRhZGF0YS5yZWdpb259IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBUZW1wbGF0ZSBIYXNoIHwgXFxgJHtyZXN1bHQubWV0YWRhdGEudGVtcGxhdGVIYXNofVxcYCB8XFxuXFxuYDtcblxuICAgIC8vIFJlc291cmNlIGNvdW50c1xuICAgIHJlcG9ydCArPSAnIyMg8J+TiiBSZXNvdXJjZSBPdmVydmlld1xcblxcbic7XG4gICAgcmVwb3J0ICs9ICd8IENhdGVnb3J5IHwgQ291bnQgfFxcbic7XG4gICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS0tfFxcbic7XG4gICAgcmVwb3J0ICs9IGB8IFRvdGFsIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnJlc291cmNlQ291bnR9IHxcXG5gO1xuICAgIHJlcG9ydCArPSBgfCBTdXBwb3J0ZWQgUmVzb3VyY2VzIHwgJHtyZXN1bHQubWV0YWRhdGEuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcbmA7XG4gICAgcmVwb3J0ICs9IGB8IFVuc3VwcG9ydGVkIFJlc291cmNlcyB8ICR7cmVzdWx0Lm1ldGFkYXRhLnVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudH0gfFxcblxcbmA7XG5cbiAgICAvLyBDb3N0IGJyZWFrZG93biBieSBjb25maWRlbmNlXG4gICAgaWYgKHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5Q29uZmlkZW5jZUxldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydCArPSAnIyMg8J+OryBDb3N0IENvbmZpZGVuY2UgQnJlYWtkb3duXFxuXFxuJztcbiAgICAgIHJlcG9ydCArPSAnfCBDb25maWRlbmNlIHwgUmVzb3VyY2VzIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfFxcbic7XG4gICAgICByZXBvcnQgKz0gJ3wtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLXxcXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbmYgb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYnlDb25maWRlbmNlTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoY29uZi50b3RhbENvc3QgLyByZXN1bHQudG90YWxNb250aGx5Q29zdCkgKiAxMDApLnRvRml4ZWQoMSk7XG4gICAgICAgIGNvbnN0IGVtb2ppID0gY29uZi5jb25maWRlbmNlID09PSAnaGlnaCcgPyAn4pyFJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYuY29uZmlkZW5jZSA9PT0gJ2xvdycgPyAn4p2TJyA6ICfinYwnO1xuICAgICAgICByZXBvcnQgKz0gYHwgJHtlbW9qaX0gJHtjb25mLmNvbmZpZGVuY2V9IHwgJHtjb25mLmNvdW50fSB8ICQke2NvbmYudG90YWxDb3N0LnRvRml4ZWQoMil9IHwgJHtwZXJjZW50YWdlfSUgfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gQ29zdCBicmVha2Rvd24gYnkgc2VydmljZVxuICAgIGlmIChvcHRpb25zLnNob3dCcmVha2Rvd24gJiYgb3B0aW9ucy5ncm91cEJ5VHlwZSkge1xuICAgICAgcmVwb3J0ICs9ICcjIyDwn5OIIENvc3QgQnJlYWtkb3duIGJ5IFNlcnZpY2VcXG5cXG4nO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHsgdG90YWxDb3N0OiBudW1iZXI7IHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+IH0+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgdHlwZUdyb3VwIG9mIHJlc3VsdC5jb3N0QnJlYWtkb3duLmJ5UmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBleHRyYWN0U2VydmljZU5hbWUodHlwZUdyb3VwLnJlc291cmNlVHlwZSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2VydmljZU1hcC5nZXQoc2VydmljZSkgfHwgeyB0b3RhbENvc3Q6IDAsIHJlc291cmNlczogW10gfTtcbiAgICAgICAgZXhpc3RpbmcudG90YWxDb3N0ICs9IHR5cGVHcm91cC50b3RhbENvc3Q7XG4gICAgICAgIGV4aXN0aW5nLnJlc291cmNlcy5wdXNoKC4uLnR5cGVHcm91cC5yZXNvdXJjZXMpO1xuICAgICAgICBzZXJ2aWNlTWFwLnNldChzZXJ2aWNlLCBleGlzdGluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbShzZXJ2aWNlTWFwLmVudHJpZXMoKSlcbiAgICAgICAgLm1hcCgoW3NlcnZpY2UsIGRhdGFdKSA9PiAoeyBzZXJ2aWNlLCAuLi5kYXRhIH0pKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi50b3RhbENvc3QgLSBhLnRvdGFsQ29zdCk7XG5cbiAgICAgIHJlcG9ydCArPSAnfCBTZXJ2aWNlIHwgQ29zdCB8IFBlcmNlbnRhZ2UgfCBUcmVuZCB8XFxuJztcbiAgICAgIHJlcG9ydCArPSAnfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS18XFxuJztcblxuICAgICAgZm9yIChjb25zdCBzdmMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9ICgoc3ZjLnRvdGFsQ29zdCAvIHJlc3VsdC50b3RhbE1vbnRobHlDb3N0KSAqIDEwMCkudG9GaXhlZCgxKTtcbiAgICAgICAgY29uc3QgdHJlbmQgPSBnZXRUcmVuZEluZGljYXRvcihzdmMudG90YWxDb3N0KTtcbiAgICAgICAgcmVwb3J0ICs9IGB8ICR7c3ZjLnNlcnZpY2V9IHwgJCR7c3ZjLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSB8ICR7cGVyY2VudGFnZX0lIHwgJHt0cmVuZH0gfFxcbmA7XG4gICAgICB9XG4gICAgICByZXBvcnQgKz0gJ1xcbic7XG5cbiAgICAgIC8vIERldGFpbGVkIGJyZWFrZG93biBieSByZXNvdXJjZSB0eXBlXG4gICAgICByZXBvcnQgKz0gJyMjIyBEZXRhaWxlZCBSZXNvdXJjZSBCcmVha2Rvd25cXG5cXG4nO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGVHcm91cCBvZiByZXN1bHQuY29zdEJyZWFrZG93bi5ieVJlc291cmNlVHlwZSkge1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKCh0eXBlR3JvdXAudG90YWxDb3N0IC8gcmVzdWx0LnRvdGFsTW9udGhseUNvc3QpICogMTAwKS50b0ZpeGVkKDEpO1xuICAgICAgICByZXBvcnQgKz0gYCMjIyMgXFxgJHt0eXBlR3JvdXAucmVzb3VyY2VUeXBlfVxcYFxcblxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKkNvdW50OioqICR7dHlwZUdyb3VwLmNvdW50fVxcbmA7XG4gICAgICAgIHJlcG9ydCArPSBgLSAqKlRvdGFsIENvc3Q6KiogJCR7dHlwZUdyb3VwLnRvdGFsQ29zdC50b0ZpeGVkKDIpfSAoJHtwZXJjZW50YWdlfSUpXFxuXFxuYDtcblxuICAgICAgICByZXBvcnQgKz0gJ3wgUmVzb3VyY2UgfCBDb3N0IHwgQ29uZmlkZW5jZSB8XFxuJztcbiAgICAgICAgcmVwb3J0ICs9ICd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tfFxcbic7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkUmVzb3VyY2VzID0gdGhpcy5zb3J0UmVzb3VyY2VzKHR5cGVHcm91cC5yZXNvdXJjZXMsIG9wdGlvbnMuc29ydEJ5KTtcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZXNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBjb25mID0gcmVzb3VyY2UubW9udGhseUNvc3QuY29uZmlkZW5jZTtcbiAgICAgICAgICBjb25zdCBlbW9qaSA9IGNvbmYgPT09ICdoaWdoJyA/ICfinIUnIDogY29uZiA9PT0gJ21lZGl1bScgPyAn4pqg77iPJyA6IGNvbmYgPT09ICdsb3cnID8gJ+KdkycgOiAn4p2MJztcbiAgICAgICAgICByZXBvcnQgKz0gYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJCR7cmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LnRvRml4ZWQoMil9IHwgJHtlbW9qaX0gJHtjb25mfSB8XFxuYDtcbiAgICAgICAgfVxuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNzdW1wdGlvbnMgKGNvbGxhcHNpYmxlKVxuICAgIGlmIChvcHRpb25zLnNob3dBc3N1bXB0aW9ucyAmJiByZXN1bHQuY29zdEJyZWFrZG93bi5hc3N1bXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnQgKz0gJzxkZXRhaWxzPlxcbic7XG4gICAgICByZXBvcnQgKz0gJzxzdW1tYXJ5PjxzdHJvbmc+8J+TiyBDb3N0IENhbGN1bGF0aW9uIEFzc3VtcHRpb25zPC9zdHJvbmc+PC9zdW1tYXJ5Plxcblxcbic7XG4gICAgICBmb3IgKGNvbnN0IGFzc3VtcHRpb24gb2YgcmVzdWx0LmNvc3RCcmVha2Rvd24uYXNzdW1wdGlvbnMpIHtcbiAgICAgICAgcmVwb3J0ICs9IGAtICR7YXNzdW1wdGlvbn1cXG5gO1xuICAgICAgfVxuICAgICAgcmVwb3J0ICs9ICdcXG48L2RldGFpbHM+XFxuXFxuJztcbiAgICB9XG5cbiAgICAvLyBSZWNvbW1lbmRhdGlvbnNcbiAgICBpZiAocmVzdWx0LnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgcmVwb3J0ICs9IGZvcm1hdFJlY29tbWVuZGF0aW9uc01hcmtkb3duKHJlc3VsdC5yZWNvbW1lbmRhdGlvbnMpO1xuICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIEZvb3RlclxuICAgIHJlcG9ydCArPSAnLS0tXFxuXFxuJztcbiAgICByZXBvcnQgKz0gJypQb3dlcmVkIGJ5IFtjZGstY29zdC1hbmFseXplcl0oaHR0cHM6Ly9naXRodWIuY29tL2J1aWxkaW5naW50aGVjbG91ZC9jZGstY29zdC1hbmFseXplcikgfCBDb25maWRlbmNlIGxldmVsczog4pyFIGhpZ2gsIOKaoO+4jyBtZWRpdW0sIOKdkyBsb3csIOKdjCB1bmtub3duKlxcbic7XG5cbiAgICByZXR1cm4gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgcmVzb3VyY2VzIGJhc2VkIG9uIHNwZWNpZmllZCBjcml0ZXJpYVxuICAgKi9cbiAgcHJpdmF0ZSBzb3J0UmVzb3VyY2VzKFxuICAgIHJlc291cmNlczogQXJyYXk8eyBsb2dpY2FsSWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtb250aGx5Q29zdDogYW55IH0+LFxuICAgIHNvcnRCeTogJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnLFxuICApOiBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IG1vbnRobHlDb3N0OiBhbnkgfT4ge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5yZXNvdXJjZXNdO1xuXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgJ2Nvc3QnOlxuICAgICAgICBzb3J0ZWQuc29ydCgoYSwgYikgPT4gYi5tb250aGx5Q29zdC5hbW91bnQgLSBhLm1vbnRobHlDb3N0LmFtb3VudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiBhLmxvZ2ljYWxJZC5sb2NhbGVDb21wYXJlKGIubG9naWNhbElkKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHlwZSc6XG4gICAgICAgIHNvcnRlZC5zb3J0KChhLCBiKSA9PiBhLnR5cGUubG9jYWxlQ29tcGFyZShiLnR5cGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRlZDtcbiAgfVxufVxuIl19
|
package/docs/CALCULATORS.md
CHANGED
|
@@ -5,14 +5,17 @@ This document provides detailed information about all supported AWS resource typ
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
7
7
|
- [Overview](#overview)
|
|
8
|
-
- [Compute Resources](#compute-resources)
|
|
9
|
-
- [Storage Resources](#storage-resources)
|
|
10
|
-
- [Database Resources](#database-resources)
|
|
11
|
-
- [Networking Resources](#networking-resources)
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
14
|
-
- [
|
|
15
|
-
- [
|
|
8
|
+
- [Compute Resources](#compute-resources) - EC2, AutoScaling, LaunchTemplate, EKS
|
|
9
|
+
- [Storage Resources](#storage-resources) - S3, EFS
|
|
10
|
+
- [Database Resources](#database-resources) - RDS, DynamoDB, Aurora Serverless
|
|
11
|
+
- [Networking Resources](#networking-resources) - NAT Gateway, ALB, NLB, VPC Endpoint, Transit Gateway
|
|
12
|
+
- [DNS and Routing Resources](#dns-and-routing-resources) - Route 53
|
|
13
|
+
- [Messaging Resources](#messaging-resources) - SQS, SNS
|
|
14
|
+
- [Content Delivery Resources](#content-delivery-resources) - CloudFront, ElastiCache
|
|
15
|
+
- [Analytics Resources](#analytics-resources) - Kinesis Streams, Firehose, Analytics
|
|
16
|
+
- [Security Resources](#security-resources) - Secrets Manager
|
|
17
|
+
- [Serverless Resources](#serverless-resources) - Lambda, API Gateway, Step Functions
|
|
18
|
+
- [Container Resources](#container-resources) - ECS
|
|
16
19
|
- [Customizing Assumptions](#customizing-assumptions)
|
|
17
20
|
|
|
18
21
|
## Overview
|
|
@@ -902,6 +905,97 @@ Total: $0.65/month
|
|
|
902
905
|
- Deletion protection can prevent accidental secret deletion
|
|
903
906
|
- Secrets can be rotated automatically using Lambda functions (Lambda costs separate)
|
|
904
907
|
|
|
908
|
+
## Compute Resources (continued)
|
|
909
|
+
|
|
910
|
+
### AWS::AutoScaling::AutoScalingGroup
|
|
911
|
+
|
|
912
|
+
**Description:** Auto Scaling Group for managing fleets of EC2 instances
|
|
913
|
+
|
|
914
|
+
**Cost Components:**
|
|
915
|
+
- EC2 instance hourly rate x desired capacity x 730 hours/month
|
|
916
|
+
|
|
917
|
+
**Default Assumptions:**
|
|
918
|
+
- Desired capacity: 1 (if not specified in template)
|
|
919
|
+
- Instance type resolved from associated LaunchConfiguration or LaunchTemplate
|
|
920
|
+
- 730 hours/month (always running)
|
|
921
|
+
- Linux operating system, shared tenancy
|
|
922
|
+
- On-demand pricing
|
|
923
|
+
|
|
924
|
+
**Detection Logic:**
|
|
925
|
+
- Resolves instance type from LaunchConfigurationName, LaunchTemplate, or MixedInstancesPolicy
|
|
926
|
+
- Handles CloudFormation `{ Ref: 'LogicalId' }` references by searching template resources
|
|
927
|
+
|
|
928
|
+
**Example:**
|
|
929
|
+
```
|
|
930
|
+
Instance Type: t3.medium (from LaunchTemplate)
|
|
931
|
+
Desired Capacity: 4
|
|
932
|
+
Hourly Rate: $0.0416
|
|
933
|
+
Monthly Cost: $0.0416 × 730 × 4 = $121.47
|
|
934
|
+
```
|
|
935
|
+
|
|
936
|
+
**Notes:**
|
|
937
|
+
- Cost equals desired capacity multiplied by per-instance cost
|
|
938
|
+
- EBS volumes from LaunchTemplate not included
|
|
939
|
+
- Scaling events (min/max capacity) not factored in
|
|
940
|
+
- Spot pricing not calculated (see Recommendations for Spot suggestions)
|
|
941
|
+
|
|
942
|
+
### AWS::EC2::LaunchTemplate
|
|
943
|
+
|
|
944
|
+
**Description:** Launch Template defining EC2 instance configuration
|
|
945
|
+
|
|
946
|
+
**Cost Components:**
|
|
947
|
+
- Instance hourly rate x 730 hours/month (per instance)
|
|
948
|
+
- EBS storage from BlockDeviceMappings
|
|
949
|
+
|
|
950
|
+
**Default Assumptions:**
|
|
951
|
+
- 730 hours/month (always running)
|
|
952
|
+
- Linux operating system, shared tenancy
|
|
953
|
+
- Default volume: 8 GB gp3 (if no block device mappings specified)
|
|
954
|
+
- On-demand pricing
|
|
955
|
+
|
|
956
|
+
**Detection Logic:**
|
|
957
|
+
- Instance type from `LaunchTemplateData.InstanceType`
|
|
958
|
+
- EBS volumes from `LaunchTemplateData.BlockDeviceMappings`
|
|
959
|
+
- Volume type defaults to gp3 if not specified
|
|
960
|
+
- Volume size defaults to 8 GB if not specified
|
|
961
|
+
|
|
962
|
+
**Example:**
|
|
963
|
+
```
|
|
964
|
+
Instance Type: m5.large
|
|
965
|
+
Hourly Rate: $0.096
|
|
966
|
+
Instance Cost: $0.096 × 730 = $70.08
|
|
967
|
+
EBS Storage: 100 GB gp3 × $0.08/GB = $8.00
|
|
968
|
+
Total: $78.08/month (per instance)
|
|
969
|
+
```
|
|
970
|
+
|
|
971
|
+
**Notes:**
|
|
972
|
+
- Launch Templates have no direct cost; this calculates per-instance reference cost
|
|
973
|
+
- Provisioned IOPS (io1/io2) detailed costs excluded
|
|
974
|
+
- Additional gp3 throughput beyond 125 MB/s baseline excluded
|
|
975
|
+
- Confidence level is low (template defines potential instances, not running ones)
|
|
976
|
+
|
|
977
|
+
### AWS::EKS::Cluster
|
|
978
|
+
|
|
979
|
+
**Description:** Amazon EKS Kubernetes control plane
|
|
980
|
+
|
|
981
|
+
**Cost Components:**
|
|
982
|
+
- Control plane hourly rate x 730 hours/month
|
|
983
|
+
|
|
984
|
+
**Default Assumptions:**
|
|
985
|
+
- 730 hours/month (always running)
|
|
986
|
+
- Fallback price: $0.10/hour if API unavailable
|
|
987
|
+
|
|
988
|
+
**Example:**
|
|
989
|
+
```
|
|
990
|
+
Control Plane Rate: $0.10/hour
|
|
991
|
+
Monthly Cost: $0.10 × 730 = $73.00
|
|
992
|
+
```
|
|
993
|
+
|
|
994
|
+
**Notes:**
|
|
995
|
+
- Worker node costs are not included (calculated separately as EC2 or Fargate)
|
|
996
|
+
- EKS add-ons and managed node groups not calculated
|
|
997
|
+
- One cluster = one control plane charge
|
|
998
|
+
|
|
905
999
|
## Container Resources
|
|
906
1000
|
|
|
907
1001
|
### AWS::ECS::Service
|
|
@@ -946,6 +1040,278 @@ Total: $9.01/month per task
|
|
|
946
1040
|
- EC2 launch type uses EC2 pricing
|
|
947
1041
|
- Data transfer costs not included
|
|
948
1042
|
|
|
1043
|
+
## Analytics Resources
|
|
1044
|
+
|
|
1045
|
+
### AWS::Kinesis::Stream
|
|
1046
|
+
|
|
1047
|
+
**Description:** Amazon Kinesis Data Streams for real-time data streaming
|
|
1048
|
+
|
|
1049
|
+
**Cost Components:**
|
|
1050
|
+
|
|
1051
|
+
**Provisioned Mode:**
|
|
1052
|
+
- Shard hours: shard count x hourly rate x 730 hours/month
|
|
1053
|
+
|
|
1054
|
+
**On-Demand Mode:**
|
|
1055
|
+
- Data ingestion: GB ingested x rate
|
|
1056
|
+
- Data retrieval: GB retrieved x rate
|
|
1057
|
+
|
|
1058
|
+
**Default Assumptions (Provisioned):**
|
|
1059
|
+
- 2 shards
|
|
1060
|
+
- Fallback price: $0.015/shard-hour
|
|
1061
|
+
|
|
1062
|
+
**Default Assumptions (On-Demand):**
|
|
1063
|
+
- 1,000 GB data ingested per month
|
|
1064
|
+
- 2,000 GB data retrieved per month
|
|
1065
|
+
- Fallback ingestion price: $0.040/GB
|
|
1066
|
+
- Fallback retrieval price: $0.015/GB
|
|
1067
|
+
|
|
1068
|
+
**Detection Logic:**
|
|
1069
|
+
- Stream mode from `StreamModeDetails.StreamMode` (defaults to PROVISIONED)
|
|
1070
|
+
- Shard count from `ShardCount` property
|
|
1071
|
+
|
|
1072
|
+
**Example (Provisioned):**
|
|
1073
|
+
```
|
|
1074
|
+
Shards: 2
|
|
1075
|
+
Shard Rate: $0.015/hour
|
|
1076
|
+
Monthly Cost: 2 × $0.015 × 730 = $21.90
|
|
1077
|
+
```
|
|
1078
|
+
|
|
1079
|
+
**Example (On-Demand):**
|
|
1080
|
+
```
|
|
1081
|
+
Ingestion: 1,000 GB × $0.040 = $40.00
|
|
1082
|
+
Retrieval: 2,000 GB × $0.015 = $30.00
|
|
1083
|
+
Total: $70.00/month
|
|
1084
|
+
```
|
|
1085
|
+
|
|
1086
|
+
**Notes:**
|
|
1087
|
+
- Extended data retention costs not included
|
|
1088
|
+
- Enhanced fan-out consumer costs not included
|
|
1089
|
+
|
|
1090
|
+
### AWS::KinesisFirehose::DeliveryStream
|
|
1091
|
+
|
|
1092
|
+
**Description:** Amazon Kinesis Data Firehose for data delivery
|
|
1093
|
+
|
|
1094
|
+
**Cost Components:**
|
|
1095
|
+
- Data ingestion: GB ingested x rate
|
|
1096
|
+
|
|
1097
|
+
**Default Assumptions:**
|
|
1098
|
+
- 1,000 GB data ingested per month
|
|
1099
|
+
- Fallback price: $0.029/GB
|
|
1100
|
+
|
|
1101
|
+
**Example:**
|
|
1102
|
+
```
|
|
1103
|
+
Data Ingestion: 1,000 GB × $0.029 = $29.00/month
|
|
1104
|
+
```
|
|
1105
|
+
|
|
1106
|
+
**Notes:**
|
|
1107
|
+
- Format conversion and data transformation costs not included
|
|
1108
|
+
- Destination-specific costs (S3, Redshift) calculated separately
|
|
1109
|
+
|
|
1110
|
+
### AWS::KinesisAnalyticsV2::Application
|
|
1111
|
+
|
|
1112
|
+
**Description:** Amazon Kinesis Data Analytics for stream processing
|
|
1113
|
+
|
|
1114
|
+
**Cost Components:**
|
|
1115
|
+
- KPU-hours: KPU count x hourly rate x 730 hours/month
|
|
1116
|
+
|
|
1117
|
+
**Default Assumptions:**
|
|
1118
|
+
- 2 KPUs (Kinesis Processing Units)
|
|
1119
|
+
- Fallback price: $0.11/KPU-hour
|
|
1120
|
+
|
|
1121
|
+
**Example:**
|
|
1122
|
+
```
|
|
1123
|
+
KPUs: 2
|
|
1124
|
+
KPU Rate: $0.11/hour
|
|
1125
|
+
Monthly Cost: 2 × $0.11 × 730 = $160.60
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
**Notes:**
|
|
1129
|
+
- Running application storage and durable application backup costs not included
|
|
1130
|
+
- Orchestration overhead KPU not included
|
|
1131
|
+
|
|
1132
|
+
## DNS and Routing Resources
|
|
1133
|
+
|
|
1134
|
+
### AWS::Route53::HostedZone
|
|
1135
|
+
|
|
1136
|
+
**Description:** Amazon Route 53 DNS hosted zone
|
|
1137
|
+
|
|
1138
|
+
**Cost Components:**
|
|
1139
|
+
- Fixed monthly charge per hosted zone
|
|
1140
|
+
|
|
1141
|
+
**Pricing:**
|
|
1142
|
+
- $0.50/month per hosted zone
|
|
1143
|
+
|
|
1144
|
+
**Example:**
|
|
1145
|
+
```
|
|
1146
|
+
Monthly Cost: $0.50
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
**Notes:**
|
|
1150
|
+
- First 25 hosted zones: $0.50/month each
|
|
1151
|
+
- Additional hosted zones: $0.10/month each (volume pricing not calculated)
|
|
1152
|
+
- DNS query costs are calculated on RecordSet resources
|
|
1153
|
+
|
|
1154
|
+
### AWS::Route53::HealthCheck
|
|
1155
|
+
|
|
1156
|
+
**Description:** Amazon Route 53 health check for endpoint monitoring
|
|
1157
|
+
|
|
1158
|
+
**Cost Components:**
|
|
1159
|
+
- Fixed monthly charge per health check
|
|
1160
|
+
|
|
1161
|
+
**Pricing:**
|
|
1162
|
+
|
|
1163
|
+
| Health Check Type | Monthly Cost |
|
|
1164
|
+
|-------------------|-------------|
|
|
1165
|
+
| Basic (HTTP, TCP) | $0.50 |
|
|
1166
|
+
| Advanced (HTTPS, HTTP_STR_MATCH, HTTPS_STR_MATCH) | $1.00 |
|
|
1167
|
+
|
|
1168
|
+
**Detection Logic:**
|
|
1169
|
+
- Health check type from `HealthCheckConfig.Type` (defaults to HTTP)
|
|
1170
|
+
|
|
1171
|
+
**Example (Basic):**
|
|
1172
|
+
```
|
|
1173
|
+
Health Check Type: HTTP
|
|
1174
|
+
Monthly Cost: $0.50
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
**Example (Advanced):**
|
|
1178
|
+
```
|
|
1179
|
+
Health Check Type: HTTPS_STR_MATCH
|
|
1180
|
+
Monthly Cost: $1.00
|
|
1181
|
+
```
|
|
1182
|
+
|
|
1183
|
+
### AWS::Route53::RecordSet
|
|
1184
|
+
|
|
1185
|
+
**Description:** Amazon Route 53 DNS record
|
|
1186
|
+
|
|
1187
|
+
**Cost Components:**
|
|
1188
|
+
- DNS query charges per million queries
|
|
1189
|
+
|
|
1190
|
+
**Default Assumptions:**
|
|
1191
|
+
- 1,000,000 queries per month
|
|
1192
|
+
|
|
1193
|
+
**Pricing by Routing Type:**
|
|
1194
|
+
|
|
1195
|
+
| Routing Type | Price per Million Queries |
|
|
1196
|
+
|-------------|------------------------|
|
|
1197
|
+
| Standard | $0.40 |
|
|
1198
|
+
| Latency-based | $0.60 |
|
|
1199
|
+
| Geolocation | $0.70 |
|
|
1200
|
+
| Alias | $0.00 (free) |
|
|
1201
|
+
|
|
1202
|
+
**Detection Logic:**
|
|
1203
|
+
- Alias records: `AliasTarget` property present (free, no query charges)
|
|
1204
|
+
- Latency routing: `Region` property present
|
|
1205
|
+
- Geolocation routing: `GeoLocation` property present
|
|
1206
|
+
- Standard routing: default
|
|
1207
|
+
|
|
1208
|
+
**Example (Standard):**
|
|
1209
|
+
```
|
|
1210
|
+
Queries: 1,000,000 × $0.40/1M = $0.40/month
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
**Example (Alias):**
|
|
1214
|
+
```
|
|
1215
|
+
Monthly Cost: $0.00 (alias queries are free)
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
## Networking Resources (continued)
|
|
1219
|
+
|
|
1220
|
+
### AWS::EC2::TransitGateway
|
|
1221
|
+
|
|
1222
|
+
**Description:** AWS Transit Gateway for connecting VPCs and on-premises networks
|
|
1223
|
+
|
|
1224
|
+
**Cost Components:**
|
|
1225
|
+
- Attachment hourly fees x number of attachments x 730 hours/month
|
|
1226
|
+
- Data processing: GB processed x rate
|
|
1227
|
+
|
|
1228
|
+
**Default Assumptions:**
|
|
1229
|
+
- 3 attachments
|
|
1230
|
+
- 1,000 GB data processed per month
|
|
1231
|
+
- Fallback attachment price: $0.05/hour
|
|
1232
|
+
- Fallback data processing price: $0.02/GB
|
|
1233
|
+
|
|
1234
|
+
**Example:**
|
|
1235
|
+
```
|
|
1236
|
+
Attachments: 3 × $0.05/hour × 730 = $109.50
|
|
1237
|
+
Data Processing: 1,000 GB × $0.02 = $20.00
|
|
1238
|
+
Total: $129.50/month
|
|
1239
|
+
```
|
|
1240
|
+
|
|
1241
|
+
**Notes:**
|
|
1242
|
+
- VPN and Direct Connect attachments have additional costs
|
|
1243
|
+
- Cross-region peering attachments priced separately
|
|
1244
|
+
|
|
1245
|
+
### AWS::EC2::TransitGatewayAttachment
|
|
1246
|
+
|
|
1247
|
+
**Description:** Transit Gateway VPC attachment
|
|
1248
|
+
|
|
1249
|
+
**Cost Components:**
|
|
1250
|
+
- Attachment hourly fee x 730 hours/month
|
|
1251
|
+
|
|
1252
|
+
**Default Assumptions:**
|
|
1253
|
+
- Fallback price: $0.05/hour
|
|
1254
|
+
|
|
1255
|
+
**Example:**
|
|
1256
|
+
```
|
|
1257
|
+
Attachment Rate: $0.05/hour
|
|
1258
|
+
Monthly Cost: $0.05 × 730 = $36.50
|
|
1259
|
+
```
|
|
1260
|
+
|
|
1261
|
+
**Notes:**
|
|
1262
|
+
- Data processing costs tracked on the parent Transit Gateway resource
|
|
1263
|
+
|
|
1264
|
+
## Database Resources (continued)
|
|
1265
|
+
|
|
1266
|
+
### AWS::RDS::DBCluster (Aurora Serverless)
|
|
1267
|
+
|
|
1268
|
+
**Description:** Amazon Aurora Serverless for auto-scaling relational databases
|
|
1269
|
+
|
|
1270
|
+
**Cost Components:**
|
|
1271
|
+
1. Compute: ACU-hours (Aurora Capacity Units)
|
|
1272
|
+
2. Storage: GB-month
|
|
1273
|
+
3. I/O requests (Serverless v2 only)
|
|
1274
|
+
|
|
1275
|
+
**Default Assumptions:**
|
|
1276
|
+
- Minimum ACUs: 0.5
|
|
1277
|
+
- Maximum ACUs: 16
|
|
1278
|
+
- Storage: 100 GB
|
|
1279
|
+
- I/O requests: 100,000,000/month (v2 only)
|
|
1280
|
+
- Fallback ACU price: $0.12/ACU-hour (v2), $0.06/ACU-hour (v1)
|
|
1281
|
+
- Storage price: $0.10/GB-month
|
|
1282
|
+
- I/O price: $0.20/million requests
|
|
1283
|
+
|
|
1284
|
+
**Detection Logic:**
|
|
1285
|
+
- Serverless v2: `ServerlessV2ScalingConfiguration` property present
|
|
1286
|
+
- Serverless v1: `EngineMode` === "serverless"
|
|
1287
|
+
- ACU min/max from `ServerlessV2ScalingConfiguration.MinCapacity` and `MaxCapacity`
|
|
1288
|
+
|
|
1289
|
+
**Pricing Model:**
|
|
1290
|
+
- Compute uses average of min and max ACU: `(minACU + maxACU) / 2 × hourly rate × 730`
|
|
1291
|
+
|
|
1292
|
+
**Example (Serverless v2):**
|
|
1293
|
+
```
|
|
1294
|
+
Average ACUs: (0.5 + 16) / 2 = 8.25
|
|
1295
|
+
Compute: 8.25 × $0.12 × 730 = $722.70
|
|
1296
|
+
Storage: 100 GB × $0.10 = $10.00
|
|
1297
|
+
I/O: 100M / 1M × $0.20 = $20.00
|
|
1298
|
+
Total: $752.70/month
|
|
1299
|
+
```
|
|
1300
|
+
|
|
1301
|
+
**Example (Serverless v1):**
|
|
1302
|
+
```
|
|
1303
|
+
Average ACUs: (0.5 + 16) / 2 = 8.25
|
|
1304
|
+
Compute: 8.25 × $0.06 × 730 = $361.35
|
|
1305
|
+
Storage: 100 GB × $0.10 = $10.00
|
|
1306
|
+
Total: $371.35/month
|
|
1307
|
+
```
|
|
1308
|
+
|
|
1309
|
+
**Notes:**
|
|
1310
|
+
- Actual ACU usage varies with workload; estimate uses midpoint
|
|
1311
|
+
- Aurora Serverless v1 does not charge for I/O
|
|
1312
|
+
- Backup storage costs not included
|
|
1313
|
+
- Data transfer costs not included
|
|
1314
|
+
|
|
949
1315
|
## Customizing Assumptions
|
|
950
1316
|
|
|
951
1317
|
### Configuration File
|
package/docs/README.md
CHANGED
|
@@ -7,11 +7,12 @@ This directory contains the documentation for CDK Cost Analyzer, published to Gi
|
|
|
7
7
|
- **index.md** - Homepage with overview and quick start
|
|
8
8
|
- **CONFIGURATION.md** - Configuration guide for thresholds, usage assumptions, and exclusions
|
|
9
9
|
- **CI_CD.md** - CI/CD integration guide for GitHub Actions and GitLab CI
|
|
10
|
-
- **CALCULATORS.md** - Resource calculator reference with cost calculation methods
|
|
10
|
+
- **CALCULATORS.md** - Resource calculator reference with cost calculation methods (25+ resource types)
|
|
11
|
+
- **RECOMMENDATIONS.md** - Cost optimization recommendations engine (7 analyzer categories)
|
|
11
12
|
- **TROUBLESHOOTING.md** - Common issues and solutions
|
|
12
13
|
- **DEVELOPMENT.md** - Local development, testing, and architecture
|
|
13
14
|
- **RELEASE.md** - Release process documentation
|
|
14
|
-
- **SINGLE-TEMPLATE-ANALYSIS.md** - Single template analysis guide
|
|
15
|
+
- **SINGLE-TEMPLATE-ANALYSIS.md** - Single template analysis guide with recommendations
|
|
15
16
|
- **NAT_GATEWAY_TESTING.md** - NAT Gateway testing and debugging guide
|
|
16
17
|
|
|
17
18
|
## GitHub Pages Setup
|