UNPKG

@gpa-gemstone/react-graph

Version:
454 lines 43 kB
"use strict"; // ****************************************************************************************************** // TimeAxis.tsx - Gbtc // // Copyright © 2020, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this // file except in compliance with the License. You may obtain a copy of the License at: // // http://opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 03/18/2021 - C Lackner // Generated original version of source code. // // ****************************************************************************************************** var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); var React = require("react"); var GraphContext_1 = require("./GraphContext"); var moment = require("moment"); var helper_functions_1 = require("@gpa-gemstone/helper-functions"); var lodash_1 = require("lodash"); var msPerSecond = 1000.00; var msPerMinute = msPerSecond * 60.0; var msPerHour = msPerMinute * 60.0; var msPerDay = msPerHour * 24.0; var msPerYear = msPerDay * 365; function TimeAxis(props) { var _a, _b, _c, _d; /* Used on bottom of Plot. */ var context = React.useContext(GraphContext_1.GraphContext); var _e = __read(React.useState([]), 2), ticks = _e[0], setTicks = _e[1]; var _f = __read(React.useState(1), 2), tickFontSize = _f[0], setTickFontSize = _f[1]; var _g = __read(React.useState(0), 2), axisHeight = _g[0], setAxisHeight = _g[1]; var _h = __read(React.useState('YYYY'), 2), tickFormat = _h[0], setTickFormat = _h[1]; var _j = __read(React.useState(''), 2), dFormat = _j[0], setDformat = _j[1]; var _k = __read(React.useState('Time'), 2), title = _k[0], setTitle = _k[1]; // Adjust unit label React.useEffect(function () { if (props.label === undefined) { setTitle(undefined); return; } var titleFormat = ""; var unitLabel = ""; switch (tickFormat) { case ('SSS'): titleFormat = "MMM Do, YYYY HH:mm:ss"; unitLabel = " (ms)"; break; case ('ss.SS'): titleFormat = "MMM Do, YYYY HH:mm"; unitLabel = " (sec.ms)"; break; case ('ss'): titleFormat = "MMM Do, YYYY HH:mm"; unitLabel = " (sec)"; break; case ('mm:ss'): titleFormat = "MMM Do, YYYY HH"; unitLabel = " (min:sec)"; break; case ('mm'): titleFormat = "MMM Do, YYYY HH"; unitLabel = " (min)"; break; case ('HH:mm'): titleFormat = "MMM Do, YYYY"; unitLabel = " (hour:min)"; break; case ('HH'): titleFormat = "MMM Do, YYYY"; unitLabel = " (hour)"; break; case ('DD HH'): titleFormat = "MMM YYYY"; unitLabel = " (day hour)"; break; case ('MM/DD'): titleFormat = "YYYY"; unitLabel = " (month/day)"; break; case ('MM YY'): titleFormat = ""; unitLabel = " (month year)"; break; case ('YYYY'): titleFormat = ""; unitLabel = " (year)"; break; default: console.warn("Unrecognized format: ".concat(tickFormat)); break; } if (props.label === '') { var formatedTitle = titleFormat === "" ? "Time" : formatTick(ticks[0], titleFormat); setTitle(formatedTitle + unitLabel); } else setTitle(props.label + unitLabel); }, [tickFormat, props.label, ticks]); // Adjust space for X Tick labels React.useEffect(function () { var dX = Math.max.apply(Math, __spreadArray([], __read(ticks.map(function (t) { return (0, helper_functions_1.GetTextHeight)("Segoe UI", '1em', formatTick(t, tickFormat)); })), false)); dX = (isFinite(dX) ? dX : 0) + 12; setAxisHeight(dX); }, [ticks, tickFormat]); React.useEffect(function () { var titleHeight = title !== undefined ? (0, helper_functions_1.GetTextHeight)("Segoe UI", '1em', title) : 0; if (axisHeight + titleHeight !== props.heightAxis) props.setHeight(axisHeight + titleHeight); }, [axisHeight, title, props.heightAxis, props.setHeight]); React.useEffect(function () { var _a; var deltaT = context.XDomain[1] - context.XDomain[0]; if (deltaT === 0) return; var format = 'YYYY'; var dateFormat = ''; if (deltaT < msPerYear * 15 && deltaT >= msPerYear) { format = 'MM YY'; dateFormat = ''; } if (deltaT < msPerYear && deltaT >= 30 * msPerDay) { format = 'MM/DD'; dateFormat = 'YY'; } if (deltaT < 30 * msPerDay && deltaT >= 2 * msPerDay) { format = 'DD HH'; dateFormat = 'YY'; } if (deltaT < 2 * msPerDay && deltaT >= 30 * msPerHour) { format = 'HH'; dateFormat = 'MM/DD'; } if (deltaT < 30 * msPerHour && deltaT >= msPerHour) { format = 'HH:mm'; dateFormat = 'MM/DD'; } if (deltaT < msPerHour && deltaT >= 30 * msPerMinute) { format = 'mm'; dateFormat = 'MM/DD HH'; } if (deltaT < 30 * msPerMinute && deltaT >= msPerMinute) { format = 'mm:ss'; dateFormat = 'MM/DD HH'; } if (deltaT < msPerMinute && deltaT >= 30 * msPerSecond) { format = 'ss'; dateFormat = 'MM/DD HH:mm'; } if (deltaT < 30 * msPerSecond && deltaT >= msPerSecond) { format = 'ss.SS'; dateFormat = 'MM/DD HH:mm'; } if (deltaT < msPerSecond) { format = 'SSS'; dateFormat = 'MM/DD HH:mm:ss'; } var Tstart = moment.utc(context.XDomain[0]); var Tend = moment.utc(context.XDomain[1]); var Tdiff = moment.duration(moment.utc(context.XDomain[1]).diff(moment.utc(context.XDomain[0]))); var Ttick = (0, lodash_1.cloneDeep)(Tstart); var step = 10; var stepType = 'y'; if (Tdiff.asYears() >= 70) { step = 10; stepType = 'y'; setTopOfYear(Ttick); Ttick.year(Math.floor((Ttick.year()) / 10.0) * 10.0); } if (Tdiff.asYears() < 70 && Tdiff.asYears() >= 40) { step = 5; setTopOfYear(Ttick); Ttick.year(Math.floor((Ttick.year()) / 5.0) * 5.0); } if (Tdiff.asYears() < 40 && Tdiff.asYears() >= 15) { step = 2; setTopOfYear(Ttick); Ttick.year(Math.floor((Ttick.year()) / 2.0) * 2.0); } if (Tdiff.asYears() < 15 && Tdiff.asYears() >= 6) { stepType = 'M'; step = 12; setTopOfYear(Ttick); } if (Tdiff.asYears() < 6 && Tdiff.asYears() >= 4) { stepType = 'M'; step = 6; setTopOfMonth(Ttick); Ttick.month(Math.floor((Ttick.month()) / 6.0) * 6.0); } if (Tdiff.asYears() < 4 && Tdiff.asYears() >= 1.5) { stepType = 'M'; step = 3; setTopOfMonth(Ttick); Ttick.month(Math.floor((Ttick.month()) / 3.0) * 3.0); } if (Tdiff.asYears() < 1.5 && Tdiff.asMonths() >= 6) { stepType = 'M'; step = 1; setTopOfMonth(Ttick); } if (Tdiff.asMonths() < 6 && Tdiff.asMonths() >= 2) { stepType = 'w'; step = 2; setTopOfWeek(Ttick); } if (Tdiff.asMonths() < 2 && Tdiff.asMonths() >= 1) { stepType = 'w'; step = 1; setTopOfWeek(Ttick); } if (Tdiff.asMonths() < 1 && Tdiff.asDays() >= 16) { stepType = 'd'; step = 2; setTopOfDay(Ttick); } if (Tdiff.asDays() < 16 && Tdiff.asDays() >= 10) { stepType = 'd'; step = 1; setTopOfDay(Ttick); } if (Tdiff.asDays() < 10 && Tdiff.asDays() >= 3) { stepType = 'h'; step = 12; setTopOfHour(Ttick); Ttick.hours(Math.floor((Ttick.hours()) / 12.0) * 12.0); } if (Tdiff.asDays() < 3 && Tdiff.asHours() >= 30) { stepType = 'h'; step = 6; setTopOfHour(Ttick); Ttick.hours(Math.floor((Ttick.hours()) / 6.0) * 6.0); } if (Tdiff.asHours() < 30 && Tdiff.asHours() >= 18) { stepType = 'h'; step = 3; setTopOfHour(Ttick); Ttick.hours(Math.floor((Ttick.hours()) / 3.0) * 3.0); } if (Tdiff.asHours() < 18 && Tdiff.asHours() >= 6) { stepType = 'h'; step = 1; setTopOfHour(Ttick); } if (Tdiff.asHours() < 6 && Tdiff.asHours() >= 3) { stepType = 'm'; step = 30; setTopOfMinute(Ttick); Ttick.minutes(Math.floor((Ttick.minutes()) / 30.0) * 30.0); } if (Tdiff.asHours() < 3 && Tdiff.asHours() >= 1) { stepType = 'm'; step = 15; setTopOfMinute(Ttick); Ttick.minutes(Math.floor((Ttick.minutes()) / 15.0) * 15.0); } if (Tdiff.asHours() < 1 && Tdiff.asMinutes() >= 20) { stepType = 'm'; step = 5; setTopOfMinute(Ttick); Ttick.minutes(Math.floor((Ttick.minutes()) / 5.0) * 5.0); } if (Tdiff.asMinutes() < 20 && Tdiff.asMinutes() >= 10) { stepType = 'm'; step = 2; setTopOfMinute(Ttick); Ttick.minutes(Math.floor((Ttick.minutes()) / 2.0) * 2.0); } if (Tdiff.asMinutes() < 10 && Tdiff.asMinutes() >= 5) { stepType = 'm'; step = 1; setTopOfMinute(Ttick); } if (Tdiff.asMinutes() < 5 && Tdiff.asMinutes() >= 2) { stepType = 's'; step = 30; setTopOfSecond(Ttick); Ttick.second(Math.floor((Ttick.second()) / 30) * 30.0); } if (Tdiff.asMinutes() < 2 && Tdiff.asMinutes() >= 1) { stepType = 's'; step = 15; setTopOfSecond(Ttick); Ttick.second(Math.floor((Ttick.second()) / 15) * 15.0); } if (Tdiff.asMinutes() < 1 && Tdiff.asSeconds() >= 30) { stepType = 's'; step = 5; setTopOfSecond(Ttick); Ttick.second(Math.floor((Ttick.second()) / 5) * 5.0); } if (Tdiff.asSeconds() < 30 && Tdiff.asSeconds() >= 15) { stepType = 's'; step = 2; setTopOfSecond(Ttick); } if (Tdiff.asSeconds() < 15 && Tdiff.asSeconds() >= 5) { stepType = 's'; step = 1; setTopOfSecond(Ttick); } if (Tdiff.asSeconds() < 5 && Tdiff.asSeconds() >= 2) { stepType = 'ms'; step = 500; setTopOfms(Ttick); Ttick.millisecond(Math.floor((Ttick.millisecond()) / 500) * 500.0); } if (Tdiff.asSeconds() < 2 && Tdiff.asSeconds() >= 1) { stepType = 'ms'; step = 250; setTopOfms(Ttick); Ttick.millisecond(Math.floor((Ttick.millisecond()) / 250) * 250.0); } if (Tdiff.asSeconds() < 1 && Tdiff.asMilliseconds() >= 500) { stepType = 'ms'; step = 100; setTopOfms(Ttick); Ttick.millisecond(Math.floor((Ttick.millisecond()) / 100) * 100.0); } if (Tdiff.asMilliseconds() < 500 && Tdiff.asMilliseconds() >= 100) { stepType = 'ms'; step = 50; setTopOfms(Ttick); Ttick.millisecond(Math.floor((Ttick.millisecond()) / 50) * 50.0); } if (Tdiff.asMilliseconds() < 100 && Tdiff.asMilliseconds() >= 20) { stepType = 'ms'; step = 10; setTopOfms(Ttick); Ttick.millisecond(Math.floor((Ttick.millisecond()) / 10) * 10.0); } if (Tdiff.asMilliseconds() < 20) { stepType = 'ms'; setTopOfms(Ttick); step = 1; } var newTicks = [Ttick.add(step, stepType)]; while (newTicks[newTicks.length - 1] < Tend) newTicks.push(newTicks[newTicks.length - 1].clone().add(step, stepType)); newTicks.pop(); setTicks(newTicks.map(function (t) { return t.valueOf(); })); setTickFormat(format); if ((_a = props.showDate) !== null && _a !== void 0 ? _a : false) setDformat(dateFormat); else setDformat(''); }, [context.XDomain, props.showDate]); function setTopOfms(d) { d.milliseconds(Math.floor(d.millisecond())); } function setTopOfSecond(d) { setTopOfms(d); d.milliseconds(0); } function setTopOfMinute(d) { setTopOfSecond(d); d.seconds(0); } function setTopOfHour(d) { setTopOfMinute(d); d.minutes(0); } function setTopOfDay(d) { setTopOfHour(d); d.hours(0); } function setTopOfWeek(d) { setTopOfDay(d); d.weekday(0); } function setTopOfMonth(d) { setTopOfDay(d); d.date(1); } function setTopOfYear(d) { setTopOfDay(d); d.dayOfYear(0); } React.useEffect(function () { if (ticks.length === 0) return; // Use first tick as they should all be very similar in size var sampleLabel = formatTick(ticks[0], tickFormat); var availableWidth = props.width - props.offsetLeft - props.offsetRight - 10; var availableWidthPerTick = availableWidth / ticks.length; var newFontSize = 1; var sampleWidth = (0, helper_functions_1.GetTextWidth)('Segoe UI', newFontSize + 'em', sampleLabel); // Decrease font size until we fit, down to a mini of 0.5em. while (sampleWidth > availableWidthPerTick && newFontSize > 0.5) { newFontSize = newFontSize - 0.05; sampleWidth = (0, helper_functions_1.GetTextWidth)('Segoe UI', newFontSize + 'em', sampleLabel); } setTickFontSize(newFontSize); }, [ticks, props.width, props.offsetLeft, props.offsetRight, tickFormat]); return (React.createElement("g", null, React.createElement("path", { stroke: 'currentColor', style: { strokeWidth: 1 }, d: "M ".concat(props.offsetLeft - (((_a = props.showLeftMostTick) !== null && _a !== void 0 ? _a : true) ? 0 : 8), " ").concat(props.height - props.offsetBottom, " H ").concat(props.width - props.offsetRight + (((_b = props.showRightMostTick) !== null && _b !== void 0 ? _b : true) ? 0 : 8)) }), ((_c = props.showLeftMostTick) !== null && _c !== void 0 ? _c : true) ? React.createElement("path", { stroke: 'currentColor', style: { strokeWidth: 1 }, d: "M ".concat(props.offsetLeft, " ").concat(props.height - props.offsetBottom, " v ").concat(8) }) : null, ((_d = props.showRightMostTick) !== null && _d !== void 0 ? _d : true) ? React.createElement("path", { stroke: 'currentColor', style: { strokeWidth: 1 }, d: "M ".concat(props.width - props.offsetRight, " ").concat(props.height - props.offsetBottom, " v ").concat(8) }) : null, props.showTicks === undefined || props.showTicks ? React.createElement(React.Fragment, null, ticks.map(function (l, i) { return React.createElement("path", { key: i, stroke: 'currentColor', style: { strokeWidth: 1, transition: 'd 0.5s' }, d: "M ".concat(context.XTransformation(l), " ").concat(props.height - props.offsetBottom + 6, " v ").concat(-6) }); }), ticks.map(function (l, i) { return React.createElement("text", { fill: 'currentColor', key: i, fontSize: "".concat(tickFontSize, "em"), style: { textAnchor: 'middle', dominantBaseline: 'hanging', transition: 'x 0.5s, y 0.5s' }, y: props.height - props.offsetBottom + 8, x: context.XTransformation(l) }, formatTick(l, tickFormat)); })) : null, title !== undefined ? React.createElement("text", { fill: 'currentColor', style: { fontSize: '1em', textAnchor: 'middle', dominantBaseline: 'middle' }, x: props.offsetLeft + ((props.width - props.offsetLeft - props.offsetRight) / 2), y: props.height - props.offsetBottom + axisHeight }, title) : null, (dFormat !== '' && ticks.length > 0) ? React.createElement("text", { fill: 'currentColor', style: { fontSize: '1em', textAnchor: 'end', dominantBaseline: 'middle' }, x: props.width - props.offsetRight, y: props.height - props.offsetBottom + axisHeight }, formatTick(ticks[0], dFormat)) : null)); } function formatTick(t, f) { var TS = moment.utc(t); return TS.format(f); } exports.default = React.memo(TimeAxis); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGltZUF4aXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvVGltZUF4aXMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5R0FBeUc7QUFDekcsdUJBQXVCO0FBQ3ZCLEVBQUU7QUFDRixxRUFBcUU7QUFDckUsRUFBRTtBQUNGLHdHQUF3RztBQUN4Ryx3R0FBd0c7QUFDeEcsc0dBQXNHO0FBQ3RHLHdGQUF3RjtBQUN4RixFQUFFO0FBQ0YsMENBQTBDO0FBQzFDLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLDRFQUE0RTtBQUM1RSxFQUFFO0FBQ0YsOEJBQThCO0FBQzlCLHdHQUF3RztBQUN4RywwQkFBMEI7QUFDMUIsbURBQW1EO0FBQ25ELEVBQUU7QUFDRix5R0FBeUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6Ryw2QkFBK0I7QUFDL0IsK0NBQTZDO0FBQzdDLCtCQUFpQztBQUNqQyxtRUFBNkU7QUFDN0UsaUNBQW1DO0FBaUJuQyxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUM7QUFDNUIsSUFBTSxXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQztBQUN2QyxJQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLElBQU0sUUFBUSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDbEMsSUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUtqQyxTQUFTLFFBQVEsQ0FBQyxLQUFhOztJQUM3Qjs7TUFFRTtJQUNGLElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsMkJBQVksQ0FBQyxDQUFDO0lBRXpDLElBQUEsS0FBQSxPQUFvQixLQUFLLENBQUMsUUFBUSxDQUFXLEVBQUUsQ0FBQyxJQUFBLEVBQS9DLEtBQUssUUFBQSxFQUFFLFFBQVEsUUFBZ0MsQ0FBQztJQUNqRCxJQUFBLEtBQUEsT0FBa0MsS0FBSyxDQUFDLFFBQVEsQ0FBUyxDQUFDLENB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QUMsQ0FBQztZQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNWLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNsRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNqRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNWLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUV6RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNWLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNWLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUMxRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0RCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUMxRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNWLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNWLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNyRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0RCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJ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