@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
124 lines (121 loc) • 18.5 kB
JavaScript
;
require("core-js/modules/es.object.define-property.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.dateFromNullableDateOrIsoString = dateFromNullableDateOrIsoString;
exports.dateFromYearMonthDayTimezoneString = dateFromYearMonthDayTimezoneString;
exports.displayDateFromLocalIsoString = displayDateFromLocalIsoString;
exports.existingDateToJson = void 0;
exports.formatRelativeFrenchTime = formatRelativeFrenchTime;
exports.frenchDateSameYearShortFormat = exports.frenchDateFormat = void 0;
exports.frenchDateWithoutDayOfWeekFromDateOrString = frenchDateWithoutDayOfWeekFromDateOrString;
exports.frenchTimeFormat = void 0;
exports.frenchTimeFromDateOrString = frenchTimeFromDateOrString;
exports.localIso8601StringFromDate = localIso8601StringFromDate;
exports.patchedDateToJson = void 0;
require("core-js/modules/es.date.to-iso-string.js");
require("core-js/modules/es.date.to-json.js");
require("core-js/modules/es.date.to-string.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.regexp.to-string.js");
require("core-js/modules/es.string.ends-with.js");
require("core-js/modules/es.string.replace.js");
var _format = require("date-fns/format");
var _fr = require("date-fns/locale/fr");
var _parse = require("date-fns/parse");
var _parseISO = require("date-fns/parseISO");
// Patch Date.prototype.toJSON to ensure that dates keep their timezone when converted to strings.
// https://stackoverflow.com/questions/31096130/how-to-json-stringify-a-javascript-date-and-preserve-timezone
var existingDateToJson = exports.existingDateToJson = Date.prototype.toJSON;
var _patchedDateToJson = exports.patchedDateToJson = function patchedDateToJson() {
try {
var hours = this.getHours();
var minutes = this.getMinutes();
var seconds = this.getSeconds();
var milliseconds = this.getMilliseconds();
var timezoneOffsetInHours = -(this.getTimezoneOffset() / 60); //UTC minus local time
// When year <= 1900, timezoneOffsetInHours is 0.15, minutes is 9 and seconds is 21!
if (timezoneOffsetInHours === 0.15 && hours === 0 && minutes === 9 && seconds === 21 || hours - timezoneOffsetInHours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {
return this.toISOString().split("T")[0];
}
// It's a bit unfortunate that we need ttimezoneOffsetInHours = -(this.getTimezoneOffset() / 60) o construct a new Date instance
// (we don't want _this_ Date instance to be modified).
var correctedDate = new Date(this.getFullYear(), this.getMonth(), this.getDate(), hours, minutes, seconds, milliseconds);
correctedDate.setHours(this.getHours() + timezoneOffsetInHours);
// Remove milliseconds & trailing "Z".
var iso = correctedDate.toISOString().replace(/(\.0+)?Z$/, "");
var sign = timezoneOffsetInHours >= 0 ? "+" : "-";
var leadingZero = Math.abs(timezoneOffsetInHours) < 10 ? "0" : "";
return iso + sign + leadingZero + Math.abs(timezoneOffsetInHours).toString().split(".")[0] + ":00";
} catch (e) {
Date.prototype.toJSON = existingDateToJson;
var jsonDate = this.toJSON();
Date.prototype.toJSON = _patchedDateToJson;
return jsonDate;
}
};
var frenchDateFormat = exports.frenchDateFormat = new Intl.DateTimeFormat("fr-FR", {
day: "numeric",
month: "long",
weekday: "long",
year: "numeric"
});
var frenchDateSameYearShortFormat = exports.frenchDateSameYearShortFormat = new Intl.DateTimeFormat("fr-FR", {
day: "numeric",
month: "short"
});
var frenchTimeFormat = exports.frenchTimeFormat = new Intl.DateTimeFormat("fr-FR", {
hour: "numeric",
minute: "2-digit"
});
function dateFromNullableDateOrIsoString(date, defaultValue) {
if (date instanceof Date) {
return date;
}
if (typeof date === "string") {
return (0, _parseISO.parseISO)(date);
}
return defaultValue;
}
/// Convert strings like "2017-11-24+01:00" to dates.
function dateFromYearMonthDayTimezoneString(dateString) {
return (0, _parse.parse)(dateString, "yyyy-MM-ddXXX", new Date());
}
function displayDateFromLocalIsoString(dateString) {
var date = (0, _parseISO.parseISO)(dateString);
dateString = (0, _format.format)(date, "EEEE d LLLL yyyy H'h'mm", {
locale: _fr.fr
});
if (dateString.endsWith(" 0h00")) {
dateString = dateString.substring(0, dateString.length - 5);
}
return dateString;
}
function formatRelativeFrenchTime(date, now) {
if (date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate()) {
return frenchTimeFormat.format(date);
}
return frenchDateSameYearShortFormat.format(date);
}
function frenchDateWithoutDayOfWeekFromDateOrString(dateOrString) {
var date = dateOrString instanceof Date ? dateOrString : (0, _parseISO.parseISO)(dateOrString);
var dateString = (0, _format.format)(date, "d LLLL yyyy H'h'mm", {
locale: _fr.fr
});
if (dateString.endsWith(" 0h00")) {
dateString = dateString.substring(0, dateString.length - 5);
}
return dateString;
}
function frenchTimeFromDateOrString(dateOrString) {
var date = dateOrString instanceof Date ? dateOrString : (0, _parseISO.parseISO)(dateOrString);
return (0, _format.format)(date, "H'h'mm", {
locale: _fr.fr
});
}
function localIso8601StringFromDate(date) {
return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().split("T")[0];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZm9ybWF0IiwicmVxdWlyZSIsIl9mciIsIl9wYXJzZSIsIl9wYXJzZUlTTyIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsImV4cG9ydHMiLCJEYXRlIiwicHJvdG90eXBlIiwidG9KU09OIiwicGF0Y2hlZERhdGVUb0pzb24iLCJob3VycyIsImdldEhvdXJzIiwibWludXRlcyIsImdldE1pbnV0ZXMiLCJzZWNvbmRzIiwiZ2V0U2Vjb25kcyIsIm1pbGxpc2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsInRpbWV6b25lT2Zmc2V0SW5Ib3VycyIsImdldFRpbWV6b25lT2Zmc2V0IiwidG9JU09TdHJpbmciLCJzcGxpdCIsImNvcnJlY3RlZERhdGUiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsInNldEhvdXJzIiwiaXNvIiwicmVwbGFjZSIsInNpZ24iLCJsZWFkaW5nWmVybyIsIk1hdGgiLCJhYnMiLCJ0b1N0cmluZyIsImUiLCJqc29uRGF0ZSIsImZyZW5jaERhdGVGb3JtYXQiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJkYXkiLCJtb250aCIsIndlZWtkYXkiLCJ5ZWFyIiwiZnJlbmNoRGF0ZVNhbWVZZWFyU2hvcnRGb3JtYXQiLCJmcmVuY2hUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsImRhdGVGcm9tTnVsbGFibGVEYXRlT3JJc29TdHJpbmciLCJkYXRlIiwiZGVmYXVsdFZhbHVlIiwicGFyc2VJU08iLCJkYXRlRnJvbVllYXJNb250aERheVRpbWV6b25lU3RyaW5nIiwiZGF0ZVN0cmluZyIsInBhcnNlIiwiZGlzcGxheURhdGVGcm9tTG9jYWxJc29TdHJpbmciLCJmb3JtYXQiLCJsb2NhbGUiLCJmckxvY2FsZSIsImVuZHNXaXRoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiZm9ybWF0UmVsYXRpdmVGcmVuY2hUaW1lIiwibm93IiwiZnJlbmNoRGF0ZVdpdGhvdXREYXlPZldlZWtGcm9tRGF0ZU9yU3RyaW5nIiwiZGF0ZU9yU3RyaW5nIiwiZnJlbmNoVGltZUZyb21EYXRlT3JTdHJpbmciLCJsb2NhbElzbzg2MDFTdHJpbmdGcm9tRGF0ZSIsImdldFRpbWUiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0ZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcImRhdGUtZm5zL2Zvcm1hdFwiXG5pbXBvcnQgeyBmciBhcyBmckxvY2FsZSB9IGZyb20gXCJkYXRlLWZucy9sb2NhbGUvZnJcIlxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiZGF0ZS1mbnMvcGFyc2VcIlxuaW1wb3J0IHsgcGFyc2VJU08gfSBmcm9tIFwiZGF0ZS1mbnMvcGFyc2VJU09cIlxuXG4vLyBQYXRjaCBEYXRlLnByb3RvdHlwZS50b0pTT04gdG8gZW5zdXJlIHRoYXQgZGF0ZXMga2VlcCB0aGVpciB0aW1lem9uZSB3aGVuIGNvbnZlcnRlZCB0byBzdHJpbmdzLlxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzEwOTYxMzAvaG93LXRvLWpzb24tc3RyaW5naWZ5LWEtamF2YXNjcmlwdC1kYXRlLWFuZC1wcmVzZXJ2ZS10aW1lem9uZVxuZXhwb3J0IGNvbnN0IGV4aXN0aW5nRGF0ZVRvSnNvbiA9IERhdGUucHJvdG90eXBlLnRvSlNPTlxuZXhwb3J0IGNvbnN0IHBhdGNoZWREYXRlVG9Kc29uID0gZnVuY3Rpb24gKHRoaXM6IERhdGUpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IGhvdXJzID0gdGhpcy5nZXRIb3VycygpXG4gICAgY29uc3QgbWludXRlcyA9IHRoaXMuZ2V0TWludXRlcygpXG4gICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMuZ2V0U2Vjb25kcygpXG4gICAgY29uc3QgbWlsbGlzZWNvbmRzID0gdGhpcy5nZXRNaWxsaXNlY29uZHMoKVxuXG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXRJbkhvdXJzID0gLSh0aGlzLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCkgLy9VVEMgbWludXMgbG9jYWwgdGltZVxuICAgIC8vIFdoZW4geWVhciA8PSAxOTAwLCB0aW1lem9uZU9mZnNldEluSG91cnMgaXMgMC4xNSwgbWludXRlcyBpcyA5IGFuZCBzZWNvbmRzIGlzIDIxIVxuICAgIGlmIChcbiAgICAgICh0aW1lem9uZU9mZnNldEluSG91cnMgPT09IDAuMTUgJiZcbiAgICAgICAgaG91cnMgPT09IDAgJiZcbiAgICAgICAgbWludXRlcyA9PT0gOSAmJlxuICAgICAgICBzZWNvbmRzID09PSAyMSkgfHxcbiAgICAgIChob3VycyAtIHRpbWV6b25lT2Zmc2V0SW5Ib3VycyA9PT0gMCAmJlxuICAgICAgICBtaW51dGVzID09PSAwICYmXG4gICAgICAgIHNlY29uZHMgPT09IDAgJiZcbiAgICAgICAgbWlsbGlzZWNvbmRzID09PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cbiAgICB9XG5cbiAgICAvLyBJdCdzIGEgYml0IHVuZm9ydHVuYXRlIHRoYXQgd2UgbmVlZCB0dGltZXpvbmVPZmZzZXRJbkhvdXJzID0gLSh0aGlzLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCkgbyBjb25zdHJ1Y3QgYSBuZXcgRGF0ZSBpbnN0YW5jZVxuICAgIC8vICh3ZSBkb24ndCB3YW50IF90aGlzXyBEYXRlIGluc3RhbmNlIHRvIGJlIG1vZGlmaWVkKS5cbiAgICBjb25zdCBjb3JyZWN0ZWREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLmdldEZ1bGxZZWFyKCksXG4gICAgICB0aGlzLmdldE1vbnRoKCksXG4gICAgICB0aGlzLmdldERhdGUoKSxcbiAgICAgIGhvdXJzLFxuICAgICAgbWludXRlcyxcbiAgICAgIHNlY29uZHMsXG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgKVxuICAgIGNvcnJlY3RlZERhdGUuc2V0SG91cnModGhpcy5nZXRIb3VycygpICsgdGltZXpvbmVPZmZzZXRJbkhvdXJzKVxuICAgIC8vIFJlbW92ZSBtaWxsaXNlY29uZHMgJiB0cmFpbGluZyBcIlpcIi5cbiAgICBjb25zdCBpc28gPSBjb3JyZWN0ZWREYXRlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvKFxcLjArKT9aJC8sIFwiXCIpXG4gICAgY29uc3Qgc2lnbiA9IHRpbWV6b25lT2Zmc2V0SW5Ib3VycyA+PSAwID8gXCIrXCIgOiBcIi1cIlxuICAgIGNvbnN0IGxlYWRpbmdaZXJvID0gTWF0aC5hYnModGltZXpvbmVPZmZzZXRJbkhvdXJzKSA8IDEwID8gXCIwXCIgOiBcIlwiXG4gICAgcmV0dXJuIChcbiAgICAgIGlzbyArXG4gICAgICBzaWduICtcbiAgICAgIGxlYWRpbmdaZXJvICtcbiAgICAgIE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0SW5Ib3VycykudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF0gK1xuICAgICAgXCI6MDBcIlxuICAgIClcbiAgfSBjYXRjaCAoZSkge1xuICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuICAgIGNvbnN0IGpzb25EYXRlID0gdGhpcy50b0pTT04oKVxuICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IHBhdGNoZWREYXRlVG9Kc29uXG4gICAgcmV0dXJuIGpzb25EYXRlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZyZW5jaERhdGVGb3JtYXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImZyLUZSXCIsIHtcbiAgZGF5OiBcIm51bWVyaWNcIixcbiAgbW9udGg6IFwibG9uZ1wiLFxuICB3ZWVrZGF5OiBcImxvbmdcIixcbiAgeWVhcjogXCJudW1lcmljXCIsXG59KVxuZXhwb3J0IGNvbnN0IGZyZW5jaERhdGVTYW1lWWVhclNob3J0Rm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJmci1GUlwiLCB7XG4gIGRheTogXCJudW1lcmljXCIsXG4gIG1vbnRoOiBcInNob3J0XCIsXG59KVxuZXhwb3J0IGNvbnN0IGZyZW5jaFRpbWVGb3JtYXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImZyLUZSXCIsIHtcbiAgaG91cjogXCJudW1lcmljXCIsXG4gIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21OdWxsYWJsZURhdGVPcklzb1N0cmluZyhcbiAgZGF0ZTogRGF0ZSB8IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIGRlZmF1bHRWYWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4pOiBEYXRlIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBkYXRlXG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhcnNlSVNPKGRhdGUpXG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxufVxuXG4vLy8gQ29udmVydCBzdHJpbmdzIGxpa2UgXCIyMDE3LTExLTI0KzAxOjAwXCIgdG8gZGF0ZXMuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21ZZWFyTW9udGhEYXlUaW1lem9uZVN0cmluZyhkYXRlU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHtcbiAgcmV0dXJuIHBhcnNlKGRhdGVTdHJpbmcsIFwieXl5eS1NTS1kZFhYWFwiLCBuZXcgRGF0ZSgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheURhdGVGcm9tTG9jYWxJc29TdHJpbmcoZGF0ZVN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKGRhdGVTdHJpbmcpXG4gIGRhdGVTdHJpbmcgPSBmb3JtYXQoZGF0ZSwgXCJFRUVFIGQgTExMTCB5eXl5IEgnaCdtbVwiLCB7IGxvY2FsZTogZnJMb2NhbGUgfSlcbiAgaWYgKGRhdGVTdHJpbmcuZW5kc1dpdGgoXCIgMGgwMFwiKSkge1xuICAgIGRhdGVTdHJpbmcgPSBkYXRlU3RyaW5nLnN1YnN0cmluZygwLCBkYXRlU3RyaW5nLmxlbmd0aCAtIDUpXG4gIH1cbiAgcmV0dXJuIGRhdGVTdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlRnJlbmNoVGltZShkYXRlOiBEYXRlLCBub3c6IERhdGUpIHtcbiAgaWYgKFxuICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gbm93LmdldEZ1bGxZZWFyKCkgJiZcbiAgICBkYXRlLmdldE1vbnRoKCkgPT09IG5vdy5nZXRNb250aCgpICYmXG4gICAgZGF0ZS5nZXREYXRlKCkgPT09IG5vdy5nZXREYXRlKClcbiAgKSB7XG4gICAgcmV0dXJuIGZyZW5jaFRpbWVGb3JtYXQuZm9ybWF0KGRhdGUpXG4gIH1cbiAgcmV0dXJuIGZyZW5jaERhdGVTYW1lWWVhclNob3J0Rm9ybWF0LmZvcm1hdChkYXRlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJlbmNoRGF0ZVdpdGhvdXREYXlPZldlZWtGcm9tRGF0ZU9yU3RyaW5nKFxuICBkYXRlT3JTdHJpbmc6IERhdGUgfCBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBkYXRlOiBEYXRlID1cbiAgICBkYXRlT3JTdHJpbmcgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZU9yU3RyaW5nIDogcGFyc2VJU08oZGF0ZU9yU3RyaW5nKVxuICBsZXQgZGF0ZVN0cmluZyA9IGZvcm1hdChkYXRlLCBcImQgTExMTCB5eXl5IEgnaCdtbVwiLCB7IGxvY2FsZTogZnJMb2NhbGUgfSlcbiAgaWYgKGRhdGVTdHJpbmcuZW5kc1dpdGgoXCIgMGgwMFwiKSkge1xuICAgIGRhdGVTdHJpbmcgPSBkYXRlU3RyaW5nLnN1YnN0cmluZygwLCBkYXRlU3RyaW5nLmxlbmd0aCAtIDUpXG4gIH1cbiAgcmV0dXJuIGRhdGVTdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyZW5jaFRpbWVGcm9tRGF0ZU9yU3RyaW5nKFxuICBkYXRlT3JTdHJpbmc6IERhdGUgfCBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBkYXRlOiBEYXRlID1cbiAgICBkYXRlT3JTdHJpbmcgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZU9yU3RyaW5nIDogcGFyc2VJU08oZGF0ZU9yU3RyaW5nKVxuICByZXR1cm4gZm9ybWF0KGRhdGUsIFwiSCdoJ21tXCIsIHsgbG9jYWxlOiBmckxvY2FsZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxJc284NjAxU3RyaW5nRnJvbURhdGUoZGF0ZTogRGF0ZSkge1xuICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMClcbiAgICAudG9JU09TdHJpbmcoKVxuICAgIC5zcGxpdChcIlRcIilbMF1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLEdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUgsT0FBQTtBQUVBO0FBQ0E7QUFDTyxJQUFNSSxrQkFBa0IsR0FBQUMsT0FBQSxDQUFBRCxrQkFBQSxHQUFHRSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0MsTUFBTTtBQUNoRCxJQUFNQyxrQkFBaUIsR0FBQUosT0FBQSxDQUFBSSxpQkFBQSxHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUEsRUFBaUM7RUFDN0QsSUFBSTtJQUNGLElBQU1DLEtBQUssR0FBRyxJQUFJLENBQUNDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLElBQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLElBQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLElBQU1DLFlBQVksR0FBRyxJQUFJLENBQUNDLGVBQWUsQ0FBQyxDQUFDO0lBRTNDLElBQU1DLHFCQUFxQixHQUFHLEVBQUUsSUFBSSxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUM7SUFDL0Q7SUFDQSxJQUNHRCxxQkFBcUIsS0FBSyxJQUFJLElBQzdCUixLQUFLLEtBQUssQ0FBQyxJQUNYRSxPQUFPLEtBQUssQ0FBQyxJQUNiRSxPQUFPLEtBQUssRUFBRSxJQUNmSixLQUFLLEdBQUdRLHFCQUFxQixLQUFLLENBQUMsSUFDbENOLE9BQU8sS0FBSyxDQUFDLElBQ2JFLE9BQU8sS0FBSyxDQUFDLElBQ2JFLFlBQVksS0FBSyxDQUFFLEVBQ3JCO01BQ0EsT0FBTyxJQUFJLENBQUNJLFdBQVcsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekM7O0lBRUE7SUFDQTtJQUNBLElBQU1DLGFBQWEsR0FBRyxJQUFJaEIsSUFBSSxDQUM1QixJQUFJLENBQUNpQixXQUFXLENBQUMsQ0FBQyxFQUNsQixJQUFJLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQ2YsSUFBSSxDQUFDQyxPQUFPLENBQUMsQ0FBQyxFQUNkZixLQUFLLEVBQ0xFLE9BQU8sRUFDUEUsT0FBTyxFQUNQRSxZQUNGLENBQUM7SUFDRE0sYUFBYSxDQUFDSSxRQUFRLENBQUMsSUFBSSxDQUFDZixRQUFRLENBQUMsQ0FBQyxHQUFHTyxxQkFBcUIsQ0FBQztJQUMvRDtJQUNBLElBQU1TLEdBQUcsR0FBR0wsYUFBYSxDQUFDRixXQUFXLENBQUMsQ0FBQyxDQUFDUSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztJQUNoRSxJQUFNQyxJQUFJLEdBQUdYLHFCQUFxQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRztJQUNuRCxJQUFNWSxXQUFXLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUFDZCxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtJQUNuRSxPQUNFUyxHQUFHLEdBQ0hFLElBQUksR0FDSkMsV0FBVyxHQUNYQyxJQUFJLENBQUNDLEdBQUcsQ0FBQ2QscUJBQXFCLENBQUMsQ0FBQ2UsUUFBUSxDQUFDLENBQUMsQ0FBQ1osS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUN4RCxLQUFLO0VBRVQsQ0FBQyxDQUFDLE9BQU9hLENBQUMsRUFBRTtJQUNWNUIsSUFBSSxDQUFDQyxTQUFTLENBQUNDLE1BQU0sR0FBR0osa0JBQWtCO0lBQzFDLElBQU0rQixRQUFRLEdBQUcsSUFBSSxDQUFDM0IsTUFBTSxDQUFDLENBQUM7SUFDOUJGLElBQUksQ0FBQ0MsU0FBUyxDQUFDQyxNQUFNLEdBQUdDLGtCQUFpQjtJQUN6QyxPQUFPMEIsUUFBUTtFQUNqQjtBQUNGLENBQUM7QUFFTSxJQUFNQyxnQkFBZ0IsR0FBQS9CLE9BQUEsQ0FBQStCLGdCQUFBLEdBQUcsSUFBSUMsSUFBSSxDQUFDQyxjQUFjLENBQUMsT0FBTyxFQUFFO0VBQy9EQyxHQUFHLEVBQUUsU0FBUztFQUNkQyxLQUFLLEVBQUUsTUFBTTtFQUNiQyxPQUFPLEVBQUUsTUFBTTtFQUNmQyxJQUFJLEVBQUU7QUFDUixDQUFDLENBQUM7QUFDSyxJQUFNQyw2QkFBNkIsR0FBQXRDLE9BQUEsQ0FBQXNDLDZCQUFBLEdBQUcsSUFBSU4sSUFBSSxDQUFDQyxjQUFjLENBQUMsT0FBTyxFQUFFO0VBQzVFQyxHQUFHLEVBQUUsU0FBUztFQUNkQyxLQUFLLEVBQUU7QUFDVCxDQUFDLENBQUM7QUFDSyxJQUFNSSxnQkFBZ0IsR0FBQXZDLE9BQUEsQ0FBQXVDLGdCQUFBLEdBQUcsSUFBSVAsSUFBSSxDQUFDQyxjQUFjLENBQUMsT0FBTyxFQUFFO0VBQy9ETyxJQUFJLEVBQUUsU0FBUztFQUNmQyxNQUFNLEVBQUU7QUFDVixDQUFDLENBQUM7QUFFSyxTQUFTQywrQkFBK0JBLENBQzdDQyxJQUFzQyxFQUN0Q0MsWUFBcUMsRUFDWjtFQUN6QixJQUFJRCxJQUFJLFlBQVkxQyxJQUFJLEVBQUU7SUFDeEIsT0FBTzBDLElBQUk7RUFDYjtFQUNBLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtJQUM1QixPQUFPLElBQUFFLGtCQUFRLEVBQUNGLElBQUksQ0FBQztFQUN2QjtFQUNBLE9BQU9DLFlBQVk7QUFDckI7O0FBRUE7QUFDTyxTQUFTRSxrQ0FBa0NBLENBQUNDLFVBQWtCLEVBQVE7RUFDM0UsT0FBTyxJQUFBQyxZQUFLLEVBQUNELFVBQVUsRUFBRSxlQUFlLEVBQUUsSUFBSTlDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkQ7QUFFTyxTQUFTZ0QsNkJBQTZCQSxDQUFDRixVQUFrQixFQUFVO0VBQ3hFLElBQU1KLElBQUksR0FBRyxJQUFBRSxrQkFBUSxFQUFDRSxVQUFVLENBQUM7RUFDakNBLFVBQVUsR0FBRyxJQUFBRyxjQUFNLEVBQUNQLElBQUksRUFBRSx5QkFBeUIsRUFBRTtJQUFFUSxNQUFNLEVBQUVDO0VBQVMsQ0FBQyxDQUFDO0VBQzFFLElBQUlMLFVBQVUsQ0FBQ00sUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQ2hDTixVQUFVLEdBQUdBLFVBQVUsQ0FBQ08sU0FBUyxDQUFDLENBQUMsRUFBRVAsVUFBVSxDQUFDUSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQzdEO0VBQ0EsT0FBT1IsVUFBVTtBQUNuQjtBQUVPLFNBQVNTLHdCQUF3QkEsQ0FBQ2IsSUFBVSxFQUFFYyxHQUFTLEVBQUU7RUFDOUQsSUFDRWQsSUFBSSxDQUFDekIsV0FBVyxDQUFDLENBQUMsS0FBS3VDLEdBQUcsQ0FBQ3ZDLFdBQVcsQ0FBQyxDQUFDLElBQ3hDeUIsSUFBSSxDQUFDeEIsUUFBUSxDQUFDLENBQUMsS0FBS3NDLEdBQUcsQ0FBQ3RDLFFBQVEsQ0FBQyxDQUFDLElBQ2xDd0IsSUFBSSxDQUFDdkIsT0FBTyxDQUFDLENBQUMsS0FBS3FDLEdBQUcsQ0FBQ3JDLE9BQU8sQ0FBQyxDQUFDLEVBQ2hDO0lBQ0EsT0FBT21CLGdCQUFnQixDQUFDVyxNQUFNLENBQUNQLElBQUksQ0FBQztFQUN0QztFQUNBLE9BQU9MLDZCQUE2QixDQUFDWSxNQUFNLENBQUNQLElBQUksQ0FBQztBQUNuRDtBQUVPLFNBQVNlLDBDQUEwQ0EsQ0FDeERDLFlBQTJCLEVBQ25CO0VBQ1IsSUFBTWhCLElBQVUsR0FDZGdCLFlBQVksWUFBWTFELElBQUksR0FBRzBELFlBQVksR0FBRyxJQUFBZCxrQkFBUSxFQUFDYyxZQUFZLENBQUM7RUFDdEUsSUFBSVosVUFBVSxHQUFHLElBQUFHLGNBQU0sRUFBQ1AsSUFBSSxFQUFFLG9CQUFvQixFQUFFO0lBQUVRLE1BQU0sRUFBRUM7RUFBUyxDQUFDLENBQUM7RUFDekUsSUFBSUwsVUFBVSxDQUFDTSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7SUFDaENOLFVBQVUsR0FBR0EsVUFBVSxDQUFDTyxTQUFTLENBQUMsQ0FBQyxFQUFFUCxVQUFVLENBQUNRLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDN0Q7RUFDQSxPQUFPUixVQUFVO0FBQ25CO0FBRU8sU0FBU2EsMEJBQTBCQSxDQUN4Q0QsWUFBMkIsRUFDbkI7RUFDUixJQUFNaEIsSUFBVSxHQUNkZ0IsWUFBWSxZQUFZMUQsSUFBSSxHQUFHMEQsWUFBWSxHQUFHLElBQUFkLGtCQUFRLEVBQUNjLFlBQVksQ0FBQztFQUN0RSxPQUFPLElBQUFULGNBQU0sRUFBQ1AsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUFFUSxNQUFNLEVBQUVDO0VBQVMsQ0FBQyxDQUFDO0FBQ3JEO0FBRU8sU0FBU1MsMEJBQTBCQSxDQUFDbEIsSUFBVSxFQUFFO0VBQ3JELE9BQU8sSUFBSTFDLElBQUksQ0FBQzBDLElBQUksQ0FBQ21CLE9BQU8sQ0FBQyxDQUFDLEdBQUduQixJQUFJLENBQUM3QixpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQy9EQyxXQUFXLENBQUMsQ0FBQyxDQUNiQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCIiwiaWdub3JlTGlzdCI6W119