@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
180 lines (177 loc) • 24.3 kB
JavaScript
import assert from "assert";
import { cleanXmlArtefacts } from "./xml.mjs";
export function cleanActeur(acteur) {
cleanXmlArtefacts(acteur);
assert.strictEqual(acteur.uid["@xsi:type"], "IdActeur_type");
acteur.uid = acteur.uid["#text"];
assert(acteur.uid);
const etatCivil = acteur.etatCivil;
{
cleanXmlArtefacts(etatCivil);
const ident = etatCivil.ident;
{
cleanXmlArtefacts(ident);
const infoNaissance = etatCivil.infoNaissance;
{
cleanXmlArtefacts(infoNaissance);
}
}
}
const profession = acteur.profession;
if (profession !== undefined) {
cleanXmlArtefacts(profession);
const socProcInsee = profession.socProcINSEE;
assert(socProcInsee);
cleanXmlArtefacts(socProcInsee);
delete profession.socProcINSEE;
profession.socProcInsee = socProcInsee;
}
const uriHatvp = acteur.uri_hatvp;
if (uriHatvp !== undefined) {
acteur.uriHatvp = uriHatvp;
delete acteur.uri_hatvp;
}
let adresses = acteur.adresses;
if (adresses !== undefined) {
adresses = adresses.adresse;
if (adresses === undefined) {
delete acteur.adresses;
adresses = undefined;
} else if (Array.isArray(adresses)) {
acteur.adresses = adresses;
} else {
assert.notStrictEqual(adresses, null);
assert.strictEqual(typeof adresses, "object");
acteur.adresses = adresses = [adresses];
}
if (adresses !== undefined) {
for (const adresse of adresses) {
cleanXmlArtefacts(adresse);
const xsiType = adresse["@xsi:type"];
assert(["AdresseMail_Type", "AdressePostale_Type", "AdresseSiteWeb_Type", "AdresseTelephonique_Type"].includes(xsiType), `Unexpected "@xsi:type": ${xsiType}`);
adresse.xsiType = xsiType;
delete adresse["@xsi:type"];
assert.notStrictEqual(adresse.uid, undefined);
assert.notStrictEqual(adresse.type, undefined);
assert.notStrictEqual(adresse.typeLibelle, undefined);
if (xsiType === "AdressePostale_Type") {
assert.strictEqual(adresse.adresseDeRattachement, undefined);
}
}
}
}
let mandats = acteur.mandats;
if (mandats !== undefined) {
let mandat = mandats.mandat;
if (Array.isArray(mandat)) {
mandats = acteur.mandats = mandat;
} else if (typeof mandat === "object") {
mandats = acteur.mandats = [mandat];
}
for (const mandat of mandats) {
cleanXmlArtefacts(mandat);
const xsiType = mandat["@xsi:type"];
if (xsiType !== undefined) {
mandat.xsiType = xsiType;
delete mandat["@xsi:type"];
}
const infosQualite = mandat.infosQualite;
{
cleanXmlArtefacts(infosQualite);
}
const organes = mandat.organes;
delete mandat.organes;
let organesRefs = organes.organeRef;
assert(organesRefs);
if (!Array.isArray(organesRefs)) {
organesRefs = [organesRefs];
}
mandat.organesRefs = organesRefs;
let suppleant = mandat.suppleants;
delete mandat.suppleants;
if (suppleant) {
suppleant = suppleant.suppleant;
assert(suppleant);
mandat.suppleant = suppleant;
cleanXmlArtefacts(suppleant);
}
const election = mandat.election;
if (election !== undefined) {
cleanXmlArtefacts(election);
const lieu = election.lieu;
cleanXmlArtefacts(lieu);
}
const mandature = mandat.mandature;
if (mandature !== undefined) {
cleanXmlArtefacts(mandature);
}
assert.strictEqual(mandat.chambre, undefined);
// Replace collaborateurs with an array of collaborateurs.
let collaborateurs = mandat.collaborateurs;
if (collaborateurs !== undefined) {
const collaborateursArray = Array.isArray(collaborateurs) ? collaborateurs.filter(collaborateur => collaborateur !== null) : [collaborateurs];
collaborateurs = [];
collaborateursArray.map(({
collaborateur
}) => {
if (Array.isArray(collaborateur)) {
for (const collaborateurItem of collaborateur) {
if (collaborateurItem !== null) {
collaborateurs.push(collaborateurItem);
}
}
} else if (collaborateur) {
collaborateurs.push(collaborateur);
}
});
if (collaborateurs.length === 0) {
delete mandat.collaborateurs;
collaborateurs = undefined;
} else {
mandat.collaborateurs = collaborateurs;
}
for (const collaborateur of collaborateurs || []) {
cleanXmlArtefacts(collaborateur);
assert.strictEqual(collaborateur.dateDebut, undefined);
assert.strictEqual(collaborateur.dateFin, undefined);
}
}
const infosHorsSian = mandat.InfosHorsSIAN;
if (infosHorsSian !== undefined) {
cleanXmlArtefacts(infosHorsSian);
assert.strictEqual(infosHorsSian.HATVP_URI, undefined);
assert.strictEqual(Object.keys(infosHorsSian).length, 0);
delete mandat.InfosHorsSIAN;
}
}
// Sort mandats to ease comparison of different open data files.
mandats.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
}
let deports = acteur.deports;
if (deports !== undefined) {
let deport = deports.deport;
if (Array.isArray(deport)) {
deports = acteur.deports = deport;
} else if (typeof deport === "object") {
deports = acteur.deports = [deport];
}
for (const deport of deports) {
cleanXmlArtefacts(deport);
const cible = deport.cible;
{
cleanXmlArtefacts(cible);
assert.strictEqual(cible.references, undefined);
}
}
// Sort deports to ease comparison of different open data files.
deports.sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
}
}
export function cleanRapporteur(rapporteur) {
const etudePlfRef = rapporteur.etudePLFRef;
if (rapporteur.etudePLFRef !== undefined) {
delete rapporteur.etudePLFRef;
rapporteur.etudePlfRef = etudePlfRef;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhblhtbEFydGVmYWN0cyIsImNsZWFuQWN0ZXVyIiwiYWN0ZXVyIiwic3RyaWN0RXF1YWwiLCJ1aWQiLCJldGF0Q2l2aWwiLCJpZGVudCIsImluZm9OYWlzc2FuY2UiLCJwcm9mZXNzaW9uIiwidW5kZWZpbmVkIiwic29jUHJvY0luc2VlIiwic29jUHJvY0lOU0VFIiwidXJpSGF0dnAiLCJ1cmlfaGF0dnAiLCJhZHJlc3NlcyIsImFkcmVzc2UiLCJBcnJheSIsImlzQXJyYXkiLCJub3RTdHJpY3RFcXVhbCIsInhzaVR5cGUiLCJpbmNsdWRlcyIsInR5cGUiLCJ0eXBlTGliZWxsZSIsImFkcmVzc2VEZVJhdHRhY2hlbWVudCIsIm1hbmRhdHMiLCJtYW5kYXQiLCJpbmZvc1F1YWxpdGUiLCJvcmdhbmVzIiwib3JnYW5lc1JlZnMiLCJvcmdhbmVSZWYiLCJzdXBwbGVhbnQiLCJzdXBwbGVhbnRzIiwiZWxlY3Rpb24iLCJsaWV1IiwibWFuZGF0dXJlIiwiY2hhbWJyZSIsImNvbGxhYm9yYXRldXJzIiwiY29sbGFib3JhdGV1cnNBcnJheSIsImZpbHRlciIsImNvbGxhYm9yYXRldXIiLCJtYXAiLCJjb2xsYWJvcmF0ZXVySXRlbSIsInB1c2giLCJsZW5ndGgiLCJkYXRlRGVidXQiLCJkYXRlRmluIiwiaW5mb3NIb3JzU2lhbiIsIkluZm9zSG9yc1NJQU4iLCJIQVRWUF9VUkkiLCJPYmplY3QiLCJrZXlzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImRlcG9ydHMiLCJkZXBvcnQiLCJjaWJsZSIsInJlZmVyZW5jZXMiLCJjbGVhblJhcHBvcnRldXIiLCJyYXBwb3J0ZXVyIiwiZXR1ZGVQbGZSZWYiLCJldHVkZVBMRlJlZiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGVhbmVycy9hY3RldXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5cbmltcG9ydCB7IGNsZWFuWG1sQXJ0ZWZhY3RzIH0gZnJvbSBcIi4veG1sXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQWN0ZXVyKGFjdGV1cjogYW55KTogdm9pZCB7XG4gIGNsZWFuWG1sQXJ0ZWZhY3RzKGFjdGV1cilcblxuICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZXVyLnVpZFtcIkB4c2k6dHlwZVwiXSwgXCJJZEFjdGV1cl90eXBlXCIpXG4gIGFjdGV1ci51aWQgPSBhY3RldXIudWlkW1wiI3RleHRcIl1cbiAgYXNzZXJ0KGFjdGV1ci51aWQpXG5cbiAgY29uc3QgZXRhdENpdmlsID0gYWN0ZXVyLmV0YXRDaXZpbFxuICB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoZXRhdENpdmlsKVxuXG4gICAgY29uc3QgaWRlbnQgPSBldGF0Q2l2aWwuaWRlbnRcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhpZGVudClcblxuICAgICAgY29uc3QgaW5mb05haXNzYW5jZSA9IGV0YXRDaXZpbC5pbmZvTmFpc3NhbmNlXG4gICAgICB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGluZm9OYWlzc2FuY2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvZmVzc2lvbiA9IGFjdGV1ci5wcm9mZXNzaW9uXG4gIGlmIChwcm9mZXNzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhwcm9mZXNzaW9uKVxuXG4gICAgY29uc3Qgc29jUHJvY0luc2VlID0gcHJvZmVzc2lvbi5zb2NQcm9jSU5TRUVcbiAgICBhc3NlcnQoc29jUHJvY0luc2VlKVxuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHNvY1Byb2NJbnNlZSlcbiAgICBkZWxldGUgcHJvZmVzc2lvbi5zb2NQcm9jSU5TRUVcbiAgICBwcm9mZXNzaW9uLnNvY1Byb2NJbnNlZSA9IHNvY1Byb2NJbnNlZVxuICB9XG5cbiAgY29uc3QgdXJpSGF0dnAgPSBhY3RldXIudXJpX2hhdHZwXG4gIGlmICh1cmlIYXR2cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWN0ZXVyLnVyaUhhdHZwID0gdXJpSGF0dnBcbiAgICBkZWxldGUgYWN0ZXVyLnVyaV9oYXR2cFxuICB9XG5cbiAgbGV0IGFkcmVzc2VzID0gYWN0ZXVyLmFkcmVzc2VzXG4gIGlmIChhZHJlc3NlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWRyZXNzZXMgPSBhZHJlc3Nlcy5hZHJlc3NlXG4gICAgaWYgKGFkcmVzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBhY3RldXIuYWRyZXNzZXNcbiAgICAgIGFkcmVzc2VzID0gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFkcmVzc2VzKSkge1xuICAgICAgYWN0ZXVyLmFkcmVzc2VzID0gYWRyZXNzZXNcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFkcmVzc2VzLCBudWxsKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBhZHJlc3NlcywgXCJvYmplY3RcIilcbiAgICAgIGFjdGV1ci5hZHJlc3NlcyA9IGFkcmVzc2VzID0gW2FkcmVzc2VzXVxuICAgIH1cbiAgICBpZiAoYWRyZXNzZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBhZHJlc3NlIG9mIGFkcmVzc2VzKSB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGFkcmVzc2UpXG5cbiAgICAgICAgY29uc3QgeHNpVHlwZSA9IGFkcmVzc2VbXCJAeHNpOnR5cGVcIl1cbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIFwiQWRyZXNzZU1haWxfVHlwZVwiLFxuICAgICAgICAgICAgXCJBZHJlc3NlUG9zdGFsZV9UeXBlXCIsXG4gICAgICAgICAgICBcIkFkcmVzc2VTaXRlV2ViX1R5cGVcIixcbiAgICAgICAgICAgIFwiQWRyZXNzZVRlbGVwaG9uaXF1ZV9UeXBlXCIsXG4gICAgICAgICAgXS5pbmNsdWRlcyh4c2lUeXBlKSxcbiAgICAgICAgICBgVW5leHBlY3RlZCBcIkB4c2k6dHlwZVwiOiAke3hzaVR5cGV9YCxcbiAgICAgICAgKVxuICAgICAgICBhZHJlc3NlLnhzaVR5cGUgPSB4c2lUeXBlXG4gICAgICAgIGRlbGV0ZSBhZHJlc3NlW1wiQHhzaTp0eXBlXCJdXG5cbiAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFkcmVzc2UudWlkLCB1bmRlZmluZWQpXG4gICAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhZHJlc3NlLnR5cGUsIHVuZGVmaW5lZClcbiAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFkcmVzc2UudHlwZUxpYmVsbGUsIHVuZGVmaW5lZClcblxuICAgICAgICBpZiAoeHNpVHlwZSA9PT0gXCJBZHJlc3NlUG9zdGFsZV9UeXBlXCIpIHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRyZXNzZS5hZHJlc3NlRGVSYXR0YWNoZW1lbnQsIHVuZGVmaW5lZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBtYW5kYXRzID0gYWN0ZXVyLm1hbmRhdHNcbiAgaWYgKG1hbmRhdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBtYW5kYXQgPSBtYW5kYXRzLm1hbmRhdFxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hbmRhdCkpIHtcbiAgICAgIG1hbmRhdHMgPSBhY3RldXIubWFuZGF0cyA9IG1hbmRhdFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hbmRhdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgbWFuZGF0cyA9IGFjdGV1ci5tYW5kYXRzID0gW21hbmRhdF1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1hbmRhdCBvZiBtYW5kYXRzKSB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhtYW5kYXQpXG5cbiAgICAgIGNvbnN0IHhzaVR5cGUgPSBtYW5kYXRbXCJAeHNpOnR5cGVcIl1cbiAgICAgIGlmICh4c2lUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFuZGF0LnhzaVR5cGUgPSB4c2lUeXBlXG4gICAgICAgIGRlbGV0ZSBtYW5kYXRbXCJAeHNpOnR5cGVcIl1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5mb3NRdWFsaXRlID0gbWFuZGF0LmluZm9zUXVhbGl0ZVxuICAgICAge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhpbmZvc1F1YWxpdGUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yZ2FuZXMgPSBtYW5kYXQub3JnYW5lc1xuICAgICAgZGVsZXRlIG1hbmRhdC5vcmdhbmVzXG4gICAgICBsZXQgb3JnYW5lc1JlZnMgPSBvcmdhbmVzLm9yZ2FuZVJlZlxuICAgICAgYXNzZXJ0KG9yZ2FuZXNSZWZzKVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9yZ2FuZXNSZWZzKSkge1xuICAgICAgICBvcmdhbmVzUmVmcyA9IFtvcmdhbmVzUmVmc11cbiAgICAgIH1cbiAgICAgIG1hbmRhdC5vcmdhbmVzUmVmcyA9IG9yZ2FuZXNSZWZzXG5cbiAgICAgIGxldCBzdXBwbGVhbnQgPSBtYW5kYXQuc3VwcGxlYW50c1xuICAgICAgZGVsZXRlIG1hbmRhdC5zdXBwbGVhbnRzXG4gICAgICBpZiAoc3VwcGxlYW50KSB7XG4gICAgICAgIHN1cHBsZWFudCA9IHN1cHBsZWFudC5zdXBwbGVhbnRcbiAgICAgICAgYXNzZXJ0KHN1cHBsZWFudClcbiAgICAgICAgbWFuZGF0LnN1cHBsZWFudCA9IHN1cHBsZWFudFxuXG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHN1cHBsZWFudClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlY3Rpb24gPSBtYW5kYXQuZWxlY3Rpb25cbiAgICAgIGlmIChlbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGVsZWN0aW9uKVxuXG4gICAgICAgIGNvbnN0IGxpZXUgPSBlbGVjdGlvbi5saWV1XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGxpZXUpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hbmRhdHVyZSA9IG1hbmRhdC5tYW5kYXR1cmVcbiAgICAgIGlmIChtYW5kYXR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhtYW5kYXR1cmUpXG4gICAgICB9XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtYW5kYXQuY2hhbWJyZSwgdW5kZWZpbmVkKVxuXG4gICAgICAvLyBSZXBsYWNlIGNvbGxhYm9yYXRldXJzIHdpdGggYW4gYXJyYXkgb2YgY29sbGFib3JhdGV1cnMuXG4gICAgICBsZXQgY29sbGFib3JhdGV1cnMgPSBtYW5kYXQuY29sbGFib3JhdGV1cnNcbiAgICAgIGlmIChjb2xsYWJvcmF0ZXVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNvbGxhYm9yYXRldXJzQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbGxhYm9yYXRldXJzKVxuICAgICAgICAgID8gY29sbGFib3JhdGV1cnMuZmlsdGVyKChjb2xsYWJvcmF0ZXVyKSA9PiBjb2xsYWJvcmF0ZXVyICE9PSBudWxsKVxuICAgICAgICAgIDogW2NvbGxhYm9yYXRldXJzXVxuICAgICAgICBjb2xsYWJvcmF0ZXVycyA9IFtdXG4gICAgICAgIGNvbGxhYm9yYXRldXJzQXJyYXkubWFwKCh7IGNvbGxhYm9yYXRldXIgfSkgPT4ge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbGxhYm9yYXRldXIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbGxhYm9yYXRldXJJdGVtIG9mIGNvbGxhYm9yYXRldXIpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbGxhYm9yYXRldXJJdGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29sbGFib3JhdGV1cnMucHVzaChjb2xsYWJvcmF0ZXVySXRlbSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoY29sbGFib3JhdGV1cikge1xuICAgICAgICAgICAgY29sbGFib3JhdGV1cnMucHVzaChjb2xsYWJvcmF0ZXVyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGNvbGxhYm9yYXRldXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSBtYW5kYXQuY29sbGFib3JhdGV1cnNcbiAgICAgICAgICBjb2xsYWJvcmF0ZXVycyA9IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hbmRhdC5jb2xsYWJvcmF0ZXVycyA9IGNvbGxhYm9yYXRldXJzXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbGxhYm9yYXRldXIgb2YgY29sbGFib3JhdGV1cnMgfHwgW10pIHtcbiAgICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhjb2xsYWJvcmF0ZXVyKVxuXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbGxhYm9yYXRldXIuZGF0ZURlYnV0LCB1bmRlZmluZWQpXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbGxhYm9yYXRldXIuZGF0ZUZpbiwgdW5kZWZpbmVkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZm9zSG9yc1NpYW4gPSBtYW5kYXQuSW5mb3NIb3JzU0lBTlxuICAgICAgaWYgKGluZm9zSG9yc1NpYW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhpbmZvc0hvcnNTaWFuKVxuXG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbmZvc0hvcnNTaWFuLkhBVFZQX1VSSSwgdW5kZWZpbmVkKVxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoT2JqZWN0LmtleXMoaW5mb3NIb3JzU2lhbikubGVuZ3RoLCAwKVxuICAgICAgICBkZWxldGUgbWFuZGF0LkluZm9zSG9yc1NJQU5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IG1hbmRhdHMgdG8gZWFzZSBjb21wYXJpc29uIG9mIGRpZmZlcmVudCBvcGVuIGRhdGEgZmlsZXMuXG4gICAgbWFuZGF0cy5zb3J0KChhOiB7IHVpZDogc3RyaW5nIH0sIGI6IHsgdWlkOiBzdHJpbmcgfSkgPT5cbiAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgKVxuICB9XG5cbiAgbGV0IGRlcG9ydHMgPSBhY3RldXIuZGVwb3J0c1xuICBpZiAoZGVwb3J0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IGRlcG9ydCA9IGRlcG9ydHMuZGVwb3J0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwb3J0KSkge1xuICAgICAgZGVwb3J0cyA9IGFjdGV1ci5kZXBvcnRzID0gZGVwb3J0XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVwb3J0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBkZXBvcnRzID0gYWN0ZXVyLmRlcG9ydHMgPSBbZGVwb3J0XVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwb3J0IG9mIGRlcG9ydHMpIHtcbiAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGRlcG9ydClcblxuICAgICAgY29uc3QgY2libGUgPSBkZXBvcnQuY2libGVcbiAgICAgIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoY2libGUpXG5cbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNpYmxlLnJlZmVyZW5jZXMsIHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGRlcG9ydHMgdG8gZWFzZSBjb21wYXJpc29uIG9mIGRpZmZlcmVudCBvcGVuIGRhdGEgZmlsZXMuXG4gICAgZGVwb3J0cy5zb3J0KChhOiB7IHVpZDogc3RyaW5nIH0sIGI6IHsgdWlkOiBzdHJpbmcgfSkgPT5cbiAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblJhcHBvcnRldXIocmFwcG9ydGV1cjogYW55KSB7XG4gIGNvbnN0IGV0dWRlUGxmUmVmID0gcmFwcG9ydGV1ci5ldHVkZVBMRlJlZlxuICBpZiAocmFwcG9ydGV1ci5ldHVkZVBMRlJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVsZXRlIHJhcHBvcnRldXIuZXR1ZGVQTEZSZWZcbiAgICByYXBwb3J0ZXVyLmV0dWRlUGxmUmVmID0gZXR1ZGVQbGZSZWZcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0sUUFBUTtBQUFBLFNBRWxCQyxpQkFBaUI7QUFFMUIsT0FBTyxTQUFTQyxXQUFXQSxDQUFDQyxNQUFXLEVBQVE7RUFDN0NGLGlCQUFpQixDQUFDRSxNQUFNLENBQUM7RUFFekJILE1BQU0sQ0FBQ0ksV0FBVyxDQUFDRCxNQUFNLENBQUNFLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUM7RUFDNURGLE1BQU0sQ0FBQ0UsR0FBRyxHQUFHRixNQUFNLENBQUNFLEdBQUcsQ0FBQyxPQUFPLENBQUM7RUFDaENMLE1BQU0sQ0FBQ0csTUFBTSxDQUFDRSxHQUFHLENBQUM7RUFFbEIsTUFBTUMsU0FBUyxHQUFHSCxNQUFNLENBQUNHLFNBQVM7RUFDbEM7SUFDRUwsaUJBQWlCLENBQUNLLFNBQVMsQ0FBQztJQUU1QixNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBSztJQUM3QjtNQUNFTixpQkFBaUIsQ0FBQ00sS0FBSyxDQUFDO01BRXhCLE1BQU1DLGFBQWEsR0FBR0YsU0FBUyxDQUFDRSxhQUFhO01BQzdDO1FBQ0VQLGlCQUFpQixDQUFDTyxhQUFhLENBQUM7TUFDbEM7SUFDRjtFQUNGO0VBRUEsTUFBTUMsVUFBVSxHQUFHTixNQUFNLENBQUNNLFVBQVU7RUFDcEMsSUFBSUEsVUFBVSxLQUFLQyxTQUFTLEVB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