@lynxwall/cucumber-tsflow 5.1.2 → 6.0.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 (99) hide show
  1. package/README.md +544 -544
  2. package/bin/cucumber-tsflow +1 -1
  3. package/lib/behave.d.ts +1 -1
  4. package/lib/behave.js +27 -27
  5. package/lib/cli/argv-parser.d.ts +24 -24
  6. package/lib/cli/argv-parser.js +103 -103
  7. package/lib/cli/index.d.ts +22 -22
  8. package/lib/cli/index.js +101 -96
  9. package/lib/cli/load-configuration.d.ts +20 -20
  10. package/lib/cli/load-configuration.js +92 -92
  11. package/lib/cli/run.d.ts +1 -1
  12. package/lib/cli/run.js +49 -44
  13. package/lib/cucumber/binding-decorator.d.ts +10 -10
  14. package/lib/cucumber/binding-decorator.js +180 -180
  15. package/lib/cucumber/binding-registry.d.ts +82 -82
  16. package/lib/cucumber/binding-registry.js +216 -218
  17. package/lib/cucumber/hook-decorators.d.ts +46 -46
  18. package/lib/cucumber/hook-decorators.js +102 -102
  19. package/lib/cucumber/managed-scenario-context.d.ts +21 -21
  20. package/lib/cucumber/managed-scenario-context.js +96 -95
  21. package/lib/cucumber/message-collector.d.ts +81 -80
  22. package/lib/cucumber/message-collector.js +251 -241
  23. package/lib/cucumber/parallel/coordinator.d.ts +79 -78
  24. package/lib/cucumber/parallel/coordinator.js +247 -228
  25. package/lib/cucumber/parallel/run-worker.d.ts +1 -1
  26. package/lib/cucumber/parallel/run-worker.js +31 -31
  27. package/lib/cucumber/parallel/worker.d.ts +30 -31
  28. package/lib/cucumber/parallel/worker.js +104 -104
  29. package/lib/cucumber/run-cucumber.d.ts +14 -14
  30. package/lib/cucumber/run-cucumber.js +117 -117
  31. package/lib/cucumber/runtime.d.ts +25 -25
  32. package/lib/cucumber/runtime.js +39 -39
  33. package/lib/cucumber/step-definition-decorators.d.ts +24 -24
  34. package/lib/cucumber/step-definition-decorators.js +91 -91
  35. package/lib/cucumber/utils.d.ts +16 -16
  36. package/lib/cucumber/utils.js +77 -77
  37. package/lib/esnode.js +19 -19
  38. package/lib/esvue.d.ts +1 -1
  39. package/lib/esvue.js +41 -41
  40. package/lib/formatters/behave-json-formatter.d.ts +49 -49
  41. package/lib/formatters/behave-json-formatter.js +75 -75
  42. package/lib/formatters/tsflow-snippet-syntax.d.ts +9 -9
  43. package/lib/formatters/tsflow-snippet-syntax.js +90 -93
  44. package/lib/gherkin/configuration.d.ts +30 -30
  45. package/lib/gherkin/configuration.js +26 -26
  46. package/lib/gherkin/gherkin-feature.d.ts +28 -28
  47. package/lib/gherkin/gherkin-feature.js +333 -335
  48. package/lib/gherkin/gherkin-manager.d.ts +29 -29
  49. package/lib/gherkin/gherkin-manager.js +114 -113
  50. package/lib/gherkin/models.d.ts +45 -45
  51. package/lib/gherkin/models.js +2 -2
  52. package/lib/index.d.ts +4 -4
  53. package/lib/index.js +22 -22
  54. package/lib/snippet.d.ts +1 -1
  55. package/lib/snippet.js +27 -27
  56. package/lib/transpilers/esbuild-transpiler.d.ts +4 -4
  57. package/lib/transpilers/esbuild-transpiler.js +19 -21
  58. package/lib/transpilers/esbuild.d.ts +12 -12
  59. package/lib/transpilers/esbuild.js +54 -54
  60. package/lib/transpilers/vue-sfc/compiler.d.ts +7 -7
  61. package/lib/transpilers/vue-sfc/compiler.js +21 -21
  62. package/lib/transpilers/vue-sfc/index.d.ts +23 -23
  63. package/lib/transpilers/vue-sfc/index.js +47 -45
  64. package/lib/transpilers/vue-sfc/main.d.ts +8 -8
  65. package/lib/transpilers/vue-sfc/main.js +248 -248
  66. package/lib/transpilers/vue-sfc/script.d.ts +5 -5
  67. package/lib/transpilers/vue-sfc/script.js +41 -41
  68. package/lib/transpilers/vue-sfc/template.d.ts +8 -8
  69. package/lib/transpilers/vue-sfc/template.js +102 -102
  70. package/lib/transpilers/vue-sfc/types.d.ts +55 -55
  71. package/lib/transpilers/vue-sfc/types.js +2 -2
  72. package/lib/transpilers/vue-sfc/utils/descriptorCache.d.ts +13 -13
  73. package/lib/transpilers/vue-sfc/utils/descriptorCache.js +67 -67
  74. package/lib/transpilers/vue-sfc/utils/error.d.ts +3 -3
  75. package/lib/transpilers/vue-sfc/utils/error.js +22 -22
  76. package/lib/transpilers/vue-sfc/utils/query.d.ts +13 -13
  77. package/lib/transpilers/vue-sfc/utils/query.js +35 -35
  78. package/lib/tsnode.js +17 -17
  79. package/lib/tsvue.d.ts +1 -1
  80. package/lib/tsvue.js +39 -39
  81. package/lib/types/scenario-context.d.ts +16 -16
  82. package/lib/types/scenario-context.js +17 -17
  83. package/lib/types/scenario-info.d.ts +16 -16
  84. package/lib/types/scenario-info.js +23 -21
  85. package/lib/types/step-binding-flags.d.ts +53 -53
  86. package/lib/types/step-binding-flags.js +58 -58
  87. package/lib/types/step-binding.d.ts +50 -50
  88. package/lib/types/step-binding.js +17 -17
  89. package/lib/types/types.d.ts +21 -21
  90. package/lib/types/types.js +2 -2
  91. package/lib/utils/helpers.d.ts +6 -6
  92. package/lib/utils/helpers.js +17 -17
  93. package/lib/utils/logger.d.ts +3 -3
  94. package/lib/utils/logger.js +29 -29
  95. package/lib/utils/our-callsite.d.ts +27 -27
  96. package/lib/utils/our-callsite.js +73 -71
  97. package/lib/version.d.ts +1 -1
  98. package/lib/version.js +5 -5
  99. package/package.json +57 -58
