@grnsft/if 0.0.5 → 0.1.0

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.
Files changed (146) hide show
  1. package/.examples/ompls/azure.yml +205 -0
  2. package/.github/workflows/nodejs-ci.yml +0 -8
  3. package/README.md +48 -9
  4. package/build/config/config.d.ts +0 -23
  5. package/build/config/config.js +1 -24
  6. package/build/index.js +3 -4
  7. package/build/lib/models-universe.js +95 -0
  8. package/build/lib/observatory.js +31 -0
  9. package/build/lib/supercomputer.js +109 -0
  10. package/examples/impls/test/azure.yml +8 -8
  11. package/examples/impls/test/ccf.yml +5 -3
  12. package/examples/impls/test/if-demo.yml +19 -9
  13. package/examples/impls/test/metadata.yml +3 -2
  14. package/examples/impls/test/nesting.yml +10 -13
  15. package/examples/impls/test/sci-e.yml +1 -1
  16. package/examples/impls/test/sci-m.yml +2 -2
  17. package/examples/impls/test/sci-o.yml +2 -4
  18. package/examples/impls/test/sci.yml +1 -2
  19. package/examples/impls/test/shell.yml +2 -1
  20. package/examples/impls/{tdp-finder-test.yml → test/tdp-finder.yml} +8 -8
  21. package/examples/ompls/ccf.yml +3 -1
  22. package/examples/ompls/if-demo.yml +46 -22
  23. package/package.json +12 -5
  24. package/tsconfig.build.json +7 -0
  25. package/tsconfig.build.tsbuildinfo +1 -0
  26. package/build/__mocks__/azure/index.d.ts +0 -11
  27. package/build/__mocks__/azure/index.js +0 -132
  28. package/build/__mocks__/boavizta/countries.json +0 -138
  29. package/build/__mocks__/boavizta/instance_types.json +0 -625
  30. package/build/__mocks__/boavizta/providers.json +0 -1
  31. package/build/__mocks__/fs/index.d.ts +0 -3
  32. package/build/__mocks__/fs/index.js +0 -56
  33. package/build/__mocks__/model-universe/index.d.ts +0 -31
  34. package/build/__mocks__/model-universe/index.js +0 -64
  35. package/build/__mocks__/watt-time/data.json +0 -119
  36. package/build/__tests__/integration/ompl/index.test.d.ts +0 -1
  37. package/build/__tests__/integration/ompl/index.test.js +0 -61
  38. package/build/__tests__/unit/lib/azure-importer/index.test.d.ts +0 -1
  39. package/build/__tests__/unit/lib/azure-importer/index.test.js +0 -152
  40. package/build/__tests__/unit/lib/boavizta/index.test.d.ts +0 -1
  41. package/build/__tests__/unit/lib/boavizta/index.test.js +0 -579
  42. package/build/__tests__/unit/lib/case-studies/aveva.test.d.ts +0 -1
  43. package/build/__tests__/unit/lib/case-studies/aveva.test.js +0 -36
  44. package/build/__tests__/unit/lib/case-studies/emem.test.d.ts +0 -1
  45. package/build/__tests__/unit/lib/case-studies/emem.test.js +0 -108
  46. package/build/__tests__/unit/lib/case-studies/eshoppen.test.d.ts +0 -1
  47. package/build/__tests__/unit/lib/case-studies/eshoppen.test.js +0 -53
  48. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.d.ts +0 -1
  49. package/build/__tests__/unit/lib/case-studies/sci-accenture.test.js +0 -23
  50. package/build/__tests__/unit/lib/ccf/index.test.d.ts +0 -1
  51. package/build/__tests__/unit/lib/ccf/index.test.js +0 -223
  52. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.d.ts +0 -1
  53. package/build/__tests__/unit/lib/cloud-instance-metadata/index.test.js +0 -73
  54. package/build/__tests__/unit/lib/sci/index.test.d.ts +0 -1
  55. package/build/__tests__/unit/lib/sci/index.test.js +0 -106
  56. package/build/__tests__/unit/lib/sci-e/index.test.d.ts +0 -1
  57. package/build/__tests__/unit/lib/sci-e/index.test.js +0 -30
  58. package/build/__tests__/unit/lib/sci-m/index.test.d.ts +0 -1
  59. package/build/__tests__/unit/lib/sci-m/index.test.js +0 -58
  60. package/build/__tests__/unit/lib/sci-o/index.test.d.ts +0 -1
  61. package/build/__tests__/unit/lib/sci-o/index.test.js +0 -42
  62. package/build/__tests__/unit/lib/shell-imp/index.test.d.ts +0 -1
  63. package/build/__tests__/unit/lib/shell-imp/index.test.js +0 -21
  64. package/build/__tests__/unit/lib/tdp-finder/index.test.d.ts +0 -1
  65. package/build/__tests__/unit/lib/tdp-finder/index.test.js +0 -62
  66. package/build/__tests__/unit/lib/teads-aws/index.test.d.ts +0 -1
  67. package/build/__tests__/unit/lib/teads-aws/index.test.js +0 -170
  68. package/build/__tests__/unit/lib/teads-curve/index.test.d.ts +0 -1
  69. package/build/__tests__/unit/lib/teads-curve/index.test.js +0 -146
  70. package/build/__tests__/unit/lib/watt-time/index.test.d.ts +0 -1
  71. package/build/__tests__/unit/lib/watt-time/index.test.js +0 -106
  72. package/build/__tests__/unit/util/args.test.d.ts +0 -1
  73. package/build/__tests__/unit/util/args.test.js +0 -92
  74. package/build/__tests__/unit/util/models-universe.test.d.ts +0 -1
  75. package/build/__tests__/unit/util/models-universe.test.js +0 -193
  76. package/build/__tests__/unit/util/observatory.test.d.ts +0 -1
  77. package/build/__tests__/unit/util/observatory.test.js +0 -99
  78. package/build/__tests__/unit/util/supercomputer.test.d.ts +0 -1
  79. package/build/__tests__/unit/util/supercomputer.test.js +0 -231
  80. package/build/__tests__/unit/util/yaml.test.d.ts +0 -1
  81. package/build/__tests__/unit/util/yaml.test.js +0 -59
  82. package/build/lib/azure-importer/index.d.ts +0 -55
  83. package/build/lib/azure-importer/index.js +0 -314
  84. package/build/lib/boavizta/index.d.ts +0 -53
  85. package/build/lib/boavizta/index.js +0 -254
  86. package/build/lib/case-studies/aveva-model.d.ts +0 -29
  87. package/build/lib/case-studies/aveva-model.js +0 -53
  88. package/build/lib/case-studies/emem-model.d.ts +0 -42
  89. package/build/lib/case-studies/emem-model.js +0 -93
  90. package/build/lib/case-studies/eshoppen-model.d.ts +0 -24
  91. package/build/lib/case-studies/eshoppen-model.js +0 -123
  92. package/build/lib/case-studies/index.d.ts +0 -4
  93. package/build/lib/case-studies/index.js +0 -21
  94. package/build/lib/case-studies/sci-accenture-model.d.ts +0 -10
  95. package/build/lib/case-studies/sci-accenture-model.js +0 -37
  96. package/build/lib/ccf/aws-embodied.json +0 -5591
  97. package/build/lib/ccf/aws-instances.json +0 -21116
  98. package/build/lib/ccf/aws-use.json +0 -79
  99. package/build/lib/ccf/azure-embodied.json +0 -6547
  100. package/build/lib/ccf/azure-instances.json +0 -8332
  101. package/build/lib/ccf/azure-use.json +0 -58
  102. package/build/lib/ccf/gcp-embodied.json +0 -3049
  103. package/build/lib/ccf/gcp-instances.json +0 -3880
  104. package/build/lib/ccf/gcp-use.json +0 -58
  105. package/build/lib/ccf/index.d.ts +0 -63
  106. package/build/lib/ccf/index.js +0 -338
  107. package/build/lib/cloud-instance-metadata/aws-instances.json +0 -1
  108. package/build/lib/cloud-instance-metadata/azure-instances.json +0 -1
  109. package/build/lib/cloud-instance-metadata/index.d.ts +0 -15
  110. package/build/lib/cloud-instance-metadata/index.js +0 -104
  111. package/build/lib/index.d.ts +0 -14
  112. package/build/lib/index.js +0 -32
  113. package/build/lib/interfaces/ccf.d.ts +0 -19
  114. package/build/lib/interfaces/ccf.js +0 -3
  115. package/build/lib/interfaces/index.d.ts +0 -7
  116. package/build/lib/interfaces/index.js +0 -18
  117. package/build/lib/sci/index.d.ts +0 -13
  118. package/build/lib/sci/index.js +0 -131
  119. package/build/lib/sci-e/index.d.ts +0 -38
  120. package/build/lib/sci-e/index.js +0 -85
  121. package/build/lib/sci-m/index.d.ts +0 -10
  122. package/build/lib/sci-m/index.js +0 -124
  123. package/build/lib/sci-o/index.d.ts +0 -17
  124. package/build/lib/sci-o/index.js +0 -52
  125. package/build/lib/shell-imp/index.d.ts +0 -32
  126. package/build/lib/shell-imp/index.js +0 -82
  127. package/build/lib/tdp-finder/index.d.ts +0 -19
  128. package/build/lib/tdp-finder/index.js +0 -98
  129. package/build/lib/teads-aws/aws-embodied.json +0 -1
  130. package/build/lib/teads-aws/aws-instances.json +0 -1
  131. package/build/lib/teads-aws/index.d.ts +0 -58
  132. package/build/lib/teads-aws/index.js +0 -208
  133. package/build/lib/teads-curve/index.d.ts +0 -52
  134. package/build/lib/teads-curve/index.js +0 -158
  135. package/build/lib/watt-time/index.d.ts +0 -18
  136. package/build/lib/watt-time/index.js +0 -204
  137. package/build/util/models-universe.js +0 -95
  138. package/build/util/observatory.js +0 -31
  139. package/build/util/supercomputer.js +0 -109
  140. package/docs/implementations/tdp-finder.md +0 -36
  141. package/examples/impls/test/complex-pipeline.yml +0 -67
  142. package/examples/impls/test/toto.yaml +0 -22
  143. package/tsconfig.tsbuildinfo +0 -1
  144. /package/build/{util → lib}/models-universe.d.ts +0 -0
  145. /package/build/{util → lib}/observatory.d.ts +0 -0
  146. /package/build/{util → lib}/supercomputer.d.ts +0 -0
