@cucumber/gherkin
Version:
Gherkin parser
194 lines • 30.2 kB
JavaScript
import { PickleStepType, StepKeywordType, } from '@cucumber/messages';
const pickleStepTypeFromKeyword = {
[StepKeywordType.UNKNOWN]: PickleStepType.UNKNOWN,
[StepKeywordType.CONTEXT]: PickleStepType.CONTEXT,
[StepKeywordType.ACTION]: PickleStepType.ACTION,
[StepKeywordType.OUTCOME]: PickleStepType.OUTCOME,
[StepKeywordType.CONJUNCTION]: null,
};
export default function compile(gherkinDocument, uri, newId) {
const pickles = [];
if (gherkinDocument.feature == null) {
return pickles;
}
const feature = gherkinDocument.feature;
const language = feature.language;
const featureTags = feature.tags;
let featureBackgroundSteps = [];
feature.children.forEach((stepsContainer) => {
if (stepsContainer.background) {
featureBackgroundSteps = [].concat(stepsContainer.background.steps);
}
else if (stepsContainer.rule) {
compileRule(featureTags, featureBackgroundSteps, stepsContainer.rule, language, pickles, uri, newId);
}
else if (stepsContainer.scenario.examples.length === 0) {
compileScenario(featureTags, featureBackgroundSteps, stepsContainer.scenario, language, pickles, uri, newId);
}
else {
compileScenarioOutline(featureTags, featureBackgroundSteps, stepsContainer.scenario, language, pickles, uri, newId);
}
});
return pickles;
}
function compileRule(featureTags, featureBackgroundSteps, rule, language, pickles, uri, newId) {
let ruleBackgroundSteps = [].concat(featureBackgroundSteps);
const tags = [].concat(featureTags).concat(rule.tags);
rule.children.forEach((stepsContainer) => {
if (stepsContainer.background) {
ruleBackgroundSteps = ruleBackgroundSteps.concat(stepsContainer.background.steps);
}
else if (stepsContainer.scenario.examples.length === 0) {
compileScenario(tags, ruleBackgroundSteps, stepsContainer.scenario, language, pickles, uri, newId);
}
else {
compileScenarioOutline(tags, ruleBackgroundSteps, stepsContainer.scenario, language, pickles, uri, newId);
}
});
}
function compileScenario(inheritedTags, backgroundSteps, scenario, language, pickles, uri, newId) {
let lastKeywordType = StepKeywordType.UNKNOWN;
const steps = [];
if (scenario.steps.length !== 0) {
backgroundSteps.forEach((step) => {
lastKeywordType =
step.keywordType === StepKeywordType.CONJUNCTION ? lastKeywordType : step.keywordType;
steps.push(pickleStep(step, [], null, newId, lastKeywordType));
});
}
const tags = [].concat(inheritedTags).concat(scenario.tags);
scenario.steps.forEach((step) => {
lastKeywordType =
step.keywordType === StepKeywordType.CONJUNCTION ? lastKeywordType : step.keywordType;
steps.push(pickleStep(step, [], null, newId, lastKeywordType));
});
const pickle = {
id: newId(),
uri,
location: scenario.location,
astNodeIds: [scenario.id],
tags: pickleTags(tags),
name: scenario.name,
language,
steps,
};
pickles.push(pickle);
}
function compileScenarioOutline(inheritedTags, backgroundSteps, scenario, language, pickles, uri, newId) {
scenario.examples
.filter((e) => e.tableHeader)
.forEach((examples) => {
const variableCells = examples.tableHeader.cells;
examples.tableBody.forEach((valuesRow) => {
let lastKeywordType = StepKeywordType.UNKNOWN;
const steps = [];
if (scenario.steps.length !== 0) {
backgroundSteps.forEach((step) => {
lastKeywordType =
step.keywordType === StepKeywordType.CONJUNCTION ? lastKeywordType : step.keywordType;
steps.push(pickleStep(step, [], null, newId, lastKeywordType));
});
}
scenario.steps.forEach((scenarioOutlineStep) => {
lastKeywordType =
scenarioOutlineStep.keywordType === StepKeywordType.CONJUNCTION
? lastKeywordType
: scenarioOutlineStep.keywordType;
const step = pickleStep(scenarioOutlineStep, variableCells, valuesRow, newId, lastKeywordType);
steps.push(step);
});
const id = newId();
const tags = pickleTags([].concat(inheritedTags).concat(scenario.tags).concat(examples.tags));
pickles.push({
id,
uri,
location: valuesRow.location,
astNodeIds: [scenario.id, valuesRow.id],
name: interpolate(scenario.name, variableCells, valuesRow.cells),
language,
steps,
tags,
});
});
});
}
function pickleDocString(argumentIndex, argument, variableCells, valueCells) {
return {
argumentIndex,
content: interpolate(argument.content, variableCells, valueCells),
mediaType: argument.mediaType
? interpolate(argument.mediaType, variableCells, valueCells)
: undefined,
};
}
function pickleTable(argumentIndex, argument, variableCells, valueCells) {
return {
argumentIndex,
rows: argument.rows.map((row) => {
return {
cells: row.cells.map((cell) => {
return {
value: interpolate(cell.value, variableCells, valueCells),
};
}),
};
}),
};
}
function createPickleArguments(step, variableCells, valueCells) {
if (step.dataTable && step.docString) {
const tableFirst = step.docString.location.line > step.dataTable.location.line;
return {
docString: pickleDocString(tableFirst ? 2 : 1, step.docString, variableCells, valueCells),
dataTable: pickleTable(tableFirst ? 1 : 2, step.dataTable, variableCells, valueCells),
};
}
else if (step.dataTable) {
return {
dataTable: pickleTable(undefined, step.dataTable, variableCells, valueCells),
};
}
else if (step.docString) {
return {
docString: pickleDocString(undefined, step.docString, variableCells, valueCells),
};
}
return undefined;
}
function interpolate(name, variableCells, valueCells) {
variableCells.forEach((variableCell, n) => {
const valueCell = valueCells[n];
const valuePattern = `<${variableCell.value}>`;
const escapedPattern = valuePattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
const regexp = new RegExp(escapedPattern, 'g');
// JS Specific - dollar sign needs to be escaped with another dollar sign
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter
const replacement = valueCell.value.replace(/\$/g, '$$$$');
name = name.replace(regexp, replacement);
});
return name;
}
function pickleStep(step, variableCells, valuesRow, newId, keywordType) {
const astNodeIds = [step.id];
if (valuesRow) {
astNodeIds.push(valuesRow.id);
}
const valueCells = valuesRow ? valuesRow.cells : [];
return {
id: newId(),
text: interpolate(step.text, variableCells, valueCells),
type: pickleStepTypeFromKeyword[keywordType],
argument: createPickleArguments(step, variableCells, valueCells),
astNodeIds: astNodeIds,
};
}
function pickleTags(tags) {
return tags.map(pickleTag);
}
function pickleTag(tag) {
return {
name: tag.name,
astNodeId: tag.id,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waWNrbGVzL2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQVNMLGNBQWMsRUFNZCxlQUFlLEdBSWhCLE1BQU0sb0JBQW9CLENBQUE7QUFFM0IsTUFBTSx5QkFBeUIsR0FBaUQ7SUFDOUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxDQUFDLE9BQU87SUFDakQsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxDQUFDLE9BQU87SUFDakQsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU07SUFDL0MsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxDQUFDLE9BQU87SUFDakQsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSTtDQUNwQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxPQUFPLENBQzdCLGVBQWdDLEVBQ2hDLEdBQVcsRUFDWCxLQUF3QjtJQUV4QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUE7SUFFNUIsSUFBSSxlQUFlLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BDLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFBO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUE7SUFDakMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtJQUNoQyxJQUFJLHNCQUFzQixHQUFXLEVBQUUsQ0FBQTtJQUV2QyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1FBQzFDLElBQUksY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzlCLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyRSxDQUFDO2FBQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsV0FBVyxDQUNULFdBQVcsRUFDWCxzQkFBc0IsRUFDdEIsY0FBYyxDQUFDLElBQUksRUFDbkIsUUFBUSxFQUNSLE9BQU8sRUFDUCxHQUFHLEVBQ0gsS0FBSyxDQUNOLENBQUE7UUFDSCxDQUFDO2FBQU0sSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekQsZUFBZSxDQUNiLFdBQVcsRUFDWCxzQkFBc0IsRUFDdEIsY0FBYyxDQUFDLFFBQVEsRUFDdkIsUUFBUSxFQUNSLE9BQU8sRUFDUCxHQUFHLEVBQ0gsS0FBSyxDQUNOLENBQUE7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLHNCQUFzQixDQUNwQixXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGNBQWMsQ0FBQyxRQUFRLEVBQ3ZCLFFBQVEsRUFDUixPQUFPLEVBQ1AsR0FBRyxFQUNILEtBQUssQ0FDTixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNsQixXQUEyQixFQUMzQixzQkFBdUMsRUFDdkMsSUFBVSxFQUNWLFFBQWdCLEVBQ2hCLE9BQWlCLEVBQ2pCLEdBQVcsRUFDWCxLQUF3QjtJQUV4QixJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUUzRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtRQUN2QyxJQUFJLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM5QixtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuRixDQUFDO2FBQU0sSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekQsZUFBZSxDQUNiLElBQUksRUFDSixtQkFBbUIsRUFDbkIsY0FBYyxDQUFDLFFBQVEsRUFDdkIsUUFBUSxFQUNSLE9BQU8sRUFDUCxHQUFHLEVBQ0gsS0FBSyxDQUNOLENBQUE7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLHNCQUFzQixDQUNwQixJQUFJLEVBQ0osbUJBQW1CLEVBQ25CLGNBQWMsQ0FBQyxRQUFRLEVBQ3ZCLFFBQVEsRUFDUixPQUFPLEVBQ1AsR0FBRyxFQUNILEtBQUssQ0FDTixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUN0QixhQUE2QixFQUM3QixlQUFnQyxFQUNoQyxRQUFrQixFQUNsQixRQUFnQixFQUNoQixPQUFpQixFQUNqQixHQUFXLEVBQ1gsS0FBd0I7SUFFeEIsSUFBSSxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQTtJQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFrQixDQUFBO0lBRWhDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQy9CLGVBQWU7Z0JBQ2IsSUFBSSxDQUFDLFdBQVcsS0FBSyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUE7WUFDdkYsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNELFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDOUIsZUFBZTtZQUNiLElBQUksQ0FBQyxXQUFXLEtBQUssZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQ3ZGLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFBO0lBQ2hFLENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxNQUFNLEdBQVc7UUFDckIsRUFBRSxFQUFFLEtBQUssRUFBRTtRQUNYLEdBQUc7UUFDSCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7UUFDM0IsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsUUFBUTtRQUNSLEtBQUs7S0FDTixDQUFBO0lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUN0QixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsYUFBNkIsRUFDN0IsZUFBZ0MsRUFDaEMsUUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsT0FBaUIsRUFDakIsR0FBVyxFQUNYLEtBQXdCO0lBRXhCLFFBQVEsQ0FBQyxRQUFRO1NBQ2QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQzVCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFBO1FBQ2hELFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQTtZQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFrQixDQUFBO1lBQ2hDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDL0IsZUFBZTt3QkFDYixJQUFJLENBQUMsV0FBVyxLQUFLLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQTtvQkFDdkYsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUE7Z0JBQ2hFLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQztZQUVELFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsRUFBRTtnQkFDN0MsZUFBZTtvQkFDYixtQkFBbUIsQ0FBQyxXQUFXLEtBQUssZUFBZSxDQUFDLFdBQVc7d0JBQzdELENBQUMsQ0FBQyxlQUFlO3dCQUNqQixDQUFDLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFBO2dCQUNyQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsU0FBUyxFQUNULEtBQUssRUFDTCxlQUFlLENBQ2hCLENBQUE7Z0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNsQixDQUFDLENBQUMsQ0FBQTtZQUVGLE1BQU0sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFBO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FDckIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQ3JFLENBQUE7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNYLEVBQUU7Z0JBQ0YsR0FBRztnQkFDSCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7Z0JBQzVCLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUNoRSxRQUFRO2dCQUNSLEtBQUs7Z0JBQ0wsSUFBSTthQUNMLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLGFBQXFCLEVBQ3JCLFFBQW1CLEVBQ25CLGFBQW1DLEVBQ25DLFVBQWdDO0lBRWhDLE9BQU87UUFDTCxhQUFhO1FBQ2IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7UUFDakUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO1lBQzNCLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDO1lBQzVELENBQUMsQ0FBQyxTQUFTO0tBQ2QsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsYUFBcUIsRUFDckIsUUFBbUIsRUFDbkIsYUFBbUMsRUFDbkMsVUFBZ0M7SUFFaEMsT0FBTztRQUNMLGFBQWE7UUFDYixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QixPQUFPO2dCQUNMLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUM1QixPQUFPO3dCQUNMLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDO3FCQUMxRCxDQUFBO2dCQUNILENBQUMsQ0FBQzthQUNILENBQUE7UUFDSCxDQUFDLENBQUM7S0FDSCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzVCLElBQVUsRUFDVixhQUFtQyxFQUNuQyxVQUFnQztJQUVoQyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7UUFDOUUsT0FBTztZQUNMLFNBQVMsRUFBRSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7WUFDekYsU0FBUyxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQztTQUN0RixDQUFBO0lBQ0gsQ0FBQztTQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE9BQU87WUFDTCxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7U0FDN0UsQ0FBQTtJQUNILENBQUM7U0FBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPO1lBQ0wsU0FBUyxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDO1NBQ2pGLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNsQixJQUFZLEVBQ1osYUFBbUMsRUFDbkMsVUFBZ0M7SUFFaEMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUE7UUFDOUMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM1RSxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDOUMseUVBQXlFO1FBQ3pFLHFJQUFxSTtRQUNySSxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDMUQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzFDLENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQ2pCLElBQVUsRUFDVixhQUFtQyxFQUNuQyxTQUEwQixFQUMxQixLQUF3QixFQUN4QixXQUE0QjtJQUU1QixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM1QixJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRW5ELE9BQU87UUFDTCxFQUFFLEVBQUUsS0FBSyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7UUFDdkQsSUFBSSxFQUFFLHlCQUF5QixDQUFDLFdBQVcsQ0FBQztRQUM1QyxRQUFRLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUM7UUFDaEUsVUFBVSxFQUFFLFVBQVU7S0FDdkIsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFXO0lBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBUTtJQUN6QixPQUFPO1FBQ0wsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFO0tBQ2xCLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBEYXRhVGFibGUsXG4gIHR5cGUgRG9jU3RyaW5nLFxuICB0eXBlIEdoZXJraW5Eb2N1bWVudCxcbiAgdHlwZSBJZEdlbmVyYXRvcixcbiAgdHlwZSBQaWNrbGUsXG4gIHR5cGUgUGlja2xlRG9jU3RyaW5nLFxuICB0eXBlIFBpY2tsZVN0ZXAsXG4gIHR5cGUgUGlja2xlU3RlcEFyZ3VtZW50LFxuICBQaWNrbGVTdGVwVHlwZSxcbiAgdHlwZSBQaWNrbGVUYWJsZSxcbiAgdHlwZSBQaWNrbGVUYWcsXG4gIHR5cGUgUnVsZSxcbiAgdHlwZSBTY2VuYXJpbyxcbiAgdHlwZSBTdGVwLFxuICBTdGVwS2V5d29yZFR5cGUsXG4gIHR5cGUgVGFibGVDZWxsLFxuICB0eXBlIFRhYmxlUm93LFxuICB0eXBlIFRhZyxcbn0gZnJvbSAnQGN1Y3VtYmVyL21lc3NhZ2VzJ1xuXG5jb25zdCBwaWNrbGVTdGVwVHlwZUZyb21LZXl3b3JkOiB7IFtrZXkgaW4gU3RlcEtleXdvcmRUeXBlXTogUGlja2xlU3RlcFR5cGUgfSA9IHtcbiAgW1N0ZXBLZXl3b3JkVHlwZS5VTktOT1dOXTogUGlja2xlU3RlcFR5cGUuVU5LTk9XTixcbiAgW1N0ZXBLZXl3b3JkVHlwZS5DT05URVhUXTogUGlja2xlU3RlcFR5cGUuQ09OVEVYVCxcbiAgW1N0ZXBLZXl3b3JkVHlwZS5BQ1RJT05dOiBQaWNrbGVTdGVwVHlwZS5BQ1RJT04sXG4gIFtTdGVwS2V5d29yZFR5cGUuT1VUQ09NRV06IFBpY2tsZVN0ZXBUeXBlLk9VVENPTUUsXG4gIFtTdGVwS2V5d29yZFR5cGUuQ09OSlVOQ1RJT05dOiBudWxsLFxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21waWxlKFxuICBnaGVya2luRG9jdW1lbnQ6IEdoZXJraW5Eb2N1bWVudCxcbiAgdXJpOiBzdHJpbmcsXG4gIG5ld0lkOiBJZEdlbmVyYXRvci5OZXdJZFxuKTogcmVhZG9ubHkgUGlja2xlW10ge1xuICBjb25zdCBwaWNrbGVzOiBQaWNrbGVbXSA9IFtdXG5cbiAgaWYgKGdoZXJraW5Eb2N1bWVudC5mZWF0dXJlID09IG51bGwpIHtcbiAgICByZXR1cm4gcGlja2xlc1xuICB9XG5cbiAgY29uc3QgZmVhdHVyZSA9IGdoZXJraW5Eb2N1bWVudC5mZWF0dXJlXG4gIGNvbnN0IGxhbmd1YWdlID0gZmVhdHVyZS5sYW5ndWFnZVxuICBjb25zdCBmZWF0dXJlVGFncyA9IGZlYXR1cmUudGFnc1xuICBsZXQgZmVhdHVyZUJhY2tncm91bmRTdGVwczogU3RlcFtdID0gW11cblxuICBmZWF0dXJlLmNoaWxkcmVuLmZvckVhY2goKHN0ZXBzQ29udGFpbmVyKSA9PiB7XG4gICAgaWYgKHN0ZXBzQ29udGFpbmVyLmJhY2tncm91bmQpIHtcbiAgICAgIGZlYXR1cmVCYWNrZ3JvdW5kU3RlcHMgPSBbXS5jb25jYXQoc3RlcHNDb250YWluZXIuYmFja2dyb3VuZC5zdGVwcylcbiAgICB9IGVsc2UgaWYgKHN0ZXBzQ29udGFpbmVyLnJ1bGUpIHtcbiAgICAgIGNvbXBpbGVSdWxlKFxuICAgICAgICBmZWF0dXJlVGFncyxcbiAgICAgICAgZmVhdHVyZUJhY2tncm91bmRTdGVwcyxcbiAgICAgICAgc3RlcHNDb250YWluZXIucnVsZSxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHBpY2tsZXMsXG4gICAgICAgIHVyaSxcbiAgICAgICAgbmV3SWRcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHN0ZXBzQ29udGFpbmVyLnNjZW5hcmlvLmV4YW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29tcGlsZVNjZW5hcmlvKFxuICAgICAgICBmZWF0dXJlVGFncyxcbiAgICAgICAgZmVhdHVyZUJhY2tncm91bmRTdGVwcyxcbiAgICAgICAgc3RlcHNDb250YWluZXIuc2NlbmFyaW8sXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBwaWNrbGVzLFxuICAgICAgICB1cmksXG4gICAgICAgIG5ld0lkXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVTY2VuYXJpb091dGxpbmUoXG4gICAgICAgIGZlYXR1cmVUYWdzLFxuICAgICAgICBmZWF0dXJlQmFja2dyb3VuZFN0ZXBzLFxuICAgICAgICBzdGVwc0NvbnRhaW5lci5zY2VuYXJpbyxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHBpY2tsZXMsXG4gICAgICAgIHVyaSxcbiAgICAgICAgbmV3SWRcbiAgICAgIClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBwaWNrbGVzXG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVSdWxlKFxuICBmZWF0dXJlVGFnczogcmVhZG9ubHkgVGFnW10sXG4gIGZlYXR1cmVCYWNrZ3JvdW5kU3RlcHM6IHJlYWRvbmx5IFN0ZXBbXSxcbiAgcnVsZTogUnVsZSxcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgcGlja2xlczogUGlja2xlW10sXG4gIHVyaTogc3RyaW5nLFxuICBuZXdJZDogSWRHZW5lcmF0b3IuTmV3SWRcbikge1xuICBsZXQgcnVsZUJhY2tncm91bmRTdGVwcyA9IFtdLmNvbmNhdChmZWF0dXJlQmFja2dyb3VuZFN0ZXBzKVxuXG4gIGNvbnN0IHRhZ3MgPSBbXS5jb25jYXQoZmVhdHVyZVRhZ3MpLmNvbmNhdChydWxlLnRhZ3MpXG5cbiAgcnVsZS5jaGlsZHJlbi5mb3JFYWNoKChzdGVwc0NvbnRhaW5lcikgPT4ge1xuICAgIGlmIChzdGVwc0NvbnRhaW5lci5iYWNrZ3JvdW5kKSB7XG4gICAgICBydWxlQmFja2dyb3VuZFN0ZXBzID0gcnVsZUJhY2tncm91bmRTdGVwcy5jb25jYXQoc3RlcHNDb250YWluZXIuYmFja2dyb3VuZC5zdGVwcylcbiAgICB9IGVsc2UgaWYgKHN0ZXBzQ29udGFpbmVyLnNjZW5hcmlvLmV4YW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29tcGlsZVNjZW5hcmlvKFxuICAgICAgICB0YWdzLFxuICAgICAgICBydWxlQmFja2dyb3VuZFN0ZXBzLFxuICAgICAgICBzdGVwc0NvbnRhaW5lci5zY2VuYXJpbyxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHBpY2tsZXMsXG4gICAgICAgIHVyaSxcbiAgICAgICAgbmV3SWRcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcGlsZVNjZW5hcmlvT3V0bGluZShcbiAgICAgICAgdGFncyxcbiAgICAgICAgcnVsZUJhY2tncm91bmRTdGVwcyxcbiAgICAgICAgc3RlcHNDb250YWluZXIuc2NlbmFyaW8sXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICBwaWNrbGVzLFxuICAgICAgICB1cmksXG4gICAgICAgIG5ld0lkXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBjb21waWxlU2NlbmFyaW8oXG4gIGluaGVyaXRlZFRhZ3M6IHJlYWRvbmx5IFRhZ1tdLFxuICBiYWNrZ3JvdW5kU3RlcHM6IHJlYWRvbmx5IFN0ZXBbXSxcbiAgc2NlbmFyaW86IFNjZW5hcmlvLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBwaWNrbGVzOiBQaWNrbGVbXSxcbiAgdXJpOiBzdHJpbmcsXG4gIG5ld0lkOiBJZEdlbmVyYXRvci5OZXdJZFxuKSB7XG4gIGxldCBsYXN0S2V5d29yZFR5cGUgPSBTdGVwS2V5d29yZFR5cGUuVU5LTk9XTlxuICBjb25zdCBzdGVwcyA9IFtdIGFzIFBpY2tsZVN0ZXBbXVxuXG4gIGlmIChzY2VuYXJpby5zdGVwcy5sZW5ndGggIT09IDApIHtcbiAgICBiYWNrZ3JvdW5kU3RlcHMuZm9yRWFjaCgoc3RlcCkgPT4ge1xuICAgICAgbGFzdEtleXdvcmRUeXBlID1cbiAgICAgICAgc3RlcC5rZXl3b3JkVHlwZSA9PT0gU3RlcEtleXdvcmRUeXBlLkNPTkpVTkNUSU9OID8gbGFzdEtleXdvcmRUeXBlIDogc3RlcC5rZXl3b3JkVHlwZVxuICAgICAgc3RlcHMucHVzaChwaWNrbGVTdGVwKHN0ZXAsIFtdLCBudWxsLCBuZXdJZCwgbGFzdEtleXdvcmRUeXBlKSlcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgdGFncyA9IFtdLmNvbmNhdChpbmhlcml0ZWRUYWdzKS5jb25jYXQoc2NlbmFyaW8udGFncylcblxuICBzY2VuYXJpby5zdGVwcy5mb3JFYWNoKChzdGVwKSA9PiB7XG4gICAgbGFzdEtleXdvcmRUeXBlID1cbiAgICAgIHN0ZXAua2V5d29yZFR5cGUgPT09IFN0ZXBLZXl3b3JkVHlwZS5DT05KVU5DVElPTiA/IGxhc3RLZXl3b3JkVHlwZSA6IHN0ZXAua2V5d29yZFR5cGVcbiAgICBzdGVwcy5wdXNoKHBpY2tsZVN0ZXAoc3RlcCwgW10sIG51bGwsIG5ld0lkLCBsYXN0S2V5d29yZFR5cGUpKVxuICB9KVxuXG4gIGNvbnN0IHBpY2tsZTogUGlja2xlID0ge1xuICAgIGlkOiBuZXdJZCgpLFxuICAgIHVyaSxcbiAgICBsb2NhdGlvbjogc2NlbmFyaW8ubG9jYXRpb24sXG4gICAgYXN0Tm9kZUlkczogW3NjZW5hcmlvLmlkXSxcbiAgICB0YWdzOiBwaWNrbGVUYWdzKHRhZ3MpLFxuICAgIG5hbWU6IHNjZW5hcmlvLm5hbWUsXG4gICAgbGFuZ3VhZ2UsXG4gICAgc3RlcHMsXG4gIH1cbiAgcGlja2xlcy5wdXNoKHBpY2tsZSlcbn1cblxuZnVuY3Rpb24gY29tcGlsZVNjZW5hcmlvT3V0bGluZShcbiAgaW5oZXJpdGVkVGFnczogcmVhZG9ubHkgVGFnW10sXG4gIGJhY2tncm91bmRTdGVwczogcmVhZG9ubHkgU3RlcFtdLFxuICBzY2VuYXJpbzogU2NlbmFyaW8sXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIHBpY2tsZXM6IFBpY2tsZVtdLFxuICB1cmk6IHN0cmluZyxcbiAgbmV3SWQ6IElkR2VuZXJhdG9yLk5ld0lkXG4pIHtcbiAgc2NlbmFyaW8uZXhhbXBsZXNcbiAgICAuZmlsdGVyKChlKSA9PiBlLnRhYmxlSGVhZGVyKVxuICAgIC5mb3JFYWNoKChleGFtcGxlcykgPT4ge1xuICAgICAgY29uc3QgdmFyaWFibGVDZWxscyA9IGV4YW1wbGVzLnRhYmxlSGVhZGVyLmNlbGxzXG4gICAgICBleGFtcGxlcy50YWJsZUJvZHkuZm9yRWFjaCgodmFsdWVzUm93KSA9PiB7XG4gICAgICAgIGxldCBsYXN0S2V5d29yZFR5cGUgPSBTdGVwS2V5d29yZFR5cGUuVU5LTk9XTlxuICAgICAgICBjb25zdCBzdGVwcyA9IFtdIGFzIFBpY2tsZVN0ZXBbXVxuICAgICAgICBpZiAoc2NlbmFyaW8uc3RlcHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgYmFja2dyb3VuZFN0ZXBzLmZvckVhY2goKHN0ZXApID0+IHtcbiAgICAgICAgICAgIGxhc3RLZXl3b3JkVHlwZSA9XG4gICAgICAgICAgICAgIHN0ZXAua2V5d29yZFR5cGUgPT09IFN0ZXBLZXl3b3JkVHlwZS5DT05KVU5DVElPTiA/IGxhc3RLZXl3b3JkVHlwZSA6IHN0ZXAua2V5d29yZFR5cGVcbiAgICAgICAgICAgIHN0ZXBzLnB1c2gocGlja2xlU3RlcChzdGVwLCBbXSwgbnVsbCwgbmV3SWQsIGxhc3RLZXl3b3JkVHlwZSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHNjZW5hcmlvLnN0ZXBzLmZvckVhY2goKHNjZW5hcmlvT3V0bGluZVN0ZXApID0+IHtcbiAgICAgICAgICBsYXN0S2V5d29yZFR5cGUgPVxuICAgICAgICAgICAgc2NlbmFyaW9PdXRsaW5lU3RlcC5rZXl3b3JkVHlwZSA9PT0gU3RlcEtleXdvcmRUeXBlLkNPTkpVTkNUSU9OXG4gICAgICAgICAgICAgID8gbGFzdEtleXdvcmRUeXBlXG4gICAgICAgICAgICAgIDogc2NlbmFyaW9PdXRsaW5lU3RlcC5rZXl3b3JkVHlwZVxuICAgICAgICAgIGNvbnN0IHN0ZXAgPSBwaWNrbGVTdGVwKFxuICAgICAgICAgICAgc2NlbmFyaW9PdXRsaW5lU3RlcCxcbiAgICAgICAgICAgIHZhcmlhYmxlQ2VsbHMsXG4gICAgICAgICAgICB2YWx1ZXNSb3csXG4gICAgICAgICAgICBuZXdJZCxcbiAgICAgICAgICAgIGxhc3RLZXl3b3JkVHlwZVxuICAgICAgICAgIClcbiAgICAgICAgICBzdGVwcy5wdXNoKHN0ZXApXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgaWQgPSBuZXdJZCgpXG4gICAgICAgIGNvbnN0IHRhZ3MgPSBwaWNrbGVUYWdzKFxuICAgICAgICAgIFtdLmNvbmNhdChpbmhlcml0ZWRUYWdzKS5jb25jYXQoc2NlbmFyaW8udGFncykuY29uY2F0KGV4YW1wbGVzLnRhZ3MpXG4gICAgICAgIClcblxuICAgICAgICBwaWNrbGVzLnB1c2goe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHVyaSxcbiAgICAgICAgICBsb2NhdGlvbjogdmFsdWVzUm93LmxvY2F0aW9uLFxuICAgICAgICAgIGFzdE5vZGVJZHM6IFtzY2VuYXJpby5pZCwgdmFsdWVzUm93LmlkXSxcbiAgICAgICAgICBuYW1lOiBpbnRlcnBvbGF0ZShzY2VuYXJpby5uYW1lLCB2YXJpYWJsZUNlbGxzLCB2YWx1ZXNSb3cuY2VsbHMpLFxuICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgIHN0ZXBzLFxuICAgICAgICAgIHRhZ3MsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG59XG5cbmZ1bmN0aW9uIHBpY2tsZURvY1N0cmluZyhcbiAgYXJndW1lbnRJbmRleDogbnVtYmVyLFxuICBhcmd1bWVudDogRG9jU3RyaW5nLFxuICB2YXJpYWJsZUNlbGxzOiByZWFkb25seSBUYWJsZUNlbGxbXSxcbiAgdmFsdWVDZWxsczogcmVhZG9ubHkgVGFibGVDZWxsW11cbik6IFBpY2tsZURvY1N0cmluZyB7XG4gIHJldHVybiB7XG4gICAgYXJndW1lbnRJbmRleCxcbiAgICBjb250ZW50OiBpbnRlcnBvbGF0ZShhcmd1bWVudC5jb250ZW50LCB2YXJpYWJsZUNlbGxzLCB2YWx1ZUNlbGxzKSxcbiAgICBtZWRpYVR5cGU6IGFyZ3VtZW50Lm1lZGlhVHlwZVxuICAgICAgPyBpbnRlcnBvbGF0ZShhcmd1bWVudC5tZWRpYVR5cGUsIHZhcmlhYmxlQ2VsbHMsIHZhbHVlQ2VsbHMpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfVxufVxuXG5mdW5jdGlvbiBwaWNrbGVUYWJsZShcbiAgYXJndW1lbnRJbmRleDogbnVtYmVyLFxuICBhcmd1bWVudDogRGF0YVRhYmxlLFxuICB2YXJpYWJsZUNlbGxzOiByZWFkb25seSBUYWJsZUNlbGxbXSxcbiAgdmFsdWVDZWxsczogcmVhZG9ubHkgVGFibGVDZWxsW11cbik6IFBpY2tsZVRhYmxlIHtcbiAgcmV0dXJuIHtcbiAgICBhcmd1bWVudEluZGV4LFxuICAgIHJvd3M6IGFyZ3VtZW50LnJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNlbGxzOiByb3cuY2VsbHMubWFwKChjZWxsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBpbnRlcnBvbGF0ZShjZWxsLnZhbHVlLCB2YXJpYWJsZUNlbGxzLCB2YWx1ZUNlbGxzKSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgIH0pLFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBpY2tsZUFyZ3VtZW50cyhcbiAgc3RlcDogU3RlcCxcbiAgdmFyaWFibGVDZWxsczogcmVhZG9ubHkgVGFibGVDZWxsW10sXG4gIHZhbHVlQ2VsbHM6IHJlYWRvbmx5IFRhYmxlQ2VsbFtdXG4pOiBQaWNrbGVTdGVwQXJndW1lbnQgfCB1bmRlZmluZWQge1xuICBpZiAoc3RlcC5kYXRhVGFibGUgJiYgc3RlcC5kb2NTdHJpbmcpIHtcbiAgICBjb25zdCB0YWJsZUZpcnN0ID0gc3RlcC5kb2NTdHJpbmcubG9jYXRpb24ubGluZSA+IHN0ZXAuZGF0YVRhYmxlLmxvY2F0aW9uLmxpbmVcbiAgICByZXR1cm4ge1xuICAgICAgZG9jU3RyaW5nOiBwaWNrbGVEb2NTdHJpbmcodGFibGVGaXJzdCA/IDIgOiAxLCBzdGVwLmRvY1N0cmluZywgdmFyaWFibGVDZWxscywgdmFsdWVDZWxscyksXG4gICAgICBkYXRhVGFibGU6IHBpY2tsZVRhYmxlKHRhYmxlRmlyc3QgPyAxIDogMiwgc3RlcC5kYXRhVGFibGUsIHZhcmlhYmxlQ2VsbHMsIHZhbHVlQ2VsbHMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChzdGVwLmRhdGFUYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhVGFibGU6IHBpY2tsZVRhYmxlKHVuZGVmaW5lZCwgc3RlcC5kYXRhVGFibGUsIHZhcmlhYmxlQ2VsbHMsIHZhbHVlQ2VsbHMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChzdGVwLmRvY1N0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBkb2NTdHJpbmc6IHBpY2tsZURvY1N0cmluZyh1bmRlZmluZWQsIHN0ZXAuZG9jU3RyaW5nLCB2YXJpYWJsZUNlbGxzLCB2YWx1ZUNlbGxzKSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhcmlhYmxlQ2VsbHM6IHJlYWRvbmx5IFRhYmxlQ2VsbFtdLFxuICB2YWx1ZUNlbGxzOiByZWFkb25seSBUYWJsZUNlbGxbXVxuKSB7XG4gIHZhcmlhYmxlQ2VsbHMuZm9yRWFjaCgodmFyaWFibGVDZWxsLCBuKSA9PiB7XG4gICAgY29uc3QgdmFsdWVDZWxsID0gdmFsdWVDZWxsc1tuXVxuICAgIGNvbnN0IHZhbHVlUGF0dGVybiA9IGA8JHt2YXJpYWJsZUNlbGwudmFsdWV9PmBcbiAgICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHZhbHVlUGF0dGVybi5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJylcbiAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGVzY2FwZWRQYXR0ZXJuLCAnZycpXG4gICAgLy8gSlMgU3BlY2lmaWMgLSBkb2xsYXIgc2lnbiBuZWVkcyB0byBiZSBlc2NhcGVkIHdpdGggYW5vdGhlciBkb2xsYXIgc2lnblxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9yZXBsYWNlI1NwZWNpZnlpbmdfYV9zdHJpbmdfYXNfYV9wYXJhbWV0ZXJcbiAgICBjb25zdCByZXBsYWNlbWVudCA9IHZhbHVlQ2VsbC52YWx1ZS5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKVxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UocmVnZXhwLCByZXBsYWNlbWVudClcbiAgfSlcbiAgcmV0dXJuIG5hbWVcbn1cblxuZnVuY3Rpb24gcGlja2xlU3RlcChcbiAgc3RlcDogU3RlcCxcbiAgdmFyaWFibGVDZWxsczogcmVhZG9ubHkgVGFibGVDZWxsW10sXG4gIHZhbHVlc1JvdzogVGFibGVSb3cgfCBudWxsLFxuICBuZXdJZDogSWRHZW5lcmF0b3IuTmV3SWQsXG4gIGtleXdvcmRUeXBlOiBTdGVwS2V5d29yZFR5cGVcbik6IFBpY2tsZVN0ZXAge1xuICBjb25zdCBhc3ROb2RlSWRzID0gW3N0ZXAuaWRdXG4gIGlmICh2YWx1ZXNSb3cpIHtcbiAgICBhc3ROb2RlSWRzLnB1c2godmFsdWVzUm93LmlkKVxuICB9XG4gIGNvbnN0IHZhbHVlQ2VsbHMgPSB2YWx1ZXNSb3cgPyB2YWx1ZXNSb3cuY2VsbHMgOiBbXVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IG5ld0lkKCksXG4gICAgdGV4dDogaW50ZXJwb2xhdGUoc3RlcC50ZXh0LCB2YXJpYWJsZUNlbGxzLCB2YWx1ZUNlbGxzKSxcbiAgICB0eXBlOiBwaWNrbGVTdGVwVHlwZUZyb21LZXl3b3JkW2tleXdvcmRUeXBlXSxcbiAgICBhcmd1bWVudDogY3JlYXRlUGlja2xlQXJndW1lbnRzKHN0ZXAsIHZhcmlhYmxlQ2VsbHMsIHZhbHVlQ2VsbHMpLFxuICAgIGFzdE5vZGVJZHM6IGFzdE5vZGVJZHMsXG4gIH1cbn1cblxuZnVuY3Rpb24gcGlja2xlVGFncyh0YWdzOiBUYWdbXSk6IHJlYWRvbmx5IFBpY2tsZVRhZ1tdIHtcbiAgcmV0dXJuIHRhZ3MubWFwKHBpY2tsZVRhZylcbn1cblxuZnVuY3Rpb24gcGlja2xlVGFnKHRhZzogVGFnKTogUGlja2xlVGFnIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiB0YWcubmFtZSxcbiAgICBhc3ROb2RlSWQ6IHRhZy5pZCxcbiAgfVxufVxuIl19