UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

221 lines 25.7 kB
import assert from "assert"; import { cleanBooleanAttribute, cleanIntegerAttribute, cleanXmlArtefacts } from "./xml.mjs"; function cleanDecompteNominatif(decompteNominatif) { cleanXmlArtefacts(decompteNominatif); let nonVotants = decompteNominatif.nonVotants; if (nonVotants === undefined) { nonVotants = decompteNominatif.nonVotant; delete decompteNominatif.nonVotant; } else { assert.strictEqual(decompteNominatif.nonVotant, undefined); } if (nonVotants !== undefined) { if (typeof nonVotants === "string") { assert.strictEqual(nonVotants, "0"); nonVotants = []; } else if (!Array.isArray(nonVotants)) { assert(nonVotants); nonVotants = [nonVotants]; } const nonVotantsArray = nonVotants; nonVotants = []; for (let nonVotant of nonVotantsArray) { if (nonVotant === null) { continue; } nonVotant = nonVotant.votant; if (Array.isArray(nonVotant)) { nonVotants.push(...nonVotant); } else { assert(nonVotant); nonVotants.push(nonVotant); } } if (nonVotants.length === 0) { delete decompteNominatif.nonVotants; } else { decompteNominatif.nonVotants = nonVotants; for (const votant of nonVotants) { cleanVotant(votant); } } } let pour = decompteNominatif.pour; if (pour === undefined) { pour = decompteNominatif.pours; delete decompteNominatif.pours; } else { assert.strictEqual(decompteNominatif.pours, undefined); } if (pour !== undefined) { pour = pour.votant; if (!Array.isArray(pour)) { assert(pour); pour = [pour]; } if (pour.length === 0) { delete decompteNominatif.pour; } else { decompteNominatif.pour = pour; for (const votant of pour) { cleanVotant(votant); } } } let contre = decompteNominatif.contre; if (contre === undefined) { contre = decompteNominatif.contres; delete decompteNominatif.contres; } else { assert.strictEqual(decompteNominatif.contres, undefined); } if (contre !== undefined) { contre = contre.votant; if (!Array.isArray(contre)) { assert(contre); contre = [contre]; } if (contre.length === 0) { delete decompteNominatif.contre; } else { decompteNominatif.contre = contre; for (const votant of contre) { cleanVotant(votant); } } } let abstentions = decompteNominatif.abstentions; if (abstentions === undefined) { abstentions = decompteNominatif.abstention; delete decompteNominatif.abstention; } else { assert.strictEqual(decompteNominatif.abstention, undefined); } if (abstentions !== undefined) { if (!Array.isArray(abstentions)) { assert(abstentions); abstentions = [abstentions]; } const abstentionsArray = abstentions; abstentions = []; for (let absentionsItem of abstentionsArray) { if (absentionsItem === null) { continue; } absentionsItem = absentionsItem.votant; if (Array.isArray(absentionsItem)) { abstentions.push(...absentionsItem); } else { assert(absentionsItem); abstentions.push(absentionsItem); } } if (abstentions.length === 0) { delete decompteNominatif.abstentions; } else { decompteNominatif.abstentions = abstentions; for (const votant of abstentions) { cleanVotant(votant); } } } let nonVotantsVolontaires = decompteNominatif.nonVotantsVolontaires; if (nonVotantsVolontaires !== undefined) { if (!Array.isArray(nonVotantsVolontaires)) { nonVotantsVolontaires = [nonVotantsVolontaires]; } const nonVotantsVolontairesArray = nonVotantsVolontaires; nonVotantsVolontaires = []; for (let absentionsItem of nonVotantsVolontairesArray) { if (absentionsItem === null) { continue; } absentionsItem = absentionsItem.votant; if (Array.isArray(absentionsItem)) { nonVotantsVolontaires.push(...absentionsItem); } else { assert(absentionsItem); nonVotantsVolontaires.push(absentionsItem); } } if (nonVotantsVolontaires.length === 0) { delete decompteNominatif.nonVotantsVolontaires; } else { decompteNominatif.nonVotantsVolontaires = nonVotantsVolontaires; for (const votant of nonVotantsVolontaires) { cleanVotant(votant); } } } } export function cleanScrutin(scrutin) { cleanXmlArtefacts(scrutin); const demandeur = scrutin.demandeur; assert(demandeur); { cleanXmlArtefacts(demandeur); assert.strictEqual(demandeur.referenceLegislative, undefined); } const objet = scrutin.objet; assert(objet); { cleanXmlArtefacts(objet); assert.strictEqual(objet.referenceLegislative, undefined); } let ventilationVotes = scrutin.ventilationVotes; assert(ventilationVotes); { ventilationVotes = ventilationVotes.organe; assert(ventilationVotes); let groupes = ventilationVotes.groupes; assert(groupes); { groupes = groupes.groupe; assert(Array.isArray(groupes)); for (const groupe of groupes) { const vote = groupe.vote; assert(vote); { const decompteVoix = vote.decompteVoix; assert(decompteVoix); { if (decompteVoix.abstention !== undefined) { assert.strictEqual(decompteVoix.abstentions, undefined); decompteVoix.abstentions = decompteVoix.abstention; delete decompteVoix.abstention; } if (decompteVoix.nonVotant !== undefined) { assert.strictEqual(decompteVoix.nonVotants, undefined); decompteVoix.nonVotants = decompteVoix.nonVotant; delete decompteVoix.nonVotant; } } const decompteNominatif = vote.decompteNominatif; assert(decompteNominatif); cleanDecompteNominatif(decompteNominatif); } } ventilationVotes.groupes = groupes; } scrutin.ventilationVotes = ventilationVotes; } const miseAuPoint = scrutin.miseAuPoint; if (miseAuPoint !== undefined) { cleanDecompteNominatif(miseAuPoint); let dysfonctionnement = miseAuPoint.dysfonctionnement; if (dysfonctionnement !== undefined) { cleanDecompteNominatif(dysfonctionnement); if (Object.values(dysfonctionnement).filter(value => value !== undefined).length === 0) { delete miseAuPoint.dysfonctionnement; } } if (Object.values(miseAuPoint).filter(value => value !== undefined).length === 0) { delete scrutin.miseAuPoint; } } } function cleanVotant(votant) { cleanBooleanAttribute(votant, "parDelegation"); cleanIntegerAttribute(votant, "numPlace"); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhbkJvb2xlYW5BdHRyaWJ1dGUiLCJjbGVhbkludGVnZXJBdHRyaWJ1dGUiLCJjbGVhblhtbEFydGVmYWN0cyIsImNsZWFuRGVjb21wdGVOb21pbmF0aWYiLCJkZWNvbXB0ZU5vbWluYXRpZiIsIm5vblZvdGFudHMiLCJ1bmRlZmluZWQiLCJub25Wb3RhbnQiLCJzdHJpY3RFcXVhbCIsIkFycmF5IiwiaXNBcnJheSIsIm5vblZvdGFudHNBcnJheSIsInZvdGFudCIsInB1c2giLCJsZW5ndGgiLCJjbGVhblZvdGFudCIsInBvdXIiLCJwb3VycyIsImNvbnRyZSIsImNvbnRyZXMiLCJhYnN0ZW50aW9ucyIsImFic3RlbnRpb24iLCJhYnN0ZW50aW9uc0FycmF5IiwiYWJzZW50aW9uc0l0ZW0iLCJub25Wb3RhbnRzVm9sb250YWlyZXMiLCJub25Wb3RhbnRzVm9sb250YWlyZXNBcnJheSIsImNsZWFuU2NydXRpbiIsInNjcnV0aW4iLCJkZW1hbmRldXIiLCJyZWZlcmVuY2VMZWdpc2xhdGl2ZSIsIm9iamV0IiwidmVudGlsYXRpb25Wb3RlcyIsIm9yZ2FuZSIsImdyb3VwZXMiLCJncm91cGUiLCJ2b3RlIiwiZGVjb21wdGVWb2l4IiwibWlzZUF1UG9pbnQiLCJkeXNmb25jdGlvbm5lbWVudCIsIk9iamVjdCIsInZhbHVlcyIsImZpbHRlciIsInZhbHVlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsZWFuZXJzL3NjcnV0aW5zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5cbmltcG9ydCB7XG4gIGNsZWFuQm9vbGVhbkF0dHJpYnV0ZSxcbiAgY2xlYW5JbnRlZ2VyQXR0cmlidXRlLFxuICBjbGVhblhtbEFydGVmYWN0cyxcbn0gZnJvbSBcIi4veG1sXCJcblxuZnVuY3Rpb24gY2xlYW5EZWNvbXB0ZU5vbWluYXRpZihkZWNvbXB0ZU5vbWluYXRpZjogYW55KSB7XG4gIGNsZWFuWG1sQXJ0ZWZhY3RzKGRlY29tcHRlTm9taW5hdGlmKVxuXG4gIGxldCBub25Wb3RhbnRzID0gZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50c1xuICBpZiAobm9uVm90YW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbm9uVm90YW50cyA9IGRlY29tcHRlTm9taW5hdGlmLm5vblZvdGFudFxuICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5ub25Wb3RhbnRcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50LCB1bmRlZmluZWQpXG4gIH1cbiAgaWYgKG5vblZvdGFudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygbm9uVm90YW50cyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5vblZvdGFudHMsIFwiMFwiKVxuICAgICAgbm9uVm90YW50cyA9IFtdXG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShub25Wb3RhbnRzKSkge1xuICAgICAgYXNzZXJ0KG5vblZvdGFudHMpXG4gICAgICBub25Wb3RhbnRzID0gW25vblZvdGFudHNdXG4gICAgfVxuICAgIGNvbnN0IG5vblZvdGFudHNBcnJheSA9IG5vblZvdGFudHNcbiAgICBub25Wb3RhbnRzID0gW11cbiAgICBmb3IgKGxldCBub25Wb3RhbnQgb2Ygbm9uVm90YW50c0FycmF5KSB7XG4gICAgICBpZiAobm9uVm90YW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBub25Wb3RhbnQgPSBub25Wb3RhbnQudm90YW50XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShub25Wb3RhbnQpKSB7XG4gICAgICAgIG5vblZvdGFudHMucHVzaCguLi5ub25Wb3RhbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQobm9uVm90YW50KVxuICAgICAgICBub25Wb3RhbnRzLnB1c2gobm9uVm90YW50KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9uVm90YW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5ub25Wb3RhbnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLm5vblZvdGFudHMgPSBub25Wb3RhbnRzXG4gICAgICBmb3IgKGNvbnN0IHZvdGFudCBvZiBub25Wb3RhbnRzKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcG91ciA9IGRlY29tcHRlTm9taW5hdGlmLnBvdXJcbiAgaWYgKHBvdXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHBvdXIgPSBkZWNvbXB0ZU5vbWluYXRpZi5wb3Vyc1xuICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5wb3Vyc1xuICB9IGVsc2Uge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvbXB0ZU5vbWluYXRpZi5wb3VycywgdW5kZWZpbmVkKVxuICB9XG4gIGlmIChwb3VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBwb3VyID0gcG91ci52b3RhbnRcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG91cikpIHtcbiAgICAgIGFzc2VydChwb3VyKVxuICAgICAgcG91ciA9IFtwb3VyXVxuICAgIH1cbiAgICBpZiAocG91ci5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5wb3VyXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLnBvdXIgPSBwb3VyXG4gICAgICBmb3IgKGNvbnN0IHZvdGFudCBvZiBwb3VyKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgY29udHJlID0gZGVjb21wdGVOb21pbmF0aWYuY29udHJlXG4gIGlmIChjb250cmUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnRyZSA9IGRlY29tcHRlTm9taW5hdGlmLmNvbnRyZXNcbiAgICBkZWxldGUgZGVjb21wdGVOb21pbmF0aWYuY29udHJlc1xuICB9IGVsc2Uge1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNvbXB0ZU5vbWluYXRpZi5jb250cmVzLCB1bmRlZmluZWQpXG4gIH1cbiAgaWYgKGNvbnRyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29udHJlID0gY29udHJlLnZvdGFudFxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb250cmUpKSB7XG4gICAgICBhc3NlcnQoY29udHJlKVxuICAgICAgY29udHJlID0gW2NvbnRyZV1cbiAgICB9XG4gICAgaWYgKGNvbnRyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkZWNvbXB0ZU5vbWluYXRpZi5jb250cmVcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjb21wdGVOb21pbmF0aWYuY29udHJlID0gY29udHJlXG4gICAgICBmb3IgKGNvbnN0IHZvdGFudCBvZiBjb250cmUpIHtcbiAgICAgICAgY2xlYW5Wb3RhbnQodm90YW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBhYnN0ZW50aW9ucyA9IGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25zXG4gIGlmIChhYnN0ZW50aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYWJzdGVudGlvbnMgPSBkZWNvbXB0ZU5vbWluYXRpZi5hYnN0ZW50aW9uXG4gICAgZGVsZXRlIGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25cbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb21wdGVOb21pbmF0aWYuYWJzdGVudGlvbiwgdW5kZWZpbmVkKVxuICB9XG4gIGlmIChhYnN0ZW50aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFic3RlbnRpb25zKSkge1xuICAgICAgYXNzZXJ0KGFic3RlbnRpb25zKVxuICAgICAgYWJzdGVudGlvbnMgPSBbYWJzdGVudGlvbnNdXG4gICAgfVxuICAgIGNvbnN0IGFic3RlbnRpb25zQXJyYXkgPSBhYnN0ZW50aW9uc1xuICAgIGFic3RlbnRpb25zID0gW11cbiAgICBmb3IgKGxldCBhYnNlbnRpb25zSXRlbSBvZiBhYnN0ZW50aW9uc0FycmF5KSB7XG4gICAgICBpZiAoYWJzZW50aW9uc0l0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGFic2VudGlvbnNJdGVtID0gYWJzZW50aW9uc0l0ZW0udm90YW50XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhYnNlbnRpb25zSXRlbSkpIHtcbiAgICAgICAgYWJzdGVudGlvbnMucHVzaCguLi5hYnNlbnRpb25zSXRlbSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChhYnNlbnRpb25zSXRlbSlcbiAgICAgICAgYWJzdGVudGlvbnMucHVzaChhYnNlbnRpb25zSXRlbSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic3RlbnRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25zXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLmFic3RlbnRpb25zID0gYWJzdGVudGlvbnNcbiAgICAgIGZvciAoY29uc3Qgdm90YW50IG9mIGFic3RlbnRpb25zKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgbm9uVm90YW50c1ZvbG9udGFpcmVzID0gZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50c1ZvbG9udGFpcmVzXG4gIGlmIChub25Wb3RhbnRzVm9sb250YWlyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShub25Wb3RhbnRzVm9sb250YWlyZXMpKSB7XG4gICAgICBub25Wb3RhbnRzVm9sb250YWlyZXMgPSBbbm9uVm90YW50c1ZvbG9udGFpcmVzXVxuICAgIH1cbiAgICBjb25zdCBub25Wb3RhbnRzVm9sb250YWlyZXNBcnJheSA9IG5vblZvdGFudHNWb2xvbnRhaXJlc1xuICAgIG5vblZvdGFudHNWb2xvbnRhaXJlcyA9IFtdXG4gICAgZm9yIChsZXQgYWJzZW50aW9uc0l0ZW0gb2Ygbm9uVm90YW50c1ZvbG9udGFpcmVzQXJyYXkpIHtcbiAgICAgIGlmIChhYnNlbnRpb25zSXRlbSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgYWJzZW50aW9uc0l0ZW0gPSBhYnNlbnRpb25zSXRlbS52b3RhbnRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFic2VudGlvbnNJdGVtKSkge1xuICAgICAgICBub25Wb3RhbnRzVm9sb250YWlyZXMucHVzaCguLi5hYnNlbnRpb25zSXRlbSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChhYnNlbnRpb25zSXRlbSlcbiAgICAgICAgbm9uVm90YW50c1ZvbG9udGFpcmVzLnB1c2goYWJzZW50aW9uc0l0ZW0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub25Wb3RhbnRzVm9sb250YWlyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgZGVjb21wdGVOb21pbmF0aWYubm9uVm90YW50c1ZvbG9udGFpcmVzXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY29tcHRlTm9taW5hdGlmLm5vblZvdGFudHNWb2xvbnRhaXJlcyA9IG5vblZvdGFudHNWb2xvbnRhaXJlc1xuICAgICAgZm9yIChjb25zdCB2b3RhbnQgb2Ygbm9uVm90YW50c1ZvbG9udGFpcmVzKSB7XG4gICAgICAgIGNsZWFuVm90YW50KHZvdGFudClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU2NydXRpbihzY3J1dGluOiBhbnkpOiB2b2lkIHtcbiAgY2xlYW5YbWxBcnRlZmFjdHMoc2NydXRpbilcblxuICBjb25zdCBkZW1hbmRldXIgPSBzY3J1dGluLmRlbWFuZGV1clxuICBhc3NlcnQoZGVtYW5kZXVyKVxuICB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoZGVtYW5kZXVyKVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlbWFuZGV1ci5yZWZlcmVuY2VMZWdpc2xhdGl2ZSwgdW5kZWZpbmVkKVxuICB9XG5cbiAgY29uc3Qgb2JqZXQgPSBzY3J1dGluLm9iamV0XG4gIGFzc2VydChvYmpldClcbiAge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKG9iamV0KVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9iamV0LnJlZmVyZW5jZUxlZ2lzbGF0aXZlLCB1bmRlZmluZWQpXG4gIH1cblxuICBsZXQgdmVudGlsYXRpb25Wb3RlcyA9IHNjcnV0aW4udmVudGlsYXRpb25Wb3Rlc1xuICBhc3NlcnQodmVudGlsYXRpb25Wb3RlcylcbiAge1xuICAgIHZlbnRpbGF0aW9uVm90ZXMgPSB2ZW50aWxhdGlvblZvdGVzLm9yZ2FuZVxuICAgIGFzc2VydCh2ZW50aWxhdGlvblZvdGVzKVxuXG4gICAgbGV0IGdyb3VwZXMgPSB2ZW50aWxhdGlvblZvdGVzLmdyb3VwZXNcbiAgICBhc3NlcnQoZ3JvdXBlcylcbiAgICB7XG4gICAgICBncm91cGVzID0gZ3JvdXBlcy5ncm91cGVcbiAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KGdyb3VwZXMpKVxuICAgICAgZm9yIChjb25zdCBncm91cGUgb2YgZ3JvdXBlcykge1xuICAgICAgICBjb25zdCB2b3RlID0gZ3JvdXBlLnZvdGVcbiAgICAgICAgYXNzZXJ0KHZvdGUpXG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBkZWNvbXB0ZVZvaXggPSB2b3RlLmRlY29tcHRlVm9peFxuICAgICAgICAgIGFzc2VydChkZWNvbXB0ZVZvaXgpXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGRlY29tcHRlVm9peC5hYnN0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY29tcHRlVm9peC5hYnN0ZW50aW9ucywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICBkZWNvbXB0ZVZvaXguYWJzdGVudGlvbnMgPSBkZWNvbXB0ZVZvaXguYWJzdGVudGlvblxuICAgICAgICAgICAgICBkZWxldGUgZGVjb21wdGVWb2l4LmFic3RlbnRpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRlY29tcHRlVm9peC5ub25Wb3RhbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjb21wdGVWb2l4Lm5vblZvdGFudHMsIHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgZGVjb21wdGVWb2l4Lm5vblZvdGFudHMgPSBkZWNvbXB0ZVZvaXgubm9uVm90YW50XG4gICAgICAgICAgICAgIGRlbGV0ZSBkZWNvbXB0ZVZvaXgubm9uVm90YW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGVjb21wdGVOb21pbmF0aWYgPSB2b3RlLmRlY29tcHRlTm9taW5hdGlmXG4gICAgICAgICAgYXNzZXJ0KGRlY29tcHRlTm9taW5hdGlmKVxuICAgICAgICAgIGNsZWFuRGVjb21wdGVOb21pbmF0aWYoZGVjb21wdGVOb21pbmF0aWYpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZlbnRpbGF0aW9uVm90ZXMuZ3JvdXBlcyA9IGdyb3VwZXNcbiAgICB9XG5cbiAgICBzY3J1dGluLnZlbnRpbGF0aW9uVm90ZXMgPSB2ZW50aWxhdGlvblZvdGVzXG4gIH1cblxuICBjb25zdCBtaXNlQXVQb2ludCA9IHNjcnV0aW4ubWlzZUF1UG9pbnRcbiAgaWYgKG1pc2VBdVBvaW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhbkRlY29tcHRlTm9taW5hdGlmKG1pc2VBdVBvaW50KVxuXG4gICAgbGV0IGR5c2ZvbmN0aW9ubmVtZW50ID0gbWlzZUF1UG9pbnQuZHlzZm9uY3Rpb25uZW1lbnRcbiAgICBpZiAoZHlzZm9uY3Rpb25uZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYW5EZWNvbXB0ZU5vbWluYXRpZihkeXNmb25jdGlvbm5lbWVudClcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhkeXNmb25jdGlvbm5lbWVudCkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgZGVsZXRlIG1pc2VBdVBvaW50LmR5c2ZvbmN0aW9ubmVtZW50XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnZhbHVlcyhtaXNlQXVQb2ludCkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgZGVsZXRlIHNjcnV0aW4ubWlzZUF1UG9pbnRcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5Wb3RhbnQodm90YW50OiBhbnkpIHtcbiAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHZvdGFudCwgXCJwYXJEZWxlZ2F0aW9uXCIpXG4gIGNsZWFuSW50ZWdlckF0dHJpYnV0ZSh2b3RhbnQsIFwibnVtUGxhY2VcIilcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFBQSxTQUd6QkMscUJBQXFCLEVBQ3JCQyxxQkFBcUIsRUFDckJDLGlCQUFpQjtBQUduQixTQUFTQyxzQkFBc0JBLENBQUNDLGlCQUFzQixFQUFFO0VBQ3RERixpQkFBaUIsQ0FBQ0UsaUJBQWlCLENBQUM7RUFFcEMsSUFBSUMsVUFBVSxHQUFHRCxpQkFBaUIsQ0FBQ0MsVUFBVTtFQUM3QyxJQUFJQSxVQUFVLEtBQUtDLFNBQVMsRUFBRTtJQUM1QkQsVUFBVSxHQUFHRCxpQkFBaUIsQ0FBQ0csU0FBUztJQUN4QyxPQUFPSCxpQkFBaUIsQ0FBQ0csU0FBUztFQUNwQyxDQUFDLE1BQU07SUFDTFIsTUFBTSxDQUFDUyxXQUFX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