@grnsft/if
Version:
Impact Framework
142 lines • 22.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SciEmbodied = void 0;
const zod_1 = require("zod");
const utils_1 = require("@grnsft/if-core/utils");
const interfaces_1 = require("@grnsft/if-core/interfaces");
exports.SciEmbodied = (0, interfaces_1.PluginFactory)({
metadata: {
inputs: {
vCPUs: {
description: 'number of CPUs allocated to an application',
unit: 'CPUs',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
memory: {
description: 'RAM available for a resource, in GB',
unit: 'GB',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
ssd: {
description: 'number of SSDs available for a resource',
unit: 'SSDs',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
hdd: {
description: 'number of HDDs available for a resource',
unit: 'HDDs',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
gpu: {
description: 'number of GPUs available for a resource',
unit: 'GPUs',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
'usage-ratio': {
description: 'a scaling factor that can be used to describe the ratio of actual resource usage comapred to real device usage, e.g. 0.25 if you are using 2 out of 8 vCPUs, 0.1 if you are responsible for 1 out of 10 GB of storage, etc',
unit: 'dimensionless',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
time: {
description: 'a time unit to scale the embodied carbon by, in seconds. If not provided,time defaults to the value of the timestep duration.',
unit: 'seconds',
'aggregation-method': {
time: 'copy',
component: 'copy',
},
},
},
outputs: {
'embodied-carbon': {
description: 'embodied carbon for a resource, scaled by usage',
unit: 'gCO2eq',
'aggregation-method': {
time: 'sum',
component: 'sum',
},
},
},
},
configValidation: zod_1.z.object({
'baseline-vcpus': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('baseline-vcpus', value, 'number'), zod_1.z.number().gte(0).default(1)),
'baseline-memory': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('baseline-memory', value, 'number'), zod_1.z.number().gte(0).default(16)),
'baseline-emissions': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('baseline-emissions', value, 'number'), zod_1.z.number().gte(0).default(1000000)),
lifespan: zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('lifespan', value, 'number'), zod_1.z.number().gt(0).default(126144000)),
'vcpu-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('vcpu-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(100000)),
'memory-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('memory-emissions-constant', value, 'number'), zod_1.z
.number()
.gte(0)
.default(533 / 384)),
'ssd-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('ssd-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(50000)),
'hdd-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('hdd-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(100000)),
'gpu-emissions-constant': zod_1.z.preprocess(value => (0, utils_1.validateArithmeticExpression)('gpu-emissions-constant', value, 'number'), zod_1.z.number().gte(0).default(150000)),
'output-parameter': zod_1.z.string().optional(),
}),
inputValidation: zod_1.z.object({
duration: zod_1.z.number().gt(0),
vCPUs: zod_1.z.number().gt(0).default(1),
memory: zod_1.z.number().gt(0).default(16),
ssd: zod_1.z.number().gte(0).default(0),
hdd: zod_1.z.number().gte(0).default(0),
gpu: zod_1.z.number().gte(0).default(0),
'usage-ratio': zod_1.z.number().gt(0).default(1),
time: zod_1.z.number().gt(0).optional(),
}),
implementation: async (inputs, config) => {
/**
* 1. Validates configuration and assigns defaults values if not provided.
* 2. Maps through observations and validates them.
* 3. Calculates total embodied carbon by substracting and the difference between baseline server and given one.
*/
return inputs.map(input => {
const cpuE = (input.vCPUs - config['baseline-vcpus']) *
config['vcpu-emissions-constant'];
const memoryE = (input.memory - config['baseline-memory']) *
((config['memory-emissions-constant'] * config['baseline-memory']) /
16) *
1000;
const hddE = input.hdd * config['hdd-emissions-constant'];
const gpuE = input.gpu * config['gpu-emissions-constant'];
const ssdE = input.ssd * config['ssd-emissions-constant'];
const time = input['time'] || input.duration;
const totalEmbodied = config['baseline-emissions'] + cpuE + memoryE + ssdE + hddE + gpuE;
const totalEmbodiedScaledByUsage = totalEmbodied * input['usage-ratio'];
const totalEmbodiedScaledByUsageAndTime = totalEmbodiedScaledByUsage * (time / config['lifespan']);
const embodiedCarbonKey = config['output-parameter'] || 'embodied-carbon';
return {
...input,
[embodiedCarbonKey]: totalEmbodiedScaledByUsageAndTime,
};
});
},
allowArithmeticExpressions: [
'baseline-vcpus',
'baseline-memory',
'baseline-emissions',
'lifespan',
'vcpu-emissions-constant',
'memory-emissions-constant',
'ssd-emissions-constant',
'hdd-emissions-constant',
'gpu-emissions-constant',
],
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3NjaS1lbWJvZGllZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0I7QUFFdEIsaURBQW1FO0FBRW5FLDJEQUF5RDtBQUU1QyxRQUFBLFdBQVcsR0FBRyxJQUFBLDBCQUFhLEVBQUM7SUFDdkMsUUFBUSxFQUFFO1FBQ1IsTUFBTSxFQUFFO1lBQ04sS0FBSyxFQUFFO2dCQUNMLFdBQVcsRUFBRSw0Q0FBNEM7Z0JBQ3pELElBQUksRUFBRSxNQUFNO2dCQUNaLG9CQUFvQixFQUFFO29CQUNwQixJQUFJLEVBQUUsTUFBTTtvQkFDWixTQUFTLEVBQUUsTUFBTTtpQkFDbEI7YUFDRjtZQUNELE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUscUNBQXFDO2dCQUNsRCxJQUFJLEVBQUUsSUFBSTtnQkFDVixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0Y7WUFDRCxHQUFHLEVBQUU7Z0JBQ0gsV0FBVyxFQUFFLHlDQUF5QztnQkFDdEQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxNQUFNO29CQUNaLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjthQUNGO1lBQ0QsR0FBRyxFQUFFO2dCQUNILFdBQVcsRUFBRSx5Q0FBeUM7Z0JBQ3RELElBQUksRUFBRSxNQUFNO2dCQUNaLG9CQUFvQixFQUFFO29CQUNwQixJQUFJLEVBQUUsTUFBTTtvQkFDWixTQUFTLEVBQUUsTUFBTTtpQkFDbEI7YUFDRjtZQUNELEdBQUcsRUFBRTtnQkFDSCxXQUFXLEVBQUUseUNBQXlDO2dCQUN0RCxJQUFJLEVBQUUsTUFBTTtnQkFDWixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07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QUssQ0FBQyxRQUFRLENBQUM7WUFFN0MsTUFBTSxhQUFhLEdBQ2pCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7WUFFckUsTUFBTSwwQkFBMEIsR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXhFLE1BQU0saUNBQWlDLEdBQ3JDLDBCQUEwQixHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTNELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksaUJBQWlCLENBQUM7WUFFMUUsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLGlDQUFpQzthQUN2RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsMEJBQTBCLEVBQUU7UUFDMUIsZ0JBQWdCO1FBQ2hCLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIsVUFBVTtRQUNWLHlCQUF5QjtRQUN6QiwyQkFBMkI7UUFDM0Isd0JBQXdCO1FBQ3hCLHdCQUF3QjtRQUN4Qix3QkFBd0I7S0FDekI7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7dmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbn0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcbmltcG9ydCB7Q29uZmlnUGFyYW1zLCBQbHVnaW5QYXJhbXN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5pbXBvcnQge1BsdWdpbkZhY3Rvcnl9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGNvbnN0IFNjaUVtYm9kaWVkID0gUGx1Z2luRmFjdG9yeSh7XG4gIG1ldGFkYXRhOiB7XG4gICAgaW5wdXRzOiB7XG4gICAgICB2Q1BVczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ251bWJlciBvZiBDUFVzIGFsbG9jYXRlZCB0byBhbiBhcHBsaWNhdGlvbicsXG4gICAgICAgIHVuaXQ6ICdDUFVzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnY29weScsXG4gICAgICAgICAgY29tcG9uZW50OiAnY29weScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVtb3J5OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUkFNIGF2YWlsYWJsZSBmb3IgYSByZXNvdXJjZSwgaW4gR0InLFxuICAgICAgICB1bml0OiAnR0InLFxuICAgICAgICAnYWdncmVnYXRpb24tbWV0aG9kJzoge1xuICAgICAgICAgIHRpbWU6ICdjb3B5JyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdjb3B5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzc2Q6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdudW1iZXIgb2YgU1NEcyBhdmFpbGFibGUgZm9yIGEgcmVzb3VyY2UnLFxuICAgICAgICB1bml0OiAnU1NEcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ2NvcHknLFxuICAgICAgICAgIGNvbXBvbmVudDogJ2NvcHknLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhkZDoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ251bWJlciBvZiBIRERzIGF2YWlsYWJsZSBmb3IgYSByZXNvdXJjZScsXG4gICAgICAgIHVuaXQ6ICdIRERzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnY29weScsXG4gICAgICAgICAgY29tcG9uZW50OiAnY29weScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZ3B1OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnbnVtYmVyIG9mIEdQVXMgYXZhaWxhYmxlIGZvciBhIHJlc291cmNlJyxcbiAgICAgICAgdW5pdDogJ0dQVXMnLFxuICAgICAgICAnYWdncmVnYXRpb24tbWV0aG9kJzoge1xuICAgICAgICAgIHRpbWU6ICdjb3B5JyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdjb3B5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAndXNhZ2UtcmF0aW8nOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdhIHNjYWxpbmcgZmFjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHJhdGlvIG9mIGFjdHVhbCByZXNvdXJjZSB1c2FnZSBjb21hcHJlZCB0byByZWFsIGRldmljZSB1c2FnZSwgZS5nLiAwLjI1IGlmIHlvdSBhcmUgdXNpbmcgMiBvdXQgb2YgOCB2Q1BVcywgMC4xIGlmIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIDEgb3V0IG9mIDEwIEdCIG9mIHN0b3JhZ2UsIGV0YycsXG4gICAgICAgIHVuaXQ6ICdkaW1lbnNpb25sZXNzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnY29weScsXG4gICAgICAgICAgY29tcG9uZW50OiAnY29weScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGltZToge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnYSB0aW1lIHVuaXQgdG8gc2NhbGUgdGhlIGVtYm9kaWVkIGNhcmJvbiBieSwgaW4gc2Vjb25kcy4gSWYgbm90IHByb3ZpZGVkLHRpbWUgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aW1lc3RlcCBkdXJhdGlvbi4nLFxuICAgICAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ2NvcHknLFxuICAgICAgICAgIGNvbXBvbmVudDogJ2NvcHknLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG91dHB1dHM6IHtcbiAgICAgICdlbWJvZGllZC1jYXJib24nOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnZW1ib2RpZWQgY2FyYm9uIGZvciBhIHJlc291cmNlLCBzY2FsZWQgYnkgdXNhZ2UnLFxuICAgICAgICB1bml0OiAnZ0NPMmVxJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnc3VtJyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdzdW0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjb25maWdWYWxpZGF0aW9uOiB6Lm9iamVjdCh7XG4gICAgJ2Jhc2VsaW5lLXZjcHVzJzogei5wcmVwcm9jZXNzKFxuICAgICAgdmFsdWUgPT4gdmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbignYmFzZWxpbmUtdmNwdXMnLCB2YWx1ZSwgJ251bWJlcicpLFxuICAgICAgei5udW1iZXIoKS5ndGUoMCkuZGVmYXVsdCgxKVxuICAgICksXG4gICAgJ2Jhc2VsaW5lLW1lbW9yeSc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+IHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oJ2Jhc2VsaW5lLW1lbW9yeScsIHZhbHVlLCAnbnVtYmVyJyksXG4gICAgICB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDE2KVxuICAgICksXG4gICAgJ2Jhc2VsaW5lLWVtaXNzaW9ucyc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+XG4gICAgICAgIHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oJ2Jhc2VsaW5lLWVtaXNzaW9ucycsIHZhbHVlLCAnbnVtYmVyJyksXG4gICAgICB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDEwMDAwMDApXG4gICAgKSxcbiAgICBsaWZlc3Bhbjogei5wcmVwcm9jZXNzKFxuICAgICAgdmFsdWUgPT4gdmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbignbGlmZXNwYW4nLCB2YWx1ZSwgJ251bWJlcicpLFxuICAgICAgei5udW1iZXIoKS5ndCgwKS5kZWZhdWx0KDEyNjE0NDAwMClcbiAgICApLFxuICAgICd2Y3B1LWVtaXNzaW9ucy1jb25zdGFudCc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+XG4gICAgICAgIHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oXG4gICAgICAgICAgJ3ZjcHUtZW1pc3Npb25zLWNvbnN0YW50JyxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAnbnVtYmVyJ1xuICAgICAgICApLFxuICAgICAgei5udW1iZXIoKS5ndGUoMCkuZGVmYXVsdCgxMDAwMDApXG4gICAgKSxcbiAgICAnbWVtb3J5LWVtaXNzaW9ucy1jb25zdGFudCc6IHoucHJlcHJvY2VzcyhcbiAgICAgIHZhbHVlID0+XG4gICAgICAgIHZhbGlkYXRlQXJpdGhtZXRpY0V4cHJlc3Npb24oXG4gICAgICAgICAgJ21lbW9yeS1lbWlzc2lvbnMtY29uc3RhbnQnLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICdudW1iZXInXG4gICAgICAgICksXG4gICAgICB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAuZ3RlKDApXG4gICAgICAgIC5kZWZhdWx0KDUzMyAvIDM4NClcbiAgICApLFxuICAgICdzc2QtZW1pc3Npb25zLWNvbnN0YW50Jzogei5wcmVwcm9jZXNzKFxuICAgICAgdmFsdWUgPT5cbiAgICAgICAgdmFsaWRhdGVBcml0aG1ldGljRXhwcmVzc2lvbignc3NkLWVtaXNzaW9ucy1jb25zdGFudCcsIHZhbHVlLCAnbnVtYmVyJyksXG4gICAgICB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDUwMDAwKVxuICAgICksXG4gICAgJ2hkZC1lbWlzc2lvbnMtY29uc3RhbnQnOiB6LnByZXByb2Nlc3MoXG4gICAgICB2YWx1ZSA9PlxuICAgICAgICB2YWxpZGF0ZUFyaXRobWV0aWNFeHByZXNzaW9uKCdoZGQtZW1pc3Npb25zLWNvbnN0YW50JywgdmFsdWUsICdudW1iZXInKSxcbiAgICAgIHoubnVtYmVyKCkuZ3RlKDApLmRlZmF1bHQoMTAwMDAwKVxuICAgICksXG4gICAgJ2dwdS1lbWlzc2lvbnMtY29uc3RhbnQnOiB6LnByZXByb2Nlc3MoXG4gICAgICB2YWx1ZSA9PlxuICAgICAgICB2YWxpZGF0ZUFyaXRobWV0aWNFeHByZXNzaW9uKCdncHUtZW1pc3Npb25zLWNvbnN0YW50JywgdmFsdWUsICdudW1iZXInKSxcbiAgICAgIHoubnVtYmVyKCkuZ3RlKDApLmRlZmF1bHQoMTUwMDAwKVxuICAgICksXG4gICAgJ291dHB1dC1wYXJhbWV0ZXInOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICBpbnB1dFZhbGlkYXRpb246IHoub2JqZWN0KHtcbiAgICBkdXJhdGlvbjogei5udW1iZXIoKS5ndCgwKSxcbiAgICB2Q1BVczogei5udW1iZXIoKS5ndCgwKS5kZWZhdWx0KDEpLFxuICAgIG1lbW9yeTogei5udW1iZXIoKS5ndCgwKS5kZWZhdWx0KDE2KSxcbiAgICBzc2Q6IHoubnVtYmVyKCkuZ3RlKDApLmRlZmF1bHQoMCksXG4gICAgaGRkOiB6Lm51bWJlcigpLmd0ZSgwKS5kZWZhdWx0KDApLFxuICAgIGdwdTogei5udW1iZXIoKS5ndGUoMCkuZGVmYXVsdCgwKSxcbiAgICAndXNhZ2UtcmF0aW8nOiB6Lm51bWJlcigpLmd0KDApLmRlZmF1bHQoMSksXG4gICAgdGltZTogei5udW1iZXIoKS5ndCgwKS5vcHRpb25hbCgpLFxuICB9KSxcbiAgaW1wbGVtZW50YXRpb246IGFzeW5jIChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBjb25maWc6IENvbmZpZ1BhcmFtcykgPT4ge1xuICAgIC8qKlxuICAgICAqIDEuIFZhbGlkYXRlcyBjb25maWd1cmF0aW9uIGFuZCBhc3NpZ25zIGRlZmF1bHRzIHZhbHVlcyBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogMi4gTWFwcyB0aHJvdWdoIG9ic2VydmF0aW9ucyBhbmQgdmFsaWRhdGVzIHRoZW0uXG4gICAgICogMy4gQ2FsY3VsYXRlcyB0b3RhbCBlbWJvZGllZCBjYXJib24gYnkgc3Vic3RyYWN0aW5nIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhc2VsaW5lIHNlcnZlciBhbmQgZ2l2ZW4gb25lLlxuICAgICAqL1xuICAgIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGNwdUUgPVxuICAgICAgICAoaW5wdXQudkNQVXMgLSBjb25maWdbJ2Jhc2VsaW5lLXZjcHVzJ10pICpcbiAgICAgICAgY29uZmlnWyd2Y3B1LWVtaXNzaW9ucy1jb25zdGFudCddO1xuICAgICAgY29uc3QgbWVtb3J5RSA9XG4gICAgICAgIChpbnB1dC5tZW1vcnkgLSBjb25maWdbJ2Jhc2VsaW5lLW1lbW9yeSddKSAqXG4gICAgICAgICgoY29uZmlnWydtZW1vcnktZW1pc3Npb25zLWNvbnN0YW50J10gKiBjb25maWdbJ2Jhc2VsaW5lLW1lbW9yeSddKSAvXG4gICAgICAgICAgMTYpICpcbiAgICAgICAgMTAwMDtcbiAgICAgIGNvbnN0IGhkZEUgPSBpbnB1dC5oZGQgKiBjb25maWdbJ2hkZC1lbWlzc2lvbnMtY29uc3RhbnQnXTtcbiAgICAgIGNvbnN0IGdwdUUgPSBpbnB1dC5ncHUgKiBjb25maWdbJ2dwdS1lbWlzc2lvbnMtY29uc3RhbnQnXTtcbiAgICAgIGNvbnN0IHNzZEUgPSBpbnB1dC5zc2QgKiBjb25maWdbJ3NzZC1lbWlzc2lvbnMtY29uc3RhbnQnXTtcbiAgICAgIGNvbnN0IHRpbWUgPSBpbnB1dFsndGltZSddIHx8IGlucHV0LmR1cmF0aW9uO1xuXG4gICAgICBjb25zdCB0b3RhbEVtYm9kaWVkID1cbiAgICAgICAgY29uZmlnWydiYXNlbGluZS1lbWlzc2lvbnMnXSArIGNwdUUgKyBtZW1vcnlFICsgc3NkRSArIGhkZEUgKyBncHVFO1xuXG4gICAgICBjb25zdCB0b3RhbEVtYm9kaWVkU2NhbGVkQnlVc2FnZSA9IHRvdGFsRW1ib2RpZWQgKiBpbnB1dFsndXNhZ2UtcmF0aW8nXTtcblxuICAgICAgY29uc3QgdG90YWxFbWJvZGllZFNjYWxlZEJ5VXNhZ2VBbmRUaW1lID1cbiAgICAgICAgdG90YWxFbWJvZGllZFNjYWxlZEJ5VXNhZ2UgKiAodGltZSAvIGNvbmZpZ1snbGlmZXNwYW4nXSk7XG5cbiAgICAgIGNvbnN0IGVtYm9kaWVkQ2FyYm9uS2V5ID0gY29uZmlnWydvdXRwdXQtcGFyYW1ldGVyJ10gfHwgJ2VtYm9kaWVkLWNhcmJvbic7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0LFxuICAgICAgICBbZW1ib2RpZWRDYXJib25LZXldOiB0b3RhbEVtYm9kaWVkU2NhbGVkQnlVc2FnZUFuZFRpbWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9LFxuICBhbGxvd0FyaXRobWV0aWNFeHByZXNzaW9uczogW1xuICAgICdiYXNlbGluZS12Y3B1cycsXG4gICAgJ2Jhc2VsaW5lLW1lbW9yeScsXG4gICAgJ2Jhc2VsaW5lLWVtaXNzaW9ucycsXG4gICAgJ2xpZmVzcGFuJyxcbiAgICAndmNwdS1lbWlzc2lvbnMtY29uc3RhbnQnLFxuICAgICdtZW1vcnktZW1pc3Npb25zLWNvbnN0YW50JyxcbiAgICAnc3NkLWVtaXNzaW9ucy1jb25zdGFudCcsXG4gICAgJ2hkZC1lbWlzc2lvbnMtY29uc3RhbnQnLFxuICAgICdncHUtZW1pc3Npb25zLWNvbnN0YW50JyxcbiAgXSxcbn0pO1xuIl19