@@ -1,254 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BoaviztaCloudOutputModel = exports.BoaviztaCpuOutputModel = void 0;
4
- const axios_1 = require("axios");
5
- const config_1 = require("../../config");
6
- const { MODEL_IDS } = config_1.CONFIG;
7
- const { BOAVIZTA_CPU, BOAVIZTA_CLOUD } = MODEL_IDS;
8
- class BoaviztaOutputModel {
9
- constructor() {
10
- this.sharedParams = undefined;
11
- this.metricType = 'cpu-util';
12
- this.expectedLifespan = 4 * 365 * 24 * 60 * 60;
13
- }
14
- async authenticate(authParams) {
15
- this.authCredentials = authParams;
16
- }
17
- async configure(name, staticParams = undefined) {
18
- this.name = name;
19
- this.sharedParams = await this.captureStaticParams(staticParams ?? {});
20
- return this;
21
- }
22
- // list of supported locations by the model
23
- async supportedLocations() {
24
- const countries = await axios_1.default.get('https://api.boavizta.org/v1/utils/country_code');
25
- return Object.values(countries.data);
26
- }
27
- // converts the usage from IMPL input to the format required by Boavizta API.
28
- transformToBoaviztaUsage(duration, metric) {
29
- // duration is in seconds, convert to hours
30
- // metric is between 0 and 1, convert to percentage
31
- let usageInput = {
32
- hours_use_time: duration / 3600.0,
33
- time_workload: metric,
34
- };
35
- // convert expected lifespan from seconds to years
36
- usageInput['years_life_time'] =
37
- this.expectedLifespan / (365.0 * 24.0 * 60.0 * 60.0);
38
- usageInput = this.addLocationToUsage(usageInput);
39
- return usageInput;
40
- }
41
- // Calculates the output of the given usage
42
- async execute(inputs = undefined) {
43
- if (Array.isArray(inputs)) {
44
- const results = [];
45
- for (const input of inputs) {
46
- const usageResult = await this.calculateUsageForinput(input);
47
- results.push(usageResult);
48
- }
49
- return results;
50
- }
51
- else {
52
- throw new Error('Parameter Not Given: invalid inputs parameter. Expecting an array of inputs');
53
- }
54
- }
55
- // Adds location to usage if location is defined in sharedParams
56
- addLocationToUsage(usageRaw) {
57
- if (this.sharedParams !== undefined && 'location' in this.sharedParams) {
58
- usageRaw['usage_location'] = this.sharedParams['location'];
59
- }
60
- return usageRaw;
61
- }
62
- // extracts information from Boavizta API response to return the output in the format required by IMPL
63
- formatResponse(data) {
64
- let m = 0;
65
- let e = 0;
66
- if ('outputs' in data) {
67
- // embodied-carbon output is in kgCO2eq, convert to gCO2eq
68
- m = data['outputs']['gwp']['embedded']['value'] * 1000;
69
- // use output is in J , convert to kWh.
70
- // 1,000,000 J / 3600 = 277.7777777777778 Wh.
71
- // 1 MJ / 3.6 = 0.278 kWh
72
- e = data['outputs']['pe']['use']['value'] / 3.6;
73
- }
74
- else if ('gwp' in data && 'pe' in data) {
75
- // embodied-carbon output is in kgCO2eq, convert to gCO2eq
76
- m = data['gwp']['embodied-carbon'] * 1000;
77
- // use output is in J , convert to kWh.
78
- // 1,000,000 J / 3600 = 277.7777777777778 Wh.
79
- // 1 MJ / 3.6 = 0.278 kWh
80
- e = data['pe']['use'] / 3.6;
81
- }
82
- return { 'embodied-carbon': m, energy: e };
83
- }
84
- // converts the usage to the format required by Boavizta API.
85
- async calculateUsageForinput(input) {
86
- if ('timestamp' in input &&
87
- 'duration' in input &&
88
- this.metricType in input) {
89
- const usageInput = this.transformToBoaviztaUsage(input['duration'], input[this.metricType]);
90
- const usage = (await this.fetchData(usageInput));
91
- return usage;
92
- }
93
- else {
94
- throw new Error('Invalid Input: Invalid inputs parameter');
95
- }
96
- }
97
- }
98
- class BoaviztaCpuOutputModel extends BoaviztaOutputModel {
99
- constructor() {
100
- super();
101
- this.sharedParams = undefined;
102
- this.verbose = false;
103
- this.allocation = 'LINEAR';
104
- this.componentType = 'cpu';
105
- this.metricType = 'cpu-util';
106
- this.componentType = 'cpu';
107
- }
108
- modelIdentifier() {
109
- return BOAVIZTA_CPU;
110
- }
111
- async fetchData(usageData) {
112
- if (this.sharedParams === undefined) {
113
- throw new Error('Improper configure: Missing configuration parameters');
114
- }
115
- const dataCast = this.sharedParams;
116
- dataCast['usage'] = usageData;
117
- const response = await axios_1.default.post(`https://api.boavizta.org/v1/component/${this.componentType}?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`, dataCast);
118
- const result = this.formatResponse(response.data);
119
- // console.log(
120
- // 'hitting ',
121
- // `https://api.boavizta.org/v1/component/${this.componentType}?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`,
122
- // dataCast,
123
- // JSON.stringify(response.data)
124
- // );
125
- return {
126
- 'e-cpu': result.energy,
127
- 'embodied-carbon': result['embodied-carbon'],
128
- };
129
- }
130
- async captureStaticParams(staticParams) {
131
- if ('verbose' in staticParams) {
132
- this.verbose = staticParams.verbose ?? false;
133
- staticParams.verbose = undefined;
134
- }
135
- if (!('physical-processor' in staticParams)) {
136
- throw new Error('Improper configure: Missing processor parameter');
137
- }
138
- if (!('core-units' in staticParams)) {
139
- throw new Error('Improper configure: Missing core-units parameter');
140
- }
141
- if ('expected-lifespan' in staticParams) {
142
- this.expectedLifespan = staticParams['expected-lifespan'];
143
- }
144
- this.sharedParams = Object.assign({}, staticParams);
145
- return this.sharedParams;
146
- }
147
- }
148
- exports.BoaviztaCpuOutputModel = BoaviztaCpuOutputModel;
149
- class BoaviztaCloudOutputModel extends BoaviztaOutputModel {
150
- constructor() {
151
- super(...arguments);
152
- this.sharedParams = undefined;
153
- this.instanceTypes = {};
154
- this.verbose = false;
155
- this.allocation = 'LINEAR';
156
- }
157
- modelIdentifier() {
158
- return BOAVIZTA_CLOUD;
159
- }
160
- async validateLocation(staticParamsCast) {
161
- if ('location' in staticParamsCast) {
162
- const location = staticParamsCast.location ?? 'USA';
163
- const countries = await this.supportedLocations();
164
- if (!countries.includes(location)) {
165
- throw new Error("Improper configure: Invalid location parameter: '" +
166
- location +
167
- "'. Valid values are : " +
168
- countries.join(', '));
169
- }
170
- return staticParamsCast.location;
171
- }
172
- }
173
- async validateInstanceType(staticParamsCast) {
174
- if (!('provider' in staticParamsCast)) {
175
- throw new Error('Improper configure: Missing provider parameter');
176
- }
177
- if (!('instance-type' in staticParamsCast)) {
178
- throw new Error("Improper configure: Missing 'instance-type' parameter");
179
- }
180
- const provider = staticParamsCast.provider;
181
- if (this.instanceTypes[provider] === undefined ||
182
- this.instanceTypes[provider].length === 0) {
183
- this.instanceTypes[provider] = await this.supportedInstancesList(provider);
184
- }
185
- if ('instance-type' in staticParamsCast) {
186
- if (!this.instanceTypes[provider].includes(staticParamsCast['instance-type'])) {
187
- throw new Error(`Improper configure: Invalid 'instance-type' parameter: '${staticParamsCast['instance-type']}'. Valid values are : ${this.instanceTypes[provider].join(', ')}`);
188
- }
189
- }
190
- }
191
- async validateProvider(staticParamsCast) {
192
- if (!('provider' in staticParamsCast)) {
193
- throw new Error('Improper configure: Missing provider parameter');
194
- }
195
- else {
196
- const supportedProviders = await this.supportedProvidersList();
197
- if (!supportedProviders.includes(staticParamsCast.provider)) {
198
- throw new Error("Improper configure: Invalid provider parameter: '" +
199
- staticParamsCast.provider +
200
- "'. Valid values are : " +
201
- supportedProviders.join(', '));
202
- }
203
- }
204
- }
205
- async supportedInstancesList(provider) {
206
- const instances = await axios_1.default.get(`https://api.boavizta.org/v1/cloud/instance/all_instances?provider=${provider}`);
207
- return instances.data;
208
- }
209
- async supportedProvidersList() {
210
- const providers = await axios_1.default.get('https://api.boavizta.org/v1/cloud/instance/all_providers');
211
- return Object.values(providers.data);
212
- }
213
- async fetchData(usageData) {
214
- if (this.sharedParams === undefined) {
215
- throw new Error('Improper configure: Missing configuration parameters');
216
- }
217
- const dataCast = this.sharedParams;
218
- for (const key in dataCast) {
219
- // replace - with _ in keys
220
- if (key.includes('-')) {
221
- const newKey = key.replace(/-/g, '_');
222
- dataCast[newKey] = dataCast[key];
223
- delete dataCast[key];
224
- }
225
- }
226
- dataCast['usage'] = usageData;
227
- const response = await axios_1.default.post(`https://api.boavizta.org/v1/cloud/instance?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`, dataCast);
228
- // console.log(
229
- // `https://api.boavizta.org/v1/cloud/instance?verbose=${this.verbose}&duration=${dataCast['usage']['hours_use_time']}`,
230
- // JSON.stringify(response.data),
231
- // dataCast
232
- // );
233
- return this.formatResponse(response.data);
234
- }
235
- async captureStaticParams(staticParams) {
236
- if ('verbose' in staticParams) {
237
- this.verbose = staticParams.verbose ?? false;
238
- staticParams.verbose = undefined;
239
- }
240
- // if no valid provider found, throw error
241
- await this.validateProvider(staticParams);
242
- // if no valid 'instance-type' found, throw error
243
- await this.validateInstanceType(staticParams);
244
- // if no valid location found, throw error
245
- await this.validateLocation(staticParams);
246
- if ('expected-lifespan' in staticParams) {
247
- this.expectedLifespan = staticParams['expected-lifespan'];
248
- }
249
- this.sharedParams = Object.assign({}, staticParams);
250
- return this.sharedParams;
251
- }
252
- }
253
- exports.BoaviztaCloudOutputModel = BoaviztaCloudOutputModel;
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2JvYXZpenRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUEwQjtBQUcxQix5Q0FBb0M7QUFLcEMsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUMzQixNQUFNLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUVqRCxNQUFlLG1CQUFtQjtJQUFsQztRQUVFLGlCQUFZLEdBQXVCLFNBQVMsQ0FBQztRQUM3QyxlQUFVLEdBQXlDLFVBQVUsQ0FBQztRQUM5RCxxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBeUg1QyxDQUFDO0lBdEhDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBUUQsMkNBQTJDO0lBQzNDLEtBQUssQ0FBQyxrQkFBa0I7UUFDdEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUMvQixnREFBZ0QsQ0FDakQsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSx3QkFBd0IsQ0FBQyxRQUFnQixFQUFFLE1BQWM7UUFDdkQsMkNBQTJDO1FBQzNDLG1E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QztZQUMxRCxZQUFZLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztTQUNsQztRQUNELDBDQUEwQztRQUMxQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxpREFBaUQ7UUFDakQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsMENBQTBDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFDLElBQUksbUJBQW1CLElBQUksWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQVcsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQWxKRCw0REFrSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5pbXBvcnQge0lPdXRwdXRNb2RlbEludGVyZmFjZX0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtCb2F2aXp0YUluc3RhbmNlVHlwZXMsIElCb2F2aXp0YVVzYWdlU0NJfSBmcm9tICcuLi8uLi90eXBlcy9ib2F2aXp0YSc7XG5pbXBvcnQge0tleVZhbHVlUGFpcn0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbW9uJztcblxuY29uc3Qge01PREVMX0lEU30gPSBDT05GSUc7XG5jb25zdCB7Qk9BVklaVEFfQ1BVLCBCT0FWSVpUQV9DTE9VRH0gPSBNT0RFTF9JRFM7XG5cbmFic3RyYWN0IGNsYXNzIEJvYXZpenRhT3V0cHV0TW9kZWwgaW1wbGVtZW50cyBJT3V0cHV0TW9kZWxJbnRlcmZhY2Uge1xuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBtZXRyaWNUeXBlOiAnY3B1LXV0aWwnIHwgJ2dwdS11dGlsJyB8ICdyYW0tdXRpbCcgPSAnY3B1LXV0aWwnO1xuICBleHBlY3RlZExpZmVzcGFuID0gNCAqIDM2NSAqIDI0ICogNjAgKiA2MDtcbiAgcHJvdGVjdGVkIGF1dGhDcmVkZW50aWFsczogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpIHtcbiAgICB0aGlzLmF1dGhDcmVkZW50aWFscyA9IGF1dGhQYXJhbXM7XG4gIH1cblxuICBhc3luYyBjb25maWd1cmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YXRpY1BhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICk6IFByb21pc2U8SU91dHB1dE1vZGVsSW50ZXJmYWNlPiB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnNoYXJlZFBhcmFtcyA9IGF3YWl0IHRoaXMuY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXMgPz8ge30pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy9kZWZpbmVzIHRoZSBtb2RlbCBpZGVudGlmaWVyXG4gIGFic3RyYWN0IG1vZGVsSWRlbnRpZmllcigpOiBzdHJpbmc7XG5cbiAgLy9mZXRjaGVzIGRhdGEgZnJvbSBCb2F2aXp0YSBBUEkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpYyBlbmRwb2ludCBvZiB0aGUgbW9kZWxcbiAgYWJzdHJhY3QgZmV0Y2hEYXRhKHVzYWdlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxvYmplY3Q+O1xuXG4gIC8vIGxpc3Qgb2Ygc3VwcG9ydGVkIGxvY2F0aW9ucyBieSB0aGUgbW9kZWxcbiAgYXN5bmMgc3VwcG9ydGVkTG9jYXRpb25zKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBjb3VudHJpZXMgPSBhd2FpdCBheGlvcy5nZXQoXG4gICAgICAnaHR0cHM6Ly9hcGkuYm9hdml6dGEub3JnL3YxL3V0aWxzL2NvdW50cnlfY29kZSdcbiAgICApO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvdW50cmllcy5kYXRhKTtcbiAgfVxuXG4gIC8vIGNvbnZlcnRzIHRoZSB1c2FnZSBmcm9tIElNUEwgaW5wdXQgdG8gdGhlIGZvcm1hdCByZXF1aXJlZCBieSBCb2F2aXp0YSBBUEkuXG4gIHRyYW5zZm9ybVRvQm9hdml6dGFVc2FnZShkdXJhdGlvbjogbnVtYmVyLCBtZXRyaWM6IG51bWJlcikge1xuICAgIC8vIGR1cmF0aW9uIGlzIGluIHNlY29uZHMsIGNvbnZlcnQgdG8gaG91cnNcbiAgICAvLyBtZXRyaWMgaXMgYmV0d2VlbiAwIGFuZCAxLCBjb252ZXJ0IHRvIHBlcmNlbnRhZ2VcbiAgICBsZXQgdXNhZ2VJbnB1dDogS2V5VmFsdWVQYWlyID0ge1xuICAgICAgaG91cnNfdXNlX3RpbWU6IGR1cmF0aW9uIC8gMzYwMC4wLFxuICAgICAgdGltZV93b3JrbG9hZDogbWV0cmljLFxuICAgIH07XG4gICAgLy8gY29udmVydCBleHBlY3RlZCBsaWZlc3BhbiBmcm9tIHNlY29uZHMgdG8geWVhcnNcbiAgICB1c2FnZUlucHV0Wyd5ZWFyc19saWZlX3RpbWUnXSA9XG4gICAgICB0aGlzLmV4cGVjdGVkTGlmZXNwYW4gLyAoMzY1LjAgKiAyNC4wICogNjAuMCAqIDYwLjApO1xuICAgIHVzYWdlSW5wdXQgPSB0aGlzLmFkZExvY2F0aW9uVG9Vc2FnZSh1c2FnZUlucHV0KTtcblxuICAgIHJldHVybiB1c2FnZUlucHV0O1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlcyB0aGUgb3V0cHV0IG9mIHRoZSBnaXZlbiB1c2FnZVxuICBhc3luYyBleGVjdXRlKFxuICAgIGlucHV0czogb2JqZWN0IHwgb2JqZWN0W10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IEtleVZhbHVlUGFpcltdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHVzYWdlUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxjdWxhdGVVc2FnZUZvcmlucHV0KGlucHV0KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHVzYWdlUmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1BhcmFtZXRlciBOb3QgR2l2ZW46IGludmFsaWQgaW5wdXRzIHBhcmFtZXRlci4gRXhwZWN0aW5nIGFuIGFycmF5IG9mIGlucHV0cydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkcyBsb2NhdGlvbiB0byB1c2FnZSBpZiBsb2NhdGlvbiBpcyBkZWZpbmVkIGluIHNoYXJlZFBhcmFtc1xuICBhZGRMb2NhdGlvblRvVXNhZ2UodXNhZ2VSYXc6IEtleVZhbHVlUGFpcikge1xuICAgIGlmICh0aGlzLnNoYXJlZFBhcmFtcyAhPT0gdW5kZWZpbmVkICYmICdsb2NhdGlvbicgaW4gdGhpcy5zaGFyZWRQYXJhbXMpIHtcbiAgICAgIHVzYWdlUmF3Wyd1c2FnZV9sb2NhdGlvbiddID0gdGhpcy5zaGFyZWRQYXJhbXNbJ2xvY2F0aW9uJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzYWdlUmF3O1xuICB9XG5cbiAgLy9hYnN0cmFjdCBzdWJzIHRvIG1ha2UgY29tcGF0aWJpbGl0eSB3aXRoIGJhc2UgaW50ZXJmYWNlLiBhbGxvd3MgY29uZmlndXJlIHRvIGJlIGRlZmluZWQgaW4gYmFzZSBjbGFzc1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXM6IG9iamVjdCk6IG9iamVjdDtcblxuICAvLyBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIEJvYXZpenRhIEFQSSByZXNwb25zZSB0byByZXR1cm4gdGhlIG91dHB1dCBpbiB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IElNUExcbiAgcHJvdGVjdGVkIGZvcm1hdFJlc3BvbnNlKGRhdGE6IEtleVZhbHVlUGFpcik6IEtleVZhbHVlUGFpciB7XG4gICAgbGV0IG0gPSAwO1xuICAgIGxldCBlID0gMDtcbiAgICBpZiAoJ291dHB1dHMnIGluIGRhdGEpIHtcbiAgICAgIC8vIGVtYm9kaWVkLWNhcmJvbiBvdXRwdXQgaXMgaW4ga2dDTzJlcSwgY29udmVydCB0byBnQ08yZXFcbiAgICAgIG0gPSBkYXRhWydvdXRwdXRzJ11bJ2d3cCddWydlbWJlZGRlZCddWyd2YWx1ZSddICogMTAwMDtcbiAgICAgIC8vIHVzZSBvdXRwdXQgaXMgaW4gSiAsIGNvbnZlcnQgdG8ga1doLlxuICAgICAgLy8gMSwwMDAsMDAwIEogLyAzNjAwID0gMjc3Ljc3Nzc3Nzc3Nzc3NzggV2guXG4gICAgICAvLyAxIE1KIC8gMy42ID0gMC4yNzgga1doXG4gICAgICBlID0gZGF0YVsnb3V0cHV0cyddWydwZSddWyd1c2UnXVsndmFsdWUnXSAvIDMuNjtcbiAgICB9IGVsc2UgaWYgKCdnd3AnIGluIGRhdGEgJiYgJ3BlJyBpbiBkYXRhKSB7XG4gICAgICAvLyBlbWJvZGllZC1jYXJib24gb3V0cHV0IGlzIGluIGtnQ08yZXEsIGNvbnZlcnQgdG8gZ0NPMmVxXG4gICAgICBtID0gZGF0YVsnZ3dwJ11bJ2VtYm9kaWVkLWNhcmJvbiddICogMTAwMDtcbiAgICAgIC8vIHVzZSBvdXRwdXQgaXMgaW4gSiAsIGNvbnZlcnQgdG8ga1doLlxuICAgICAgLy8gMSwwMDAsMDAwIEogLyAzNjAwID0gMjc3Ljc3Nzc3Nzc3Nzc3NzggV2guXG4gICAgICAvLyAxIE1KIC8gMy42ID0gMC4yNzgga1doXG4gICAgICBlID0gZGF0YVsncGUnXVsndXNlJ10gLyAzLjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsnZW1ib2RpZWQtY2FyYm9uJzogbSwgZW5lcmd5OiBlfTtcbiAgfVxuXG4gIC8vIGNvbnZlcnRzIHRoZSB1c2FnZSB0byB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IEJvYXZpenRhIEFQSS5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbGN1bGF0ZVVzYWdlRm9yaW5wdXQoXG4gICAgaW5wdXQ6IEtleVZhbHVlUGFpclxuICApOiBQcm9taXNlPEtleVZhbHVlUGFpcj4ge1xuICAgIGlmIChcbiAgICAgICd0aW1lc3RhbXAnIGluIGlucHV0ICYmXG4gICAgICAnZHVyYXRpb24nIGluIGlucHV0ICYmXG4gICAgICB0aGlzLm1ldHJpY1R5cGUgaW4gaW5wdXRcbiAgICApIHtcbiAgICAgIGNvbnN0IHVzYWdlSW5wdXQgPSB0aGlzLnRyYW5zZm9ybVRvQm9hdml6dGFVc2FnZShcbiAgICAgICAgaW5wdXRbJ2R1cmF0aW9uJ10sXG4gICAgICAgIGlucHV0W3RoaXMubWV0cmljVHlwZV1cbiAgICAgICk7XG4gICAgICBjb25zdCB1c2FnZSA9IChhd2FpdCB0aGlzLmZldGNoRGF0YSh1c2FnZUlucHV0KSkgYXMgSUJvYXZpenRhVXNhZ2VTQ0k7XG5cbiAgICAgIHJldHVybiB1c2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElucHV0OiBJbnZhbGlkIGlucHV0cyBwYXJhbWV0ZXInKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvYXZpenRhQ3B1T3V0cHV0TW9kZWxcbiAgZXh0ZW5kcyBCb2F2aXp0YU91dHB1dE1vZGVsXG4gIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlXG57XG4gIHNoYXJlZFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdmVyYm9zZSA9IGZhbHNlO1xuICBwdWJsaWMgYWxsb2NhdGlvbiA9ICdMSU5FQVInO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudFR5cGUgPSAnY3B1JztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWV0cmljVHlwZSA9ICdjcHUtdXRpbCc7XG4gICAgdGhpcy5jb21wb25lbnRUeXBlID0gJ2NwdSc7XG4gIH1cblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQk9BVklaVEFfQ1BVO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hEYXRhKHVzYWdlRGF0YTogb2JqZWN0IHwgdW5kZWZpbmVkKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBpZiAodGhpcy5zaGFyZWRQYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUNhc3QgPSB0aGlzLnNoYXJlZFBhcmFtcyBhcyBLZXlWYWx1ZVBhaXI7XG4gICAgZGF0YUNhc3RbJ3VzYWdlJ10gPSB1c2FnZURhdGE7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICBgaHR0cHM6Ly9hcGkuYm9hdml6dGEub3JnL3YxL2NvbXBvbmVudC8ke3RoaXMuY29tcG9uZW50VHlwZX0/dmVyYm9zZT0ke3RoaXMudmVyYm9zZX0mZHVyYXRpb249JHtkYXRhQ2FzdFsndXNhZ2UnXVsnaG91cnNfdXNlX3RpbWUnXX1gLFxuICAgICAgZGF0YUNhc3RcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mb3JtYXRSZXNwb25zZShyZXNwb25zZS5kYXRhKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgJ2hpdHRpbmcgJyxcbiAgICAvLyAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY29tcG9uZW50LyR7dGhpcy5jb21wb25lbnRUeXBlfT92ZXJib3NlPSR7dGhpcy52ZXJib3NlfSZkdXJhdGlvbj0ke2RhdGFDYXN0Wyd1c2FnZSddWydob3Vyc191c2VfdGltZSddfWAsXG4gICAgLy8gICBkYXRhQ2FzdCxcbiAgICAvLyAgIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmRhdGEpXG4gICAgLy8gKTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2UtY3B1JzogcmVzdWx0LmVuZXJneSxcbiAgICAgICdlbWJvZGllZC1jYXJib24nOiByZXN1bHRbJ2VtYm9kaWVkLWNhcmJvbiddLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FwdHVyZVN0YXRpY1BhcmFtcyhzdGF0aWNQYXJhbXM6IG9iamVjdCk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgaWYgKCd2ZXJib3NlJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMudmVyYm9zZSA9IChzdGF0aWNQYXJhbXMudmVyYm9zZSBhcyBib29sZWFuKSA/PyBmYWxzZTtcbiAgICAgIHN0YXRpY1BhcmFtcy52ZXJib3NlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghKCdwaHlzaWNhbC1wcm9jZXNzb3InIGluIHN0YXRpY1BhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wcm9wZXIgY29uZmlndXJlOiBNaXNzaW5nIHByb2Nlc3NvciBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoISgnY29yZS11bml0cycgaW4gc3RhdGljUGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgY29yZS11bml0cyBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoJ2V4cGVjdGVkLWxpZmVzcGFuJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXhwZWN0ZWRMaWZlc3BhbiA9IHN0YXRpY1BhcmFtc1snZXhwZWN0ZWQtbGlmZXNwYW4nXSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkUGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGljUGFyYW1zKTtcblxuICAgIHJldHVybiB0aGlzLnNoYXJlZFBhcmFtcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9hdml6dGFDbG91ZE91dHB1dE1vZGVsXG4gIGV4dGVuZHMgQm9hdml6dGFPdXRwdXRNb2RlbFxuICBpbXBsZW1lbnRzIElPdXRwdXRNb2RlbEludGVyZmFjZVxue1xuICBwdWJsaWMgc2hhcmVkUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBpbnN0YW5jZVR5cGVzOiBCb2F2aXp0YUluc3RhbmNlVHlwZXMgPSB7fTtcbiAgcHVibGljIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHZlcmJvc2UgPSBmYWxzZTtcbiAgcHVibGljIGFsbG9jYXRpb24gPSAnTElORUFSJztcblxuICBtb2RlbElkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQk9BVklaVEFfQ0xPVUQ7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUxvY2F0aW9uKHN0YXRpY1BhcmFtc0Nhc3Q6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nIHwgdm9pZD4ge1xuICAgIGlmICgnbG9jYXRpb24nIGluIHN0YXRpY1BhcmFtc0Nhc3QpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gKHN0YXRpY1BhcmFtc0Nhc3QubG9jYXRpb24gYXMgc3RyaW5nKSA/PyAnVVNBJztcbiAgICAgIGNvbnN0IGNvdW50cmllcyA9IGF3YWl0IHRoaXMuc3VwcG9ydGVkTG9jYXRpb25zKCk7XG4gICAgICBpZiAoIWNvdW50cmllcy5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiSW1wcm9wZXIgY29uZmlndXJlOiBJbnZhbGlkIGxvY2F0aW9uIHBhcmFtZXRlcjogJ1wiICtcbiAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgIFwiJy4gVmFsaWQgdmFsdWVzIGFyZSA6IFwiICtcbiAgICAgICAgICAgIGNvdW50cmllcy5qb2luKCcsICcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGljUGFyYW1zQ2FzdC5sb2NhdGlvbiBhcyBzdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVJbnN0YW5jZVR5cGUoc3RhdGljUGFyYW1zQ2FzdDogb2JqZWN0KSB7XG4gICAgaWYgKCEoJ3Byb3ZpZGVyJyBpbiBzdGF0aWNQYXJhbXNDYXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgcHJvdmlkZXIgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCEoJ2luc3RhbmNlLXR5cGUnIGluIHN0YXRpY1BhcmFtc0Nhc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbXByb3BlciBjb25maWd1cmU6IE1pc3NpbmcgJ2luc3RhbmNlLXR5cGUnIHBhcmFtZXRlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm92aWRlciA9IHN0YXRpY1BhcmFtc0Nhc3QucHJvdmlkZXIgYXMgc3RyaW5nO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pbnN0YW5jZVR5cGVzW3Byb3ZpZGVyXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmluc3RhbmNlVHlwZXNbcHJvdmlkZXJdLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhpcy5pbnN0YW5jZVR5cGVzW3Byb3ZpZGVyXSA9IGF3YWl0IHRoaXMuc3VwcG9ydGVkSW5zdGFuY2VzTGlzdChcbiAgICAgICAgcHJvdmlkZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCdpbnN0YW5jZS10eXBlJyBpbiBzdGF0aWNQYXJhbXNDYXN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmluc3RhbmNlVHlwZXNbcHJvdmlkZXJdLmluY2x1ZGVzKFxuICAgICAgICAgIHN0YXRpY1BhcmFtc0Nhc3RbJ2luc3RhbmNlLXR5cGUnXSBhcyBzdHJpbmdcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW1wcm9wZXIgY29uZmlndXJlOiBJbnZhbGlkICdpbnN0YW5jZS10eXBlJyBwYXJhbWV0ZXI6ICcke1xuICAgICAgICAgICAgc3RhdGljUGFyYW1zQ2FzdFsnaW5zdGFuY2UtdHlwZSddXG4gICAgICAgICAgfScuIFZhbGlkIHZhbHVlcyBhcmUgOiAke3RoaXMuaW5zdGFuY2VUeXBlc1twcm92aWRlcl0uam9pbignLCAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVQcm92aWRlcihzdGF0aWNQYXJhbXNDYXN0OiBvYmplY3QpIHtcbiAgICBpZiAoISgncHJvdmlkZXInIGluIHN0YXRpY1BhcmFtc0Nhc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBwcm92aWRlciBwYXJhbWV0ZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3VwcG9ydGVkUHJvdmlkZXJzID0gYXdhaXQgdGhpcy5zdXBwb3J0ZWRQcm92aWRlcnNMaXN0KCk7XG5cbiAgICAgIGlmICghc3VwcG9ydGVkUHJvdmlkZXJzLmluY2x1ZGVzKHN0YXRpY1BhcmFtc0Nhc3QucHJvdmlkZXIgYXMgc3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJJbXByb3BlciBjb25maWd1cmU6IEludmFsaWQgcHJvdmlkZXIgcGFyYW1ldGVyOiAnXCIgK1xuICAgICAgICAgICAgc3RhdGljUGFyYW1zQ2FzdC5wcm92aWRlciArXG4gICAgICAgICAgICBcIicuIFZhbGlkIHZhbHVlcyBhcmUgOiBcIiArXG4gICAgICAgICAgICBzdXBwb3J0ZWRQcm92aWRlcnMuam9pbignLCAnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN1cHBvcnRlZEluc3RhbmNlc0xpc3QocHJvdmlkZXI6IHN0cmluZykge1xuICAgIGNvbnN0IGluc3RhbmNlcyA9IGF3YWl0IGF4aW9zLmdldChcbiAgICAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2UvYWxsX2luc3RhbmNlcz9wcm92aWRlcj0ke3Byb3ZpZGVyfWBcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcy5kYXRhO1xuICB9XG5cbiAgYXN5bmMgc3VwcG9ydGVkUHJvdmlkZXJzTGlzdCgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgJ2h0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZS9hbGxfcHJvdmlkZXJzJ1xuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMuZGF0YSk7XG4gIH1cblxuICBhc3luYyBmZXRjaERhdGEodXNhZ2VEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGlmICh0aGlzLnNoYXJlZFBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIGNvbmZpZ3VyZTogTWlzc2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhQ2FzdCA9IHRoaXMuc2hhcmVkUGFyYW1zIGFzIEtleVZhbHVlUGFpcjtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhQ2FzdCkge1xuICAgICAgLy8gICByZXBsYWNlIC0gd2l0aCBfIGluIGtleXNcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICBjb25zdCBuZXdLZXkgPSBrZXkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgICAgICBkYXRhQ2FzdFtuZXdLZXldID0gZGF0YUNhc3Rba2V5XTtcbiAgICAgICAgZGVsZXRlIGRhdGFDYXN0W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGRhdGFDYXN0Wyd1c2FnZSddID0gdXNhZ2VEYXRhO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgIGBodHRwczovL2FwaS5ib2F2aXp0YS5vcmcvdjEvY2xvdWQvaW5zdGFuY2U/dmVyYm9zZT0ke3RoaXMudmVyYm9zZX0mZHVyYXRpb249JHtkYXRhQ2FzdFsndXNhZ2UnXVsnaG91cnNfdXNlX3RpbWUnXX1gLFxuICAgICAgZGF0YUNhc3RcbiAgICApO1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYGh0dHBzOi8vYXBpLmJvYXZpenRhLm9yZy92MS9jbG91ZC9pbnN0YW5jZT92ZXJib3NlPSR7dGhpcy52ZXJib3NlfSZkdXJhdGlvbj0ke2RhdGFDYXN0Wyd1c2FnZSddWydob3Vyc191c2VfdGltZSddfWAsXG4gICAgLy8gICBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5kYXRhKSxcbiAgICAvLyAgIGRhdGFDYXN0XG4gICAgLy8gKTtcblxuICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlKHJlc3BvbnNlLmRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhcHR1cmVTdGF0aWNQYXJhbXMoc3RhdGljUGFyYW1zOiBvYmplY3QpIHtcbiAgICBpZiAoJ3ZlcmJvc2UnIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy52ZXJib3NlID0gKHN0YXRpY1BhcmFtcy52ZXJib3NlIGFzIGJvb2xlYW4pID8/IGZhbHNlO1xuICAgICAgc3RhdGljUGFyYW1zLnZlcmJvc2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIGlmIG5vIHZhbGlkIHByb3ZpZGVyIGZvdW5kLCB0aHJvdyBlcnJvclxuICAgIGF3YWl0IHRoaXMudmFsaWRhdGVQcm92aWRlcihzdGF0aWNQYXJhbXMpO1xuICAgIC8vIGlmIG5vIHZhbGlkICdpbnN0YW5jZS10eXBlJyBmb3VuZCwgdGhyb3cgZXJyb3JcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlSW5zdGFuY2VUeXBlKHN0YXRpY1BhcmFtcyk7XG4gICAgLy8gaWYgbm8gdmFsaWQgbG9jYXRpb24gZm91bmQsIHRocm93IGVycm9yXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUxvY2F0aW9uKHN0YXRpY1BhcmFtcyk7XG5cbiAgICBpZiAoJ2V4cGVjdGVkLWxpZmVzcGFuJyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMuZXhwZWN0ZWRMaWZlc3BhbiA9IHN0YXRpY1BhcmFtc1snZXhwZWN0ZWQtbGlmZXNwYW4nXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0aWNQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkUGFyYW1zO1xuICB9XG59XG5cbi8qKlxuICogRm9yIEpTSUkuXG4gKi9cbmV4cG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7Qm9hdml6dGFJbnN0YW5jZVR5cGVzLCBJQm9hdml6dGFVc2FnZVNDSX0gZnJvbSAnLi4vLi4vdHlwZXMvYm9hdml6dGEnO1xuZXhwb3J0IHtLZXlWYWx1ZVBhaXJ9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG4iXX0=
@@ -1,29 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export declare class EAvevaModel implements IOutputModelInterface {
3
- authParams: object | undefined;
4
- name: string | undefined;
5
- staticParams: object | undefined;
6
- /**
7
- * Defined for compatibility. Not used here.
8
- */
9
- authenticate(authParams: object): void;
10
- /**
11
- * Configures the Aveva Plugin for IEF
12
- * @param {string} name name of the resource
13
- * @param {Object} staticParams static parameters for the resource
14
- */
15
- configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
16
- /**
17
- * Calculate the total emissions for a list of inputs.
18
- * Each input require:
19
- * @param {Object[]} inputs
20
- * @param {number} inputs[].time time to normalize to in hours
21
- * @param {number} inputs[].pb baseline power
22
- * @param {number} inputs[].pl measured power
23
- */
24
- execute(inputs: object | object[] | undefined): Promise<any[]>;
25
- /**
26
- * Returns model identifier
27
- */
28
- modelIdentifier(): string;
29
- }
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EAvevaModel = void 0;
4
- const config_1 = require("../../config");
5
- const { MODEL_IDS } = config_1.CONFIG;
6
- const { AVEVA } = MODEL_IDS;
7
- class EAvevaModel {
8
- /**
9
- * Defined for compatibility. Not used here.
10
- */
11
- authenticate(authParams) {
12
- this.authParams = authParams;
13
- }
14
- /**
15
- * Configures the Aveva Plugin for IEF
16
- * @param {string} name name of the resource
17
- * @param {Object} staticParams static parameters for the resource
18
- */
19
- async configure(name, staticParams = undefined) {
20
- this.name = name;
21
- this.staticParams = staticParams;
22
- return this;
23
- }
24
- /**
25
- * Calculate the total emissions for a list of inputs.
26
- * Each input require:
27
- * @param {Object[]} inputs
28
- * @param {number} inputs[].time time to normalize to in hours
29
- * @param {number} inputs[].pb baseline power
30
- * @param {number} inputs[].pl measured power
31
- */
32
- async execute(inputs) {
33
- if (inputs === undefined) {
34
- throw new Error('Required Parameters not provided');
35
- }
36
- else if (!Array.isArray(inputs)) {
37
- throw new Error('inputs must be an array');
38
- }
39
- return inputs.map(input => {
40
- input['energy-cpu'] =
41
- ((input['pl'] - input['pb']) * input['time']) / 1000;
42
- return input;
43
- });
44
- }
45
- /**
46
- * Returns model identifier
47
- */
48
- modelIdentifier() {
49
- return AVEVA;
50
- }
51
- }
52
- exports.EAvevaModel = EAvevaModel;
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZldmEtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Nhc2Utc3R1ZGllcy9hdmV2YS1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx5Q0FBb0M7QUFFcEMsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUMzQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsU0FBUyxDQUFDO0FBRTFCLE1BQWEsV0FBVztJQUt0Qjs7T0FFRztJQUNILFlBQVksQ0FBQyxVQUFrQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUM7UUFDakQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNqQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUV2RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBeERELGtDQXdEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SU91dHB1dE1vZGVsSW50ZXJmYWNlfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtDT05GSUd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge0FWRVZBfSA9IE1PREVMX0lEUztcblxuZXhwb3J0IGNsYXNzIEVBdmV2YU1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkOyAvLyBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiBBdmV2YS5cbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkOyAvLyBuYW1lIG9mIHRoZSBkYXRhIHNvdXJjZVxuICBzdGF0aWNQYXJhbXM6IG9iamVjdCB8IHVuZGVmaW5lZDsgLy8gRGVmaW5lZCBmb3IgY29tcGF0aWJpbGl0eS4gTm90IHVzZWQgaW4gQXZldmEuXG5cbiAgLyoqXG4gICAqIERlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkuIE5vdCB1c2VkIGhlcmUuXG4gICAqL1xuICBhdXRoZW50aWNhdGUoYXV0aFBhcmFtczogb2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5hdXRoUGFyYW1zID0gYXV0aFBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHRoZSBBdmV2YSBQbHVnaW4gZm9yIElFRlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGljUGFyYW1zIHN0YXRpYyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVzb3VyY2VcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhdGljUGFyYW1zID0gc3RhdGljUGFyYW1zO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBlbWlzc2lvbnMgZm9yIGEgbGlzdCBvZiBpbnB1dHMuXG4gICAqIEVhY2ggaW5wdXQgcmVxdWlyZTpcbiAgICogQHBhcmFtIHtPYmplY3RbXX0gaW5wdXRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS50aW1lIHRpbWUgdG8gbm9ybWFsaXplIHRvIGluIGhvdXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnB1dHNbXS5wYiBiYXNlbGluZSBwb3dlclxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10ucGwgbWVhc3VyZWQgcG93ZXJcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICBpbnB1dFsnZW5lcmd5LWNwdSddID1cbiAgICAgICAgKChpbnB1dFsncGwnXSAtIGlucHV0WydwYiddKSAqIGlucHV0Wyd0aW1lJ10pIC8gMTAwMDtcblxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiBBVkVWQTtcbiAgfVxufVxuIl19
@@ -1,42 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export declare class EMemModel implements IOutputModelInterface {
3
- authParams: object | undefined;
4
- name: string | undefined;
5
- memoryAllocation: number;
6
- memoryEnergy: number;
7
- /**
8
- * Defined for compatibility. Not used.
9
- */
10
- authenticate(authParams: object): void;
11
- /**
12
- * Configures the Plugin for IEF
13
- * @param {string} name name of the resource
14
- * @param {Object} staticParams static parameters for the resource
15
- * @param {number} staticParams.thermal-design-power Thermal Design Power in Watts
16
- * @param {Interpolation} staticParams.interpolation Interpolation method
17
- */
18
- configure(name: string, staticParams?: object | undefined): Promise<IOutputModelInterface>;
19
- /**
20
- * Calculate the total emissions for a list of inputs.
21
- *
22
- * Each input require:
23
- * @param {Object[]} inputs
24
- * @param {string} inputs[].timestamp RFC3339 timestamp string
25
- * @param {number} inputs[].mem-util percentage mem usage
26
- */
27
- execute(inputs: object | object[] | undefined): Promise<any[]>;
28
- /**
29
- * Returns model identifier
30
- */
31
- modelIdentifier(): string;
32
- /**
33
- * Calculates the energy consumption for a single input
34
- * requires
35
- *
36
- * mem-util: ram usage in percentage
37
- * timestamp: RFC3339 timestamp string
38
- *
39
- * multiplies memory used (GB) by a coefficient (wh/GB) and converts to kwh
40
- */
41
- private calculateEnergy;
42
- }
@@ -1,93 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EMemModel = void 0;
4
- const config_1 = require("../../config");
5
- const { MODEL_IDS } = config_1.CONFIG;
6
- const { EMEM } = MODEL_IDS;
7
- class EMemModel {
8
- constructor() {
9
- this.memoryAllocation = 0;
10
- this.memoryEnergy = 0;
11
- }
12
- /**
13
- * Defined for compatibility. Not used.
14
- */
15
- authenticate(authParams) {
16
- this.authParams = authParams;
17
- }
18
- /**
19
- * Configures the Plugin for IEF
20
- * @param {string} name name of the resource
21
- * @param {Object} staticParams static parameters for the resource
22
- * @param {number} staticParams.thermal-design-power Thermal Design Power in Watts
23
- * @param {Interpolation} staticParams.interpolation Interpolation method
24
- */
25
- async configure(name, staticParams = undefined) {
26
- this.name = name;
27
- if (staticParams === undefined) {
28
- throw new Error('Required Parameters not provided');
29
- }
30
- if ('mem-alloc' in staticParams) {
31
- this.memoryAllocation = staticParams['mem-alloc'];
32
- }
33
- if ('mem-energy' in staticParams) {
34
- this.memoryEnergy = staticParams['mem-energy'];
35
- }
36
- return this;
37
- }
38
- /**
39
- * Calculate the total emissions for a list of inputs.
40
- *
41
- * Each input require:
42
- * @param {Object[]} inputs
43
- * @param {string} inputs[].timestamp RFC3339 timestamp string
44
- * @param {number} inputs[].mem-util percentage mem usage
45
- */
46
- async execute(inputs) {
47
- if (inputs === undefined) {
48
- throw new Error('Required Parameters not provided');
49
- }
50
- else if (!Array.isArray(inputs)) {
51
- throw new Error('inputs must be an array');
52
- }
53
- return inputs.map((input) => {
54
- this.configure(this.name, input);
55
- input['energy-memory'] = this.calculateEnergy(input);
56
- return input;
57
- });
58
- }
59
- /**
60
- * Returns model identifier
61
- */
62
- modelIdentifier() {
63
- return EMEM;
64
- }
65
- /**
66
- * Calculates the energy consumption for a single input
67
- * requires
68
- *
69
- * mem-util: ram usage in percentage
70
- * timestamp: RFC3339 timestamp string
71
- *
72
- * multiplies memory used (GB) by a coefficient (wh/GB) and converts to kwh
73
- */
74
- calculateEnergy(input) {
75
- if (!('mem-util' in input) || !('timestamp' in input)) {
76
- throw new Error('Required Parameters duration,cpu-util,timestamp not provided for input');
77
- }
78
- if (this.memoryAllocation === 0) {
79
- throw new Error('Required Parameter: mem-alloc not provided in configure');
80
- }
81
- if (this.memoryEnergy === 0) {
82
- throw new Error('Required Parameter: mem-energy not provided in configure');
83
- }
84
- const mem_alloc = this.memoryAllocation;
85
- const mem_util = input['mem-util']; // convert cpu usage to percentage
86
- if (mem_util < 0 || mem_util > 100) {
87
- throw new Error('cpu usage must be between 0 and 100');
88
- }
89
- return (mem_alloc * (mem_util / 100) * this.memoryEnergy) / 1000;
90
- }
91
- }
92
- exports.EMemModel = EMemModel;
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1lbS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY2FzZS1zdHVkaWVzL2VtZW0tbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQW9DO0FBSXBDLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDM0IsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLFNBQVMsQ0FBQztBQUV6QixNQUFhLFNBQVM7SUFBdEI7UUFHRSxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDckIsaUJBQVksR0FBRyxDQUFDLENBQUM7SUF3R25CLENBQUM7SUF0R0M7O09BRUc7SUFDSCxZQUFZLENBQUMsVUFBa0I7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBWSxFQUNaLGVBQW1DLFNBQVM7UUFFNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksV0FBVyxJQUFJLFlBQVksRUFBRTtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBVyxDQUFDO1NBQzdEO1FBRUQsSUFBSSxZQUFZLElBQUksWUFBWSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBVyxDQUFDO1NBQzFEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUM7UUFDakQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGVBQWUsQ0FBQyxLQUFtQjtRQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLHdFQUF3RSxDQUN6RSxDQUFDO1NBQ0g7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsQ0FDMUQsQ0FBQztTQUNIO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxDQUMzRCxDQUFDO1NBQ0g7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBRXRFLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRSxDQUFDO0NBQ0Y7QUE1R0QsOEJBNEdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJT3V0cHV0TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQge0NPTkZJR30gZnJvbSAnLi4vLi4vY29uZmlnJztcblxuaW1wb3J0IHtLZXlWYWx1ZVBhaXJ9IGZyb20gJy4uLy4uL3R5cGVzL2NvbW1vbic7XG5cbmNvbnN0IHtNT0RFTF9JRFN9ID0gQ09ORklHO1xuY29uc3Qge0VNRU19ID0gTU9ERUxfSURTO1xuXG5leHBvcnQgY2xhc3MgRU1lbU1vZGVsIGltcGxlbWVudHMgSU91dHB1dE1vZGVsSW50ZXJmYWNlIHtcbiAgYXV0aFBhcmFtczogb2JqZWN0IHwgdW5kZWZpbmVkOyAvLyBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZCBpbiB0aGlzLlxuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlXG4gIG1lbW9yeUFsbG9jYXRpb24gPSAwO1xuICBtZW1vcnlFbmVyZ3kgPSAwO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiBOb3QgdXNlZC5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShhdXRoUGFyYW1zOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhQYXJhbXMgPSBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIFBsdWdpbiBmb3IgSUVGXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0aWNQYXJhbXMgc3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdGljUGFyYW1zLnRoZXJtYWwtZGVzaWduLXBvd2VyIFRoZXJtYWwgRGVzaWduIFBvd2VyIGluIFdhdHRzXG4gICAqIEBwYXJhbSB7SW50ZXJwb2xhdGlvbn0gc3RhdGljUGFyYW1zLmludGVycG9sYXRpb24gSW50ZXJwb2xhdGlvbiBtZXRob2RcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhdGljUGFyYW1zOiBvYmplY3QgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxJT3V0cHV0TW9kZWxJbnRlcmZhY2U+IHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgaWYgKHN0YXRpY1BhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFBhcmFtZXRlcnMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCdtZW0tYWxsb2MnIGluIHN0YXRpY1BhcmFtcykge1xuICAgICAgdGhpcy5tZW1vcnlBbGxvY2F0aW9uID0gc3RhdGljUGFyYW1zWydtZW0tYWxsb2MnXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgaWYgKCdtZW0tZW5lcmd5JyBpbiBzdGF0aWNQYXJhbXMpIHtcbiAgICAgIHRoaXMubWVtb3J5RW5lcmd5ID0gc3RhdGljUGFyYW1zWydtZW0tZW5lcmd5J10gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgdG90YWwgZW1pc3Npb25zIGZvciBhIGxpc3Qgb2YgaW5wdXRzLlxuICAgKlxuICAgKiBFYWNoIGlucHV0IHJlcXVpcmU6XG4gICAqIEBwYXJhbSB7T2JqZWN0W119IGlucHV0c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRzW10udGltZXN0YW1wIFJGQzMzMzkgdGltZXN0YW1wIHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5wdXRzW10ubWVtLXV0aWwgcGVyY2VudGFnZSBtZW0gdXNhZ2VcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoaW5wdXRzOiBvYmplY3QgfCBvYmplY3RbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8YW55W10+IHtcbiAgICBpZiAoaW5wdXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgUGFyYW1ldGVycyBub3QgcHJvdmlkZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQ6IEtleVZhbHVlUGFpcikgPT4ge1xuICAgICAgdGhpcy5jb25maWd1cmUodGhpcy5uYW1lISwgaW5wdXQpO1xuICAgICAgaW5wdXRbJ2VuZXJneS1tZW1vcnknXSA9IHRoaXMuY2FsY3VsYXRlRW5lcmd5KGlucHV0KTtcblxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbW9kZWwgaWRlbnRpZmllclxuICAgKi9cbiAgbW9kZWxJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVNRU07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIGZvciBhIHNpbmdsZSBpbnB1dFxuICAgKiByZXF1aXJlc1xuICAgKlxuICAgKiBtZW0tdXRpbDogcmFtIHVzYWdlIGluIHBlcmNlbnRhZ2VcbiAgICogdGltZXN0YW1wOiBSRkMzMzM5IHRpbWVzdGFtcCBzdHJpbmdcbiAgICpcbiAgICogbXVsdGlwbGllcyBtZW1vcnkgdXNlZCAoR0IpIGJ5IGEgY29lZmZpY2llbnQgKHdoL0dCKSBhbmQgY29udmVydHMgdG8ga3doXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUVuZXJneShpbnB1dDogS2V5VmFsdWVQYWlyKSB7XG4gICAgaWYgKCEoJ21lbS11dGlsJyBpbiBpbnB1dCkgfHwgISgndGltZXN0YW1wJyBpbiBpbnB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcnMgZHVyYXRpb24sY3B1LXV0aWwsdGltZXN0YW1wIG5vdCBwcm92aWRlZCBmb3IgaW5wdXQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lbW9yeUFsbG9jYXRpb24gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVpcmVkIFBhcmFtZXRlcjogbWVtLWFsbG9jIG5vdCBwcm92aWRlZCBpbiBjb25maWd1cmUnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lbW9yeUVuZXJneSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVxdWlyZWQgUGFyYW1ldGVyOiBtZW0tZW5lcmd5IG5vdCBwcm92aWRlZCBpbiBjb25maWd1cmUnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbV9hbGxvYyA9IHRoaXMubWVtb3J5QWxsb2NhdGlvbjtcbiAgICBjb25zdCBtZW1fdXRpbCA9IGlucHV0WydtZW0tdXRpbCddOyAvLyBjb252ZXJ0IGNwdSB1c2FnZSB0byBwZXJjZW50YWdlXG5cbiAgICBpZiAobWVtX3V0aWwgPCAwIHx8IG1lbV91dGlsID4gMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NwdSB1c2FnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChtZW1fYWxsb2MgKiAobWVtX3V0aWwgLyAxMDApICogdGhpcy5tZW1vcnlFbmVyZ3kpIC8gMTAwMDtcbiAgfVxufVxuIl19
@@ -1,24 +0,0 @@
1
- import { IOutputModelInterface } from '../interfaces';
2
- export { KeyValuePair } from '../../types/common';
3
- export declare class EshoppenModel implements IOutputModelInterface {
4
- authParams: object | undefined;
5
- modelType: 'energy-cpu' | 'energy-memory' | 'energy-network' | 'e-sum';
6
- staticParams: object | undefined;
7
- name: string | undefined;
8
- authenticate(authParams: object): void;
9
- execute(inputs: object | object[] | undefined): Promise<any[]>;
10
- configure(name: string, staticParams: object | undefined): Promise<IOutputModelInterface>;
11
- modelIdentifier(): string;
12
- }
13
- export declare class EshoppenCpuModel extends EshoppenModel {
14
- constructor();
15
- modelIdentifier(): string;
16
- }
17
- export declare class EshoppenMemModel extends EshoppenModel {
18
- constructor();
19
- modelIdentifier(): string;
20
- }
21
- export declare class EshoppenNetModel extends EshoppenModel {
22
- constructor();
23
- modelIdentifier(): string;
24
- }