@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
724 lines (720 loc) • 88.2 kB
JavaScript
// To parse this data:
//
// import { Convert, Reunion, Agendas } from "./file";
//
// const reunion = Convert.toReunion(json);
// const agendas = Convert.toAgendas(json);
//
// These functions will throw an error if the JSON doesn't
// match the expected interface, even if the JSON is valid.
export let ReunionXsiType = /*#__PURE__*/function (ReunionXsiType) {
ReunionXsiType["ReunionCommissionType"] = "reunionCommission_type";
ReunionXsiType["ReunionInitParlementaireType"] = "reunionInitParlementaire_type";
ReunionXsiType["SeanceType"] = "seance_type";
return ReunionXsiType;
}({});
export let PointOdjXsiType = /*#__PURE__*/function (PointOdjXsiType) {
PointOdjXsiType["PodjReunionType"] = "podjReunion_type";
PointOdjXsiType["PodjSeanceConfPresType"] = "podjSeanceConfPres_type";
return PointOdjXsiType;
}({});
export let Etat = /*#__PURE__*/function (Etat) {
Etat["Annul\xE9"] = "Annul\xE9";
Etat["Confirm\xE9"] = "Confirm\xE9";
Etat["Eventuel"] = "Eventuel";
Etat["Supprim\xE9"] = "Supprim\xE9";
return Etat;
}({});
export let NatureTravauxOdj = /*#__PURE__*/function (NatureTravauxOdj) {
NatureTravauxOdj["Odjpr"] = "ODJPR";
NatureTravauxOdj["Odjsn"] = "ODJSN";
return NatureTravauxOdj;
}({});
export let Procedure = /*#__PURE__*/function (Procedure) {
Procedure["DiscussionG\xE9n\xE9raleCommune"] = "discussion g\xE9n\xE9rale commune";
Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle103"] = "proc\xE9dure d'examen simplifi\xE9e-Article 103";
Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle106"] = "proc\xE9dure d'examen simplifi\xE9e-Article 106";
Procedure["Proc\xE9dureDExamenSimplifi\xE9eArticle107"] = "proc\xE9dure d'examen simplifi\xE9e-Article 107";
Procedure["Proc\xE9dureDeL\xE9gislationEnCommissionArticle1071"] = "proc\xE9dure de l\xE9gislation en commission-Article 107-1";
return Procedure;
}({});
export let TypePointOdj = /*#__PURE__*/function (TypePointOdj) {
TypePointOdj["AmendementsArt88"] = "Amendements (Art. 88)";
TypePointOdj["AmendementsArt91"] = "Amendements (Art. 91)";
TypePointOdj["Audition"] = "Audition";
TypePointOdj["AuditionMinistre"] = "Audition ministre";
TypePointOdj["AuditionMinistreOuverte\xC0LaPresse"] = "Audition ministre ouverte \xE0 la presse";
TypePointOdj["AuditionOuverte\xC0LaPresse"] = "Audition ouverte \xE0 la presse";
TypePointOdj["Communication"] = "Communication";
TypePointOdj["ConstitutionDeMissionDInformation"] = "Constitution de mission d'information";
TypePointOdj["Discussion"] = "Discussion";
TypePointOdj["D\xE9batDInitiativeParlementaire"] = "D\xE9bat d'initiative parlementaire";
TypePointOdj["D\xE9clarationDuGouvernementSuivieDUnD\xE9bat"] = "D\xE9claration du Gouvernement suivie d'un d\xE9bat";
TypePointOdj["EchangesDeVues"] = "Echanges de vues";
TypePointOdj["Examen"] = "Examen";
TypePointOdj["ExplicationsDeVoteDesGroupesEtVoteParScrutinPublic"] = "Explications de vote des groupes et vote par scrutin public";
TypePointOdj["ExplicationsDeVoteEtVoteParScrutinPublic"] = "Explications de vote et vote par scrutin public";
TypePointOdj["FixationDeLOrdreDuJour"] = "Fixation de l'ordre du jour";
TypePointOdj["NominationBureau"] = "Nomination bureau";
TypePointOdj["NominationCandidatsOrganismeExtraparlementaire"] = "Nomination candidats organisme extraparlementaire";
TypePointOdj["NominationDUnMembreDUneMissionDInformation"] = "Nomination d'un membre d'une mission d'information";
TypePointOdj["NominationRapporteur"] = "Nomination rapporteur";
TypePointOdj["NominationRapporteurDApplication"] = "Nomination rapporteur d'application";
TypePointOdj["NominationRapporteurDInformation"] = "Nomination rapporteur d'information";
TypePointOdj["NominationRapporteurPourAvis"] = "Nomination rapporteur pour avis";
TypePointOdj["OuvertureEtCl\xF4tureDeSession"] = "Ouverture et cl\xF4ture de session";
TypePointOdj["QuestionsAuGouvernement"] = "Questions au Gouvernement";
TypePointOdj["QuestionsOralesSansD\xE9bat"] = "Questions orales sans d\xE9bat";
TypePointOdj["Rapport"] = "Rapport";
TypePointOdj["RapportDInformation"] = "Rapport d'information";
TypePointOdj["RapportPourAvis"] = "Rapport pour avis";
TypePointOdj["SeancesReserveesGroupeOppositionOuMinoritaire"] = "S\xE9ances r\xE9serv\xE9es \xE0 un groupe de l'opposition ou minoritaire";
TypePointOdj["SuiteDeLaDiscussion"] = "Suite de la discussion";
TypePointOdj["TableRonde"] = "Table ronde";
TypePointOdj["VoteParScrutinPublic"] = "Vote par scrutin public";
TypePointOdj["VoteSolennel"] = "Vote solennel";
return TypePointOdj;
}({});
export let FormatReunion = /*#__PURE__*/function (FormatReunion) {
FormatReunion["AuditionExterne"] = "AuditionExterne";
FormatReunion["AuditionParPresidentCommission"] = "AuditionParPresidentCommission";
FormatReunion["AuditionParRapporteur"] = "AuditionParRapporteur";
FormatReunion["Ordinaire"] = "Ordinaire";
return FormatReunion;
}({});
export let Quantieme = /*#__PURE__*/function (Quantieme) {
Quantieme["Deuxi\xE8me"] = "Deuxi\xE8me";
Quantieme["Premi\xE8re"] = "Premi\xE8re";
Quantieme["Troisi\xE8me"] = "Troisi\xE8me";
Quantieme["Unique"] = "Unique";
return Quantieme;
}({});
export let Presence = /*#__PURE__*/function (Presence) {
Presence["Absent"] = "absent";
Presence["Excus\xE9"] = "excus\xE9";
Presence["Pr\xE9sent"] = "pr\xE9sent";
return Presence;
}({});
export let TypeReunion = /*#__PURE__*/function (TypeReunion) {
TypeReunion["Dep"] = "DEP";
TypeReunion["Ga"] = "GA";
TypeReunion["Ge"] = "GE";
TypeReunion["Gevi"] = "GEVI";
TypeReunion["Gp"] = "GP";
TypeReunion["H\xE9Aur\xE9lien"] = "H\xC9 Aur\xE9lien";
return TypeReunion;
}({});
export let Civ = /*#__PURE__*/function (Civ) {
Civ["M"] = "M.";
Civ["Mme"] = "Mme";
return Civ;
}({});
export let UidXsiType = /*#__PURE__*/function (UidXsiType) {
UidXsiType["IdActeurType"] = "IdActeur_type";
UidXsiType["IdPersonneExterneType"] = "IdPersonneExterne_type";
return UidXsiType;
}({});
// Converts JSON strings to/from your types
// and asserts the results of JSON.parse at runtime
export class Convert {
static toReunion(json) {
return cast(JSON.parse(json), r("Reunion"));
}
static reunionToJson(value) {
return JSON.stringify(uncast(value, r("Reunion")), null, 2);
}
static toAgendas(json) {
return cast(JSON.parse(json), r("Agendas"));
}
static agendasToJson(value) {
return JSON.stringify(uncast(value, r("Agendas")), null, 2);
}
}
function invalidValue(typ, val, key = '') {
if (key) {
throw Error(`Invalid value for key "${key}". Expected type ${JSON.stringify(typ)} but got ${JSON.stringify(val)}`);
}
throw Error(`Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}`);
}
function jsonToJSProps(typ) {
if (typ.jsonToJS === undefined) {
const map = {};
typ.props.forEach(p => map[p.json] = {
key: p.js,
typ: p.typ
});
typ.jsonToJS = map;
}
return typ.jsonToJS;
}
function jsToJSONProps(typ) {
if (typ.jsToJSON === undefined) {
const map = {};
typ.props.forEach(p => map[p.js] = {
key: p.json,
typ: p.typ
});
typ.jsToJSON = map;
}
return typ.jsToJSON;
}
function transform(val, typ, getProps, key = '') {
function transformPrimitive(typ, val) {
if (typeof typ === typeof val) return val;
return invalidValue(typ, val, key);
}
function transformUnion(typs, val) {
// val must validate against one typ in typs
const l = typs.length;
for (let i = 0; i < l; i++) {
const typ = typs[i];
try {
return transform(val, typ, getProps);
} catch (_) {}
}
return invalidValue(typs, val);
}
function transformEnum(cases, val) {
if (cases.indexOf(val) !== -1) return val;
return invalidValue(cases, val);
}
function transformArray(typ, val) {
// val must be an array with no invalid elements
if (!Array.isArray(val)) return invalidValue("array", val);
return val.map(el => transform(el, typ, getProps));
}
function transformDate(val) {
if (val === null) {
return null;
}
const d = new Date(val);
if (isNaN(d.valueOf())) {
return invalidValue("Date", val);
}
return d;
}
function transformObject(props, additional, val) {
if (val === null || typeof val !== "object" || Array.isArray(val)) {
return invalidValue("object", val);
}
const result = {};
Object.getOwnPropertyNames(props).forEach(key => {
const prop = props[key];
const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
result[prop.key] = transform(v, prop.typ, getProps, prop.key);
});
Object.getOwnPropertyNames(val).forEach(key => {
if (!Object.prototype.hasOwnProperty.call(props, key)) {
result[key] = transform(val[key], additional, getProps, key);
}
});
return result;
}
if (typ === "any") return val;
if (typ === null) {
if (val === null) return val;
return invalidValue(typ, val);
}
if (typ === false) return invalidValue(typ, val);
while (typeof typ === "object" && typ.ref !== undefined) {
typ = typeMap[typ.ref];
}
if (Array.isArray(typ)) return transformEnum(typ, val);
if (typeof typ === "object") {
return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) : invalidValue(typ, val);
}
// Numbers can be parsed by Date but shouldn't be.
if (typ === Date && typeof val !== "number") return transformDate(val);
return transformPrimitive(typ, val);
}
function cast(val, typ) {
return transform(val, typ, jsonToJSProps);
}
function uncast(val, typ) {
return transform(val, typ, jsToJSONProps);
}
function a(typ) {
return {
arrayItems: typ
};
}
function u(...typs) {
return {
unionMembers: typs
};
}
function o(props, additional) {
return {
props,
additional
};
}
// function m(additional: any) {
// return { props: [], additional };
// }
function r(name) {
return {
ref: name
};
}
const typeMap = {
"Reunion": o([{
json: "reunion",
js: "reunion",
typ: r("ReunionReunion")
}], false),
"ReunionReunion": o([{
json: "@xmlns",
js: "@xmlns",
typ: ""
}, {
json: "@xmlns:xsi",
js: "@xmlns:xsi",
typ: ""
}, {
json: "@xsi:type",
js: "@xsi:type",
typ: r("ReunionXsiType")
}, {
json: "uid",
js: "uid",
typ: ""
}, {
json: "timeStampDebut",
js: "timeStampDebut",
typ: Date
}, {
json: "timeStampFin",
js: "timeStampFin",
typ: u(undefined, "")
}, {
json: "lieu",
js: "lieu",
typ: u(undefined, r("Lieu"))
}, {
json: "cycleDeVie",
js: "cycleDeVie",
typ: r("CycleDeVie")
}, {
json: "demandeurs",
js: "demandeurs",
typ: u(undefined, u(r("Demandeurs"), null))
}, {
json: "organeReuniRef",
js: "organeReuniRef",
typ: u(null, "")
}, {
json: "typeReunion",
js: "typeReunion",
typ: u(undefined, r("TypeReunion"))
}, {
json: "demandeur",
js: "demandeur",
typ: u(undefined, u(r("Demandeur"), null))
}, {
json: "participants",
js: "participants",
typ: u(undefined, u(r("PurpleParticipants"), null))
}, {
json: "visioConference",
js: "visioConference",
typ: u(undefined, u(null, ""))
}, {
json: "ODJ",
js: "ODJ",
typ: u(undefined, u(r("Odj"), null))
}, {
json: "sessionRef",
js: "sessionRef",
typ: u(undefined, u("", null))
}, {
json: "ouverturePresse",
js: "ouverturePresse",
typ: u(undefined, "")
}, {
json: "captationVideo",
js: "captationVideo",
typ: u(undefined, "")
}, {
json: "compteRenduRef",
js: "compteRenduRef",
typ: u(undefined, u(null, ""))
}, {
json: "formatReunion",
js: "formatReunion",
typ: u(undefined, r("FormatReunion"))
}, {
json: "infosReunionsInternationale",
js: "infosReunionsInternationale",
typ: u(undefined, r("InfosReunionsInternationale"))
}, {
json: "identifiants",
js: "identifiants",
typ: u(undefined, r("Identifiants"))
}], false),
"Odj": o([{
json: "convocationODJ",
js: "convocationODJ",
typ: u(r("ConvocationOdjClass"), null)
}, {
json: "resumeODJ",
js: "resumeODJ",
typ: u(r("ConvocationOdjClass"), null)
}, {
json: "pointsODJ",
js: "pointsODJ",
typ: u(undefined, u(r("PointsOdj"), null))
}], false),
"ConvocationOdjClass": o([{
json: "item",
js: "item",
typ: u(a(""), "")
}], false),
"PointsOdj": o([{
json: "pointODJ",
js: "pointODJ",
typ: u(a(r("PointOdjElement")), r("PointOdjElement"))
}], false),
"PointOdjElement": o([{
json: "@xsi:type",
js: "@xsi:type",
typ: r("PointOdjXsiType")
}, {
json: "uid",
js: "uid",
typ: ""
}, {
json: "cycleDeVie",
js: "cycleDeVie",
typ: r("CycleDeVie")
}, {
json: "objet",
js: "objet",
typ: ""
}, {
json: "demandeurPoint",
js: "demandeurPoint",
typ: null
}, {
json: "procedure",
js: "procedure",
typ: u(r("Procedure"), null)
}, {
json: "dossiersLegislatifsRefs",
js: "dossiersLegislatifsRefs",
typ: u(r("DossiersLegislatifsRefs"), null)
}, {
json: "typePointODJ",
js: "typePointODJ",
typ: r("TypePointOdj")
}, {
json: "comiteSecret",
js: "comiteSecret",
typ: ""
}, {
json: "textesAssocies",
js: "textesAssocies",
typ: null
}, {
json: "natureTravauxODJ",
js: "natureTravauxODJ",
typ: u(undefined, r("NatureTravauxOdj"))
}, {
json: "dateConfPres",
js: "dateConfPres",
typ: u(undefined, "")
}, {
json: "dateLettreMinistre",
js: "dateLettreMinistre",
typ: u(undefined, "")
}], false),
"CycleDeVie": o([{
json: "etat",
js: "etat",
typ: r("Etat")
}, {
json: "chrono",
js: "chrono",
typ: r("Chrono")
}], false),
"Chrono": o([{
json: "creation",
js: "creation",
typ: ""
}, {
json: "cloture",
js: "cloture",
typ: u(null, "")
}], false),
"DossiersLegislatifsRefs": o([{
json: "dossierRef",
js: "dossierRef",
typ: u(a(""), "")
}], false),
"Demandeur": o([{
json: "acteur",
js: "acteur",
typ: u(undefined, r("ActeurElement"))
}, {
json: "organe",
js: "organe",
typ: u(undefined, r("Organe"))
}], false),
"ActeurElement": o([{
json: "nom",
js: "nom",
typ: u(null, "")
}, {
json: "acteurRef",
js: "acteurRef",
typ: ""
}], false),
"Organe": o([{
json: "nom",
js: "nom",
typ: ""
}, {
json: "organeRef",
js: "organeRef",
typ: ""
}], false),
"Demandeurs": o([{
json: "acteur",
js: "acteur",
typ: u(undefined, u(a(r("ActeurElement")), r("ActeurElement")))
}, {
json: "organe",
js: "organe",
typ: u(undefined, r("Organe"))
}], false),
"Identifiants": o([{
json: "numSeanceJO",
js: "numSeanceJO",
typ: u(null, "")
}, {
json: "idJO",
js: "idJO",
typ: u(null, "")
}, {
json: "quantieme",
js: "quantieme",
typ: r("Quantieme")
}, {
json: "DateSeance",
js: "DateSeance",
typ: ""
}], false),
"InfosReunionsInternationale": o([{
json: "estReunionInternationale",
js: "estReunionInternationale",
typ: ""
}, {
json: "listePays",
js: "listePays",
typ: u(r("ListePays"), null)
}, {
json: "informationsComplementaires",
js: "informationsComplementaires",
typ: u(undefined, u(null, ""))
}], false),
"ListePays": o([{
json: "paysRef",
js: "paysRef",
typ: u(a(""), "")
}], false),
"Lieu": o([{
json: "code",
js: "code",
typ: u(undefined, u("", null))
}, {
json: "libelleCourt",
js: "libelleCourt",
typ: u(undefined, u("", null))
}, {
json: "libelleLong",
js: "libelleLong",
typ: u(null, "")
}, {
json: "lieuRef",
js: "lieuRef",
typ: u(undefined, u("", null))
}], false),
"PurpleParticipants": o([{
json: "participantsInternes",
js: "participantsInternes",
typ: u(r("PurpleParticipantsInternes"), null)
}, {
json: "personnesAuditionnees",
js: "personnesAuditionnees",
typ: u(r("PurplePersonnesAuditionnees"), null)
}], false),
"PurpleParticipantsInternes": o([{
json: "participantInterne",
js: "participantInterne",
typ: u(a(r("ParticipantInterneElement")), r("ParticipantInterneElement"))
}], false),
"ParticipantInterneElement": o([{
json: "acteurRef",
js: "acteurRef",
typ: ""
}, {
json: "presence",
js: "presence",
typ: r("Presence")
}], false),
"PurplePersonnesAuditionnees": o([{
json: "personneAuditionnee",
js: "personneAuditionnee",
typ: u(a(null), null)
}], false),
"Agendas": o([{
json: "reunions",
js: "reunions",
typ: r("Reunions")
}], false),
"Reunions": o([{
json: "reunion",
js: "reunion",
typ: a(r("ReunionElement"))
}], false),
"ReunionElement": o([{
json: "uid",
js: "uid",
typ: ""
}, {
json: "timeStampDebut",
js: "timeStampDebut",
typ: Date
}, {
json: "timeStampFin",
js: "timeStampFin",
typ: u(undefined, "")
}, {
json: "lieu",
js: "lieu",
typ: r("Lieu")
}, {
json: "cycleDeVie",
js: "cycleDeVie",
typ: r("CycleDeVie")
}, {
json: "demandeurs",
js: "demandeurs",
typ: u(undefined, u(r("Demandeurs"), null))
}, {
json: "organeReuniRef",
js: "organeReuniRef",
typ: u(null, "")
}, {
json: "typeReunion",
js: "typeReunion",
typ: u(undefined, r("TypeReunion"))
}, {
json: "@xmlns:xsi",
js: "@xmlns:xsi",
typ: u(undefined, "")
}, {
json: "demandeur",
js: "demandeur",
typ: u(undefined, null)
}, {
json: "participants",
js: "participants",
typ: u(undefined, u(r("FluffyParticipants"), null))
}, {
json: "sessionRef",
js: "sessionRef",
typ: u(undefined, u("", null))
}, {
json: "ouverturePresse",
js: "ouverturePresse",
typ: u(undefined, "")
}, {
json: "ODJ",
js: "ODJ",
typ: u(undefined, r("Odj"))
}, {
json: "compteRenduRef",
js: "compteRenduRef",
typ: u(undefined, u(null, ""))
}, {
json: "identifiants",
js: "identifiants",
typ: u(undefined, r("Identifiants"))
}], false),
"FluffyParticipants": o([{
json: "participantsInternes",
js: "participantsInternes",
typ: u(r("FluffyParticipantsInternes"), null)
}, {
json: "personnesAuditionnees",
js: "personnesAuditionnees",
typ: u(r("FluffyPersonnesAuditionnees"), null)
}], false),
"FluffyParticipantsInternes": o([{
json: "participantInterne",
js: "participantInterne",
typ: a(r("ParticipantInterneElement"))
}], false),
"FluffyPersonnesAuditionnees": o([{
json: "personneAuditionnee",
js: "personneAuditionnee",
typ: u(a(r("PersonneAuditionneeElement")), r("PersonneAuditionneeElement"))
}], false),
"PersonneAuditionneeElement": o([{
json: "uid",
js: "uid",
typ: r("Uid")
}, {
json: "ident",
js: "ident",
typ: r("Ident")
}, {
json: "dateNais",
js: "dateNais",
typ: u(Date, null)
}], false),
"Ident": o([{
json: "civ",
js: "civ",
typ: r("Civ")
}, {
json: "prenom",
js: "prenom",
typ: ""
}, {
json: "nom",
js: "nom",
typ: ""
}, {
json: "alpha",
js: "alpha",
typ: u(undefined, "")
}, {
json: "trigramme",
js: "trigramme",
typ: u(undefined, u(null, ""))
}], false),
"Uid": o([{
json: "@xsi:type",
js: "@xsi:type",
typ: r("UidXsiType")
}, {
json: "#text",
js: "#text",
typ: ""
}], false),
"ReunionXsiType": ["reunionCommission_type", "reunionInitParlementaire_type", "seance_type"],
"PointOdjXsiType": ["podjReunion_type", "podjSeanceConfPres_type"],
"Etat": ["Annulé", "Confirmé", "Eventuel", "Supprimé"],
"NatureTravauxOdj": ["ODJPR", "ODJSN"],
"Procedure": ["discussion générale commune", "procédure d'examen simplifiée-Article 103", "procédure d'examen simplifiée-Article 106", "procédure d'examen simplifiée-Article 107", "procédure de législation en commission-Article 107-1"],
"TypePointOdj": ["Amendements (Art. 88)", "Amendements (Art. 91)", "Audition", "Audition ministre", "Audition ministre ouverte à la presse", "Audition ouverte à la presse", "Communication", "Constitution de mission d'information", "Discussion", "Débat d'initiative parlementaire", "Déclaration du Gouvernement suivie d'un débat", "Echanges de vues", "Examen", "Explications de vote des groupes et vote par scrutin public", "Explications de vote et vote par scrutin public", "Fixation de l'ordre du jour", "Nomination bureau", "Nomination candidats organisme extraparlementaire", "Nomination d'un membre d'une mission d'information", "Nomination rapporteur", "Nomination rapporteur d'application", "Nomination rapporteur d'information", "Nomination rapporteur pour avis", "Ouverture et clôture de session", "Questions au Gouvernement", "Questions orales sans débat", "Rapport", "Rapport d'information", "Rapport pour avis", "Séances réservées à un groupe de l'opposition ou minoritaire", "Suite de la discussion", "Table ronde", "Vote par scrutin public", "Vote solennel"],
"FormatReunion": ["AuditionExterne", "AuditionParPresidentCommission", "AuditionParRapporteur", "Ordinaire"],
"Quantieme": ["Deuxième", "Première", "Troisième", "Unique"],
"Presence": ["absent", "excusé", "présent"],
"TypeReunion": ["DEP", "GA", "GE", "GEVI", "GP", "HÉ Aurélien"],
"Civ": ["M.", "Mme"],
"UidXsiType": ["IdActeur_type", "IdPersonneExterne_type"]
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXVuaW9uWHNpVHlwZSIsIlBvaW50T2RqWHNpVHlwZSIsIkV0YXQiLCJOYXR1cmVUcmF2YXV4T2RqIiwiUHJvY2VkdXJlIiwiVHlwZVBvaW50T2RqIiwiRm9ybWF0UmV1bmlvbiIsIlF1YW50aWVtZSIsIlByZXNlbmNlIiwiVHlwZVJldW5pb24iLCJDaXYiLCJVaWRYc2lUeXBlIiwiQ29udmVydCIsInRvUmV1bmlvbiIsImpzb24iLCJjYXN0IiwiSlNPTiIsInBhcnNlIiwiciIsInJldW5pb25Ub0pzb24iLCJ2YWx1ZSIsInN0cmluZ2lmeSIsInVuY2FzdCIsInRvQWdlbmRhcyIsImFnZW5kYXNUb0pzb24iLCJpbnZhbGlkVmFsdWUiLCJ0eXAiLCJ2YWwiLCJrZXkiLCJFcnJvciIsImpzb25Ub0pTUHJvcHMiLCJqc29uVG9KUyIsInVuZGVmaW5lZCIsIm1hcCIsInByb3BzIiwiZm9yRWFjaCIsInAiLCJqcyIsImpzVG9KU09OUHJvcHMiLCJqc1RvSlNPTiIsInRyYW5zZm9ybSIsImdldFByb3BzIiwidHJhbnNmb3JtUHJpbWl0aXZlIiwidHJhbnNmb3JtVW5pb24iLCJ0eXBzIiwibCIsImxlbmd0aCIsImkiLCJfIiwidHJhbnNmb3JtRW51bSIsImNhc2VzIiwiaW5kZXhPZiIsInRyYW5zZm9ybUFycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZWwiLCJ0cmFuc2Zvcm1EYXRlIiwiZCIsIkRhdGUiLCJpc05hTiIsInZhbHVlT2YiLCJ0cmFuc2Zvcm1PYmplY3QiLCJhZGRpdGlvbmFsIiwicmVzdWx0IiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3AiLCJ2IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVmIiwidHlwZU1hcCIsInVuaW9uTWVtYmVycyIsImFycmF5SXRlbXMiLCJhIiwidSIsIm8iLCJuYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jhd190eXBlcy9hZ2VuZGFzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRvIHBhcnNlIHRoaXMgZGF0YTpcbi8vXG4vLyAgIGltcG9ydCB7IENvbnZlcnQsIFJldW5pb24sIEFnZW5kYXMgfSBmcm9tIFwiLi9maWxlXCI7XG4vL1xuLy8gICBjb25zdCByZXVuaW9uID0gQ29udmVydC50b1JldW5pb24oanNvbik7XG4vLyAgIGNvbnN0IGFnZW5kYXMgPSBDb252ZXJ0LnRvQWdlbmRhcyhqc29uKTtcbi8vXG4vLyBUaGVzZSBmdW5jdGlvbnMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgSlNPTiBkb2Vzbid0XG4vLyBtYXRjaCB0aGUgZXhwZWN0ZWQgaW50ZXJmYWNlLCBldmVuIGlmIHRoZSBKU09OIGlzIHZhbGlkLlxuXG5leHBvcnQgaW50ZXJmYWNlIFJldW5pb24ge1xuICAgIHJldW5pb246IFJldW5pb25SZXVuaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldW5pb25SZXVuaW9uIHtcbiAgICBcIkB4bWxuc1wiOiAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBcIkB4bWxuczp4c2lcIjogICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBcIkB4c2k6dHlwZVwiOiAgICAgICAgICAgICAgICAgIFJldW5pb25Yc2lUeXBlO1xuICAgIHVpZDogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICB0aW1lU3RhbXBEZWJ1dDogICAgICAgICAgICAgICBEYXRlO1xuICAgIHRpbWVTdGFtcEZpbj86ICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBsaWV1PzogICAgICAgICAgICAgICAgICAgICAgICBMaWV1O1xuICAgIGN5Y2xlRGVWaWU6ICAgICAgICAgICAgICAgICAgIEN5Y2xlRGVWaWU7XG4gICAgZGVtYW5kZXVycz86ICAgICAgICAgICAgICAgICAgRGVtYW5kZXVycyB8IG51bGw7XG4gICAgb3JnYW5lUmV1bmlSZWY6ICAgICAgICAgICAgICAgbnVsbCB8IHN0cmluZztcbiAgICB0eXBlUmV1bmlvbj86ICAgICAgICAgICAgICAgICBUeXBlUmV1bmlvbjtcbiAgICBkZW1hbmRldXI/OiAgICAgICAgICAgICAgICAgICBEZW1hbmRldXIgfCBudWxsO1xuICAgIHBhcnRpY2lwYW50cz86ICAgICAgICAgICAgICAgIFB1cnBsZVBhcnRpY2lwYW50cyB8IG51bGw7XG4gICAgdmlzaW9Db25mZXJlbmNlPzogICAgICAgICAgICAgbnVsbCB8IHN0cmluZztcbiAgICBPREo/OiAgICAgICAgICAgICAgICAgICAgICAgICBPZGogfCBudWxsO1xuICAgIHNlc3Npb25SZWY/OiAgICAgICAgICAgICAgICAgIG51bGwgfCBzdHJpbmc7XG4gICAgb3V2ZXJ0dXJlUHJlc3NlPzogICAgICAgICAgICAgc3RyaW5nO1xuICAgIGNhcHRhdGlvblZpZGVvPzogICAgICAgICAgICAgIHN0cmluZztcbiAgICBjb21wdGVSZW5kdVJlZj86ICAgICAgICAgICAgICBudWxsIHwgc3RyaW5nO1xuICAgIGZvcm1hdFJldW5pb24/OiAgICAgICAgICAgICAgIEZvcm1hdFJldW5pb247XG4gICAgaW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlPzogSW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlO1xuICAgIGlkZW50aWZpYW50cz86ICAgICAgICAgICAgICAgIElkZW50aWZpYW50cztcbn1cblxuZXhwb3J0IGVudW0gUmV1bmlvblhzaVR5cGUge1xuICAgIFJldW5pb25Db21taXNzaW9uVHlwZSA9IFwicmV1bmlvbkNvbW1pc3Npb25fdHlwZVwiLFxuICAgIFJldW5pb25Jbml0UGFybGVtZW50YWlyZVR5cGUgPSBcInJldW5pb25Jbml0UGFybGVtZW50YWlyZV90eXBlXCIsXG4gICAgU2VhbmNlVHlwZSA9IFwic2VhbmNlX3R5cGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPZGoge1xuICAgIGNvbnZvY2F0aW9uT0RKOiBDb252b2NhdGlvbk9kakNsYXNzIHwgbnVsbDtcbiAgICByZXN1bWVPREo6ICAgICAgQ29udm9jYXRpb25PZGpDbGFzcyB8IG51bGw7XG4gICAgcG9pbnRzT0RKPzogICAgIFBvaW50c09kaiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udm9jYXRpb25PZGpDbGFzcyB7XG4gICAgaXRlbTogc3RyaW5nW10gfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRzT2RqIHtcbiAgICBwb2ludE9ESjogUG9pbnRPZGpFbGVtZW50W10gfCBQb2ludE9kakVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRPZGpFbGVtZW50IHtcbiAgICBcIkB4c2k6dHlwZVwiOiAgICAgICAgICAgICBQb2ludE9kalhzaVR5cGU7XG4gICAgdWlkOiAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBjeWNsZURlVmllOiAgICAgICAgICAgICAgQ3ljbGVEZVZpZTtcbiAgICBvYmpldDogICAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIGRlbWFuZGV1clBvaW50OiAgICAgICAgICBudWxsO1xuICAgIHByb2NlZHVyZTogICAgICAgICAgICAgICBQcm9jZWR1cmUgfCBudWxsO1xuICAgIGRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzOiBEb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8IG51bGw7XG4gICAgdHlwZVBvaW50T0RKOiAgICAgICAgICAgIFR5cGVQb2ludE9kajtcbiAgICBjb21pdGVTZWNyZXQ6ICAgICAgICAgICAgc3RyaW5nO1xuICAgIHRleHRlc0Fzc29jaWVzOiAgICAgICAgICBudWxsO1xuICAgIG5hdHVyZVRyYXZhdXhPREo/OiAgICAgICBOYXR1cmVUcmF2YXV4T2RqO1xuICAgIGRhdGVDb25mUHJlcz86ICAgICAgICAgICBzdHJpbmc7XG4gICAgZGF0ZUxldHRyZU1pbmlzdHJlPzogICAgIHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gUG9pbnRPZGpYc2lUeXBlIHtcbiAgICBQb2RqUmV1bmlvblR5cGUgPSBcInBvZGpSZXVuaW9uX3R5cGVcIixcbiAgICBQb2RqU2VhbmNlQ29uZlByZXNUeXBlID0gXCJwb2RqU2VhbmNlQ29uZlByZXNfdHlwZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN5Y2xlRGVWaWUge1xuICAgIGV0YXQ6ICAgRXRhdDtcbiAgICBjaHJvbm86IENocm9ubztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaHJvbm8ge1xuICAgIGNyZWF0aW9uOiBzdHJpbmc7XG4gICAgY2xvdHVyZTogIG51bGwgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIEV0YXQge1xuICAgIEFubnVsw6kgPSBcIkFubnVsw6lcIixcbiAgICBDb25maXJtw6kgPSBcIkNvbmZpcm3DqVwiLFxuICAgIEV2ZW50dWVsID0gXCJFdmVudHVlbFwiLFxuICAgIFN1cHByaW3DqSA9IFwiU3VwcHJpbcOpXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9zc2llcnNMZWdpc2xhdGlmc1JlZnMge1xuICAgIGRvc3NpZXJSZWY6IHN0cmluZ1tdIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBOYXR1cmVUcmF2YXV4T2RqIHtcbiAgICBPZGpwciA9IFwiT0RKUFJcIixcbiAgICBPZGpzbiA9IFwiT0RKU05cIixcbn1cblxuZXhwb3J0IGVudW0gUHJvY2VkdXJlIHtcbiAgICBEaXNjdXNzaW9uR8OpbsOpcmFsZUNvbW11bmUgPSBcImRpc2N1c3Npb24gZ8OpbsOpcmFsZSBjb21tdW5lXCIsXG4gICAgUHJvY8OpZHVyZURFeGFtZW5TaW1wbGlmacOpZUFydGljbGUxMDMgPSBcInByb2PDqWR1cmUgZCdleGFtZW4gc2ltcGxpZmnDqWUtQXJ0aWNsZSAxMDNcIixcbiAgICBQcm9jw6lkdXJlREV4YW1lblNpbXBsaWZpw6llQXJ0aWNsZTEwNiA9IFwicHJvY8OpZHVyZSBkJ2V4YW1lbiBzaW1wbGlmacOpZS1BcnRpY2xlIDEwNlwiLFxuICAgIFByb2PDqWR1cmVERXhhbWVuU2ltcGxpZmnDqWVBcnRpY2xlMTA3ID0gXCJwcm9jw6lkdXJlIGQnZXhhbWVuIHNpbXBsaWZpw6llLUFydGljbGUgMTA3XCIsXG4gICAgUHJvY8OpZHVyZURlTMOpZ2lzbGF0aW9uRW5Db21taXNzaW9uQXJ0aWNsZTEwNzEgPSBcInByb2PDqWR1cmUgZGUgbMOpZ2lzbGF0aW9uIGVuIGNvbW1pc3Npb24tQXJ0aWNsZSAxMDctMVwiLFxufVxuXG5leHBvcnQgZW51bSBUeXBlUG9pbnRPZGoge1xuICAgIEFtZW5kZW1lbnRzQXJ0ODggPSBcIkFtZW5kZW1lbnRzIChBcnQuIDg4KVwiLFxuICAgIEFtZW5kZW1lbnRzQXJ0OTEgPSBcIkFtZW5kZW1lbnRzIChBcnQuIDkxKVwiLFxuICAgIEF1ZGl0aW9uID0gXCJBdWRpdGlvblwiLFxuICAgIEF1ZGl0aW9uTWluaXN0cmUgPSBcIkF1ZGl0aW9uIG1pbmlzdHJlXCIsXG4gICAgQXVkaXRpb25NaW5pc3RyZU91dmVydGXDgExhUHJlc3NlID0gXCJBdWRpdGlvbiBtaW5pc3RyZSBvdXZlcnRlIMOgIGxhIHByZXNzZVwiLFxuICAgIEF1ZGl0aW9uT3V2ZXJ0ZcOATGFQcmVzc2UgPSBcIkF1ZGl0aW9uIG91dmVydGUgw6AgbGEgcHJlc3NlXCIsXG4gICAgQ29tbXVuaWNhdGlvbiA9IFwiQ29tbXVuaWNhdGlvblwiLFxuICAgIENvbnN0aXR1dGlvbkRlTWlzc2lvbkRJbmZvcm1hdGlvbiA9IFwiQ29uc3RpdHV0aW9uIGRlIG1pc3Npb24gZCdpbmZvcm1hdGlvblwiLFxuICAgIERpc2N1c3Npb24gPSBcIkRpc2N1c3Npb25cIixcbiAgICBEw6liYXRESW5pdGlhdGl2ZVBhcmxlbWVudGFpcmUgPSBcIkTDqWJhdCBkJ2luaXRpYXRpdmUgcGFybGVtZW50YWlyZVwiLFxuICAgIETDqWNsYXJhdGlvbkR1R291dmVybmVtZW50U3VpdmllRFVuRMOpYmF0ID0gXCJEw6ljbGFyYXRpb24gZHUgR291dmVybmVtZW50IHN1aXZpZSBkJ3VuIGTDqWJhdFwiLFxuICAgIEVjaGFuZ2VzRGVWdWVzID0gXCJFY2hhbmdlcyBkZSB2dWVzXCIsXG4gICAgRXhhbWVuID0gXCJFeGFtZW5cIixcbiAgICBFeHBsaWNhdGlvbnNEZVZvdGVEZXNHcm91cGVzRXRWb3RlUGFyU2NydXRpblB1YmxpYyA9IFwiRXhwbGljYXRpb25zIGRlIHZvdGUgZGVzIGdyb3VwZXMgZXQgdm90ZSBwYXIgc2NydXRpbiBwdWJsaWNcIixcbiAgICBFeHBsaWNhdGlvbnNEZVZvdGVFdFZvdGVQYXJTY3J1dGluUHVibGljID0gXCJFeHBsaWNhdGlvbnMgZGUgdm90ZSBldCB2b3RlIHBhciBzY3J1dGluIHB1YmxpY1wiLFxuICAgIEZpeGF0aW9uRGVMT3JkcmVEdUpvdXIgPSBcIkZpeGF0aW9uIGRlIGwnb3JkcmUgZHUgam91clwiLFxuICAgIE5vbWluYXRpb25CdXJlYXUgPSBcIk5vbWluYXRpb24gYnVyZWF1XCIsXG4gICAgTm9taW5hdGlvbkNhbmRpZGF0c09yZ2FuaXNtZUV4dHJhcGFybGVtZW50YWlyZSA9IFwiTm9taW5hdGlvbiBjYW5kaWRhdHMgb3JnYW5pc21lIGV4dHJhcGFybGVtZW50YWlyZVwiLFxuICAgIE5vbWluYXRpb25EVW5NZW1icmVEVW5lTWlzc2lvbkRJbmZvcm1hdGlvbiA9IFwiTm9taW5hdGlvbiBkJ3VuIG1lbWJyZSBkJ3VuZSBtaXNzaW9uIGQnaW5mb3JtYXRpb25cIixcbiAgICBOb21pbmF0aW9uUmFwcG9ydGV1ciA9IFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyXCIsXG4gICAgTm9taW5hdGlvblJhcHBvcnRldXJEQXBwbGljYXRpb24gPSBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBkJ2FwcGxpY2F0aW9uXCIsXG4gICAgTm9taW5hdGlvblJhcHBvcnRldXJESW5mb3JtYXRpb24gPSBcIk5vbWluYXRpb24gcmFwcG9ydGV1ciBkJ2luZm9ybWF0aW9uXCIsXG4gICAgTm9taW5hdGlvblJhcHBvcnRldXJQb3VyQXZpcyA9IFwiTm9taW5hdGlvbiByYXBwb3J0ZXVyIHBvdXIgYXZpc1wiLFxuICAgIE91dmVydHVyZUV0Q2zDtHR1cmVEZVNlc3Npb24gPSBcIk91dmVydHVyZSBldCBjbMO0dHVyZSBkZSBzZXNzaW9uXCIsXG4gICAgUXVlc3Rpb25zQXVHb3V2ZXJuZW1lbnQgPSBcIlF1ZXN0aW9ucyBhdSBHb3V2ZXJuZW1lbnRcIixcbiAgICBRdWVzdGlvbnNPcmFsZXNTYW5zRMOpYmF0ID0gXCJRdWVzdGlvbnMgb3JhbGVzIHNhbnMgZMOpYmF0XCIsXG4gICAgUmFwcG9ydCA9IFwiUmFwcG9ydFwiLFxuICAgIFJhcHBvcnRESW5mb3JtYXRpb24gPSBcIlJhcHBvcnQgZCdpbmZvcm1hdGlvblwiLFxuICAgIFJhcHBvcnRQb3VyQXZpcyA9IFwiUmFwcG9ydCBwb3VyIGF2aXNcIixcbiAgICBTZWFuY2VzUmVzZXJ2ZWVzR3JvdXBlT3Bwb3NpdGlvbk91TWlub3JpdGFpcmU9XCJTw6lhbmNlcyByw6lzZXJ2w6llcyDDoCB1biBncm91cGUgZGUgbCdvcHBvc2l0aW9uIG91IG1pbm9yaXRhaXJlXCIsXG4gICAgU3VpdGVEZUxhRGlzY3Vzc2lvbiA9IFwiU3VpdGUgZGUgbGEgZGlzY3Vzc2lvblwiLFxuICAgIFRhYmxlUm9uZGUgPSBcIlRhYmxlIHJvbmRlXCIsXG4gICAgVm90ZVBhclNjcnV0aW5QdWJsaWMgPSBcIlZvdGUgcGFyIHNjcnV0aW4gcHVibGljXCIsXG4gICAgVm90ZVNvbGVubmVsID0gXCJWb3RlIHNvbGVubmVsXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVyIHtcbiAgICBhY3RldXI/OiBBY3RldXJFbGVtZW50O1xuICAgIG9yZ2FuZT86IE9yZ2FuZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3RldXJFbGVtZW50IHtcbiAgICBub206ICAgICAgIG51bGwgfCBzdHJpbmc7XG4gICAgYWN0ZXVyUmVmOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5lIHtcbiAgICBub206ICAgICAgIHN0cmluZztcbiAgICBvcmdhbmVSZWY6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZW1hbmRldXJzIHtcbiAgICBhY3RldXI/OiBBY3RldXJFbGVtZW50W10gfCBBY3RldXJFbGVtZW50O1xuICAgIG9yZ2FuZT86IE9yZ2FuZTtcbn1cblxuZXhwb3J0IGVudW0gRm9ybWF0UmV1bmlvbiB7XG4gICAgQXVkaXRpb25FeHRlcm5lID0gXCJBdWRpdGlvbkV4dGVybmVcIixcbiAgICBBdWRpdGlvblBhclByZXNpZGVudENvbW1pc3Npb24gPSBcIkF1ZGl0aW9uUGFyUHJlc2lkZW50Q29tbWlzc2lvblwiLFxuICAgIEF1ZGl0aW9uUGFyUmFwcG9ydGV1ciA9IFwiQXVkaXRpb25QYXJSYXBwb3J0ZXVyXCIsXG4gICAgT3JkaW5haXJlID0gXCJPcmRpbmFpcmVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGlmaWFudHMge1xuICAgIG51bVNlYW5jZUpPOiBudWxsIHwgc3RyaW5nO1xuICAgIGlkSk86ICAgICAgICBudWxsIHwgc3RyaW5nO1xuICAgIHF1YW50aWVtZTogICBRdWFudGllbWU7XG4gICAgRGF0ZVNlYW5jZTogIHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gUXVhbnRpZW1lIHtcbiAgICBEZXV4acOobWUgPSBcIkRldXhpw6htZVwiLFxuICAgIFByZW1pw6hyZSA9IFwiUHJlbWnDqHJlXCIsXG4gICAgVHJvaXNpw6htZSA9IFwiVHJvaXNpw6htZVwiLFxuICAgIFVuaXF1ZSA9IFwiVW5pcXVlXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5mb3NSZXVuaW9uc0ludGVybmF0aW9uYWxlIHtcbiAgICBlc3RSZXVuaW9uSW50ZXJuYXRpb25hbGU6ICAgICBzdHJpbmc7XG4gICAgbGlzdGVQYXlzOiAgICAgICAgICAgICAgICAgICAgTGlzdGVQYXlzIHwgbnVsbDtcbiAgICBpbmZvcm1hdGlvbnNDb21wbGVtZW50YWlyZXM/OiBudWxsIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlUGF5cyB7XG4gICAgcGF5c1JlZjogc3RyaW5nW10gfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlldSB7XG4gICAgY29kZT86ICAgICAgICAgc3RyaW5nIHwgbnVsbDtcbiAgICBsaWJlbGxlQ291cnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIGxpYmVsbGVMb25nOiAgIG51bGwgfCBzdHJpbmc7XG4gICAgbGlldVJlZj86ICAgICAgc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXJwbGVQYXJ0aWNpcGFudHMge1xuICAgIHBhcnRpY2lwYW50c0ludGVybmVzOiAgUHVycGxlUGFydGljaXBhbnRzSW50ZXJuZXMgfCBudWxsO1xuICAgIHBlcnNvbm5lc0F1ZGl0aW9ubmVlczogUHVycGxlUGVyc29ubmVzQXVkaXRpb25uZWVzIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXJwbGVQYXJ0aWNpcGFudHNJbnRlcm5lcyB7XG4gICAgcGFydGljaXBhbnRJbnRlcm5lOiBQYXJ0aWNpcGFudEludGVybmVFbGVtZW50W10gfCBQYXJ0aWNpcGFudEludGVybmVFbGVtZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpY2lwYW50SW50ZXJuZUVsZW1lbnQge1xuICAgIGFjdGV1clJlZjogc3RyaW5nO1xuICAgIHByZXNlbmNlOiAgUHJlc2VuY2U7XG59XG5cbmV4cG9ydCBlbnVtIFByZXNlbmNlIHtcbiAgICBBYnNlbnQgPSBcImFic2VudFwiLFxuICAgIEV4Y3Vzw6kgPSBcImV4Y3Vzw6lcIixcbiAgICBQcsOpc2VudCA9IFwicHLDqXNlbnRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXJwbGVQZXJzb25uZXNBdWRpdGlvbm5lZXMge1xuICAgIHBlcnNvbm5lQXVkaXRpb25uZWU6IG51bGxbXSB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIFR5cGVSZXVuaW9uIHtcbiAgICBEZXAgPSBcIkRFUFwiLFxuICAgIEdhID0gXCJHQVwiLFxuICAgIEdlID0gXCJHRVwiLFxuICAgIEdldmkgPSBcIkdFVklcIixcbiAgICBHcCA9IFwiR1BcIixcbiAgICBIw6lBdXLDqWxpZW4gPSBcIkjDiSBBdXLDqWxpZW5cIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VuZGFzIHtcbiAgICByZXVuaW9uczogUmV1bmlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV1bmlvbnMge1xuICAgIHJldW5pb246IFJldW5pb25FbGVtZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV1bmlvbkVsZW1lbnQge1xuICAgIHVpZDogICAgICAgICAgICAgIHN0cmluZztcbiAgICB0aW1lU3RhbXBEZWJ1dDogICBEYXRlO1xuICAgIHRpbWVTdGFtcEZpbj86ICAgIHN0cmluZztcbiAgICBsaWV1OiAgICAgICAgICAgICBMaWV1O1xuICAgIGN5Y2xlRGVWaWU6ICAgICAgIEN5Y2xlRGVWaWU7XG4gICAgZGVtYW5kZXVycz86ICAgICAgRGVtYW5kZXVycyB8IG51bGw7XG4gICAgb3JnYW5lUmV1bmlSZWY6ICAgbnVsbCB8IHN0cmluZztcbiAgICB0eXBlUmV1bmlvbj86ICAgICBUeXBlUmV1bmlvbjtcbiAgICBcIkB4bWxuczp4c2lcIj86ICAgIHN0cmluZztcbiAgICBkZW1hbmRldXI/OiAgICAgICBudWxsO1xuICAgIHBhcnRpY2lwYW50cz86ICAgIEZsdWZmeVBhcnRpY2lwYW50cyB8IG51bGw7XG4gICAgc2Vzc2lvblJlZj86ICAgICAgbnVsbCB8IHN0cmluZztcbiAgICBvdXZlcnR1cmVQcmVzc2U/OiBzdHJpbmc7XG4gICAgT0RKPzogICAgICAgICAgICAgT2RqO1xuICAgIGNvbXB0ZVJlbmR1UmVmPzogIG51bGwgfCBzdHJpbmc7XG4gICAgaWRlbnRpZmlhbnRzPzogICAgSWRlbnRpZmlhbnRzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdWZmeVBhcnRpY2lwYW50cyB7XG4gICAgcGFydGljaXBhbnRzSW50ZXJuZXM6ICBGbHVmZnlQYXJ0aWNpcGFudHNJbnRlcm5lcyB8IG51bGw7XG4gICAgcGVyc29ubmVzQXVkaXRpb25uZWVzOiBGbHVmZnlQZXJzb25uZXNBdWRpdGlvbm5lZXMgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdWZmeVBhcnRpY2lwYW50c0ludGVybmVzIHtcbiAgICBwYXJ0aWNpcGFudEludGVybmU6IFBhcnRpY2lwYW50SW50ZXJuZUVsZW1lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbHVmZnlQZXJzb25uZXNBdWRpdGlvbm5lZXMge1xuICAgIHBlcnNvbm5lQXVkaXRpb25uZWU6IFBlcnNvbm5lQXVkaXRpb25uZWVFbGVtZW50W10gfCBQZXJzb25uZUF1ZGl0aW9ubmVlRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzb25uZUF1ZGl0aW9ubmVlRWxlbWVudCB7XG4gICAgdWlkOiAgICAgIFVpZDtcbiAgICBpZGVudDogICAgSWRlbnQ7XG4gICAgZGF0ZU5haXM6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50IHtcbiAgICBjaXY6ICAgICAgICBDaXY7XG4gICAgcHJlbm9tOiAgICAgc3RyaW5nO1xuICAgIG5vbTogICAgICAgIHN0cmluZztcbiAgICBhbHBoYT86ICAgICBzdHJpbmc7XG4gICAgdHJpZ3JhbW1lPzogbnVsbCB8IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQ2l2IHtcbiAgICBNID0gXCJNLlwiLFxuICAgIE1tZSA9IFwiTW1lXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVWlkIHtcbiAgICBcIkB4c2k6dHlwZVwiOiBVaWRYc2lUeXBlO1xuICAgIFwiI3RleHRcIjogICAgIHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gVWlkWHNpVHlwZSB7XG4gICAgSWRBY3RldXJUeXBlID0gXCJJZEFjdGV1cl90eXBlXCIsXG4gICAgSWRQZXJzb25uZUV4dGVybmVUeXBlID0gXCJJZFBlcnNvbm5lRXh0ZXJuZV90eXBlXCIsXG59XG5cbi8vIENvbnZlcnRzIEpTT04gc3RyaW5ncyB0by9mcm9tIHlvdXIgdHlwZXNcbi8vIGFuZCBhc3NlcnRzIHRoZSByZXN1bHRzIG9mIEpTT04ucGFyc2UgYXQgcnVudGltZVxuZXhwb3J0IGNsYXNzIENvbnZlcnQge1xuICAgIHB1YmxpYyBzdGF0aWMgdG9SZXVuaW9uKGpzb246IHN0cmluZyk6IFJldW5pb24ge1xuICAgICAgICByZXR1cm4gY2FzdChKU09OLnBhcnNlKGpzb24pLCByKFwiUmV1bmlvblwiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZXVuaW9uVG9Kc29uKHZhbHVlOiBSZXVuaW9uKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHVuY2FzdCh2YWx1ZSwgcihcIlJldW5pb25cIikpLCBudWxsLCAyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvQWdlbmRhcyhqc29uOiBzdHJpbmcpOiBBZ2VuZGFzIHtcbiAgICAgICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIkFnZW5kYXNcIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWdlbmRhc1RvSnNvbih2YWx1ZTogQWdlbmRhcyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJBZ2VuZGFzXCIpKSwgbnVsbCwgMik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkVmFsdWUodHlwOiBhbnksIHZhbDogYW55LCBrZXk6IGFueSA9ICcnKTogbmV2ZXIge1xuICAgIGlmIChrZXkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiLiBFeHBlY3RlZCB0eXBlICR7SlNPTi5zdHJpbmdpZnkodHlwKX0gYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9YCk7XG4gICAgfVxuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodmFsKX0gZm9yIHR5cGUgJHtKU09OLnN0cmluZ2lmeSh0eXApfWAsICk7XG59XG5cbmZ1bmN0aW9uIGpzb25Ub0pTUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXAuanNvblRvSlMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtYXA6IGFueSA9IHt9O1xuICAgICAgICB0eXAucHJvcHMuZm9yRWFjaCgocDogYW55KSA9PiBtYXBbcC5qc29uXSA9IHsga2V5OiBwLmpzLCB0eXA6IHAudHlwIH0pO1xuICAgICAgICB0eXAuanNvblRvSlMgPSBtYXA7XG4gICAgfVxuICAgIHJldHVybiB0eXAuanNvblRvSlM7XG59XG5cbmZ1bmN0aW9uIGpzVG9KU09OUHJvcHModHlwOiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXAuanNUb0pTT04gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtYXA6IGFueSA9IHt9O1xuICAgICAgICB0eXAucHJvcHMuZm9yRWFjaCgocDogYW55KSA9PiBtYXBbcC5qc10gPSB7IGtleTogcC5qc29uLCB0eXA6IHAudHlwIH0pO1xuICAgICAgICB0eXAuanNUb0pTT04gPSBtYXA7XG4gICAgfVxuICAgIHJldHVybiB0eXAuanNUb0pTT047XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybSh2YWw6IGFueSwgdHlwOiBhbnksIGdldFByb3BzOiBhbnksIGtleTogYW55ID0gJycpOiBhbnkge1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVByaW1pdGl2ZSh0eXA6IHN0cmluZywgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHR5cCA9PT0gdHlwZW9mIHZhbCkgcmV0dXJuIHZhbDtcbiAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZSh0eXAsIHZhbCwga2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Vbmlvbih0eXBzOiBhbnlbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICAvLyB2YWwgbXVzdCB2YWxpZGF0ZSBhZ2FpbnN0IG9uZSB0eXAgaW4gdHlwc1xuICAgICAgICBjb25zdCBsID0gdHlwcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0eXAgPSB0eXBzW2ldO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBnZXRQcm9wcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwcywgdmFsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1FbnVtKGNhc2VzOiBzdHJpbmdbXSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoY2FzZXMuaW5kZXhPZih2YWwpICE9PSAtMSkgcmV0dXJuIHZhbDtcbiAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShjYXNlcywgdmFsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1BcnJheSh0eXA6IGFueSwgdmFsOiBhbnkpOiBhbnkge1xuICAgICAgICAvLyB2YWwgbXVzdCBiZSBhbiBhcnJheSB3aXRoIG5vIGludmFsaWQgZWxlbWVudHNcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBpbnZhbGlkVmFsdWUoXCJhcnJheVwiLCB2YWwpO1xuICAgICAgICByZXR1cm4gdmFsLm1hcChlbCA9PiB0cmFuc2Zvcm0oZWwsIHR5cCwgZ2V0UHJvcHMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRlKHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgIGlmIChpc05hTihkLnZhbHVlT2YoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoXCJEYXRlXCIsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0KHByb3BzOiB7IFtrOiBzdHJpbmddOiBhbnkgfSwgYWRkaXRpb25hbDogYW55LCB2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUoXCJvYmplY3RcIiwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCB2ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbCwga2V5KSA/IHZhbFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmVzdWx0W3Byb3Aua2V5XSA9IHRyYW5zZm9ybSh2LCBwcm9wLnR5cCwgZ2V0UHJvcHMsIHByb3Aua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvcHMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHRyYW5zZm9ybSh2YWxba2V5XSwgYWRkaXRpb25hbCwgZ2V0UHJvcHMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0eXAgPT09IFwiYW55XCIpIHJldHVybiB2YWw7XG4gICAgaWYgKHR5cCA9PT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gdmFsO1xuICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsKTtcbiAgICB9XG4gICAgaWYgKHR5cCA9PT0gZmFsc2UpIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpO1xuICAgIHdoaWxlICh0eXBlb2YgdHlwID09PSBcIm9iamVjdFwiICYmIHR5cC5yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0eXAgPSB0eXBlTWFwW3R5cC5yZWZdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXApKSByZXR1cm4gdHJhbnNmb3JtRW51bSh0eXAsIHZhbCk7XG4gICAgaWYgKHR5cGVvZiB0eXAgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIHR5cC5oYXNPd25Qcm9wZXJ0eShcInVuaW9uTWVtYmVyc1wiKSA/IHRyYW5zZm9ybVVuaW9uKHR5cC51bmlvbk1lbWJlcnMsIHZhbClcbiAgICAgICAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwiYXJyYXlJdGVtc1wiKSAgICA/IHRyYW5zZm9ybUFycmF5KHR5cC5hcnJheUl0ZW1zLCB2YWwpXG4gICAgICAgICAgICA6IHR5cC5oYXNPd25Qcm9wZXJ0eShcInByb3BzXCIpICAgICAgICAgPyB0cmFuc2Zvcm1PYmplY3QoZ2V0UHJvcHModHlwKSwgdHlwLmFkZGl0aW9uYWwsIHZhbClcbiAgICAgICAgICAgIDogaW52YWxpZFZhbHVlKHR5cCwgdmFsKTtcbiAgICB9XG4gICAgLy8gTnVtYmVycyBjYW4gYmUgcGFyc2VkIGJ5IERhdGUgYnV0IHNob3VsZG4ndCBiZS5cbiAgICBpZiAodHlwID09PSBEYXRlICYmIHR5cGVvZiB2YWwgIT09IFwibnVtYmVyXCIpIHJldHVybiB0cmFuc2Zvcm1EYXRlKHZhbCk7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVByaW1pdGl2ZSh0eXAsIHZhbCk7XG59XG5cbmZ1bmN0aW9uIGNhc3Q8VD4odmFsOiBhbnksIHR5cDogYW55KTogVCB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybSh2YWwsIHR5cCwganNvblRvSlNQcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVuY2FzdDxUPih2YWw6IFQsIHR5cDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBqc1RvSlNPTlByb3BzKTtcbn1cblxuZnVuY3Rpb24gYSh0eXA6IGFueSkge1xuICAgIHJldHVybiB7IGFycmF5SXRlbXM6IHR5cCB9O1xufVxuXG5mdW5jdGlvbiB1KC4uLnR5cHM6IGFueVtdKSB7XG4gICAgcmV0dXJuIHsgdW5pb25NZW1iZXJzOiB0eXBzIH07XG59XG5cbmZ1bmN0aW9uIG8ocHJvcHM6IGFueVtdLCBhZGRpdGlvbmFsOiBhbnkpIHtcbiAgICByZXR1cm4geyBwcm9wcywgYWRkaXRpb25hbCB9O1xufVxuXG4vLyBmdW5jdGlvbiBtKGFkZGl0aW9uYWw6IGFueSkge1xuLy8gICAgIHJldHVybiB7IHByb3BzOiBbXSwgYWRkaXRpb25hbCB9O1xuLy8gfVxuXG5mdW5jdGlvbiByKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB7IHJlZjogbmFtZSB9O1xufVxuXG5jb25zdCB0eXBlTWFwOiBhbnkgPSB7XG4gICAgXCJSZXVuaW9uXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwicmV1bmlvblwiLCBqczogXCJyZXVuaW9uXCIsIHR5cDogcihcIlJldW5pb25SZXVuaW9uXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiUmV1bmlvblJldW5pb25cIjogbyhbXG4gICAgICAgIHsganNvbjogXCJAeG1sbnNcIiwganM6IFwiQHhtbG5zXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiQHhtbG5zOnhzaVwiLCBqczogXCJAeG1sbnM6eHNpXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiQHhzaTp0eXBlXCIsIGpzOiBcIkB4c2k6dHlwZVwiLCB0eXA6IHIoXCJSZXVuaW9uWHNpVHlwZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwidWlkXCIsIGpzOiBcInVpZFwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInRpbWVTdGFtcERlYnV0XCIsIGpzOiBcInRpbWVTdGFtcERlYnV0XCIsIHR5cDogRGF0ZSB9LFxuICAgICAgICB7IGpzb246IFwidGltZVN0YW1wRmluXCIsIGpzOiBcInRpbWVTdGFtcEZpblwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwibGlldVwiLCBqczogXCJsaWV1XCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJMaWV1XCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiY3ljbGVEZVZpZVwiLCBqczogXCJjeWNsZURlVmllXCIsIHR5cDogcihcIkN5Y2xlRGVWaWVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImRlbWFuZGV1cnNcIiwganM6IFwiZGVtYW5kZXVyc1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJEZW1hbmRldXJzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcIm9yZ2FuZVJldW5pUmVmXCIsIGpzOiBcIm9yZ2FuZVJldW5pUmVmXCIsIHR5cDogdShudWxsLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwidHlwZVJldW5pb25cIiwganM6IFwidHlwZVJldW5pb25cIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIlR5cGVSZXVuaW9uXCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiZGVtYW5kZXVyXCIsIGpzOiBcImRlbWFuZGV1clwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJEZW1hbmRldXJcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwicGFydGljaXBhbnRzXCIsIGpzOiBcInBhcnRpY2lwYW50c1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJQdXJwbGVQYXJ0aWNpcGFudHNcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwidmlzaW9Db25mZXJlbmNlXCIsIGpzOiBcInZpc2lvQ29uZmVyZW5jZVwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KG51bGwsIFwiXCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiT0RKXCIsIGpzOiBcIk9ESlwiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJPZGpcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwic2Vzc2lvblJlZlwiLCBqczogXCJzZXNzaW9uUmVmXCIsIHR5cDogdSh1bmRlZmluZWQsIHUoXCJcIiwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJvdXZlcnR1cmVQcmVzc2VcIiwganM6IFwib3V2ZXJ0dXJlUHJlc3NlXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJjYXB0YXRpb25WaWRlb1wiLCBqczogXCJjYXB0YXRpb25WaWRlb1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwiY29tcHRlUmVuZHVSZWZcIiwganM6IFwiY29tcHRlUmVuZHVSZWZcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShudWxsLCBcIlwiKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImZvcm1hdFJldW5pb25cIiwganM6IFwiZm9ybWF0UmV1bmlvblwiLCB0eXA6IHUodW5kZWZpbmVkLCByKFwiRm9ybWF0UmV1bmlvblwiKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiLCBqczogXCJpbmZvc1JldW5pb25zSW50ZXJuYXRpb25hbGVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkluZm9zUmV1bmlvbnNJbnRlcm5hdGlvbmFsZVwiKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImlkZW50aWZpYW50c1wiLCBqczogXCJpZGVudGlmaWFudHNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIklkZW50aWZpYW50c1wiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJPZGpcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJjb252b2NhdGlvbk9ESlwiLCBqczogXCJjb252b2NhdGlvbk9ESlwiLCB0eXA6IHUocihcIkNvbnZvY2F0aW9uT2RqQ2xhc3NcIiksIG51bGwpIH0sXG4gICAgICAgIHsganNvbjogXCJyZXN1bWVPREpcIiwganM6IFwicmVzdW1lT0RKXCIsIHR5cDogdShyKFwiQ29udm9jYXRpb25PZGpDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInBvaW50c09ESlwiLCBqczogXCJwb2ludHNPREpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiUG9pbnRzT2RqXCIpLCBudWxsKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJDb252b2NhdGlvbk9kakNsYXNzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiaXRlbVwiLCBqczogXCJpdGVtXCIsIHR5cDogdShhKFwiXCIpLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlBvaW50c09kalwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInBvaW50T0RKXCIsIGpzOiBcInBvaW50T0RKXCIsIHR5cDogdShhKHIoXCJQb2ludE9kakVsZW1lbnRcIikpLCByKFwiUG9pbnRPZGpFbGVtZW50XCIpKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlBvaW50T2RqRWxlbWVudFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIkB4c2k6dHlwZVwiLCBqczogXCJAeHNpOnR5cGVcIiwgdHlwOiByKFwiUG9pbnRPZGpYc2lUeXBlXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJ1aWRcIiwganM6IFwidWlkXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiY3ljbGVEZVZpZVwiLCBqczogXCJjeWNsZURlVmllXCIsIHR5cDogcihcIkN5Y2xlRGVWaWVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm9iamV0XCIsIGpzOiBcIm9iamV0XCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiZGVtYW5kZXVyUG9pbnRcIiwganM6IFwiZGVtYW5kZXVyUG9pbnRcIiwgdHlwOiBudWxsIH0sXG4gICAgICAgIHsganNvbjogXCJwcm9jZWR1cmVcIiwganM6IFwicHJvY2VkdXJlXCIsIHR5cDogdShyKFwiUHJvY2VkdXJlXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwiZG9zc2llcnNMZWdpc2xhdGlmc1JlZnNcIiwganM6IFwiZG9zc2llcnNMZWdpc2xhdGlmc1JlZnNcIiwgdHlwOiB1KHIoXCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmVmc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInR5cGVQb2ludE9ESlwiLCBqczogXCJ0eXBlUG9pbnRPREpcIiwgdHlwOiByKFwiVHlwZVBvaW50T2RqXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJjb21pdGVTZWNyZXRcIiwganM6IFwiY29taXRlU2VjcmV0XCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwidGV4dGVzQXNzb2NpZXNcIiwganM6IFwidGV4dGVzQXNzb2NpZXNcIiwgdHlwOiBudWxsIH0sXG4gICAgICAgIHsganNvbjogXCJuYXR1cmVUcmF2YXV4T0RKXCIsIGpzOiBcIm5hdHVyZVRyYXZhdXhPREpcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk5hdHVyZVRyYXZhdXhPZGpcIikpIH0sXG4gICAgICAgIHsganNvbjogXCJkYXRlQ29uZlByZXNcIiwganM6IFwiZGF0ZUNvbmZQcmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJkYXRlTGV0dHJlTWluaXN0cmVcIiwganM6IFwiZGF0ZUxldHRyZU1pbmlzdHJlXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiQ3ljbGVEZVZpZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImV0YXRcIiwganM6IFwiZXRhdFwiLCB0eXA6IHIoXCJFdGF0XCIpIH0sXG4gICAgICAgIHsganNvbjogXCJjaHJvbm9cIiwganM6IFwiY2hyb25vXCIsIHR5cDogcihcIkNocm9ub1wiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkNocm9ub1wiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImNyZWF0aW9uXCIsIGpzOiBcImNyZWF0aW9uXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiY2xvdHVyZVwiLCBqczogXCJjbG90dXJlXCIsIHR5cDogdShudWxsLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiZG9zc2llclJlZlwiLCBqczogXCJkb3NzaWVyUmVmXCIsIHR5cDogdShhKFwiXCIpLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlbWFuZGV1clwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImFjdGV1clwiLCBqczogXCJhY3RldXJcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkFjdGV1ckVsZW1lbnRcIikpIH0sXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVcIiwganM6IFwib3JnYW5lXCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJPcmdhbmVcIikpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiQWN0ZXVyRWxlbWVudFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vbVwiLCBqczogXCJub21cIiwgdHlwOiB1KG51bGwsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJhY3RldXJSZWZcIiwganM6IFwiYWN0ZXVyUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIk9yZ2FuZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vbVwiLCBqczogXCJub21cIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVSZWZcIiwganM6IFwib3JnYW5lUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlbWFuZGV1cnNcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJhY3RldXJcIiwganM6IFwiYWN0ZXVyXCIsIHR5cDogdSh1bmRlZmluZWQsIHUoYShyKFwiQWN0ZXVyRWxlbWVudFwiKSksIHIoXCJBY3RldXJFbGVtZW50XCIpKSkgfSxcbiAgICAgICAgeyBqc29uOiBcIm9yZ2FuZVwiLCBqczogXCJvcmdhbmVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIk9yZ2FuZVwiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJJZGVudGlmaWFudHNcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJudW1TZWFuY2VKT1wiLCBqczogXCJudW1TZWFuY2VKT1wiLCB0eXA6IHUobnVsbCwgXCJcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImlkSk9cIiwganM6IFwiaWRKT1wiLCB0eXA6IHUobnVsbCwgXCJcIikgfSxcbiAgICAgICAge