@@ -1,335 +1,333 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- const fs_1 = require("fs");
27
- const glob_1 = require("glob");
28
- const messages = __importStar(require("@cucumber/messages"));
29
- const configuration_1 = require("./configuration");
30
- const src_1 = require("@cucumber/gherkin/dist/src");
31
- class GherkinFeature {
32
- constructor() {
33
- this.cwd = process.cwd();
34
- this.loadFeature = (featureFilePath, options) => {
35
- try {
36
- const featureText = (0, fs_1.readFileSync)(featureFilePath, 'utf8');
37
- return this.parseFeature(featureText, featureFilePath, options);
38
- }
39
- catch (err) {
40
- if (err.code === 'ENOENT') {
41
- throw new Error(`Feature file not found (${featureFilePath})`);
42
- }
43
- throw err;
44
- }
45
- };
46
- this.loadFeatures = (globPattern, options) => {
47
- const featureFiles = (0, glob_1.sync)(globPattern);
48
- return featureFiles.map(featureFilePath => this.loadFeature(featureFilePath, options));
49
- };
50
- this.parseFeature = (featureText, featureFilePath, options) => {
51
- let ast;
52
- options = (0, configuration_1.getJestCucumberConfiguration)(options);
53
- try {
54
- const builder = new src_1.AstBuilder(messages.IdGenerator.uuid());
55
- const matcher = new src_1.GherkinClassicTokenMatcher(); // or Gherkin.GherkinInMarkdownTokenMatcher()
56
- ast = new src_1.Parser(builder, matcher).parse(featureText);
57
- }
58
- catch (err) {
59
- throw new Error(`Error parsing feature Gherkin: ${err.message}`);
60
- }
61
- let astFeature = this.collapseRulesAndBackgrounds(ast.feature);
62
- if (astFeature.language !== 'en') {
63
- astFeature = this.translateKeywords(astFeature);
64
- }
65
- return {
66
- title: astFeature.name,
67
- featureFile: featureFilePath.replace(`${this.cwd}\\`, ''),
68
- scenarios: this.parseScenarios(astFeature),
69
- scenarioOutlines: this.parseScenarioOutlines(astFeature),
70
- tags: this.parseTags(astFeature),
71
- options
72
- };
73
- };
74
- this.parseDataTableRow = (astDataTableRow) => {
75
- return astDataTableRow.cells.map((col) => col.value);
76
- };
77
- this.parseDataTable = (astDataTable, astDataTableHeader) => {
78
- let headerRow;
79
- let bodyRows;
80
- if (astDataTableHeader) {
81
- headerRow = this.parseDataTableRow(astDataTableHeader);
82
- bodyRows = astDataTable;
83
- }
84
- else {
85
- headerRow = this.parseDataTableRow(astDataTable.rows[0]);
86
- bodyRows = astDataTable && astDataTable.rows && astDataTable.rows.length && astDataTable.rows.slice(1);
87
- }
88
- if (bodyRows && bodyRows.length > 0) {
89
- return bodyRows.map(nextRow => {
90
- const parsedRow = this.parseDataTableRow(nextRow);
91
- return parsedRow.reduce((rowObj, nextCol, index) => {
92
- return {
93
- ...rowObj,
94
- [headerRow[index]]: nextCol
95
- };
96
- }, {});
97
- });
98
- }
99
- else {
100
- return [];
101
- }
102
- };
103
- this.parseStepArgument = (astStep) => {
104
- if (astStep) {
105
- switch (astStep.argument) {
106
- case 'dataTable':
107
- return this.parseDataTable(astStep.dataTable);
108
- case 'docString':
109
- return astStep.docString.content;
110
- default:
111
- return null;
112
- }
113
- }
114
- else {
115
- return null;
116
- }
117
- };
118
- this.parseStep = (astStep) => {
119
- return {
120
- stepText: astStep.text,
121
- keyword: astStep.keyword.trim().toLowerCase(),
122
- stepArgument: this.parseStepArgument(astStep),
123
- lineNumber: astStep.location.line
124
- };
125
- };
126
- this.parseSteps = (astScenario) => {
127
- return astScenario.steps.map((astStep) => this.parseStep(astStep));
128
- };
129
- this.parseTags = (ast) => {
130
- if (!ast.tags) {
131
- return [];
132
- }
133
- else {
134
- return ast.tags.map((tag) => tag.name);
135
- }
136
- };
137
- this.parseScenario = (astScenario, astFeature) => {
138
- return {
139
- title: astScenario.name,
140
- steps: this.parseSteps(astScenario),
141
- tags: [...this.parseTags(astFeature), ...this.parseTags(astScenario)],
142
- lineNumber: astScenario.location.line,
143
- scenarioContext: undefined
144
- };
145
- };
146
- this.parseScenarioOutlineExampleSteps = (exampleTableRow, scenarioSteps) => {
147
- return scenarioSteps.map(scenarioStep => {
148
- const stepText = Object.keys(exampleTableRow).reduce((processedStepText, nextTableColumn) => {
149
- return processedStepText.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
150
- }, scenarioStep.stepText);
151
- let stepArgument = '';
152
- if (scenarioStep.stepArgument) {
153
- if (Array.isArray(scenarioStep.stepArgument)) {
154
- stepArgument = scenarioStep.stepArgument.map((stepArgumentRow) => {
155
- const modifiedStepArgumentRow = { ...stepArgumentRow };
156
- Object.keys(exampleTableRow).forEach(nextTableColumn => {
157
- Object.keys(modifiedStepArgumentRow).forEach(prop => {
158
- modifiedStepArgumentRow[prop] = modifiedStepArgumentRow[prop].replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
159
- });
160
- });
161
- return modifiedStepArgumentRow;
162
- });
163
- }
164
- else {
165
- stepArgument = scenarioStep.stepArgument;
166
- if (typeof scenarioStep.stepArgument === 'string' || scenarioStep.stepArgument instanceof String) {
167
- Object.keys(exampleTableRow).forEach(nextTableColumn => {
168
- stepArgument = stepArgument.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
169
- });
170
- }
171
- }
172
- }
173
- return {
174
- ...scenarioStep,
175
- stepText,
176
- stepArgument
177
- };
178
- });
179
- };
180
- this.getOutlineDynamicTitle = (exampleTableRow, title) => {
181
- return title.replace(/<(\S*)>/g, (_, firstMatch) => {
182
- return exampleTableRow[firstMatch || ''];
183
- });
184
- };
185
- this.parseScenarioOutlineExample = (exampleTableRow, outlineScenario, exampleSetTags) => {
186
- return {
187
- title: this.getOutlineDynamicTitle(exampleTableRow, outlineScenario.title),
188
- steps: this.parseScenarioOutlineExampleSteps(exampleTableRow, outlineScenario.steps),
189
- tags: Array.from(new Set([...outlineScenario.tags, ...exampleSetTags]))
190
- };
191
- };
192
- this.parseScenarioOutlineExampleSet = (astExampleSet, outlineScenario) => {
193
- const exampleTable = this.parseDataTable(astExampleSet.tableBody, astExampleSet.tableHeader);
194
- return exampleTable.map(tableRow => this.parseScenarioOutlineExample(tableRow, outlineScenario, this.parseTags(astExampleSet)));
195
- };
196
- this.parseScenarioOutlineExampleSets = (astExampleSets, outlineScenario) => {
197
- const exampleSets = astExampleSets.map((astExampleSet) => {
198
- return this.parseScenarioOutlineExampleSet(astExampleSet, outlineScenario);
199
- });
200
- return exampleSets.reduce((scenarios, nextExampleSet) => {
201
- return [...scenarios, ...nextExampleSet];
202
- }, []);
203
- };
204
- this.parseScenarioOutline = (astScenarioOutline, astFeature) => {
205
- const outlineScenario = this.parseScenario(astScenarioOutline.scenario, astFeature);
206
- return {
207
- title: outlineScenario.title,
208
- scenarios: this.parseScenarioOutlineExampleSets(astScenarioOutline.scenario.examples, outlineScenario),
209
- tags: outlineScenario.tags,
210
- steps: outlineScenario.steps,
211
- lineNumber: astScenarioOutline.scenario.location.line,
212
- scenarioContext: undefined
213
- };
214
- };
215
- this.parseScenarios = (astFeature) => {
216
- return astFeature.children
217
- .filter((child) => {
218
- const keywords = ['Scenario Outline', 'Scenario Template'];
219
- return child.scenario && keywords.indexOf(child.scenario.keyword) === -1;
220
- })
221
- .map((astScenario) => this.parseScenario(astScenario.scenario, astFeature));
222
- };
223
- this.parseScenarioOutlines = (astFeature) => {
224
- return astFeature.children
225
- .filter((child) => {
226
- const keywords = ['Scenario Outline', 'Scenario Template'];
227
- return child.scenario && keywords.indexOf(child.scenario.keyword) !== -1;
228
- })
229
- .map((astScenarioOutline) => this.parseScenarioOutline(astScenarioOutline, astFeature));
230
- };
231
- this.collapseBackgrounds = (astChildren, backgrounds) => {
232
- const backgroundSteps = backgrounds.reduce((allBackgroundSteps, nextBackground) => {
233
- return [...allBackgroundSteps, ...nextBackground.steps];
234
- }, []);
235
- astChildren.forEach(child => {
236
- if (child.scenario) {
237
- child.scenario.steps = [...backgroundSteps, ...child.scenario.steps];
238
- }
239
- });
240
- return astChildren;
241
- };
242
- this.parseBackgrounds = (ast) => {
243
- return ast.children.filter((child) => child.background).map((child) => child.background);
244
- };
245
- this.collapseRulesAndBackgrounds = (astFeature) => {
246
- const featureBackgrounds = this.parseBackgrounds(astFeature);
247
- const children = this.collapseBackgrounds(astFeature.children, featureBackgrounds).reduce((newChildren, nextChild) => {
248
- if (nextChild.rule) {
249
- const rule = nextChild.rule;
250
- const ruleBackgrounds = this.parseBackgrounds(rule);
251
- return [
252
- ...newChildren,
253
- ...this.collapseBackgrounds(rule.children, [...featureBackgrounds, ...ruleBackgrounds])
254
- ];
255
- }
256
- else {
257
- return [...newChildren, nextChild];
258
- }
259
- }, []);
260
- return {
261
- ...astFeature,
262
- children
263
- };
264
- };
265
- this.createTranslationMap = (translateDialect) => {
266
- const englishDialect = src_1.dialects.en;
267
- const translationMap = {};
268
- const props = [
269
- 'and',
270
- 'background',
271
- 'but',
272
- 'examples',
273
- 'feature',
274
- 'given',
275
- 'scenario',
276
- 'scenarioOutline',
277
- 'then',
278
- 'when',
279
- 'rule'
280
- ];
281
- for (const prop of props) {
282
- const dialectWords = translateDialect[prop];
283
- const translationWords = englishDialect[prop];
284
- let index = 0;
285
- let defaultWordIndex = null;
286
- for (const dialectWord of dialectWords) {
287
- // skip "* " word
288
- if (dialectWord.indexOf('*') !== 0) {
289
- if (translationWords[index] !== undefined) {
290
- translationMap[dialectWord] = translationWords[index];
291
- if (defaultWordIndex === null) {
292
- // set default when non is set yet
293
- defaultWordIndex = index;
294
- }
295
- }
296
- else {
297
- // index has undefined value, translate to default word
298
- if (defaultWordIndex !== null) {
299
- translationMap[dialectWord] = translationWords[defaultWordIndex];
300
- }
301
- else {
302
- throw new Error('No translation found for ' + dialectWord);
303
- }
304
- }
305
- }
306
- index++;
307
- }
308
- }
309
- return translationMap;
310
- };
311
- this.translateKeywords = (astFeature) => {
312
- const languageDialect = src_1.dialects[astFeature.language];
313
- const translationMap = this.createTranslationMap(languageDialect);
314
- astFeature.language = 'en';
315
- astFeature.keyword = translationMap[astFeature.keyword] || astFeature.keyword;
316
- for (const child of astFeature.children) {
317
- if (child.background) {
318
- child.background.keyword = translationMap[child.background.keyword] || child.background.keyword;
319
- }
320
- if (child.scenario) {
321
- child.scenario.keyword = translationMap[child.scenario.keyword] || child.scenario.keyword;
322
- for (const step of child.scenario.steps) {
323
- step.keyword = translationMap[step.keyword] || step.keyword;
324
- }
325
- for (const example of child.scenario.examples) {
326
- example.keyword = translationMap[example.keyword] || example.keyword;
327
- }
328
- }
329
- }
330
- return astFeature;
331
- };
332
- }
333
- }
334
- exports.default = GherkinFeature;
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2hlcmtpbi1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2doZXJraW4vZ2hlcmtpbi1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQkFBa0M7QUFDbEMsK0JBQXdDO0FBQ3hDLDZEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsb0RBQStHO0FBRy9HLE1BQXFCLGNBQWM7SUFBbkM7UUFDUyxRQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXJCLGdCQUFXLEdBQUcsQ0FBQyxlQUF1QixFQUFFLE9BQWlCLEVBQUUsRUFBRTtZQUNuRSxJQUFJO2dCQUNILE1BQU0sV0FBVyxHQUFXLElBQUEsaUJBQVksRUFBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2xFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ2hFO1lBQUMsT0FBTyxHQUFRLEVBQUU7Z0JBQ2xCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLGVBQWUsR0FBRyxDQUFDLENBQUM7aUJBQy9EO2dCQUVELE1BQU0sR0FBRyxDQUFDO2FBQ1Y7UUFDRixDQUFDLENBQUM7UUFFSyxpQkFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxPQUFpQixFQUFFLEVBQUU7WUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBQSxXQUFRLEVBQUMsV0FBVyxDQUFDLENBQUM7WUFFM0MsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUM7UUFFTSxpQkFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxlQUF1QixFQUFFLE9BQWlCLEVBQWlCLEVBQUU7WUFDekcsSUFBSSxHQUFRLENBQUM7WUFDYixPQUFPLEdBQUcsSUFBQSw0Q0FBNEIsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUVoRCxJQUFJO2dCQUNILE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksZ0NBQTBCLEVBQUUsQ0FBQyxDQUFDLDZDQUE2QztnQkFDL0YsR0FBRyxHQUFHLElBQUksWUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDdEQ7WUFBQyxPQUFPLEdBQVEsRUFBRTtnQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDakU7WUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRS9ELElBQUksVUFBVSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDaEQ7WUFFRCxPQUFPO2dCQUNOLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSTtnQkFDdEIsV0FBVyxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUN6RCxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQzFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztnQkFDaEMsT0FBTzthQUNVLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBRU0sc0JBQWlCLEdBQUcsQ0FBQyxlQUFvQixFQUFFLEVBQUU7WUFDcEQsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBYSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQztRQUVNLG1CQUFjLEdBQUcsQ0FBQyxZQUFpQixFQUFFLGtCQUF3QixFQUFFLEVBQUU7WUFDeEUsSUFBSSxTQUFtQixDQUFDO1lBQ3hCLElBQUksUUFBa0IsQ0FBQztZQUV2QixJQUFJLGtCQUFrQixFQUFFO2dCQUN2QixTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3ZELFFBQVEsR0FBRyxZQUFZLENBQUM7YUFDeEI7aUJBQU07Z0JBQ04sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELFFBQVEsR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RztZQUVELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFbEQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTt3QkFDbEQsT0FBTzs0QkFDTixHQUFHLE1BQU07NEJBQ1QsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPO3lCQUMzQixDQUFDO29CQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDUixDQUFDLENBQUMsQ0FBQzthQUNIO2lCQUFNO2dCQUNOLE9BQU8sRUFBRSxDQUFDO2FBQ1Y7UUFDRixDQUFDLENBQUM7UUFFTSxzQkFBaUIsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFO1lBQzVDLElBQUksT0FBTyxFQUFFO2dCQUNaLFFBQVEsT0FBTyxDQUFDLFFBQVEsRUFBRTtvQkFDekIsS0FBSyxXQUFXO3dCQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQy9DLEtBQUssV0FBVzt3QkFDZixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNsQzt3QkFDQyxPQUFPLElBQUksQ0FBQztpQkFDYjthQUNEO2lCQUFNO2dCQUNOLE9BQU8sSUFBSSxDQUFDO2FBQ1o7UUFDRixDQUFDLENBQUM7UUFFTSxjQUFTLEdBQUcsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUNwQyxPQUFPO2dCQUNOLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFZO2dCQUN2RCxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztnQkFDN0MsVUFBVSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTthQUNuQixDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQUVNLGVBQVUsR0FBRyxDQUFDLFdBQWdCLEVBQUUsRUFBRTtZQUN6QyxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDO1FBRU0sY0FBUyxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2QsT0FBTyxFQUFjLENBQUM7YUFDdEI7aUJBQU07Z0JBQ04sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVDO1FBQ0YsQ0FBQyxDQUFDO1FBRU0sa0JBQWEsR0FBRyxDQUFDLFdBQWdCLEVBQUUsVUFBZSxFQUFFLEVBQUU7WUFDN0QsT0FBTztnQkFDTixLQUFLLEVBQUUsV0FBVyxDQUFDLElBQUk7Z0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDckMsZUFBZSxFQUFFLFNBQVM7YUFDUixDQUFDO1FBQ3JCLENBQUMsQ0FBQztRQUVNLHFDQUFnQyxHQUFHLENBQUMsZUFBb0IsRUFBRSxhQUEyQixFQUFFLEVBQUU7WUFDaEcsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxFQUFFO29CQUMzRixPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLGVBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUxQixJQUFJLFlBQVksR0FBZ0IsRUFBRSxDQUFDO2dCQUVuQyxJQUFJLFlBQVksQ0FBQyxZQUFZLEVBQUU7b0JBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7d0JBQzdDLFlBQVksR0FBSSxZQUFZLENBQUMsWUFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFvQixFQUFFLEVBQUU7NEJBQzlFLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFDOzRCQUV2RCxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRTtnQ0FDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQ0FDbkQsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUNwRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLGVBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUN2QyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQ2hDLENBQUM7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NEJBQ0osQ0FBQyxDQUFDLENBQUM7NEJBRUgsT0FBTyx1QkFBdUIsQ0FBQzt3QkFDaEMsQ0FBQyxDQUFDLENBQUM7cUJBQ0g7eUJBQU07d0JBQ04sWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7d0JBRXpDLElBQUksT0FBTyxZQUFZLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsWUFBWSxZQUFZLE1BQU0sRUFBRTs0QkFDakcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0NBQ3RELFlBQVksR0FBSSxZQUF1QixDQUFDLE9BQU8sQ0FDOUMsSUFBSSxNQUFNLENBQUMsSUFBSSxlQUFlLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDdkMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUNoQyxDQUFDOzRCQUNILENBQUMsQ0FBQyxDQUFDO3lCQUNIO3FCQUNEO2lCQUNEO2dCQUVELE9BQU87b0JBQ04sR0FBRyxZQUFZO29CQUNmLFFBQVE7b0JBQ1IsWUFBWTtpQkFDRSxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRU0sMkJBQXNCLEdBQUcsQ0FBQyxlQUFvQixFQUFFLEtBQWEsRUFBRSxFQUFFO1lBQ3hFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQ2xELE9BQU8sZUFBZSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVNLGdDQUEyQixHQUFHLENBQ3JDLGVBQW9CLEVBQ3BCLGVBQStCLEVBQy9CLGNBQXdCLEVBQ3ZCLEVBQUU7WUFDSCxPQUFPO2dCQUNOLEtBQUssRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUM7Z0JBQzFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BGLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUM3RCxDQUFDO1FBQ3JCLENBQUMsQ0FBQztRQUVNLG1DQUE4QixHQUFHLENBQUMsYUFBa0IsRUFBRSxlQUErQixFQUFFLEVBQUU7WUFDaEcsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU3RixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FDbEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUMxRixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRU0sb0NBQStCLEdBQUcsQ0FBQyxjQUFtQixFQUFFLGVBQStCLEVBQUUsRUFBRTtZQUNsRyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBa0IsRUFBRSxFQUFFO2dCQUM3RCxPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDNUUsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUEyQixFQUFFLGNBQWtDLEVBQUUsRUFBRTtnQkFDN0YsT0FBTyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7WUFDMUMsQ0FBQyxFQUFFLEVBQXNCLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFFTSx5QkFBb0IsR0FBRyxDQUFDLGtCQUF1QixFQUFFLFVBQWUsRUFBRSxFQUFFO1lBQzNFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXBGLE9BQU87Z0JBQ04sS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLO2dCQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLCtCQUErQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDO2dCQUN0RyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7Z0JBQzFCLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSztnQkFDNUIsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDckQsZUFBZSxFQUFFLFNBQVM7YUFDRCxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQUVNLG1CQUFjLEdBQUcsQ0FBQyxVQUFlLEVBQUUsRUFBRTtZQUM1QyxPQUFPLFVBQVUsQ0FBQyxRQUFRO2lCQUN4QixNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDdEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUUzRCxPQUFPLEtBQUssQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQztpQkFDRCxHQUFHLENBQUMsQ0FBQyxXQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUM7UUFFTSwwQkFBcUIsR0FBRyxDQUFDLFVBQWUsRUFBRSxFQUFFO1lBQ25ELE9BQU8sVUFBVSxDQUFDLFFBQVE7aUJBQ3hCLE1BQU0sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN0QixNQUFNLFFBQVEsR0FBRyxDQUFDLGtCQUFrQixFQUFFLG1CQUFtQixDQUFDLENBQUM7Z0JBRTNELE9BQU8sS0FBSyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDO2lCQUNELEdBQUcsQ0FBQyxDQUFDLGtCQUF1QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUM7UUFFTSx3QkFBbUIsR0FBRyxDQUFDLFdBQWtCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO1lBQ3hFLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsRUFBRTtnQkFDakYsT0FBTyxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVAsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0IsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO29CQUNuQixLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDckU7WUFDRixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sV0FBVyxDQUFDO1FBQ3BCLENBQUMsQ0FBQztRQUVNLHFCQUFnQixHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDdkMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BHLENBQUMsQ0FBQztRQUVNLGdDQUEyQixHQUFHLENBQUMsVUFBZSxFQUFFLEVBQUU7WUFDekQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQ3hGLENBQUMsV0FBZSxFQUFFLFNBQWMsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQzVCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFcEQsT0FBTzt3QkFDTixHQUFHLFdBQVc7d0JBQ2QsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQztxQkFDdkYsQ0FBQztpQkFDRjtxQkFBTTtvQkFDTixPQUFPLENBQUMsR0FBRyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7aUJBQ25DO1lBQ0YsQ0FBQyxFQUNELEVBQUUsQ0FDRixDQUFDO1lBRUYsT0FBTztnQkFDTixHQUFHLFVBQVU7Z0JBQ2IsUUFBUTthQUNSLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDTSx5QkFBb0IsR0FBRyxDQUFDLGdCQUF5QixFQUFFLEVBQUU7WUFDNUQsTUFBTSxjQUFjLEdBQUcsY0FBUSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLGNBQWMsR0FBK0IsRUFBRSxDQUFDO1lBRXRELE1BQU0sS0FBSyxHQUF5QjtnQkFDbkMsS0FBSztnQkFDTCxZQUFZO2dCQUNaLEtBQUs7Z0JBQ0wsVUFBVTtnQkFDVixTQUFTO2dCQUNULE9BQU87Z0JBQ1AsVUFBVTtnQkFDVixpQkFBaUI7Z0JBQ2pCLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2FBQ04sQ0FBQztZQUVGLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO2dCQUN6QixNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLGdCQUFnQixHQUFrQixJQUFJLENBQUM7Z0JBRTNDLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFO29CQUN2QyxpQkFBaUI7b0JBQ2pCLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ25DLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFOzRCQUMxQyxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3RELElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFO2dDQUM5QixrQ0FBa0M7Z0NBQ2xDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs2QkFDekI7eUJBQ0Q7NkJBQU07NEJBQ04sdURBQXVEOzRCQUN2RCxJQUFJLGdCQUFnQixLQUFLLElBQUksRUFBRTtnQ0FDOUIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7NkJBQ2pFO2lDQUFNO2dDQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsV0FBVyxDQUFDLENBQUM7NkJBQzNEO3lCQUNEO3FCQUNEO29CQUVELEtBQUssRUFBRSxDQUFDO2lCQUNSO2FBQ0Q7WUFFRCxPQUFPLGNBQWMsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFFTSxzQkFBaUIsR0FBRyxDQUFDLFVBQWUsRUFBRSxFQUFFO1lBQy9DLE1BQU0sZUFBZSxHQUFHLGNBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRWxFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDO1lBRTlFLEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDeEMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO29CQUNyQixLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztpQkFDaEc7Z0JBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO29CQUNuQixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztvQkFFMUYsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTt3QkFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7cUJBQzVEO29CQUVELEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7d0JBQzlDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO3FCQUNyRTtpQkFDRDthQUNEO1lBRUQsT0FBTyxVQUFVLENBQUM7UUFDbkIsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztDQUFBO0FBM1dELGlDQTJXQyJ9
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const fs_1 = require("fs");
27
+ const glob_1 = require("glob");
28
+ const messages = __importStar(require("@cucumber/messages"));
29
+ const configuration_1 = require("./configuration");
30
+ const src_1 = require("@cucumber/gherkin/dist/src");
31
+ class GherkinFeature {
32
+ cwd = process.cwd();
33
+ loadFeature = (featureFilePath, options) => {
34
+ try {
35
+ const featureText = (0, fs_1.readFileSync)(featureFilePath, 'utf8');
36
+ return this.parseFeature(featureText, featureFilePath, options);
37
+ }
38
+ catch (err) {
39
+ if (err.code === 'ENOENT') {
40
+ throw new Error(`Feature file not found (${featureFilePath})`);
41
+ }
42
+ throw err;
43
+ }
44
+ };
45
+ loadFeatures = (globPattern, options) => {
46
+ const featureFiles = (0, glob_1.sync)(globPattern);
47
+ return featureFiles.map(featureFilePath => this.loadFeature(featureFilePath, options));
48
+ };
49
+ parseFeature = (featureText, featureFilePath, options) => {
50
+ let ast;
51
+ options = (0, configuration_1.getJestCucumberConfiguration)(options);
52
+ try {
53
+ const builder = new src_1.AstBuilder(messages.IdGenerator.uuid());
54
+ const matcher = new src_1.GherkinClassicTokenMatcher(); // or Gherkin.GherkinInMarkdownTokenMatcher()
55
+ ast = new src_1.Parser(builder, matcher).parse(featureText);
56
+ }
57
+ catch (err) {
58
+ throw new Error(`Error parsing feature Gherkin: ${err.message}`);
59
+ }
60
+ let astFeature = this.collapseRulesAndBackgrounds(ast.feature);
61
+ if (astFeature.language !== 'en') {
62
+ astFeature = this.translateKeywords(astFeature);
63
+ }
64
+ return {
65
+ title: astFeature.name,
66
+ featureFile: featureFilePath.replace(`${this.cwd}\\`, ''),
67
+ scenarios: this.parseScenarios(astFeature),
68
+ scenarioOutlines: this.parseScenarioOutlines(astFeature),
69
+ tags: this.parseTags(astFeature),
70
+ options
71
+ };
72
+ };
73
+ parseDataTableRow = (astDataTableRow) => {
74
+ return astDataTableRow.cells.map((col) => col.value);
75
+ };
76
+ parseDataTable = (astDataTable, astDataTableHeader) => {
77
+ let headerRow;
78
+ let bodyRows;
79
+ if (astDataTableHeader) {
80
+ headerRow = this.parseDataTableRow(astDataTableHeader);
81
+ bodyRows = astDataTable;
82
+ }
83
+ else {
84
+ headerRow = this.parseDataTableRow(astDataTable.rows[0]);
85
+ bodyRows = astDataTable && astDataTable.rows && astDataTable.rows.length && astDataTable.rows.slice(1);
86
+ }
87
+ if (bodyRows && bodyRows.length > 0) {
88
+ return bodyRows.map(nextRow => {
89
+ const parsedRow = this.parseDataTableRow(nextRow);
90
+ return parsedRow.reduce((rowObj, nextCol, index) => {
91
+ return {
92
+ ...rowObj,
93
+ [headerRow[index]]: nextCol
94
+ };
95
+ }, {});
96
+ });
97
+ }
98
+ else {
99
+ return [];
100
+ }
101
+ };
102
+ parseStepArgument = (astStep) => {
103
+ if (astStep) {
104
+ switch (astStep.argument) {
105
+ case 'dataTable':
106
+ return this.parseDataTable(astStep.dataTable);
107
+ case 'docString':
108
+ return astStep.docString.content;
109
+ default:
110
+ return null;
111
+ }
112
+ }
113
+ else {
114
+ return null;
115
+ }
116
+ };
117
+ parseStep = (astStep) => {
118
+ return {
119
+ stepText: astStep.text,
120
+ keyword: astStep.keyword.trim().toLowerCase(),
121
+ stepArgument: this.parseStepArgument(astStep),
122
+ lineNumber: astStep.location.line
123
+ };
124
+ };
125
+ parseSteps = (astScenario) => {
126
+ return astScenario.steps.map((astStep) => this.parseStep(astStep));
127
+ };
128
+ parseTags = (ast) => {
129
+ if (!ast.tags) {
130
+ return [];
131
+ }
132
+ else {
133
+ return ast.tags.map((tag) => tag.name);
134
+ }
135
+ };
136
+ parseScenario = (astScenario, astFeature) => {
137
+ return {
138
+ title: astScenario.name,
139
+ steps: this.parseSteps(astScenario),
140
+ tags: [...this.parseTags(astFeature), ...this.parseTags(astScenario)],
141
+ lineNumber: astScenario.location.line,
142
+ scenarioContext: undefined
143
+ };
144
+ };
145
+ parseScenarioOutlineExampleSteps = (exampleTableRow, scenarioSteps) => {
146
+ return scenarioSteps.map(scenarioStep => {
147
+ const stepText = Object.keys(exampleTableRow).reduce((processedStepText, nextTableColumn) => {
148
+ return processedStepText.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
149
+ }, scenarioStep.stepText);
150
+ let stepArgument = '';
151
+ if (scenarioStep.stepArgument) {
152
+ if (Array.isArray(scenarioStep.stepArgument)) {
153
+ stepArgument = scenarioStep.stepArgument.map((stepArgumentRow) => {
154
+ const modifiedStepArgumentRow = { ...stepArgumentRow };
155
+ Object.keys(exampleTableRow).forEach(nextTableColumn => {
156
+ Object.keys(modifiedStepArgumentRow).forEach(prop => {
157
+ modifiedStepArgumentRow[prop] = modifiedStepArgumentRow[prop].replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
158
+ });
159
+ });
160
+ return modifiedStepArgumentRow;
161
+ });
162
+ }
163
+ else {
164
+ stepArgument = scenarioStep.stepArgument;
165
+ if (typeof scenarioStep.stepArgument === 'string' || scenarioStep.stepArgument instanceof String) {
166
+ Object.keys(exampleTableRow).forEach(nextTableColumn => {
167
+ stepArgument = stepArgument.replace(new RegExp(`<${nextTableColumn}>`, 'g'), exampleTableRow[nextTableColumn]);
168
+ });
169
+ }
170
+ }
171
+ }
172
+ return {
173
+ ...scenarioStep,
174
+ stepText,
175
+ stepArgument
176
+ };
177
+ });
178
+ };
179
+ getOutlineDynamicTitle = (exampleTableRow, title) => {
180
+ return title.replace(/<(\S*)>/g, (_, firstMatch) => {
181
+ return exampleTableRow[firstMatch || ''];
182
+ });
183
+ };
184
+ parseScenarioOutlineExample = (exampleTableRow, outlineScenario, exampleSetTags) => {
185
+ return {
186
+ title: this.getOutlineDynamicTitle(exampleTableRow, outlineScenario.title),
187
+ steps: this.parseScenarioOutlineExampleSteps(exampleTableRow, outlineScenario.steps),
188
+ tags: Array.from(new Set([...outlineScenario.tags, ...exampleSetTags]))
189
+ };
190
+ };
191
+ parseScenarioOutlineExampleSet = (astExampleSet, outlineScenario) => {
192
+ const exampleTable = this.parseDataTable(astExampleSet.tableBody, astExampleSet.tableHeader);
193
+ return exampleTable.map(tableRow => this.parseScenarioOutlineExample(tableRow, outlineScenario, this.parseTags(astExampleSet)));
194
+ };
195
+ parseScenarioOutlineExampleSets = (astExampleSets, outlineScenario) => {
196
+ const exampleSets = astExampleSets.map((astExampleSet) => {
197
+ return this.parseScenarioOutlineExampleSet(astExampleSet, outlineScenario);
198
+ });
199
+ return exampleSets.reduce((scenarios, nextExampleSet) => {
200
+ return [...scenarios, ...nextExampleSet];
201
+ }, []);
202
+ };
203
+ parseScenarioOutline = (astScenarioOutline, astFeature) => {
204
+ const outlineScenario = this.parseScenario(astScenarioOutline.scenario, astFeature);
205
+ return {
206
+ title: outlineScenario.title,
207
+ scenarios: this.parseScenarioOutlineExampleSets(astScenarioOutline.scenario.examples, outlineScenario),
208
+ tags: outlineScenario.tags,
209
+ steps: outlineScenario.steps,
210
+ lineNumber: astScenarioOutline.scenario.location.line,
211
+ scenarioContext: undefined
212
+ };
213
+ };
214
+ parseScenarios = (astFeature) => {
215
+ return astFeature.children
216
+ .filter((child) => {
217
+ const keywords = ['Scenario Outline', 'Scenario Template'];
218
+ return child.scenario && keywords.indexOf(child.scenario.keyword) === -1;
219
+ })
220
+ .map((astScenario) => this.parseScenario(astScenario.scenario, astFeature));
221
+ };
222
+ parseScenarioOutlines = (astFeature) => {
223
+ return astFeature.children
224
+ .filter((child) => {
225
+ const keywords = ['Scenario Outline', 'Scenario Template'];
226
+ return child.scenario && keywords.indexOf(child.scenario.keyword) !== -1;
227
+ })
228
+ .map((astScenarioOutline) => this.parseScenarioOutline(astScenarioOutline, astFeature));
229
+ };
230
+ collapseBackgrounds = (astChildren, backgrounds) => {
231
+ const backgroundSteps = backgrounds.reduce((allBackgroundSteps, nextBackground) => {
232
+ return [...allBackgroundSteps, ...nextBackground.steps];
233
+ }, []);
234
+ astChildren.forEach(child => {
235
+ if (child.scenario) {
236
+ child.scenario.steps = [...backgroundSteps, ...child.scenario.steps];
237
+ }
238
+ });
239
+ return astChildren;
240
+ };
241
+ parseBackgrounds = (ast) => {
242
+ return ast.children.filter((child) => child.background).map((child) => child.background);
243
+ };
244
+ collapseRulesAndBackgrounds = (astFeature) => {
245
+ const featureBackgrounds = this.parseBackgrounds(astFeature);
246
+ const children = this.collapseBackgrounds(astFeature.children, featureBackgrounds).reduce((newChildren, nextChild) => {
247
+ if (nextChild.rule) {
248
+ const rule = nextChild.rule;
249
+ const ruleBackgrounds = this.parseBackgrounds(rule);
250
+ return [
251
+ ...newChildren,
252
+ ...this.collapseBackgrounds(rule.children, [...featureBackgrounds, ...ruleBackgrounds])
253
+ ];
254
+ }
255
+ else {
256
+ return [...newChildren, nextChild];
257
+ }
258
+ }, []);
259
+ return {
260
+ ...astFeature,
261
+ children
262
+ };
263
+ };
264
+ createTranslationMap = (translateDialect) => {
265
+ const englishDialect = src_1.dialects.en;
266
+ const translationMap = {};
267
+ const props = [
268
+ 'and',
269
+ 'background',
270
+ 'but',
271
+ 'examples',
272
+ 'feature',
273
+ 'given',
274
+ 'scenario',
275
+ 'scenarioOutline',
276
+ 'then',
277
+ 'when',
278
+ 'rule'
279
+ ];
280
+ for (const prop of props) {
281
+ const dialectWords = translateDialect[prop];
282
+ const translationWords = englishDialect[prop];
283
+ let index = 0;
284
+ let defaultWordIndex = null;
285
+ for (const dialectWord of dialectWords) {
286
+ // skip "* " word
287
+ if (dialectWord.indexOf('*') !== 0) {
288
+ if (translationWords[index] !== undefined) {
289
+ translationMap[dialectWord] = translationWords[index];
290
+ if (defaultWordIndex === null) {
291
+ // set default when non is set yet
292
+ defaultWordIndex = index;
293
+ }
294
+ }
295
+ else {
296
+ // index has undefined value, translate to default word
297
+ if (defaultWordIndex !== null) {
298
+ translationMap[dialectWord] = translationWords[defaultWordIndex];
299
+ }
300
+ else {
301
+ throw new Error('No translation found for ' + dialectWord);
302
+ }
303
+ }
304
+ }
305
+ index++;
306
+ }
307
+ }
308
+ return translationMap;
309
+ };
310
+ translateKeywords = (astFeature) => {
311
+ const languageDialect = src_1.dialects[astFeature.language];
312
+ const translationMap = this.createTranslationMap(languageDialect);
313
+ astFeature.language = 'en';
314
+ astFeature.keyword = translationMap[astFeature.keyword] || astFeature.keyword;
315
+ for (const child of astFeature.children) {
316
+ if (child.background) {
317
+ child.background.keyword = translationMap[child.background.keyword] || child.background.keyword;
318
+ }
319
+ if (child.scenario) {
320
+ child.scenario.keyword = translationMap[child.scenario.keyword] || child.scenario.keyword;
321
+ for (const step of child.scenario.steps) {
322
+ step.keyword = translationMap[step.keyword] || step.keyword;
323
+ }
324
+ for (const example of child.scenario.examples) {
325
+ example.keyword = translationMap[example.keyword] || example.keyword;
326
+ }
327
+ }
328
+ }
329
+ return astFeature;
330
+ };
331
+ }
332
+ exports.default = GherkinFeature;
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2hlcmtpbi1mZWF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2doZXJraW4vZ2hlcmtpbi1mZWF0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQkFBa0M7QUFDbEMsK0JBQXdDO0FBQ3hDLDZEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsb0RBQStHO0FBRy9HLE1BQXFCLGNBQWM7SUFDMUIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUVyQixXQUFXLEdBQUcsQ0FBQyxlQUF1QixFQUFFLE9BQWlCLEVBQUUsRUFBRTtRQUNuRSxJQUFJO1lBQ0gsTUFBTSxXQUFXLEdBQVcsSUFBQSxpQkFBWSxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNoRTtRQUFDLE9BQU8sR0FBUSxFQUFFO1lBQ2xCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLGVBQWUsR0FBRyxDQUFDLENBQUM7YUFDL0Q7WUFFRCxNQUFNLEdBQUcsQ0FBQztTQUNWO0lBQ0YsQ0FBQyxDQUFDO0lBRUssWUFBWSxHQUFHLENBQUMsV0FBbUIsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBQSxXQUFRLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0MsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUM7SUFFTSxZQUFZLEdBQUcsQ0FBQyxXQUFtQixFQUFFLGVBQXVCLEVBQUUsT0FBaUIsRUFBaUIs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