UNPKG

@nlabs/gothamjs

Version:
207 lines (206 loc) 23.7 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; /** * Copyright (c) 2025-Present, Nitrogen Labs, Inc. * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms. */ import { useEffect, useState } from 'react'; export const DatePicker = ({ initialDate = new Date().getTime(), maxDate, minDate, onDateSelect })=>{ const defaultDate = new Date(initialDate); const [selectedDate, setSelectedDate] = useState(defaultDate); const [currentMonth, setCurrentMonth] = useState(defaultDate.getMonth()); const [currentYear, setCurrentYear] = useState(defaultDate.getFullYear()); useEffect(()=>{ const updatedDate = new Date(initialDate); setSelectedDate(updatedDate); setCurrentMonth(updatedDate.getMonth()); setCurrentYear(updatedDate.getFullYear()); }, [ initialDate ]); const handlePrevMonth = ()=>{ if (currentMonth === 0) { setCurrentMonth(11); setCurrentYear(currentYear - 1); } else { setCurrentMonth(currentMonth - 1); } }; const handleNextMonth = ()=>{ if (currentMonth === 11) { setCurrentMonth(0); setCurrentYear(currentYear + 1); } else { setCurrentMonth(currentMonth + 1); } }; const handleMonthChange = (e)=>{ setCurrentMonth(parseInt(e.target.value, 10)); }; const handleYearChange = (e)=>{ setCurrentYear(parseInt(e.target.value, 10)); }; const isDateInRange = (date)=>{ const dateTimestamp = date.getTime(); if (minDate && dateTimestamp < minDate) { return false; } if (maxDate && dateTimestamp > maxDate) { return false; } return true; }; const handleDateSelect = (day)=>{ const newDate = new Date(currentYear, currentMonth, day); if (!isDateInRange(newDate)) { return; } setSelectedDate(newDate); if (onDateSelect) { onDateSelect(newDate.getTime()); } }; // Get month name const monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; const getDaysInMonth = (year, month)=>{ return new Date(year, month + 1, 0).getDate(); }; const getFirstDayOfMonth = (year, month)=>{ return new Date(year, month, 1).getDay(); }; // Generate years for dropdown (range based on min/max dates) const generateYearOptions = ()=>{ let startYear = currentYear - 5; let endYear = currentYear + 5; if (minDate) { const minYear = new Date(minDate).getFullYear(); startYear = minYear; } if (maxDate) { const maxYear = new Date(maxDate).getFullYear(); endYear = maxYear; } return Array.from({ length: endYear - startYear + 1 }, (_, i)=>startYear + i); }; // Generate days for the calendar const daysInMonth = getDaysInMonth(currentYear, currentMonth); const firstDayOfMonth = getFirstDayOfMonth(currentYear, currentMonth); const days = []; // Add empty cells for days before the first day of the month for(let i = 0; i < firstDayOfMonth; i++){ days.push(/*#__PURE__*/ _jsx("div", { className: "h-8 w-8" }, `empty-${i}`)); } // Add days of the month for(let day = 1; day <= daysInMonth; day++){ const date = new Date(currentYear, currentMonth, day); const isSelected = selectedDate.getDate() === day && selectedDate.getMonth() === currentMonth && selectedDate.getFullYear() === currentYear; const isDisabled = !isDateInRange(date); days.push(/*#__PURE__*/ _jsx("button", { onClick: ()=>handleDateSelect(day), disabled: isDisabled, className: `h-7 w-7 text-sm rounded-full flex items-center justify-center ${isSelected ? 'bg-blue-500 text-white' : isDisabled ? 'text-gray-300 cursor-not-allowed' : 'hover:bg-gray-200'}`, children: day }, day)); } const yearOptions = generateYearOptions(); return /*#__PURE__*/ _jsxs("div", { className: "bg-white border border-gray-200 rounded-lg shadow-lg p-3", children: [ /*#__PURE__*/ _jsxs("div", { className: "flex justify-between items-center mb-2", children: [ /*#__PURE__*/ _jsx("button", { onClick: handlePrevMonth, className: "p-1 rounded-full hover:bg-gray-200 text-sm", children: "<" }), /*#__PURE__*/ _jsxs("div", { className: "flex space-x-1", children: [ /*#__PURE__*/ _jsx("select", { value: currentMonth, onChange: handleMonthChange, className: "border border-gray-300 rounded px-1.5 py-0.5 text-sm", children: monthNames.map((month, index)=>/*#__PURE__*/ _jsx("option", { value: index, children: month }, month)) }), /*#__PURE__*/ _jsxs("div", { className: "relative inline-flex items-center", children: [ /*#__PURE__*/ _jsx("select", { value: currentYear, onChange: handleYearChange, className: "px-1.5 py-0.5 text-sm appearance-none bg-transparent focus:outline-none pr-5 hover:text-blue-600 cursor-pointer", style: { MozAppearance: 'none', WebkitAppearance: 'none', scrollbarWidth: 'thin' }, children: yearOptions.map((year)=>/*#__PURE__*/ _jsx("option", { value: year, className: "text-sm", children: year }, year)) }), /*#__PURE__*/ _jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center px-1 text-gray-700", children: /*#__PURE__*/ _jsx("svg", { className: "h-3 w-3 fill-current", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", children: /*#__PURE__*/ _jsx("path", { d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" }) }) }) ] }) ] }), /*#__PURE__*/ _jsx("button", { onClick: handleNextMonth, className: "p-1 rounded-full hover:bg-gray-200 text-sm", children: ">" }) ] }), /*#__PURE__*/ _jsxs("div", { className: "grid grid-cols-7 gap-0.5", children: [ [ 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa' ].map((day)=>/*#__PURE__*/ _jsx("div", { className: "text-center font-medium text-gray-500 text-xs", children: day }, day)), days ] }) ] }); }; export default DatePicker; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL0RhdGVGaWVsZC9EYXRlUGlja2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyNS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHtGQywgUmVhY3ROb2RlfSBmcm9tICdyZWFjdCc7XG5cbmludGVyZmFjZSBEYXRlUGlja2VyUHJvcHMge1xuICBpbml0aWFsRGF0ZT86IG51bWJlcjtcbiAgbWF4RGF0ZT86IG51bWJlcjtcbiAgbWluRGF0ZT86IG51bWJlcjtcbiAgb25EYXRlU2VsZWN0PzogKGRhdGU6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IERhdGVQaWNrZXI6IEZDPERhdGVQaWNrZXJQcm9wcz4gPSAoe1xuICBpbml0aWFsRGF0ZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksXG4gIG1heERhdGUsXG4gIG1pbkRhdGUsXG4gIG9uRGF0ZVNlbGVjdFxufSkgPT4ge1xuICBjb25zdCBkZWZhdWx0RGF0ZSA9IG5ldyBEYXRlKGluaXRpYWxEYXRlKTtcbiAgY29uc3QgW3NlbGVjdGVkRGF0ZSwgc2V0U2VsZWN0ZWREYXRlXSA9IHVzZVN0YXRlPERhdGU+KGRlZmF1bHREYXRlKTtcbiAgY29uc3QgW2N1cnJlbnRNb250aCwgc2V0Q3VycmVudE1vbnRoXSA9IHVzZVN0YXRlPG51bWJlcj4oZGVmYXVsdERhdGUuZ2V0TW9udGgoKSk7XG4gIGNvbnN0IFtjdXJyZW50WWVhciwgc2V0Q3VycmVudFllYXJdID0gdXNlU3RhdGU8bnVtYmVyPihkZWZhdWx0RGF0ZS5nZXRGdWxsWWVhcigpKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gbmV3IERhdGUoaW5pdGlhbERhdGUpO1xuICAgIHNldFNlbGVjdGVkRGF0ZSh1cGRhdGVkRGF0ZSk7XG4gICAgc2V0Q3VycmVudE1vbnRoKHVwZGF0ZWREYXRlLmdldE1vbnRoKCkpO1xuICAgIHNldEN1cnJlbnRZZWFyKHVwZGF0ZWREYXRlLmdldEZ1bGxZZWFyKCkpO1xuICB9LCBbaW5pdGlhbERhdGVdKTtcblxuICBjb25zdCBoYW5kbGVQcmV2TW9udGggPSAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRNb250aCA9PT0gMCkge1xuICAgICAgc2V0Q3VycmVudE1vbnRoKDExKTtcbiAgICAgIHNldEN1cnJlbnRZZWFyKGN1cnJlbnRZZWFyIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEN1cnJlbnRNb250aChjdXJyZW50TW9udGggLSAxKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTmV4dE1vbnRoID0gKCkgPT4ge1xuICAgIGlmIChjdXJyZW50TW9udGggPT09IDExKSB7XG4gICAgICBzZXRDdXJyZW50TW9udGgoMCk7XG4gICAgICBzZXRDdXJyZW50WWVhcihjdXJyZW50WWVhciArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRDdXJyZW50TW9udGgoY3VycmVudE1vbnRoICsgMSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1vbnRoQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxTZWxlY3RFbGVtZW50PikgPT4ge1xuICAgIHNldEN1cnJlbnRNb250aChwYXJzZUludChlLnRhcmdldC52YWx1ZSwgMTApKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVZZWFyQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxTZWxlY3RFbGVtZW50PikgPT4ge1xuICAgIHNldEN1cnJlbnRZZWFyKHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlLCAxMCkpO1xuICB9O1xuXG4gIGNvbnN0IGlzRGF0ZUluUmFuZ2UgPSAoZGF0ZTogRGF0ZSk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGRhdGVUaW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcblxuICAgIGlmIChtaW5EYXRlICYmIGRhdGVUaW1lc3RhbXAgPCBtaW5EYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUgJiYgZGF0ZVRpbWVzdGFtcCA+IG1heERhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVEYXRlU2VsZWN0ID0gKGRheTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIGRheSk7XG5cbiAgICBpZiAoIWlzRGF0ZUluUmFuZ2UobmV3RGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RlZERhdGUobmV3RGF0ZSk7XG5cbiAgICBpZiAob25EYXRlU2VsZWN0KSB7XG4gICAgICBvbkRhdGVTZWxlY3QobmV3RGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cbiAgfTtcblxuICAvLyBHZXQgbW9udGggbmFtZVxuICBjb25zdCBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJyxcbiAgICAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXG4gIF07XG5cbiAgY29uc3QgZ2V0RGF5c0luTW9udGggPSAoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldEZpcnN0RGF5T2ZNb250aCA9ICh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpO1xuICB9O1xuXG4gIC8vIEdlbmVyYXRlIHllYXJzIGZvciBkcm9wZG93biAocmFuZ2UgYmFzZWQgb24gbWluL21heCBkYXRlcylcbiAgY29uc3QgZ2VuZXJhdGVZZWFyT3B0aW9ucyA9ICgpID0+IHtcbiAgICBsZXQgc3RhcnRZZWFyID0gY3VycmVudFllYXIgLSA1O1xuICAgIGxldCBlbmRZZWFyID0gY3VycmVudFllYXIgKyA1O1xuXG4gICAgaWYgKG1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pblllYXIgPSBuZXcgRGF0ZShtaW5EYXRlKS5nZXRGdWxsWWVhcigpO1xuICAgICAgc3RhcnRZZWFyID0gbWluWWVhcjtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWF4WWVhciA9IG5ldyBEYXRlKG1heERhdGUpLmdldEZ1bGxZZWFyKCk7XG4gICAgICBlbmRZZWFyID0gbWF4WWVhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHtsZW5ndGg6IGVuZFllYXIgLSBzdGFydFllYXIgKyAxfSxcbiAgICAgIChfLCBpKSA9PiBzdGFydFllYXIgKyBpXG4gICAgKTtcbiAgfTtcblxuICAvLyBHZW5lcmF0ZSBkYXlzIGZvciB0aGUgY2FsZW5kYXJcbiAgY29uc3QgZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aChjdXJyZW50WWVhciwgY3VycmVudE1vbnRoKTtcbiAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gZ2V0Rmlyc3REYXlPZk1vbnRoKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgpO1xuXG4gIGNvbnN0IGRheXM6IFJlYWN0Tm9kZVtdID0gW107XG4gIC8vIEFkZCBlbXB0eSBjZWxscyBmb3IgZGF5cyBiZWZvcmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERheU9mTW9udGg7IGkrKykge1xuICAgIGRheXMucHVzaCg8ZGl2IGtleT17YGVtcHR5LSR7aX1gfSBjbGFzc05hbWU9XCJoLTggdy04XCI+PC9kaXY+KTtcbiAgfVxuXG4gIC8vIEFkZCBkYXlzIG9mIHRoZSBtb250aFxuICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gZGF5c0luTW9udGg7IGRheSsrKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIGRheSk7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICBzZWxlY3RlZERhdGUuZ2V0RGF0ZSgpID09PSBkYXkgJiZcbiAgICAgIHNlbGVjdGVkRGF0ZS5nZXRNb250aCgpID09PSBjdXJyZW50TW9udGggJiZcbiAgICAgIHNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpID09PSBjdXJyZW50WWVhcjtcblxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAhaXNEYXRlSW5SYW5nZShkYXRlKTtcblxuICAgIGRheXMucHVzaChcbiAgICAgIDxidXR0b25cbiAgICAgICAga2V5PXtkYXl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZURhdGVTZWxlY3QoZGF5KX1cbiAgICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgIGNsYXNzTmFtZT17YGgtNyB3LTcgdGV4dC1zbSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgJHtcbiAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICA/ICdiZy1ibHVlLTUwMCB0ZXh0LXdoaXRlJ1xuICAgICAgICAgICAgOiBpc0Rpc2FibGVkXG4gICAgICAgICAgICAgID8gJ3RleHQtZ3JheS0zMDAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICA6ICdob3ZlcjpiZy1ncmF5LTIwMCdcbiAgICAgICAgfWB9XG4gICAgICA+XG4gICAgICAgIHtkYXl9XG4gICAgICA8L2J1dHRvbj5cbiAgICApO1xuICB9XG5cbiAgY29uc3QgeWVhck9wdGlvbnMgPSBnZW5lcmF0ZVllYXJPcHRpb25zKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbGcgcC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBtYi0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQcmV2TW9udGh9XG4gICAgICAgICAgY2xhc3NOYW1lPVwicC0xIHJvdW5kZWQtZnVsbCBob3ZlcjpiZy1ncmF5LTIwMCB0ZXh0LXNtXCJcbiAgICAgICAgPlxuICAgICAgICAgICZsdDtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBzcGFjZS14LTFcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICB2YWx1ZT17Y3VycmVudE1vbnRofVxuICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZU1vbnRoQ2hhbmdlfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkIHB4LTEuNSBweS0wLjUgdGV4dC1zbVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge21vbnRoTmFtZXMubWFwKChtb250aCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e21vbnRofSB2YWx1ZT17aW5kZXh9PlxuICAgICAgICAgICAgICAgIHttb250aH1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICB2YWx1ZT17Y3VycmVudFllYXJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVZZWFyQ2hhbmdlfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC0xLjUgcHktMC41IHRleHQtc20gYXBwZWFyYW5jZS1ub25lIGJnLXRyYW5zcGFyZW50IGZvY3VzOm91dGxpbmUtbm9uZSBwci01IGhvdmVyOnRleHQtYmx1ZS02MDAgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIE1vekFwcGVhcmFuY2U6ICdub25lJyxcbiAgICAgICAgICAgICAgICBXZWJraXRBcHBlYXJhbmNlOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgc2Nyb2xsYmFyV2lkdGg6ICd0aGluJ1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eWVhck9wdGlvbnMubWFwKHllYXIgPT4gKFxuICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXt5ZWFyfSB2YWx1ZT17eWVhcn0gY2xhc3NOYW1lPVwidGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAge3llYXJ9XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgZmxleCBpdGVtcy1jZW50ZXIgcHgtMSB0ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwiaC0zIHctMyBmaWxsLWN1cnJlbnRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS4yOTMgNy4yOTNhMSAxIDAgMDExLjQxNCAwTDEwIDEwLjU4NmwzLjI5My0zLjI5M2ExIDEgMCAxMTEuNDE0IDEuNDE0bC00IDRhMSAxIDAgMDEtMS40MTQgMGwtNC00YTEgMSAwIDAxMC0xLjQxNHpcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU5leHRNb250aH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJwLTEgcm91bmRlZC1mdWxsIGhvdmVyOmJnLWdyYXktMjAwIHRleHQtc21cIlxuICAgICAgICA+XG4gICAgICAgICAgJmd0O1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy03IGdhcC0wLjVcIj5cbiAgICAgICAge1snU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXS5tYXAoZGF5ID0+IChcbiAgICAgICAgICA8ZGl2IGtleT17ZGF5fSBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlciBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIHRleHQteHNcIj5cbiAgICAgICAgICAgIHtkYXl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgICB7ZGF5c31cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlcjsiXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJEYXRlUGlja2VyIiwiaW5pdGlhbERhdGUiLCJEYXRlIiwiZ2V0VGltZSIsIm1heERhdGUiLCJtaW5EYXRlIiwib25EYXRlU2VsZWN0IiwiZGVmYXVsdERhdGUiLCJzZWxlY3RlZERhdGUiLCJzZXRTZWxlY3RlZERhdGUiLCJjdXJyZW50TW9udGgiLCJzZXRDdXJyZW50TW9udGgiLCJnZXRNb250aCIsImN1cnJlbnRZZWFyIiwic2V0Q3VycmVudFllYXIiLCJnZXRGdWxsWWVhciIsInVwZGF0ZWREYXRlIiwiaGFuZGxlUHJldk1vbnRoIiwiaGFuZGxlTmV4dE1vbnRoIiwiaGFuZGxlTW9udGhDaGFuZ2UiLCJlIiwicGFyc2VJbnQiLCJ0YXJnZXQiLCJ2YWx1ZSIsImhhbmRsZVllYXJDaGFuZ2UiLCJpc0RhdGVJblJhbmdlIiwiZGF0ZSIsImRhdGVUaW1lc3RhbXAiLCJoYW5kbGVEYXRlU2VsZWN0IiwiZGF5IiwibmV3RGF0ZSIsIm1vbnRoTmFtZXMiLCJnZXREYXlzSW5Nb250aCIsInllYXIiLCJtb250aCIsImdldERhdGUiLCJnZXRGaXJzdERheU9mTW9udGgiLCJnZXREYXkiLCJnZW5lcmF0ZVllYXJPcHRpb25zIiwic3RhcnRZZWFyIiwiZW5kWWVhciIsIm1pblllYXIiLCJtYXhZZWFyIiwiQXJyYXkiLCJmcm9tIiwibGVuZ3RoIiwiXyIsImkiLCJkYXlzSW5Nb250aCIsImZpcnN0RGF5T2ZNb250aCIsImRheXMiLCJwdXNoIiwiZGl2IiwiY2xhc3NOYW1lIiwiaXNTZWxlY3RlZCIsImlzRGlzYWJsZWQiLCJidXR0b24iLCJvbkNsaWNrIiwiZGlzYWJsZWQiLCJ5ZWFyT3B0aW9ucyIsInNlbGVjdCIsIm9uQ2hhbmdlIiwibWFwIiwiaW5kZXgiLCJvcHRpb24iLCJzdHlsZSIsIk1vekFwcGVhcmFuY2UiLCJXZWJraXRBcHBlYXJhbmNlIiwic2Nyb2xsYmFyV2lkdGgiLCJzdmciLCJ4bWxucyIsInZpZXdCb3giLCJwYXRoIiwiZCJdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFNBQVMsRUFBRUMsUUFBUSxRQUFPLFFBQVE7QUFXMUMsT0FBTyxNQUFNQyxhQUFrQyxDQUFDLEVBQzlDQyxjQUFjLEFBQUMsSUFBSUMsT0FBUUMsT0FBTyxFQUFFLEVBQ3BDQyxPQUFPLEVBQ1BDLE9BQU8sRUFDUEMsWUFBWSxFQUNiO0lBQ0MsTUFB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