@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
152 lines • 21.3 kB
JavaScript
import { load } from "../../file_systems.mjs";
import { assert } from "chai";
import { Plugin } from "../agenda-00011/index.mjs";
import fetchMock from "fetch-mock";
const id = "00011";
suite(`Plugin${id}`);
test(`#Plugin${id}FindSession`, async function () {
const plugin = new Plugin({});
const sessions = [{
debut: "2019-09-10",
fin: "2019-09-27"
}, {
debut: "2019-10-01",
fin: "2020-06-30"
}, {
debut: "2020-06-31",
fin: "2020-07-31"
}, {
debut: "2020-08-01",
fin: "2020-08-31"
}, {
debut: "2020-09-01",
fin: "2020-09-30"
}];
plugin.sessions = sessions.slice(0, 2);
// between sessions
assert.strictEqual(plugin.lookupSession("2019-09-28"), null);
assert.strictEqual(plugin.lookupSession("2017-01-01"), null);
assert.deepEqual(plugin.lookupSession("2019-09-15"), plugin.sessions[0]);
assert.deepEqual(plugin.lookupSession("2020-02-02"), plugin.sessions[1]);
assert.strictEqual(plugin.lookupSession("2022-01-01"), null);
plugin.sessions = sessions.slice(0, 1);
assert.strictEqual(plugin.lookupSession("2017-01-01"), null);
assert.deepEqual(plugin.lookupSession("2019-09-15"), plugin.sessions[0]);
assert.strictEqual(plugin.lookupSession("2020-02-02"), null);
assert.strictEqual(plugin.lookupSession("2022-01-01"), null);
plugin.sessions = sessions;
assert.strictEqual(plugin.lookupSession("2017-01-01"), null);
assert.deepEqual(plugin.lookupSession("2019-09-15"), plugin.sessions[0]);
assert.deepEqual(plugin.lookupSession("2020-02-02"), plugin.sessions[1]);
assert.deepEqual(plugin.lookupSession("2020-09-01"), plugin.sessions[4]);
assert.deepEqual(plugin.lookupSession("2020-09-30"), plugin.sessions[4]);
assert.strictEqual(plugin.lookupSession("2022-01-01"), null);
});
test(`#Plugin${id}Load`, async function () {
const plugin = new Plugin({});
const d = `src/bugs/agenda-${id}`;
const wikidata = load(`${d}/wikidata.json`);
plugin.fetch = fetchMock.route(/query\.wikidata\.org/, {
body: wikidata,
status: 200
});
await plugin.preFix();
const expected = [{
debut: "2019-09-10",
fin: "2019-09-27",
label: "SESSION02"
}, {
debut: "2019-10-01",
fin: "2020-06-30",
label: "SESSION01"
}];
assert.deepEqual(plugin.sessions, expected);
});
test(`#Plugin${id}Fix`, async function () {
const plugin = new Plugin({});
const d = `src/bugs/agenda-${id}`;
const wikidata = load(`${d}/wikidata.json`);
plugin.fetch = fetchMock.route(/query\.wikidata\.org/, {
body: wikidata,
status: 200
});
await plugin.preFix();
assert(plugin.sessions != undefined);
{
const f = `${d}/ok.json`;
const content = load(f);
assert("sessionRef" in content, content);
assert.equal(await plugin.fix(content, f), true, f);
assert(!("sessionRef" in content), content);
assert(content.session.label, "SESSION01");
}
{
const f = `${d}/oldschema.json`;
const content = load(f);
assert.equal(content.schemaVersion, "agenda-1.0");
assert.equal(await plugin.fix(content, f), true, f);
assert.equal(content.schemaVersion, "agenda-1.1");
}
{
const f = `${d}/noschema.json`;
const content = load(f);
assert.strictEqual(content.schemaVersion, undefined);
assert.equal(await plugin.fix(content, f), true, f);
assert.equal(content.schemaVersion, "agenda-1.1");
}
{
const f = `${d}/nosessionref.json`;
const content = load(f);
assert.equal(await plugin.fix(content, f), true, f);
assert.equal(content.session.label, "SESSION01");
}
{
const f = `${d}/session.json`;
const content = load(f);
assert.equal(content.session.label, "SOMETHING");
assert.equal(await plugin.fix(content, f), true, f);
assert.equal(content.session.label, "SESSION01");
}
{
const f = `${d}/not_seance_type.json`;
const content = load(f);
assert.equal(await plugin.fix(content, f), null, f);
}
});
test(`#Plugin${id}Check`, async function () {
const plugin = new Plugin({});
const d = `src/bugs/agenda-${id}`;
const wikidata = load(`${d}/wikidata.json`);
plugin.fetch = fetchMock.route(/query\.wikidata\.org/, {
body: wikidata,
status: 200
});
await plugin.preCheck();
assert(plugin.sessions != undefined);
{
const f = `${d}/ok.json`;
const content = load(f);
const result = await plugin.check(content, f);
assert.deepEqual(result, {
status: "ok",
info: [""]
}, f);
}
{
const f = `${d}/badtimestamp.json`;
const content = load(f);
const result = await plugin.check(content, f);
assert.deepEqual(result, {
status: "needs-fixing",
info: ["2017-06-20 is not in a session"]
}, f);
}
});
test(`#Plugin${id}FetchFail`, async function () {
const plugin = new Plugin({});
plugin.fetch = fetchMock.route(/query\.wikidata\.org/, 500);
let status = "unexpected";
await plugin.preFix().then(() => status = "exception not thrown").catch(e => status = String(e.status));
assert.equal(status, "500");
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2FkIiwiYXNzZXJ0IiwiUGx1Z2luIiwiZmV0Y2hNb2NrIiwiaWQiLCJzdWl0ZSIsInRlc3QiLCJwbHVnaW4iLCJzZXNzaW9ucyIsImRlYnV0IiwiZmluIiwic2xpY2UiLCJzdHJpY3RFcXVhbCIsImxvb2t1cFNlc3Npb24iLCJkZWVwRXF1YWwiLCJkIiwid2lraWRhdGEiLCJmZXRjaCIsInJvdXRlIiwiYm9keSIsInN0YXR1cyIsInByZUZpeCIsImV4cGVjdGVkIiwibGFiZWwiLCJ1bmRlZmluZWQiLCJmIiwiY29udGVudCIsImVxdWFsIiwiZml4Iiwic2Vzc2lvbiIsInNjaGVtYVZlcnNpb24iLCJwcmVDaGVjayIsInJlc3VsdCIsImNoZWNrIiwiaW5mbyIsInRoZW4iLCJjYXRjaCIsImUiLCJTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnVncy9hZ2VuZGEtMDAwMTEvcGx1Z2luLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZCB9IGZyb20gXCIuLi8uLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcImNoYWlcIlxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4uL2FnZW5kYS0wMDAxMVwiXG5pbXBvcnQgZmV0Y2hNb2NrIGZyb20gXCJmZXRjaC1tb2NrXCJcblxuY29uc3QgaWQgPSBcIjAwMDExXCJcblxuc3VpdGUoYFBsdWdpbiR7aWR9YClcblxudGVzdChgI1BsdWdpbiR7aWR9RmluZFNlc3Npb25gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe30pXG5cbiAgY29uc3Qgc2Vzc2lvbnMgPSBbXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAxOS0wOS0xMFwiLFxuICAgICAgZmluOiBcIjIwMTktMDktMjdcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlYnV0OiBcIjIwMTktMTAtMDFcIixcbiAgICAgIGZpbjogXCIyMDIwLTA2LTMwXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWJ1dDogXCIyMDIwLTA2LTMxXCIsXG4gICAgICBmaW46IFwiMjAyMC0wNy0zMVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAyMC0wOC0wMVwiLFxuICAgICAgZmluOiBcIjIwMjAtMDgtMzFcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlYnV0OiBcIjIwMjAtMDktMDFcIixcbiAgICAgIGZpbjogXCIyMDIwLTA5LTMwXCIsXG4gICAgfSxcbiAgXVxuXG4gIHBsdWdpbi5zZXNzaW9ucyA9IHNlc3Npb25zLnNsaWNlKDAsIDIpXG4gIC8vIGJldHdlZW4gc2Vzc2lvbnNcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAxOS0wOS0yOFwiKSwgbnVsbClcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAxNy0wMS0wMVwiKSwgbnVsbClcbiAgYXNzZXJ0LmRlZXBFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMTktMDktMTVcIiksIHBsdWdpbi5zZXNzaW9uc1swXSlcbiAgYXNzZXJ0LmRlZXBFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMjAtMDItMDJcIiksIHBsdWdpbi5zZXNzaW9uc1sxXSlcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAyMi0wMS0wMVwiKSwgbnVsbClcblxuICBwbHVnaW4uc2Vzc2lvbnMgPSBzZXNzaW9ucy5zbGljZSgwLCAxKVxuICBhc3NlcnQuc3RyaWN0RXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDE3LTAxLTAxXCIpLCBudWxsKVxuICBhc3NlcnQuZGVlcEVxdWFsKHBsdWdpbi5sb29rdXBTZXNzaW9uKFwiMjAxOS0wOS0xNVwiKSwgcGx1Z2luLnNlc3Npb25zWzBdKVxuICBhc3NlcnQuc3RyaWN0RXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTAyLTAyXCIpLCBudWxsKVxuICBhc3NlcnQuc3RyaWN0RXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIyLTAxLTAxXCIpLCBudWxsKVxuXG4gIHBsdWdpbi5zZXNzaW9ucyA9IHNlc3Npb25zXG4gIGFzc2VydC5zdHJpY3RFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMTctMDEtMDFcIiksIG51bGwpXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDE5LTA5LTE1XCIpLCBwbHVnaW4uc2Vzc2lvbnNbMF0pXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTAyLTAyXCIpLCBwbHVnaW4uc2Vzc2lvbnNbMV0pXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTA5LTAxXCIpLCBwbHVnaW4uc2Vzc2lvbnNbNF0pXG4gIGFzc2VydC5kZWVwRXF1YWwocGx1Z2luLmxvb2t1cFNlc3Npb24oXCIyMDIwLTA5LTMwXCIpLCBwbHVnaW4uc2Vzc2lvbnNbNF0pXG4gIGFzc2VydC5zdHJpY3RFcXVhbChwbHVnaW4ubG9va3VwU2Vzc2lvbihcIjIwMjItMDEtMDFcIiksIG51bGwpXG59KVxuXG50ZXN0KGAjUGx1Z2luJHtpZH1Mb2FkYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHt9KVxuICBjb25zdCBkID0gYHNyYy9idWdzL2FnZW5kYS0ke2lkfWBcblxuICBjb25zdCB3aWtpZGF0YSA9IGxvYWQoYCR7ZH0vd2lraWRhdGEuanNvbmApXG4gIHBsdWdpbi5mZXRjaCA9IGZldGNoTW9jay5yb3V0ZSgvcXVlcnlcXC53aWtpZGF0YVxcLm9yZy8sIHtcbiAgICBib2R5OiB3aWtpZGF0YSxcbiAgICBzdGF0dXM6IDIwMCxcbiAgfSlcbiAgYXdhaXQgcGx1Z2luLnByZUZpeCgpXG5cbiAgY29uc3QgZXhwZWN0ZWQgPSBbXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAxOS0wOS0xMFwiLFxuICAgICAgZmluOiBcIjIwMTktMDktMjdcIixcbiAgICAgIGxhYmVsOiBcIlNFU1NJT04wMlwiLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVidXQ6IFwiMjAxOS0xMC0wMVwiLFxuICAgICAgZmluOiBcIjIwMjAtMDYtMzBcIixcbiAgICAgIGxhYmVsOiBcIlNFU1NJT04wMVwiLFxuICAgIH0sXG4gIF1cbiAgYXNzZXJ0LmRlZXBFcXVhbChwbHVnaW4uc2Vzc2lvbnMsIGV4cGVjdGVkKVxufSlcblxudGVzdChgI1BsdWdpbiR7aWR9Rml4YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHt9KVxuICBjb25zdCBkID0gYHNyYy9idWdzL2FnZW5kYS0ke2lkfWBcblxuICBjb25zdCB3aWtpZGF0YSA9IGxvYWQoYCR7ZH0vd2lraWRhdGEuanNvbmApXG4gIHBsdWdpbi5mZXRjaCA9IGZldGNoTW9jay5yb3V0ZSgvcXVlcnlcXC53aWtpZGF0YVxcLm9yZy8sIHtcbiAgICBib2R5OiB3aWtpZGF0YSxcbiAgICBzdGF0dXM6IDIwMCxcbiAgfSlcblxuICBhd2FpdCBwbHVnaW4ucHJlRml4KClcbiAgYXNzZXJ0KHBsdWdpbi5zZXNzaW9ucyAhPSB1bmRlZmluZWQpXG5cbiAge1xuICAgIGNvbnN0IGYgPSBgJHtkfS9vay5qc29uYFxuICAgIGNvbnN0IGNvbnRlbnQgPSBsb2FkKGYpXG4gICAgYXNzZXJ0KFwic2Vzc2lvblJlZlwiIGluIGNvbnRlbnQsIGNvbnRlbnQpXG4gICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHBsdWdpbi5maXgoY29udGVudCwgZiksIHRydWUsIGYpXG4gICAgYXNzZXJ0KCEoXCJzZXNzaW9uUmVmXCIgaW4gY29udGVudCksIGNvbnRlbnQpXG4gICAgYXNzZXJ0KGNvbnRlbnQuc2Vzc2lvbi5sYWJlbCwgXCJTRVNTSU9OMDFcIilcbiAgfVxuXG4gIHtcbiAgICBjb25zdCBmID0gYCR7ZH0vb2xkc2NoZW1hLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zY2hlbWFWZXJzaW9uLCBcImFnZW5kYS0xLjBcIilcbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgcGx1Z2luLmZpeChjb250ZW50LCBmKSwgdHJ1ZSwgZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zY2hlbWFWZXJzaW9uLCBcImFnZW5kYS0xLjFcIilcbiAgfVxuXG4gIHtcbiAgICBjb25zdCBmID0gYCR7ZH0vbm9zY2hlbWEuanNvbmBcbiAgICBjb25zdCBjb250ZW50ID0gbG9hZChmKVxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb250ZW50LnNjaGVtYVZlcnNpb24sIHVuZGVmaW5lZClcbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgcGx1Z2luLmZpeChjb250ZW50LCBmKSwgdHJ1ZSwgZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zY2hlbWFWZXJzaW9uLCBcImFnZW5kYS0xLjFcIilcbiAgfVxuXG4gIHtcbiAgICBjb25zdCBmID0gYCR7ZH0vbm9zZXNzaW9ucmVmLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBhc3NlcnQuZXF1YWwoYXdhaXQgcGx1Z2luLmZpeChjb250ZW50LCBmKSwgdHJ1ZSwgZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zZXNzaW9uLmxhYmVsLCBcIlNFU1NJT04wMVwiKVxuICB9XG5cbiAge1xuICAgIGNvbnN0IGYgPSBgJHtkfS9zZXNzaW9uLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBhc3NlcnQuZXF1YWwoY29udGVudC5zZXNzaW9uLmxhYmVsLCBcIlNPTUVUSElOR1wiKVxuICAgIGFzc2VydC5lcXVhbChhd2FpdCBwbHVnaW4uZml4KGNvbnRlbnQsIGYpLCB0cnVlLCBmKVxuICAgIGFzc2VydC5lcXVhbChjb250ZW50LnNlc3Npb24ubGFiZWwsIFwiU0VTU0lPTjAxXCIpXG4gIH1cblxuICB7XG4gICAgY29uc3QgZiA9IGAke2R9L25vdF9zZWFuY2VfdHlwZS5qc29uYFxuICAgIGNvbnN0IGNvbnRlbnQgPSBsb2FkKGYpXG4gICAgYXNzZXJ0LmVxdWFsKGF3YWl0IHBsdWdpbi5maXgoY29udGVudCwgZiksIG51bGwsIGYpXG4gIH1cbn0pXG5cbnRlc3QoYCNQbHVnaW4ke2lkfUNoZWNrYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHt9KVxuICBjb25zdCBkID0gYHNyYy9idWdzL2FnZW5kYS0ke2lkfWBcblxuICBjb25zdCB3aWtpZGF0YSA9IGxvYWQoYCR7ZH0vd2lraWRhdGEuanNvbmApXG4gIHBsdWdpbi5mZXRjaCA9IGZldGNoTW9jay5yb3V0ZSgvcXVlcnlcXC53aWtpZGF0YVxcLm9yZy8sIHtcbiAgICBib2R5OiB3aWtpZGF0YSxcbiAgICBzdGF0dXM6IDIwMCxcbiAgfSlcblxuICBhd2FpdCBwbHVnaW4ucHJlQ2hlY2soKVxuICBhc3NlcnQocGx1Z2luLnNlc3Npb25zICE9IHVuZGVmaW5lZClcblxuICB7XG4gICAgY29uc3QgZiA9IGAke2R9L29rLmpzb25gXG4gICAgY29uc3QgY29udGVudCA9IGxvYWQoZilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwbHVnaW4uY2hlY2soY29udGVudCwgZilcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3VsdCwgeyBzdGF0dXM6IFwib2tcIiwgaW5mbzogW1wiXCJdIH0sIGYpXG4gIH1cblxuICB7XG4gICAgY29uc3QgZiA9IGAke2R9L2JhZHRpbWVzdGFtcC5qc29uYFxuICAgIGNvbnN0IGNvbnRlbnQgPSBsb2FkKGYpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGx1Z2luLmNoZWNrKGNvbnRlbnQsIGYpXG4gICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgIHJlc3VsdCxcbiAgICAgIHsgc3RhdHVzOiBcIm5lZWRzLWZpeGluZ1wiLCBpbmZvOiBbXCIyMDE3LTA2LTIwIGlzIG5vdCBpbiBhIHNlc3Npb25cIl0gfSxcbiAgICAgIGYsXG4gICAgKVxuICB9XG59KVxuXG50ZXN0KGAjUGx1Z2luJHtpZH1GZXRjaEZhaWxgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe30pXG5cbiAgcGx1Z2luLmZldGNoID0gZmV0Y2hNb2NrLnJvdXRlKC9xdWVyeVxcLndpa2lkYXRhXFwub3JnLywgNTAwKVxuXG4gIGxldCBzdGF0dXMgPSBcInVuZXhwZWN0ZWRcIlxuICBhd2FpdCBwbHVnaW5cbiAgICAucHJlRml4KClcbiAgICAudGhlbigoKSA9PiAoc3RhdHVzID0gXCJleGNlcHRpb24gbm90IHRocm93blwiKSlcbiAgICAuY2F0Y2goKGUpID0+IChzdGF0dXMgPSBTdHJpbmcoZS5zdGF0dXMpKSlcbiAgYXNzZXJ0LmVxdWFsKHN0YXR1cywgXCI1MDBcIilcbn0pXG4iXSwibWFwcGluZ3MiOiJTQUFTQSxJQUFJO0FBQ2IsU0FBU0MsTUFBTSxRQUFRLE1BQU07QUFBQSxTQUNwQkMsTUFBTTtBQUNmLE9BQU9DLFNBQVMsTUFBTSxZQUFZO0FBRWxDLE1BQU1DLEVBQUUsR0FBRyxPQUFPO0FBRWxCQyxLQUFLLENBQUMsU0FBU0QsRUFBRSxFQUFFLENBQUM7QUFFcEJFLElBQUksQ0FBQyxVQUFVRixFQUFFLGFBQWEsRUFBRSxrQkFBa0I7RUFDaEQsTUFBTUcsTUFBTSxHQUFHLElBQUlMLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUU3QixNQUFNTSxRQUFRLEdBQUcsQ0FDZjtJQUNFQyxLQUFLLEVBQUUsWUFBWTtJQUNuQkMsR0FBRyxFQUFFO0VBQ1AsQ0FBQyxFQUNEO0lBQ0VELEtBQUssRUFBRSxZQUFZO0lBQ25CQyxHQUFHLEVBQUU7RUFDUCxDQUFDLEVBQ0Q7SUFDRUQsS0FBSyxFQUFFLFlBQVk7SUFDbkJDLEdBQUcsRUFBRTtFQUNQLENBQUMsRUFDRDtJQUNFRCxLQUFLLEVBQUUsWUFBWTtJQUNuQkMsR0FBRyxFQUFFO0VBQ1AsQ0FBQyxFQUNEO0lB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