cdk-iot-greengrass-fleet-provisioning
Version:
CDK Construct for AWS IoT Greengrass Fleet Provisioning (with AWS IoT Certificates)
186 lines • 23.7 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 __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createResource = createResource;
exports.deleteResource = deleteResource;
const client_iot_1 = require("@aws-sdk/client-iot");
const client_s3_1 = require("@aws-sdk/client-s3");
const client_ssm_1 = require("@aws-sdk/client-ssm");
__exportStar(require("./types"), exports);
__exportStar(require("./iot"), exports);
__exportStar(require("./s3"), exports);
__exportStar(require("./ssm"), exports);
const iot_1 = require("./iot");
const s3_1 = require("./s3");
const ssm_1 = require("./ssm");
const iotClient = (0, iot_1.IoTClientAdapter)(new client_iot_1.IoTClient());
const ssmClient = (0, ssm_1.SSMClientAdapter)(new client_ssm_1.SSMClient());
const s3Client = (0, s3_1.S3ClientAdapter)(new client_s3_1.S3Client());
async function createResource(resource) {
const { certificateId, certificateArn, certificatePem, keyPair } = await iotClient.createKeysAndCertificate();
console.log(`Iot Certificate - Created Certificate with Id ${certificateId}`);
const pathCertificate = `${resource.CertificatePrefix}/${certificateId}`;
const pathCertificatePem = `${pathCertificate}.pem`;
const pathCertificatePrivateKey = `${pathCertificate}.key.prv`;
const pathCertificatePublicKey = `${pathCertificate}.key.pub`;
const pathCertificateRoot = `${pathCertificate}.root`;
const response = await fetch('https://www.amazontrust.com/repository/AmazonRootCA1.pem');
const buffer = await response.arrayBuffer();
const certificateRootCA = Buffer.from(buffer).toString();
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}`,
Body: certificateId,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}.arn`,
Body: certificateArn,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePem}`,
Body: certificatePem,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePrivateKey}`,
Body: keyPair?.PrivateKey,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePublicKey}`,
Body: keyPair?.PublicKey,
});
await s3Client.putObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificateRoot}`,
Body: certificateRootCA,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/certificateId`,
Value: `${certificateId}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/pem`,
Value: `${certificatePem}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-private`,
Value: `${keyPair.PrivateKey}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-public`,
Value: `${keyPair.PublicKey}`,
Type: 'String',
Overwrite: true,
});
await ssmClient.putParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/root-ca`,
Value: `${certificateRootCA}`,
Type: 'String',
Overwrite: true,
});
const credentialEndpointAddress = await iotClient.describeEndpoint({
endpointType: 'iot:CredentialProvider',
});
const dataEndpointAddress = await iotClient.describeEndpoint({
endpointType: 'iot:CredentialProvider',
});
;
return {
certificateId: certificateId,
certificateArn: certificateArn,
credentialEndpointAddress: credentialEndpointAddress.endpointAddress,
dataEndpointAddress: dataEndpointAddress.endpointAddress,
// s3CertificatePem: `s3://${resource.CertificateBucketName}/${pathCertificatePem}`,
// s3CertificatePrivateKey: `s3://${resource.CertificateBucketName}/${pathCertificatePrivateKey}`,
// s3CertificatePublicKey: `s3://${resource.CertificateBucketName}/${pathCertificatePublicKey}`,
// s3CertificateRoot: `s3://${resource.CertificateBucketName}/${pathCertificateRoot}`,
// ssmParamCertificateId: `/${resource.ResourcePrefix}/certificateId`,
// ssmParamCertificatePem: `/${resource.ResourcePrefix}/${certificateId}/pem`,
// ssmParamCertificatePrivateKey: `/${resource.ResourcePrefix}/${certificateId}/key-private`,
// ssmParamCertificatePublicKey: `/${resource.ResourcePrefix}/${certificateId}/key-public`,
// ssmParamCertificateRoot: `/${resource.ResourcePrefix}/${certificateId}/root-ca`,
};
}
async function deleteResource(resource, certificateId) {
const pathCertificate = `${resource.CertificatePrefix}/${certificateId}`;
const pathCertificatePem = `${pathCertificate}.pem`;
const pathCertificatePrivateKey = `${pathCertificate}.key.prv`;
const pathCertificatePublicKey = `${pathCertificate}.key.pub`;
const pathCertificateRoot = `${pathCertificate}.root`;
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificate}.arn`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePem}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePrivateKey}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificatePublicKey}`,
});
await s3Client.deleteObject({
Bucket: resource.CertificateBucketName,
Key: `${pathCertificateRoot}`,
});
// delete if it's the current one
const ssmParamCertificateId = await ssmClient.getParameter({
Name: `/${resource.ResourcePrefix}/certificateId`,
});
if (ssmParamCertificateId.Parameter?.Value === certificateId) {
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/certificateId`,
});
}
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/pem`,
});
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-private`,
});
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/key-public`,
});
await ssmClient.deleteParameter({
Name: `/${resource.ResourcePrefix}/${certificateId}/root-ca`,
});
await iotClient.updateCertificate({
certificateId: certificateId,
newStatus: 'INACTIVE',
});
await iotClient.deleteCertificate({
certificateId: certificateId,
});
return {};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3JlZW5ncmFzcy1mbGVldC1wcm92aXNpb25pbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSx3Q0FvR0M7QUFFRCx3Q0FpRUM7QUE5TEQsb0RBQWdEO0FBQ2hELGtEQUE4QztBQUM5QyxvREFBZ0Q7QUFFaEQsMENBQXdCO0FBQ3hCLHdDQUFzQjtBQUN0Qix1Q0FBcUI7QUFDckIsd0NBQXNCO0FBRXRCLCtCQUF5QztBQUN6Qyw2QkFBdUM7QUFDdkMsK0JBQXlDO0FBUXpDLE1BQU0sU0FBUyxHQUFHLElBQUEsc0JBQWdCLEVBQUMsSUFBSSxzQkFBUyxFQUFFLENBQUMsQ0FBQztBQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFBLHNCQUFnQixFQUFDLElBQUksc0JBQVMsRUFBRSxDQUFDLENBQUM7QUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxvQkFBZSxFQUFDLElBQUksb0JBQVEsRUFBRSxDQUFDLENBQUM7QUFFMUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxRQUE0QjtJQUMvRCxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUM5RyxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sZUFBZSxHQUFXLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ2pGLE1BQU0sa0JBQWtCLEdBQVcsR0FBRyxlQUFlLE1BQU0sQ0FBQztJQUM1RCxNQUFNLHlCQUF5QixHQUFXLEdBQUcsZUFBZSxVQUFVLENBQUM7SUFDdkUsTUFBTSx3QkFBd0IsR0FBVyxHQUFHLGVBQWUsVUFBVSxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQVcsR0FBRyxlQUFlLE9B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LGFBQWEsTUFBTTtLQUN6RCxDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksUUFBUSxDQUFDLGNBQWMsSUFBSSxhQUFhLGNBQWM7S0FDakUsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQzlCLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxjQUFjLElBQUksYUFBYSxhQUFhO0tBQ2hFLENBQUMsQ0FBQztJQUNILE1BQU0sU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUM5QixJQUFJLEVBQUUsSUFBSSxRQUFRLENBQUMsY0FBYyxJQUFJLGFBQWEsVUFBVTtLQUM3RCxDQUFDLENBQUM7SUFFSCxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxhQUFhLEVBQUUsYUFBYTtRQUM1QixTQUFTLEVBQUUsVUFBVTtLQUN0QixDQUFDLENBQUM7SUFDSCxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxhQUFhLEVBQUUsYUFBYTtLQUM3QixDQUFDLENBQUM7SUFFSCxPQUFPLEVBQ04sQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJb1RDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtaW90JztcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcbmltcG9ydCB7IFNTTUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zc20nO1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW90JztcbmV4cG9ydCAqIGZyb20gJy4vczMnO1xuZXhwb3J0ICogZnJvbSAnLi9zc20nO1xuXG5pbXBvcnQgeyBJb1RDbGllbnRBZGFwdGVyIH0gZnJvbSAnLi9pb3QnO1xuaW1wb3J0IHsgUzNDbGllbnRBZGFwdGVyIH0gZnJvbSAnLi9zMyc7XG5pbXBvcnQgeyBTU01DbGllbnRBZGFwdGVyIH0gZnJvbSAnLi9zc20nO1xuXG5pbXBvcnQge1xuICBDcmVhdGVSZXNvdXJjZXNSZXNwb25zZSxcbiAgRGVsZXRlUmVzb3VyY2VzUmVzcG9uc2UsXG4gIFJlc291cmNlUHJvcGVydGllcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGlvdENsaWVudCA9IElvVENsaWVudEFkYXB0ZXIobmV3IElvVENsaWVudCgpKTtcbmNvbnN0IHNzbUNsaWVudCA9IFNTTUNsaWVudEFkYXB0ZXIobmV3IFNTTUNsaWVudCgpKTtcbmNvbnN0IHMzQ2xpZW50ID0gUzNDbGllbnRBZGFwdGVyKG5ldyBTM0NsaWVudCgpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZVByb3BlcnRpZXMpOiBQcm9taXNlPENyZWF0ZVJlc291cmNlc1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHsgY2VydGlmaWNhdGVJZCwgY2VydGlmaWNhdGVBcm4sIGNlcnRpZmljYXRlUGVtLCBrZXlQYWlyIH0gPSBhd2FpdCBpb3RDbGllbnQuY3JlYXRlS2V5c0FuZENlcnRpZmljYXRlKCk7XG4gIGNvbnNvbGUubG9nKGBJb3QgQ2VydGlmaWNhdGUgLSBDcmVhdGVkIENlcnRpZmljYXRlIHdpdGggSWQgJHtjZXJ0aWZpY2F0ZUlkfWApO1xuXG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZTogc3RyaW5nID0gYCR7cmVzb3VyY2UuQ2VydGlmaWNhdGVQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH1gO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQZW06IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ucGVtYDtcbiAgY29uc3QgcGF0aENlcnRpZmljYXRlUHJpdmF0ZUtleTogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5rZXkucHJ2YDtcbiAgY29uc3QgcGF0aENlcnRpZmljYXRlUHVibGljS2V5OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LmtleS5wdWJgO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVSb290OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LnJvb3RgO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LmFtYXpvbnRydXN0LmNvbS9yZXBvc2l0b3J5L0FtYXpvblJvb3RDQTEucGVtJyk7XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gIGNvbnN0IGNlcnRpZmljYXRlUm9vdENBOiBzdHJpbmcgPSBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCk7XG5cbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX1gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlSWQsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5wdXRPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlfS5hcm5gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlQXJuLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZVBlbX1gLFxuICAgIEJvZHk6IGNlcnRpZmljYXRlUGVtLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZVByaXZhdGVLZXl9YCxcbiAgICBCb2R5OiBrZXlQYWlyPy5Qcml2YXRlS2V5LFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQucHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZVB1YmxpY0tleX1gLFxuICAgIEJvZHk6IGtleVBhaXI/LlB1YmxpY0tleSxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LnB1dE9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVSb290fWAsXG4gICAgQm9keTogY2VydGlmaWNhdGVSb290Q0EsXG4gIH0pO1xuXG4gIGF3YWl0IHNzbUNsaWVudC5wdXRQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vY2VydGlmaWNhdGVJZGAsXG4gICAgVmFsdWU6IGAke2NlcnRpZmljYXRlSWR9YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcGVtYCxcbiAgICBWYWx1ZTogYCR7Y2VydGlmaWNhdGVQZW19YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQucHV0UGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0va2V5LXByaXZhdGVgLFxuICAgIFZhbHVlOiBgJHtrZXlQYWlyIS5Qcml2YXRlS2V5IX1gLFxuICAgIFR5cGU6ICdTdHJpbmcnLFxuICAgIE92ZXJ3cml0ZTogdHJ1ZSxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5wdXRQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHVibGljYCxcbiAgICBWYWx1ZTogYCR7a2V5UGFpciEuUHVibGljS2V5IX1gLFxuICAgIFR5cGU6ICdTdHJpbmcnLFxuICAgIE92ZXJ3cml0ZTogdHJ1ZSxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5wdXRQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9yb290LWNhYCxcbiAgICBWYWx1ZTogYCR7Y2VydGlmaWNhdGVSb290Q0F9YCxcbiAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICBPdmVyd3JpdGU6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3MgPSBhd2FpdCBpb3RDbGllbnQuZGVzY3JpYmVFbmRwb2ludCh7XG4gICAgZW5kcG9pbnRUeXBlOiAnaW90OkNyZWRlbnRpYWxQcm92aWRlcicsXG4gIH0pO1xuICBjb25zdCBkYXRhRW5kcG9pbnRBZGRyZXNzID0gYXdhaXQgaW90Q2xpZW50LmRlc2NyaWJlRW5kcG9pbnQoe1xuICAgIGVuZHBvaW50VHlwZTogJ2lvdDpDcmVkZW50aWFsUHJvdmlkZXInLFxuICB9KTs7XG5cbiAgcmV0dXJuIHtcbiAgICBjZXJ0aWZpY2F0ZUlkOiBjZXJ0aWZpY2F0ZUlkISxcbiAgICBjZXJ0aWZpY2F0ZUFybjogY2VydGlmaWNhdGVBcm4hLFxuICAgIGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3M6IGNyZWRlbnRpYWxFbmRwb2ludEFkZHJlc3MuZW5kcG9pbnRBZGRyZXNzISxcbiAgICBkYXRhRW5kcG9pbnRBZGRyZXNzOiBkYXRhRW5kcG9pbnRBZGRyZXNzLmVuZHBvaW50QWRkcmVzcyEsXG5cbiAgICAvLyBzM0NlcnRpZmljYXRlUGVtOiBgczM6Ly8ke3Jlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZX0vJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgICAvLyBzM0NlcnRpZmljYXRlUHJpdmF0ZUtleTogYHMzOi8vJHtyZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWV9LyR7cGF0aENlcnRpZmljYXRlUHJpdmF0ZUtleX1gLFxuICAgIC8vIHMzQ2VydGlmaWNhdGVQdWJsaWNLZXk6IGBzMzovLyR7cmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lfS8ke3BhdGhDZXJ0aWZpY2F0ZVB1YmxpY0tleX1gLFxuICAgIC8vIHMzQ2VydGlmaWNhdGVSb290OiBgczM6Ly8ke3Jlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZX0vJHtwYXRoQ2VydGlmaWNhdGVSb290fWAsXG5cbiAgICAvLyBzc21QYXJhbUNlcnRpZmljYXRlSWQ6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vY2VydGlmaWNhdGVJZGAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVBlbTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L3BlbWAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVByaXZhdGVLZXk6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHJpdmF0ZWAsXG4gICAgLy8gc3NtUGFyYW1DZXJ0aWZpY2F0ZVB1YmxpY0tleTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS8ke2NlcnRpZmljYXRlSWR9L2tleS1wdWJsaWNgLFxuICAgIC8vIHNzbVBhcmFtQ2VydGlmaWNhdGVSb290OiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2VQcm9wZXJ0aWVzLCBjZXJ0aWZpY2F0ZUlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGV0ZVJlc291cmNlc1Jlc3BvbnNlPiB7XG5cbiAgY29uc3QgcGF0aENlcnRpZmljYXRlOiBzdHJpbmcgPSBgJHtyZXNvdXJjZS5DZXJ0aWZpY2F0ZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfWA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVBlbTogc3RyaW5nID0gYCR7cGF0aENlcnRpZmljYXRlfS5wZW1gO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5OiBzdHJpbmcgPSBgJHtwYXRoQ2VydGlmaWNhdGV9LmtleS5wcnZgO1xuICBjb25zdCBwYXRoQ2VydGlmaWNhdGVQdWJsaWNLZXk6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ua2V5LnB1YmA7XG4gIGNvbnN0IHBhdGhDZXJ0aWZpY2F0ZVJvb3Q6IHN0cmluZyA9IGAke3BhdGhDZXJ0aWZpY2F0ZX0ucm9vdGA7XG5cbiAgYXdhaXQgczNDbGllbnQuZGVsZXRlT2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX1gLFxuICB9KTtcbiAgYXdhaXQgczNDbGllbnQuZGVsZXRlT2JqZWN0KHtcbiAgICBCdWNrZXQ6IHJlc291cmNlLkNlcnRpZmljYXRlQnVja2V0TmFtZSxcbiAgICBLZXk6IGAke3BhdGhDZXJ0aWZpY2F0ZX0uYXJuYCxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LmRlbGV0ZU9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQZW19YCxcbiAgfSk7XG4gIGF3YWl0IHMzQ2xpZW50LmRlbGV0ZU9iamVjdCh7XG4gICAgQnVja2V0OiByZXNvdXJjZS5DZXJ0aWZpY2F0ZUJ1Y2tldE5hbWUsXG4gICAgS2V5OiBgJHtwYXRoQ2VydGlmaWNhdGVQcml2YXRlS2V5fWAsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5kZWxldGVPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUHVibGljS2V5fWAsXG4gIH0pO1xuICBhd2FpdCBzM0NsaWVudC5kZWxldGVPYmplY3Qoe1xuICAgIEJ1Y2tldDogcmVzb3VyY2UuQ2VydGlmaWNhdGVCdWNrZXROYW1lLFxuICAgIEtleTogYCR7cGF0aENlcnRpZmljYXRlUm9vdH1gLFxuICB9KTtcblxuICAvLyBkZWxldGUgaWYgaXQncyB0aGUgY3VycmVudCBvbmVcbiAgY29uc3Qgc3NtUGFyYW1DZXJ0aWZpY2F0ZUlkID0gYXdhaXQgc3NtQ2xpZW50LmdldFBhcmFtZXRlcih7XG4gICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS9jZXJ0aWZpY2F0ZUlkYCxcbiAgfSk7XG4gIGlmIChzc21QYXJhbUNlcnRpZmljYXRlSWQuUGFyYW1ldGVyPy5WYWx1ZSA9PT0gY2VydGlmaWNhdGVJZCkge1xuICAgIGF3YWl0IHNzbUNsaWVudC5kZWxldGVQYXJhbWV0ZXIoe1xuICAgICAgTmFtZTogYC8ke3Jlc291cmNlLlJlc291cmNlUHJlZml4fS9jZXJ0aWZpY2F0ZUlkYCxcbiAgICB9KTtcbiAgfVxuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcGVtYCxcbiAgfSk7XG4gIGF3YWl0IHNzbUNsaWVudC5kZWxldGVQYXJhbWV0ZXIoe1xuICAgIE5hbWU6IGAvJHtyZXNvdXJjZS5SZXNvdXJjZVByZWZpeH0vJHtjZXJ0aWZpY2F0ZUlkfS9rZXktcHJpdmF0ZWAsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0va2V5LXB1YmxpY2AsXG4gIH0pO1xuICBhd2FpdCBzc21DbGllbnQuZGVsZXRlUGFyYW1ldGVyKHtcbiAgICBOYW1lOiBgLyR7cmVzb3VyY2UuUmVzb3VyY2VQcmVmaXh9LyR7Y2VydGlmaWNhdGVJZH0vcm9vdC1jYWAsXG4gIH0pO1xuXG4gIGF3YWl0IGlvdENsaWVudC51cGRhdGVDZXJ0aWZpY2F0ZSh7XG4gICAgY2VydGlmaWNhdGVJZDogY2VydGlmaWNhdGVJZCxcbiAgICBuZXdTdGF0dXM6ICdJTkFDVElWRScsXG4gIH0pO1xuICBhd2FpdCBpb3RDbGllbnQuZGVsZXRlQ2VydGlmaWNhdGUoe1xuICAgIGNlcnRpZmljYXRlSWQ6IGNlcnRpZmljYXRlSWQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gIH07XG59Il19